You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
2.0 KiB
74 lines
2.0 KiB
3 years ago
|
#!/bin/python3
|
||
|
|
||
|
#lumbung.space calendar feed generator
|
||
|
#© 2021 roel roscam abbing gplv3 etc
|
||
|
|
||
|
from ics import Calendar
|
||
|
import requests
|
||
|
import jinja2
|
||
|
import os
|
||
|
from slugify import slugify
|
||
|
from natural import date
|
||
|
from event_feed_config import calendar_url, output_dir
|
||
|
|
||
|
cal = Calendar(requests.get(calendar_url).text)
|
||
|
|
||
|
env = jinja2.Environment(
|
||
|
loader=jinja2.FileSystemLoader(os.path.curdir)
|
||
|
)
|
||
|
|
||
|
if not os.path.exists(output_dir):
|
||
|
os.mkdir(output_dir)
|
||
|
|
||
|
template = env.get_template('event_template.md')
|
||
|
|
||
|
existing_posts = os.listdir(output_dir)
|
||
|
|
||
|
|
||
|
# Dates need to be displayed for the various TZs
|
||
|
# 3 PM Kassel, Germany, 4 PM Ramallah/Jerusalem, Palestina (QoF),
|
||
|
# 8 AM Bogota, Colombia (MaMa), 8 PM Jakarta, Indonesia (Gudskul),
|
||
|
# 1 PM (+1day) Wellington, New Zealand (Fafswag), 9 AM Havana, Cuba (Instar).
|
||
|
|
||
|
tzs = [
|
||
|
('Kassel','Europe/Berlin'),
|
||
|
('Bamako', 'Europe/London'),
|
||
|
('Palestine','Asia/Jerusalem'),
|
||
|
('Bogota','America/Bogota'),
|
||
|
('Jakarta','Asia/Jakarta'),
|
||
|
('Makassar','Asia/Makassar'),
|
||
|
('Wellington', 'Pacific/Auckland')
|
||
|
]
|
||
|
|
||
|
for event in list(cal.events):
|
||
|
|
||
|
localized_begins =[]
|
||
|
for i in tzs:
|
||
|
localized_begins.append( #javascript formatting because of string creation from hell
|
||
|
'__{}__ {}'.format(
|
||
|
str(i[0]),
|
||
|
str(event.begin.to(i[1]).format("YYYY-MM-DD HH:mm"))
|
||
|
)
|
||
|
)
|
||
|
|
||
|
|
||
|
event_metadata = {
|
||
|
'name':event.name,
|
||
|
'created':event.created.format(),
|
||
|
'description': event.description,
|
||
|
'begin': ' '.join(localized_begins), #non-breaking space characters to defeat markdown
|
||
|
'end': event.end.format(),
|
||
|
'duration': date.compress(event.duration),
|
||
|
'location': event.location
|
||
|
}
|
||
|
|
||
|
#FIXME: There is no deletion logic
|
||
|
#FIXME: figure out how to use legible yet unique post names
|
||
|
#FIXME: An update logic?
|
||
|
post_dir = os.path.join(output_dir, slugify(event.name)) + '-' + slugify(event.begin.format("YYYY-MM-DD"))
|
||
|
if not os.path.exists(post_dir):
|
||
|
os.mkdir(post_dir)
|
||
|
|
||
|
with open(os.path.join(post_dir,'index.md'),'w') as f:
|
||
|
post = template.render(event = event_metadata)
|
||
|
f.write(post)
|