Reputation: 31
I am extremely new to python and icalendar but I am trying to grab my icalendar from Apple's Icloud website and then be able to access the calendar information so that I can display it on an app. I am able to get any event from the calendar that isn't reoccurring, but it only gets those events and for some reason skips over the reoccurring ones (which is basically the only type of events I schedule now of days) This is the code that I currently have, any ideas on how to get reoccurring events?
from icalendar import Calendar, Event
import urllib.request
def getCalendar():
urlHome = urllib.request.urlopen('https://p10-calendarws.icloud.com/ca/subscribe/1/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX').read()
return urlHome
def displayCalendar(calendar):
showCalHome = Calendar.from_ical(calHome)
for event in showCalHome.walk('VEVENT'):
date = event.get('dtstart').dt
summary = event.get('summary')
print(summary,date)
calendar = getCalendar()
displayCalendar(calendar)
Any thoughts or ideas on what I can do to not only get a list of single events, but also reoccurring events?
Upvotes: 1
Views: 2935
Reputation: 14873
I created a library because I was looking for the exact same use-case.
In your case, recurring-ical-events
could be embedded like this:
events = recurring_ical_events.of(calendar).between(start_date, end_date)
for event in events:
# ...
Upvotes: 1
Reputation: 31
Figured it out by parsing through the ICS file itself, turning alot of values into strings and then comparing the strings to what I was looking for, looked something like this:
import json
import requests
from icalendar import Calendar, Event
import urllib.request
from datetime import *
import datetime
from dateutil.rrule import *
def getCalendar():
urlWork = urllib.request.urlopen('https://p10-calendarws.icloud.com/ca/subscribe/1/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX').read()
urlHome = urllib.request.urlopen('https://p10-calendarws.icloud.com/ca/subscribe/1/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX').read()
calendars = [urlHome, urlWork]
return calendars
def getTodaysEvents(calendars):
calHome = calendars[0]
calWork = calendars[1]
allEvents = []
singleEvents = {}
homeEvents = {}
workEvents = {}
today = str(date.today())
year = today[0:4]
month = today[5:7]
day = today[8:10]
currentDay = year + month + day
showCalHome = Calendar.from_ical(calHome)
for component in showCalHome.walk():
if component.name == "VEVENT":
rule = component.get('rrule')
eventDay = str(component.get('dtstart').dt)
if rule is not None:
rrule = dict(rule)
if 'UNTIL' in rrule.keys():
eventEnd = str(rrule['UNTIL'][0])
eventEndYear = eventEnd[0:4]
eventEndMonth = eventEnd[5:7]
eventEndDay = eventEnd[8:10]
endEvent = eventEndYear + eventEndMonth + eventEndDay
if int(endEvent) >= int(currentDay):
print(component.get('summary'))
homeEvents['CALENDAR'] = "HOME"
homeEvents['SUMMARY'] = (component.get('summary'))
homeEvents['LOCATION'] = (component.get('location'))
homeEvents['START'] = (component.get('dtstart').dt)
homeEvents['END'] = (component.get('dtend').dt)
allEvents.append(homeEvents)
# else: (NEED TO IMPLEMENT WEEKLY EVENTS THAT DON'T END and Events that aren't Reoccuring)
# print(component.get('summary'))
# if component.get('location') != 'None':
# print(component.get('location'))
# print(component.get('dtstart').dt)
# print(component.get('dtend').dt)
else:
if str(date.today()) == eventDay[0:10]:
print(component.get('summary'))
singleEvents['CALENDAR'] = "HOME"
singleEvents['SUMMARY'] = (component.get('summary'))
singleEvents['LOCATION'] = (component.get('location'))
singleEvents['START'] = (component.get('dtstart').dt)
singleEvents['END'] = (component.get('dtend').dt)
allEvents.append(singleEvents)
print(allEvents)
showCalWork = Calendar.from_ical(calWork)
for component in showCalWork.walk():
if component.name == "VEVENT":
rule = component.get('rrule')
if rule is not None:
rrule = dict(rule)
today = str(date.today())
year = today[0:4]
month = today[5:7]
day = today[8:10]
currentDay = year + month + day
if 'UNTIL' in rrule.keys():
eventEnd = str(rrule['UNTIL'][0])
eventEndYear = eventEnd[0:4]
eventEndMonth = eventEnd[5:7]
eventEndDay = eventEnd[8:10]
endEvent = eventEndYear + eventEndMonth + eventEndDay
if int(endEvent) >= int(currentDay):
workEvents['CALENDAR'] = "WORK"
workEvents['SUMMARY'] = (component.get('summary'))
workEvents['LOCATION'] = (component.get('location'))
workEvents['START'] = (component.get('dtstart').dt)
workEvents['END'] = (component.get('dtend').dt)
allEvents.append(workEvents)
# else:
# print(component.get('summary'))
# if component.get('location') != 'None':
# print(component.get('location'))
# print(component.get('dtstart').dt)
# print(component.get('dtend').dt)
return allEvents
def displayEvents(events):
print(events)
print()
print("TODAY:")
for event in range(len(events)):
start = str(events[event]['START'])[11:16]
end = str(events[event]["END"])[11:16]
if int(start[0:2]) < 12:
sT = "AM"
else:
pmtime = int(start[0:2]) - 12
start[0:2].replace(start[0:2], str(pmtime))
sT = "PM"
if int(end[0:2]) < 12:
eT = "AM"
else:
pmtime = int(end[0:2]) - 12
end = str(pmtime) + end[2:5]
eT = "PM"
print(events[event]['SUMMARY'] + " - " + events[event]["CALENDAR"])
if str(events[event]['LOCATION']) != "None":
print(events[event]['LOCATION'])
if start[0] == "0" and end[0] == "0":
print(start[1:5] + sT + " - " + end[1:5] + eT)
elif start[0] == "0":
print(start[1:5] + sT + " - " + end + eT)
elif end[0] == "0":
print(start + sT + " - " + end[1:5] + eT)
else:
print(start + sT + " - " + end + eT)
calendars = getCalendar()
events = getTodaysEvents(calendars)
displayEvents(events)
Upvotes: 1