1
0
mirror of https://github.com/javierpena/eink-calendar.git synced 2024-11-24 08:12:33 +02:00

Add iCal support for calendars

We can now use an iCal URL as well as a CalDav one. iCal URLs are
identified by a trailing ".ics" for now.
This commit is contained in:
Javier Pena 2022-03-17 16:36:10 +01:00
parent 71fc4f8e37
commit dd2a1b79a4
5 changed files with 59 additions and 12 deletions

View File

@ -39,7 +39,7 @@ owm_api_key = <insert API key here>
owm_location = <insert location id here> owm_location = <insert location id here>
[calendar] [calendar]
urls = http://example.com/caldavcal1, http://example.com/caldavcal2, http://example.com/caldavcal3 urls = http://example.com/caldavcal1, http://example.com/caldavcal2, http://example.com/ical3.ics
names = user1, user2, user3 names = user1, user2, user3
username = user username = user
password = password password = password
@ -62,19 +62,24 @@ location id for your town, add them to the `owm_api_key` and `owm_location` keys
the configuration file. the configuration file.
### Calendar configuration ### Calendar configuration
You can use any CalDav link; in my case, I set up 3 calendars in a [Synology](https://www.synology.com) You can use any CalDav or iCal link; in my case, I set up 3 calendars in a [Synology](https://www.synology.com)
DiskStation using Synology Calenar. The code should adapt to any number of calendars, DiskStation using Synology Calendar. The code should adapt to any number of calendars,
but keep in mind the resolution and font size. but keep in mind the resolution and font size.
The `urls` parameter is a comma-separated list of CalDav URLs. Since each of those The `urls` parameter is a comma-separated list of CalDav or iCal URLs. Currently,
calendars will correspond to an actual person, `names` will contain the list of iCal URLs are identified by a trailing `.ics` in the calendar URL. This may be
names for each url. Make sure you spefify the same number of URLs and names. improved in the future.
Since each of those calendars will correspond to an actual person, `names` will
contain the list of names for each url. Make sure you spefify the same number
of URLs and names.
The `username` and `password` fields are self-explaining: include the user and The `username` and `password` fields are self-explaining: include the user and
password to access the calendars. password to access the calendars, only for CalDav URLs.
If you want to use a different type of calendar, such as Google Calendar, you If you want to use a different type of calendar, such as Google Calendar, you
will need to create a new driver. Patches are welcome :). will need to create a new driver. However, it is possible to export a read-only,
secret address for your Google Calendar following [this guide](https://support.google.com/calendar/answer/37648?hl=en#zippy=%2Cget-your-calendar-view-only).
## Running ## Running
The scripts directory contains a simple launcher script using a virtual environment, The scripts directory contains a simple launcher script using a virtual environment,

View File

@ -13,8 +13,8 @@ owm_api_key = <insert API key here>
owm_location = <insert location id here> owm_location = <insert location id here>
[calendar] [calendar]
# URL of all caldav calendars, separated by commas # URL of all caldav or iCal calendars, separated by commas
urls = http://example.com/caldavcal1, http://example.com/caldavcal2, http://example.com/caldavcal3 urls = http://example.com/caldavcal1, http://example.com/caldavcal2, http://example.com/ical3.ics
names = user1, user2, user3 names = user1, user2, user3
username = user username = user
password = password password = password

29
drivers/icalprovider.py Normal file
View File

@ -0,0 +1,29 @@
from datetime import datetime
from icalevents import icalevents
import icalendar
import pytz
import urllib3
urllib3.disable_warnings()
class ICalProvider():
def __init__(self):
self.tz = pytz.timezone('Europe/Madrid')
def get_calendar(self, url, date_start, date_end):
#print("%s %s" % (date_start, date_end))
returned_events = []
try:
events_found = icalevents.events(url=url, start=date_start, end=date_end)
if events_found:
for event in events_found:
single_event = {}
single_event['event_start'] = event.start.astimezone(self.tz)
single_event['event_end'] = event.end.astimezone(self.tz)
single_event['event_title'] = event.summary
returned_events.append(single_event)
except Exception:
pass
return returned_events

View File

@ -9,6 +9,7 @@ import sys
import time import time
from drivers.caldavprovider import CalDavProvider from drivers.caldavprovider import CalDavProvider
from drivers.icalprovider import ICalProvider
from widgets.calendarwidget import CalendarWidget from widgets.calendarwidget import CalendarWidget
from widgets.timewidget import TimeWidget from widgets.timewidget import TimeWidget
from widgets.weatherwidget import WeatherWidget from widgets.weatherwidget import WeatherWidget
@ -22,13 +23,18 @@ def today_calendar():
fullimg.paste(timewidget.get_time(), box=(128, 0)) fullimg.paste(timewidget.get_time(), box=(128, 0))
calendar = CalendarWidget(family_names) calendar = CalendarWidget(family_names)
event_getter = CalDavProvider(calendar_username, calendar_password) event_getter = CalDavProvider(calendar_username, calendar_password)
ical_event_getter = ICalProvider()
test_event_list = [] test_event_list = []
today_start = datetime.now().replace(hour=8, minute=0, second=0, microsecond=0) today_start = datetime.now().replace(hour=8, minute=0, second=0, microsecond=0)
today_end = today_start.replace(hour=21, minute=0, second=0, microsecond=0) today_end = today_start.replace(hour=21, minute=0, second=0, microsecond=0)
for url in calendar_list: for url in calendar_list:
test_event_list.append(event_getter.get_calendar(url, today_start, today_end)) if url.endswith('.ics'):
# This is an iCal URL
test_event_list.append(ical_event_getter.get_calendar(url, today_start, today_end))
else:
test_event_list.append(event_getter.get_calendar(url, today_start, today_end))
img1, img2 = calendar.get_calendar(test_event_list) img1, img2 = calendar.get_calendar(test_event_list)
fullimg.paste(img1, box=(0, 80)) fullimg.paste(img1, box=(0, 80))
fullimg2.paste(img2, box=(0, 80)) fullimg2.paste(img2, box=(0, 80))
@ -42,6 +48,7 @@ def week_calendar(calid, name):
timewidget = TimeWidget() timewidget = TimeWidget()
fullimg.paste(timewidget.get_time(), box=(128, 0)) fullimg.paste(timewidget.get_time(), box=(128, 0))
event_getter = CalDavProvider(calendar_username, calendar_password) event_getter = CalDavProvider(calendar_username, calendar_password)
ical_event_getter = ICalProvider()
test_event_list = [] test_event_list = []
today = datetime.today() today = datetime.today()
@ -49,7 +56,12 @@ def week_calendar(calid, name):
curdate = curdate.replace(hour=8, minute=0, second=0, microsecond=0) curdate = curdate.replace(hour=8, minute=0, second=0, microsecond=0)
for day in range(7, 12): for day in range(7, 12):
test_event_list.append(event_getter.get_calendar(calendar_list[calid], curdate, curdate.replace(hour=21))) if calendar_list[calid].endswith('.ics'):
# iCal calendar
test_event_list.append(ical_event_getter.get_calendar(calendar_list[calid], curdate, curdate.replace(hour=21)))
else:
# CalDAV
test_event_list.append(event_getter.get_calendar(calendar_list[calid], curdate, curdate.replace(hour=21)))
curdate = curdate + timedelta(days=1) curdate = curdate + timedelta(days=1)
calendar = CalendarWidget(['L', 'M', 'X', 'J', 'V']) calendar = CalendarWidget(['L', 'M', 'X', 'J', 'V'])

View File

@ -1,5 +1,6 @@
caldav caldav
icalendar icalendar
icalevents
pygame pygame
pillow pillow
pyowm pyowm