#!/usr/bin/python3 import sys import os from icalendar import Calendar, Event def dtstrs(start, end): start, end = start.dt, end.dt def strftime(dt, strf): return dt.astimezone().strftime(strf) ret = [] if start.tzinfo == end.tzinfo: ret.append(strftime(start, '%F %R')) else: ret.append(strftime(start, '%F %R %Z')) if start.date() == end.date(): ret.append(strftime(end, '%T %Z')) else: ret.append(strftime(end, '%F %R %Z')) return ret def parse_ics_file(fp): cal = Calendar.from_ical(fp.read()) for event in cal.walk(): if event.name != "VEVENT": continue print('=' * (int(os.getenv('COLUMNS', 80))-10)) print('{} → {}'.format(*dtstrs(event.get('dtstart'), event.get('dtend')))) for i in ('summary','organizer','location','rrule'): print(' {:9s}: {}'.format(i.capitalize(), event.get(i, f'(no {i})'))) flags = [] for k in ('status', 'class', 'transp', 'priority'): t = event.get(k) if t: flags.append((k, t)) print(' Flags : ' + ' '.join('{}:{}'.format(*f) for f in flags)) if __name__ == '__main__': if len(sys.argv) > 1: for f in sys.argv[1:]: fp = open(f) parse_ics_file(fp) fp.close() else: parse_ics_file(sys.stdin)