On ajoute un script pour expérimenter le développement de l'import d'ical
This commit is contained in:
parent
f9dd80a98a
commit
7a0cd494a2
1
.gitignore
vendored
1
.gitignore
vendored
@ -85,3 +85,4 @@ dmypy.json
|
||||
cython_debug/
|
||||
letsencrypt/
|
||||
experimentations/cache/
|
||||
experimentations/cache-augustes.ical
|
||||
|
124
experimentations/get_ical_events.py
Executable file
124
experimentations/get_ical_events.py
Executable file
@ -0,0 +1,124 @@
|
||||
#!/usr/bin/python3
|
||||
# coding: utf-8
|
||||
|
||||
|
||||
from abc import ABC, abstractmethod
|
||||
from urllib.parse import urlparse
|
||||
import urllib.request
|
||||
import os
|
||||
from selenium import webdriver
|
||||
from selenium.webdriver.chrome.service import Service
|
||||
from selenium.webdriver.chrome.options import Options
|
||||
import icalendar
|
||||
|
||||
|
||||
|
||||
|
||||
class Downloader(ABC):
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def download(self, url):
|
||||
pass
|
||||
|
||||
class SimpleDownloader(Downloader):
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
|
||||
def download(self, url):
|
||||
print("Downloading {}".format(url))
|
||||
|
||||
try:
|
||||
resource = urllib.request.urlopen(url)
|
||||
data = resource.read().decode(resource.headers.get_content_charset())
|
||||
return data
|
||||
except:
|
||||
return None
|
||||
|
||||
|
||||
|
||||
class ChromiumHeadlessDownloader(Downloader):
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
options = Options()
|
||||
options.add_argument("--headless=new")
|
||||
service = Service("/usr/bin/chromedriver")
|
||||
self.driver = webdriver.Chrome(service=service, options=options)
|
||||
|
||||
|
||||
def download(self, url):
|
||||
print("Download {}".format(url))
|
||||
|
||||
self.driver.get(url)
|
||||
return driver.page_source
|
||||
|
||||
|
||||
class Extractor(ABC):
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def extract(self, content, url, url_human = None):
|
||||
pass
|
||||
|
||||
|
||||
class ICALExtractor(Extractor):
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
def extract(self, content, url, url_human = None):
|
||||
print("Extracting ical events from {}".format(url))
|
||||
|
||||
calendar = icalendar.Calendar.from_ical(content)
|
||||
|
||||
for event in calendar.walk('VEVENT'):
|
||||
print(event)
|
||||
|
||||
return []
|
||||
|
||||
|
||||
|
||||
class URL2Events:
|
||||
|
||||
def __init__(self, downloader, extractor):
|
||||
|
||||
self.downloader = downloader
|
||||
self.extractor = extractor
|
||||
|
||||
|
||||
def process(self, url, url_human = None, cache = None):
|
||||
|
||||
if cache and os.path.exists(cache):
|
||||
print("Loading cache ({})".format(cache))
|
||||
with open(cache) as f:
|
||||
content = "\n".join(f.readlines())
|
||||
else:
|
||||
content = self.downloader.download(url)
|
||||
|
||||
if cache:
|
||||
print("Saving cache ({})".format(cache))
|
||||
dir = os.path.dirname(cache)
|
||||
if dir != "" and not os.path.exists(dir):
|
||||
os.makedirs(dir)
|
||||
with open(cache, "w") as text_file:
|
||||
text_file.write(content)
|
||||
|
||||
return self.extractor.extract(content, url, url_human)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
u2e = URL2Events(SimpleDownloader(), ICALExtractor())
|
||||
url = "https://calendar.google.com/calendar/ical/programmation.lesaugustes%40gmail.com/public/basic.ics"
|
||||
url_human = "https://www.cafelesaugustes.fr/la-programmation/"
|
||||
|
||||
events = u2e.process(url, url_human, cache = "cache-augustes.ical")
|
||||
|
||||
print(events)
|
Loading…
Reference in New Issue
Block a user