試合日程 - 長友 佑都 - 海外サッカー - サッカー - 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
こんな感じで使います。
- インスタンス作成
- Timezone設定
(tzinfoを使うともっと簡単に書ける気がしますが、よくわからなかった) - Event作成
- publish
- ファイルに書き出し
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 で指定したカレンダー名を手動で修正しています)
こんな感じ
公開カレンダー
rebuild.fm 見ていて気づいたのですがwebcalというプロトコルにすると対応するアプリケーションがある場合は、そのまま直で開いてくれます。例えばMacの場合はカレンダーアプリ。
カレンダー | http | webcal |
---|---|---|
長友佑都 | GoogleCalendar | iCalフィード |
本田圭佑 | GoogleCalendar | iCalフィード |
香川真司 | GoogleCalendar | iCalフィード |