RubyでiCalの作成とGoogleCalendarでの公開

試合日程 - 長友 佑都 - 海外サッカー - サッカー - SANSPO.COM を見ていてgoogle calendarに突っ込めたら便利だなと思ったのでRubyで作ってみました。
リーグ戦しか無いので、データソースとしては今一ですが、カッとなって作ってしまいました。
多分データソース探して作り直します。

iCalの作り方

icalendar/icalendar というgemを利用すると便利です。

icalendar

  def create_ical(name, name_ja, cards)
    cal = Icalendar::Calendar.new
    cal.timezone do |t|
      t.tzid = 'Asia/Tokyo'
      t.standard do |s|
        s.tzoffsetfrom = '+0900'
        s.tzoffsetto   = '+0900'
        s.tzname       = 'JST'
        s.dtstart      = '19700101T000000'
      end
    end
    cal.append_custom_property('X-WR-CALNAME;VALUE=TEXT', "試合日程 #{name_ja}")
    cards.each do |card|
      cal.event do |e|
        e.summary     = "#{card.section}#{card.rival}"
        e.description = "#{name_ja}#{card.section}#{card.rival}戦 [#{card.home_away}]"
        e.dtstart     = Icalendar::Values::DateTime.new(card.kickoff_at)
        e.dtend       = Icalendar::Values::DateTime.new(card.kickoff_at + 2.hour)
      end
    end
    cal.publish
    open("ics/#{name}.ics", 'w') { |f| f.puts(cal.to_ical) }
  end

こんな感じで使います。

  1. インスタンス作成
  2. Timezone設定
    (tzinfoを使うともっと簡単に書ける気がしますが、よくわからなかった)
  3. Event作成
  4. publish
  5. ファイルに書き出し

publishが無いとGoogleCalendarで取込み時にtimezoneがJSTとならないという問題がありました。
また、X-WR-CALNAME という拡張プロパティなものを追加しています。(AppleやMSだと有効でGoogleは反映されたりせれなかったり。)

 
こんなnot readableなファイルが生成されます。 ics sample

BEGIN:VCALENDAR
VERSION:2.0
PRODID:icalendar-ruby
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME;VALUE=TEXT:試合日程 長友佑都
BEGIN:VTIMEZONE
TZID:Asia/Tokyo
BEGIN:STANDARD
DTSTART:19700101T000000
TZOFFSETFROM:+0900
TZOFFSETTO:+0900
TZNAME:JST
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20140908T165219Z
UID:08250a71-9a86-411d-bb4e-147ab813f9dd
DTSTART:20140901T034500
DTEND:20140901T054500
DESCRIPTION:長友佑都 第1節 トリノ戦 [A]
SUMMARY:1節 トリノ
END:VEVENT
略

nginx周り

公開ディレクトリにicsを配置して、以下の設定を追加。

nginx.conf

charset UTF-8;

mime.types

    text/calendar                         ics;

GoogleCalendar

取込み

他のカレンダー > URLを追加
公開URLを入力するだけ。(X-WR-CALNAME で指定したカレンダー名を手動で修正しています)

こんな感じ

f:id:rochefort:20140909020917p:plain

公開カレンダー

rebuild.fm 見ていて気づいたのですがwebcalというプロトコルにすると対応するアプリケーションがある場合は、そのまま直で開いてくれます。例えばMacの場合はカレンダーアプリ。

カレンダー http webcal
長友佑都 GoogleCalendar iCalフィード
本田圭佑 GoogleCalendar iCalフィード
香川真司 GoogleCalendar iCalフィード