| ソースコード |
# -*- encoding: utf-8 -*-
# Audio Podcast
# Copyright Kazuto Maruoka All rights reserved.
import clr
clr.AddReferenceByPartialName("PresentationCore")
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName("WindowsBase")
clr.AddReferenceByPartialName("System.Xml")
clr.AddReferenceByPartialName("System.Configuration")
clr.AddReferenceByPartialName("coRockets")
from System import String, Int32, Uri, DateTime, TimeSpan, Exception
from System.IO import Stream, StreamReader, Path, DirectoryInfo
from System.Collections.Generic import List
from System.Collections.ObjectModel import Collection;
from System.Globalization import CultureInfo, DateTimeStyles
from System.Text.RegularExpressions import Regex, RegexOptions, Match
from System.Text import *
from System.Security import *
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 System.Configuration import ConfigurationManager, ConfigurationUserLevel
from CoRockets import Entry
from System.Diagnostics import *
from System.Text import *
def update():
try:
global rootEntry
if not NetworkInterface.GetIsNetworkAvailable():
return
cacheDirectory = None
config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if config.HasFile:
if config.AppSettings.Settings["Cache"] != None:
cacheDirectory = config.AppSettings.Settings["Cache"].Value
di = DirectoryInfo(cacheDirectory)
if di.Exists == False:
di.Create()
link = rss
request = WebRequest.Create(link)
response = request.GetResponse()
s = response.GetResponseStream()
doc = XmlDocument()
doc.Load(s)
entryList = List[Entry]()
for postXmlNode in doc.SelectNodes("/rss/channel/item"):
newEntry = Entry()
for xmlNode in postXmlNode.ChildNodes:
if xmlNode.Name.Equals("title"):
newEntry.Title = xmlNode.InnerText
elif xmlNode.Name.Equals("link"):
newEntry.Link = Uri(xmlNode.InnerText)
elif xmlNode.Name.Equals("author"):
newEntry.Author = xmlNode.InnerText
elif xmlNode.Name.Equals("enclosure"):
for contentAttribute in xmlNode.Attributes:
if contentAttribute.Name.Equals("url"):
newEntry.Uri = Uri(contentAttribute.Value)
elif contentAttribute.Name.Equals("type"):
if contentAttribute.Value == "audio/mpeg":
newEntry.CacheExtension = "mp3"
elif xmlNode.Name.Equals("media:content"):
for contentAttribute in xmlNode.Attributes:
if contentAttribute.Name.Equals("url"):
newEntry.Uri = Uri(contentAttribute.Value)
elif contentAttribute.Name.Equals("type"):
if contentAttribute.Value == "audio/mpeg":
newEntry.CacheExtension = "mp3"
elif xmlNode.Name.Equals("media:thumbnail"):
for thumbnailAttribute in xmlNode.Attributes:
if thumbnailAttribute.Name.Equals("url"):
if String.IsNullOrEmpty(thumbnailAttribute.Value) != True:
newEntry.ImageUri = Uri(thumbnailAttribute.Value)
elif xmlNode.Name.Equals("description"):
newEntry.Description = xmlNode.InnerText
elif xmlNode.Name.Equals("pubDate"):
try:
newEntry.Updated = DateTime.ParseExact(xmlNode.InnerText, "ddd, dd MMM yyyy HH:mm:ss zz00", CultureInfo.InvariantCulture.DateTimeFormat, DateTimeStyles.None)
except:
pass
if String.IsNullOrEmpty(newEntry.Title):
newEntry.Title = "N/A"
if newEntry.Uri != None:
isExist = False
for entry in rootEntry.ChildEntries:
if entry.Uri == newEntry.Uri:
isExist = True
if isExist == False:
entryList.Add(newEntry)
if entryList.Count > 0:
rootEntry.ImageUri = Uri("http://www.psypress.com/podcast/podcast-icon-small.gif")
entryList.Reverse()
for entry in entryList:
rootEntry.InsertChild(0, entry)
if s != None:
s.Close()
if response != None:
response.Close()
except Exception, e:
Trace.WriteLine("Audio Podcast.py "+e)
def onUpdate(s, e):
update()
rootEntry = None
for entry in Fetcher.Entries:
if entry.Title.Equals(title):
rootEntry = entry
break
if rootEntry == None:
rootEntry = Entry()
rootEntry.Title = title
rootEntry.Type = "Music"
Fetcher.Entries.Add(rootEntry)
Fetcher.Update += onUpdate
|