cal.py
#!/usr/bin/env python3
import requests
from datetime import date
from datetime import timedelta
from icalendar import Calendar
MY_URI = "https://api.somtoday.nl/rest/v1/icalendar/stream/XXX/XXX"
YOUR_URI = "https://api.somtoday.nl/rest/v1/icalendar/stream/YYY/YYY"
def fetch_schedule(url):
response = requests.get(url)
if response.status_code == 200:
return response.text
raise Exception(f"Failed to fetch schedule, got: {response.status_code}")
def time_range(schedule, date):
calendar = Calendar.from_ical(schedule)
events = []
for component in calendar.walk('vevent'):
event = {
"start": component.get('dtstart').dt,
"end": component.get('dtend').dt
}
if event['start'].date() == date:
events.append(event)
if not events:
# No events for this day
return None, None
else:
events = sorted(events, key=lambda e: e['start'])
return events[0], events[-1]
my_schedule = fetch_schedule(MY_URI)
your_schedule = fetch_schedule(YOUR_URI)
now = date.today()
for i in range(0, 7):
date = now + timedelta(days=i)
my_first, my_last = time_range(my_schedule, date)
your_first, your_last = time_range(your_schedule, date)
if not my_first or not my_last or not your_first or not your_last:
continue
if my_first['start'].time() == your_first['start'].time():
print(f'{date} {my_first['start'].time()}')
if my_last['end'].time() == your_last['end'].time():
print(f'{date} {my_last['end'].time()}')
Script that given two Somtoday iCalendar URLs, calculates which days in the following week have matching first and last hours.