#!/bin/python3
#lumbung.space calendar feed generator
#© 2021 roel roscam abbing gplv3 etc
from ics import Calendar
import requests
import jinja2
import os
import shutil
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
}
if event . uid not in existing_posts : #if there is an event we dont already have, make it
post_dir = os . path . join ( output_dir , event . uid )
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 )
print ( ' created post for ' , event . name , ' ( {} ) ' . format ( event . uid ) )
elif event . uid in existing_posts : #if we already have it, update
existing_posts . remove ( event . uid ) # create list of posts which have not been returned by the calendar
#FIXME: An update logic? e.g. exists but creation date is altered.
print ( event . uid , ' already exists ' )
for post in existing_posts : #remove events that have been deleted
print ( ' deleted ' , post ) #rm posts not returned
shutil . rmtree ( os . path . join ( output_dir , post ) )