| ソースコード |
# -*- encoding: utf-8 -*-
# Tumblr.py
# Copyright Masaaki Kawata All rights reserved.
import clr
clr.AddReferenceByPartialName("PresentationCore")
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName("WindowsBase")
clr.AddReferenceByPartialName("System.Xml")
clr.AddReferenceByPartialName("coRockets")
from System import String, Uri, DateTime, TimeSpan, Int32
from System.IO import Stream, StreamReader
from System.Collections.Generic import List
from System.Collections.ObjectModel import Collection;
from System.Globalization import CultureInfo, DateTimeStyles
from System.Text import Encoding
from System.Text.RegularExpressions import Regex, RegexOptions, Match
from System.Timers import Timer
from System.Net import WebRequest, WebResponse, WebClient, HttpRequestHeader
from System.Net.NetworkInformation import NetworkInterface
from System.Windows.Threading import DispatcherTimer;
from System.Xml import XmlDocument, XmlNode, XmlAttribute
from CoRockets import Entry, Fetcher
from System.Diagnostics import *
def update():
global rootEntry
if not NetworkInterface.GetIsNetworkAvailable():
return
request = WebRequest.Create("http://"+user+".tumblr.com/api/read?num=50&type=video")
response = request.GetResponse()
s = response.GetResponseStream()
doc = XmlDocument()
doc.Load(s)
entryList = List[Entry]()
for postXmlNode in doc.SelectNodes("/tumblr/posts/post"):
newEntry = Entry()
id = String.Empty
for xmlAttribute in postXmlNode.Attributes:
if xmlAttribute.Name.Equals("id"):
newEntry.Title = xmlAttribute.Value
for xmlNode in postXmlNode.ChildNodes:
if xmlNode.Name.Equals("video-source"):
domain = ""
source = xmlNode.InnerText
if source.Contains("www.youtube"):
domain = "www"
elif source.Contains("jp.youtube"):
domain = "jp"
if domain != "":
id = Regex.Match(xmlNode.InnerText, "v=([a-zA-Z0-9_-]+)", RegexOptions.IgnoreCase)
if id.Success:
yid=id.Groups[1].Value
try:
watchHtmlData = WebClient().DownloadData("http://"+domain+".youtube.com/watch?v="+yid)
htmlString = Encoding.UTF8.GetString(watchHtmlData)
t = Regex.Match(htmlString, "<title>(.*)</title>", RegexOptions.IgnoreCase)
if t.Success:
newEntry.Title = t.Groups[1].Value
else:
newEntry.Title = "N/A"
t = Regex.Match(htmlString, "\"t\":.\"([^\"]*)\"", RegexOptions.IgnoreCase)
if t.Success:
yT = t.Groups[1].Value
uri = "http://"+domain+".youtube.com/get_video?video_id="+yid+"&t="+yT+"&fmt=18"
imageUri = "http://i4.ytimg.com/vi/"+yid+"/default.jpg"
link = "http://"+domain+".youtube.com/watch?v="+yid
newEntry.Link = Uri(link)
newEntry.ImageUri = Uri(imageUri)
newEntry.Uri = Uri(uri)
newEntry.ImageExtension = "jpg"
newEntry.CacheExtension = "mp4"
if newEntry.Uri != None:
isExist = False
for entry in rootEntry.ChildEntries:
if entry.Link.AbsoluteUri.Equals(newEntry.Link.AbsoluteUri):
isExist = True
if isExist == False:
entryList.Add(newEntry)
except:
pass
if entryList.Count > 0:
rootEntry.ImageUri = Uri("http://www.tumblr.com/images/apple_touch_icon.png")
entryList.Reverse()
for entry in entryList:
rootEntry.InsertChild(0, entry)
if s != None:
s.Close()
if response != None:
response.Close()
def onUpdate(s, e):
update()
rootEntry = None
for entry in Fetcher.Instance.Entries:
if entry.Title.Equals("Tumblr"):
rootEntry = entry
rootEntry.IsLimit = False
break
if rootEntry == None:
rootEntry = Entry()
rootEntry.Title = title
rootEntry.Type = "Videos"
rootEntry.IsLimit = False
Fetcher.Instance.Entries.Add(rootEntry)
Fetcher.Instance.Update += onUpdate
|