parent
6355530f77
commit
62376524ee
3 changed files with 80 additions and 3 deletions
@ -0,0 +1,75 @@ |
|||||||
|
#!/usr/bin/env python |
||||||
|
|
||||||
|
import sys |
||||||
|
import warnings |
||||||
|
import vobject |
||||||
|
import datetime |
||||||
|
|
||||||
|
|
||||||
|
def get_invitation_from_path(path): |
||||||
|
with open(path) as f: |
||||||
|
try: |
||||||
|
# vobject uses deprecated Exceptions |
||||||
|
with warnings.catch_warnings(): |
||||||
|
warnings.simplefilter("ignore") |
||||||
|
return vobject.readOne(f, ignoreUnreadable=True) |
||||||
|
except AttributeError: |
||||||
|
return vobject.readOne(f, ignoreUnreadable=True) |
||||||
|
|
||||||
|
|
||||||
|
def person_string(c): |
||||||
|
return "{} {}".format(c.params['CN'][0], "<%s>" % c.value.split(':')[1]) |
||||||
|
|
||||||
|
|
||||||
|
def when_str_of_start_end(s, e): |
||||||
|
datetime_format = "%a, %d %b %Y at %H:%M" |
||||||
|
|
||||||
|
# sometimes, s and e can be dates only, so convert them to datetimes |
||||||
|
if type(s) == datetime.date: |
||||||
|
s = datetime.datetime.combine(s, datetime.time.min) |
||||||
|
if type(e) == datetime.date: |
||||||
|
e = datetime.datetime.combine(e, datetime.time.min) |
||||||
|
|
||||||
|
until_format = "%H:%M %Z" if s.date() == e.date() else datetime_format |
||||||
|
return "{} -- {}".format(s.strftime(datetime_format), e.strftime(until_format)) |
||||||
|
|
||||||
|
|
||||||
|
def pretty_print_invitation(invitation): |
||||||
|
event = invitation.vevent.contents |
||||||
|
title = event['summary'][0].value |
||||||
|
org = event['organizer'][0] if 'organizer' in event else None |
||||||
|
invitees = event['attendee'] if 'attendee' in event else None |
||||||
|
start = event['dtstart'][0].value |
||||||
|
end = event['dtend'][0].value |
||||||
|
location = event['location'][0].value if 'location' in event else None |
||||||
|
description = event['description'][0].value if 'description' in event else None |
||||||
|
sequence = event['sequence'][0].value if 'sequence' in event else None |
||||||
|
rrule = event['rrule'][0].value if 'rrule' in event else None |
||||||
|
print("="*70) |
||||||
|
if sequence is not None and int(sequence) > 0: |
||||||
|
print("MEETING UPDATE".center(70)) |
||||||
|
else: |
||||||
|
print("MEETING INVITATION".center(70)) |
||||||
|
print("="*70) |
||||||
|
print("Event:\n\t{}".format(title)) |
||||||
|
if org: |
||||||
|
print("Organiser:\n\t{}".format(person_string(org))) |
||||||
|
if invitees: |
||||||
|
print("Invitees:") |
||||||
|
for i in invitees: |
||||||
|
print("\t{}".format(person_string(i))) |
||||||
|
print("When:\n\t{}".format(when_str_of_start_end(start, end))) |
||||||
|
if rrule: |
||||||
|
print("Rrule:\n\t{}".format(rrule)) |
||||||
|
if location: |
||||||
|
print("Location:\n\t{}".format(location)) |
||||||
|
if description: |
||||||
|
print("---\n{}\n---".format(description)) |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
if len(sys.argv) != 2 or sys.argv[1].startswith('-'): |
||||||
|
sys.stderr.write("Usage: %s <filename.ics>\n".format(sys.argv[0])) |
||||||
|
sys.exit(2) |
||||||
|
inv = get_invitation_from_path(sys.argv[1]) |
||||||
|
pretty_print_invitation(inv) |
@ -1,5 +1,6 @@ |
|||||||
text/html; $BROWSER %s |
text/html; $BROWSER %s |
||||||
text/html; w3m -I %{charset} -T text/html -dump; copiousoutput; |
text/html; w3m -I %{charset} -T text/html -dump; copiousoutput; |
||||||
|
text/calendar; dump-ical %s; copiousoutput; |
||||||
image/*; sxiv -a -b %s & |
image/*; sxiv -a -b %s & |
||||||
video/*; setsid mpv --quiet %s & |
video/*; setsid mpv --quiet %s & |
||||||
application/pdf; zathura %s & |
application/pdf; zathura %s & |
||||||
|
Loading…
Reference in new issue