Skip to content

Instantly share code, notes, and snippets.

@stackcoder
Created January 15, 2020 21:13
Show Gist options
  • Save stackcoder/a729788902f5f33e2cca475657c21b6b to your computer and use it in GitHub Desktop.
Save stackcoder/a729788902f5f33e2cca475657c21b6b to your computer and use it in GitHub Desktop.
Import a ics file into your CalDav Server
#!/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