ニコニコ動画の新着を表示するApricot用アドオン
ニコニコ動画の新着を表示するApricot用アドオンを書いてみました。新着をサムネイル付きで表示できます。
処理内容は引用βの時と同じく、ニコニコ動画のRSSから新着を抜き出してます。なので、処理内容はほぼ一緒です。引用βとの違いは、RSSのdescriptionタグ内からサムネイル画像を抜き出す操作をするところでしょうか。
デスクトップマスコット「Apricot」はこちら
アプリコタン.NET (http://www.apricotan.net/)
下記のスクリプトをUTF-8で保存して、Scriptsフォルダに入れればApricotのキャラクターが新着を喋るようになります。
# -*- coding: utf-8 -*- # nicovideo.py # Copyright 〓 Masaaki Kawata All rights reserved. import clr clr.AddReferenceByPartialName("mscorlib") clr.AddReferenceByPartialName("System") clr.AddReferenceByPartialName("System.Xml") clr.AddReferenceByPartialName("Apricot") from System import String, Uri, DateTime, TimeSpan, TimeZone, Convert from System.IO import Stream, StreamReader from System.Collections.Generic import List from System.Diagnostics import Trace from System.Globalization import CultureInfo, DateTimeStyles from System.Text.RegularExpressions import Regex, RegexOptions, Match, Capture from System.Timers import Timer from System.Net import WebRequest, WebResponse from System.Net.NetworkInformation import NetworkInterface from System.Xml import XmlDocument from Apricot import Entry, Word, Script def parse(s): dt = DateTime() invalidTimeZone = False index = s.Length; match = Regex.Match(s, "\\s[\\+\\-0-9A-Z]+$") if match.Success: index = match.Index else: invalidTimeZone = true dt = Convert.ToDateTime(s.Substring(0, index)) if s.Length - index > 0: if s[index + 1] == '+': if s.Length - (index + 1) == 5: dt = dt.AddHours(-Convert.ToInt32(s.Substring(index + 2, 2))) dt = dt.AddMinutes(-Convert.ToInt32(s.Substring(index + 4, 2))) else: invalidTimeZone = true; elif s[index + 1] == '-': if s.Length - (index + 1) == 5: dt = dt.AddHours(Convert.ToInt32(s.Substring(index + 2, 2))) dt = dt.AddMinutes(Convert.ToInt32(s.Substring(index + 4, 2))) else: invalidTimeZone = true if invalidTimeZone == False: dt = dt.Add(TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now)) return dt def update(): try: global dateTime if not NetworkInterface.GetIsNetworkAvailable(): return request = WebRequest.Create("http://www.nicovideo.jp/ranking/mylist/daily/all?rss=2.0") response = request.GetResponse() s = response.GetResponseStream() doc = XmlDocument() doc.Load(s) entryList = List[Entry]() for itemXmlNode in doc.SelectNodes("/rss/channel/item"): newEntry = Entry() id = String.Empty for xmlNode in itemXmlNode.ChildNodes: if xmlNode.Name.Equals("title"): newEntry.Title = xmlNode.InnerText elif xmlNode.Name.Equals("link"): newEntry.Resource = Uri(xmlNode.InnerText) elif xmlNode.Name.Equals("pubDate"): newEntry.Created = newEntry.Modified = parse(xmlNode.InnerText) elif xmlNode.Name.Equals("description"): match = Regex.Match(xmlNode.InnerText, "img.*?src\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))", RegexOptions.IgnoreCase | RegexOptions.Singleline) if match.Success: if match.Groups[1].Value.Length > 0: newEntry.ImageUri = Uri(match.Groups[1].Value) newEntry.Description = Regex.Replace(xmlNode.InnerText, "<.+?>", String.Empty, RegexOptions.Singleline) newEntry.BaseUri = Uri("http://www.nicovideo.jp/") newEntry.BaseTitle = "ニコニコ動画" if newEntry.Created > dateTime and entryList.Count < 10: entryList.Add(newEntry) if entryList.Count > 0: Script.Instance.Alert(entryList) dateTime = DateTime.Now isActivated = False for entry in entryList: wordList = List[String]() for word in Script.Instance.Words: if Regex.IsMatch(entry.Title, Regex.Escape(word.Name)) and wordList.Contains(word.Name) == False: wordList.Add(word.Name) if wordList.Count > 0 and isActivated == False: isActivated = Script.Instance.TryEnqueue(Script.Instance.Prepare(wordList, None, True)) if s != None: s.Close() if response != None: response.Close() except Exception, e: Trace.WriteLine(e.clsException.Message) Trace.WriteLine(e.clsException.StackTrace) def onTimedEvent(timer, e): update() timer.Interval = 1000 * 60 * 5 timer.AutoReset = True timer.Start() def onStart(s, e): global timer timer.Interval = 1000 * 60 timer.AutoReset = False timer.Start() def onStop(s, e): global timer timer.Stop() dateTime = DateTime.Now - TimeSpan(24, 0, 0) timer = Timer() timer.Elapsed += onTimedEvent timer.Enabled = False Script.Instance.Start += onStart Script.Instance.Stop += onStop