harry’s memorandum

おれおれメモ

フィルムセンターの上映スケジュールを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カレンダーの設定から取得。

  1. メニューの[Settings]->[Calendar Settings]に移動
  2. [Calendar]タブからカレンダーをクリックします。
  3. 下の方にある[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]
}

たまに登録エラーになるので失敗したら5回retryしています。
これで、楽しい映画鑑賞ライフを満喫できそうです。
f:id:dharry:20100818030712p:image