Python
icalendar

JRA公開の重賞スケジュールを「予定なし」でGoogleカレンダーに取り込む

はじめにの前に

※今年(2018年)1月に自分のブログに公開した内容ですが、2019年カレンダーがJRAから公開されていましたので、それに合わせてこちらでも加筆した上で、記事を載せさせていただきます。

iCalendar形式ファイルのイベントを「予定なし」にする

はじめに

皆さん、競馬、楽しんでますか?(笑)

中央競馬の重賞日程と開催日程に関して、日本中央競馬会(JRA)が、Googleカレンダー等に取り込めるようにiCalendar形式でカレンダーを提供してくれています。

他のカレンダーと連携する:レーシングカレンダー JRA

ありがたく使わせていただこうとしていたのですが、実際にGoogleカレンダーに取り込んでみると「予定あり」として取り込まれてしまいます。

どうでもいいと言えばいいのですが、「予定なし」で取り込みたかったため、ちょっと公開されているファイルを書き直すツールを作ってみました。

「予定あり」となってしまう理由

これは各イベントで「TRANSP:OPAQUE」という指定がされているため。
ここを「TRANSP:TRANSPARENT」に書き換えてあげると「予定なし」として取り込むことができます。

ということで、この書き換えをするプログラムを作ってみました。

※なお、iCalendar形式の内容はこちらの説明がわかりやすかったです。

実装内容

説明するよりソースを見てもらう方がわかりやすいと思うので、いきなり実装内容です。
ちなみにgithubにもソースは置いてあります。

ソースを見ていただければわかるようにicalendarというライブラリを使っていますが、これはpipでインストール可能です。

ics_tofree.py
"""Calendarファイル(.ics)内のイベントをすべて「予定なし」に書き換える."""
import argparse
from icalendar import Calendar
import sys


def update_transp(cal, transp):
    """VEVENTコンポーネントのTRANSPプロパティを指定のものに書き換える."""
    for ev in cal.walk():
        if ev.name == 'VEVENT':
            ev['TRANSP'] = transp


def main():
    """メイン関数."""
    parser = argparse.ArgumentParser()
    parser.add_argument('input', nargs='?',
                        type=argparse.FileType(mode='r'), default=sys.stdin)
    parser.add_argument('-o', '--output', nargs='?',
                        type=argparse.FileType(mode='w'), default=sys.stdout)
    args = parser.parse_args()

    cal = Calendar.from_ical(args.input.read())
    update_transp(cal, 'TRANSPARENT')

    args.output.write(cal.to_ical().decode('utf-8'))


if __name__ == '__main__':
    main()

動作確認環境

Python 3.6.4
iCalendar 4.0.0
(2018年1月時点)

Python 3.7.1
iCalendar 4.0.3
(2018年11月時点)

最後に

競馬もコンピュータを使って快適に楽しみましょう!(笑)