Created
January 15, 2020 21:13
-
-
Save stackcoder/a729788902f5f33e2cca475657c21b6b to your computer and use it in GitHub Desktop.
Import a ics file into your CalDav Server
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
import logging | |
import sys | |
import vobject | |
import requests | |
from requests.auth import HTTPBasicAuth | |
from requests.packages.urllib3.poolmanager import PoolManager | |
# https://stackoverflow.com/questions/26479039/python-requests-direct-pem-pinning-with-self-signed-cert | |
class _FingerprintAdapter(requests.adapters.HTTPAdapter): | |
def __init__(self, fingerprint=None, **kwargs): | |
self.fingerprint = str(fingerprint) | |
super(_FingerprintAdapter, self).__init__(**kwargs) | |
def init_poolmanager(self, connections, maxsize, block=False): | |
self.poolmanager = PoolManager( | |
num_pools=connections, | |
maxsize=maxsize, | |
block=block, | |
assert_fingerprint=self.fingerprint) | |
class CalDavImporter(): | |
def __init__(self): | |
self.dav_url = 'https://caldav.example.com' | |
self.dav_session = requests.Session() | |
self.dav_session.auth = HTTPBasicAuth('<user>', '<pass>') | |
self.dav_session.mount(self.dav_url, _FingerprintAdapter('<certificate fingerprint>')) | |
self.dav_session.verify = False | |
def download_ics(self, url: str): | |
r = requests.get(url, stream=True) | |
return vobject.readOne(r.text) | |
def dav_upload(self, prefix: str, vevent): | |
uid = vevent.getChildValue('uid') | |
if len(uid) < 5: | |
logging.warning("Reject uploading uid: %s" % uid) | |
return | |
cal = vobject.newFromBehavior('vcalendar') | |
cal.vevent = vevent | |
self.dav_session.put("%s/%s_%s.ics" % (self.dav_url, prefix, uid), | |
data=cal.serialize(), | |
headers={'Content-Type': 'text/calendar'}) | |
def update_calendar(self, prefix: str, url: str): | |
cal = self.download_ics(url) | |
events = [] | |
for e in cal.getChildren(): | |
if e.name == 'VEVENT': | |
events.append(e) | |
for e in events: | |
self.dav_upload(prefix, e) | |
if __name__ == '__main__': | |
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) | |
importer = CalDavImporter() | |
importer.update_calendar('<prefix>', 'https://download.example.com/file-to-import.ics') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment