フィルムセンターの上映スケジュールをgcalapiでGoogleカレンダーに登録
東京国立近代美術館フィルムセンターという国立映画機関があります。大小の2ホールで映画を上映していたり、映画資料展示や映画関連文献の公開もしていて、映画ファンならかなり楽しめるところです。
今回の特集は「フィルム・コレクションに見るNFCの40年」ということで概要はこんな感じになっています。
http://www.momat.go.jp/FC/NFC_Calendar/2010-7-8/kaisetsu.html
国立近代美術館(1952年開館、現・東京国立近代美術館)のフィルム・ライブラリー部門が、1970年5月27日にフィルムセンターとして開館してから今年で40年目を迎えます。この間に、フィルムセンターが収集した映画フィルムは約6万本に上り、その対象も、長篇劇映画から文化・記録映画、ニュース映画、教育映画、PR映画、さらには企業外映画まで、自国映画を中心に様々な領域をカバーすべく拡大を続けてきました。
開館40周年記念事業の第2弾となるこの企画では、アメリカやロシアから里帰りした日本映画や、小宮登美次郎氏の無声外国映画コレクションをはじめとするコレクターの旧蔵フィルム、国内外で発掘・復元された幻の日本映画、海外アーカイブとの協力により入手した良質な外国映画のプリントなど計96本(49プログラム)を紹介して、我が国唯一の国立映画保存機関の歩みを振り返ります。
ということで、この上映スケジュールをGoogleカレンダーに登録したくなったので、gcalapi という gem を使って試してみました。
gcalapiを使えるようにインストールします。
$ sudo gem install gcalapi
nokogiriでスクレイピング。フィルムセンターから上映スケジュールを抜き出します。
class NFC def initialize @result = [] @location = "日本フィルムセンター" end def dom(url) url.split("/")[0..2].join("/") end def retime(time) times = time[0..-2].split(":").map {|t| t.to_i } times[0] += 12 if time[-2..-1] == "pm" return times end def redate(date) date.scan(/\d+\/\d+/)[0].split("/").map {|d| d.to_i } end def get(url) begin doc = Nokogiri::HTML(open(url).read) rescue return nil end domain = dom(url) year = Time.now.year xpath = [ "//table[@class='weekday']", "//table[@class='saturday']", "//table[@class='sunday']", ] doc.xpath(*xpath).each {|elem| times = []; titles = [] mon, day = redate((elem/'th.date').text) (elem/'td.time').each {|t| times << retime(t.text) } (elem/'td.title/a').each {|t| titles << [t.text, t.attributes["href"].value] } 2.times {|n| hour, minute = times[n] @result << { :start => [year, mon, day, hour, minute], :end => [year, mon, day, hour + 3, minute], :title => titles[n][0], :description => domain + titles[n][1], :location => @location, } } } return @result end end
Googleカレンダーに登録。feedのURLはGoogleカレンダーの設定から取得。
- メニューの[Settings]->[Calendar Settings]に移動
- [Calendar]タブからカレンダーをクリックします。
- 下の方にある[Private Address:] のXMLをクリック
require 'rubygems' require 'nokogiri' require 'gcalapi' require 'open-uri' class MyGoogleCalendar include GoogleCalendar def initialize @mail ||= "" @pass ||= "" @feed ||= "" @cal ||= "" end attr_accessor :mail, :pass, :feed def refeed(feed) (feed.split("/")[0..-3] + %w(private full)).join("/") end def create @cal = Calendar.new(Service.new(@mail, @pass), refeed(@feed)) end def add!(item) event = @cal.create_event event.title = item[:title] event.desc = item[:description] event.where = item[:location] event.st = Time.mktime(*item[:start]) event.en = Time.mktime(*item[:end]) event.save! end end # film center url = "http://www.momat.go.jp/FC/NFC_Calendar/2010-7-8/nittei.html" # google calendar mail = "xxx@gmail.com" pass = "xxx" feed = "http://www.google.com/calendar/feeds/xxxxxxxxxxx4%40group.calendar.google.com/private-xxxxxxxxxxxxxxxxxxxxxxxxxxxx/basic" nfc = NFC.new items = nfc.get(url) gc = MyGoogleCalendar.new gc.mail = mail gc.pass = pass gc.feed = feed gc.create items.each {|item| cnt = 0 begin gc.add!(item) rescue if cnt < 5 cnt += 1 retry else puts "Error: #{item[:title]}" end end puts item[:title] }