2019年5月6日月曜日

pythonでicalendarを試してみた(parseだけ)

khal のコマンド作成の スクリプトを作ってはみたが、登録が重複するのはまずいので、 登録済かどうか確認するのに、 icalendar を使ってみた。

khal は ローカルにファイルを保管していてサーバとのやり取りは無いので、 やってみる気になった。しかも、parseだけ出来ればよいので。

#!~/.pyenv/shims/python
"""Read and Check ical data file."""

from __future__ import unicode_literals

import sys
import logging
from pathlib import Path

import logzero
from icalendar import Calendar


def parse_icalfile(f_path, ride_log):
    """Parse icalendar file."""
    cal_fobj = open(f_path, 'rb')
    k_calen = Calendar.from_ical(cal_fobj.read())
    cal_fobj.close()
    for cal_ev in k_calen.walk():
        if cal_ev.name == 'VEVENT':
            start_year = cal_ev.get('dtstart').dt.strftime("%Y")
            ride_log[start_year].append(k_calen)

    return ride_log


def sel_event_list(ride_log, t_day):
    """Select events by target date character."""
    event_list = []
    for ical_obj in ride_log[t_day[0:4]]:
        for cal_ev in ical_obj.walk():
            if cal_ev.name == 'VEVENT':
                summary = cal_ev.get('summary', default='None')
                descrip = cal_ev.get('description', default='None')
                start_dt = cal_ev.get('dtstart').dt
                end_dt = cal_ev.get('dtend').dt
                event_item = "{0:s}{1:s}:{2:s}({3:s})".format(
                    start_dt.strftime("%Y%m%d%H%M"),
                    end_dt.strftime("%m%d%H%M"), summary, descrip[0:20]
                )
                event_list.append(event_item)

    logzero.logger.info("- All entry {0:s}".format(t_day[0:4]))
    for s_str in sorted(event_list):
        logzero.logger.info(s_str)

    c_event = [e for e in sorted(event_list) if e[0:len(t_day)] == t_day]

    return sorted(c_event)


def main():
    """Do main prcess."""
    #
    khal_dir = Path.home() / "Documents/ownCloud/caldav/bikes/"

    ride_log = {
        "2016": [], "2017": [], "2018": [], "2019": [], "2020": []
    }

    for f_path in khal_dir.glob('*'):
        ride_log = parse_icalfile(f_path, ride_log)

    t_date = '20190412'

    target_ev_list = sel_event_list(ride_log, t_date)

    if target_ev_list == []:
        logzero.logger.info("- No entry on {0:s}".format(t_date))
    else:
        logzero.logger.info("- target {0:s}".format(t_date))
        for mes_str in target_ev_list:
            logzero.logger.info("  {0:s}".format(mes_str))


if __name__ == "__main__":

    LOG_FORMAT = "%(color)s[%(module)s:%(lineno)d]%(end_color)s %(message)s"
    FORMATTER = logzero.LogFormatter(fmt=LOG_FORMAT)
    logzero.setup_default_logger(formatter=FORMATTER)
    logzero.loglevel(logging.INFO)
    logzero.logfile("./_logs/log.log", maxBytes=3e5, backupCount=3)

    main()
    sys.exit()
#

まずまずなのだが、 登録済確認をスクリプト内で出来れば良いのだが、 私には無理なので、目視確認とした。

gpxのログを読み込んで、その概要を掃き出すスクリプトを改造して、 khalコマンドとicalendarの作成と併せて、確認させてみた結果の例が以下。

# Check 015: 2019-04-26 09.10.03 Day.gpx
- time (2019-04-26 09:10:03 JST) - (2019-04-26 16:30:22 JST)
- trip 101.0km(382 + (stop 58)min) ave. 15.9km/hr u/d(495.9/551.6)
- farthest 32.9km SE

    $ khal new -a bikes 20190426 09:10 440m ride 101.0k SE32k :: 奈良県天理市

- Bike event 20190426
  20190426091004261630:ride 101.0k SE32k(奈良県天理市 by gpl2cal.py)

# Check 016: 2019-05-03 17.48.26 Day.gpx
- time (2019-05-03 07:53:35 JST) - (2019-05-03 17:47:44 JST)
- trip 147.6km(493 + (stop 64)min) ave. 18.0km/hr u/d(739.2/693.1)
- farthest 53.5km EE

    $ khal new -a bikes 20190503 07:53 557m ride 147.6k EE53k :: 滋賀県東近江市

- Bike event 20190503
  None

コンソール上のコピペで作業ができるので良しとする。

0 件のコメント:

コメントを投稿

麻のボディタオル

2018年の秋(まだ、自転車を封印してない)、 近江上布伝統産業会館 で、興味からボディタオルを購入した。 お、よかった。: 自然派パン工房 ふるさとの道 ほぼ毎日風呂で使ってきて、ついに寿命がきたようだ。 お店の方に、「糸が痩せて破れてくる」まで使える、と...