On ajoute un script pour expérimenter le développement de l'import d'ical
This commit is contained in:
		
							
								
								
									
										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)
 | 
			
		||||
		Reference in New Issue
	
	Block a user