-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathshare.py
66 lines (55 loc) · 2.15 KB
/
share.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import pathlib
import datetime as dt
from requests_html import AsyncHTMLSession
from bs4 import BeautifulSoup
from cairosvg import svg2png
import pyppeteer
import logging
SHARE_FOLDER = "static/share"
class AsyncHTMLSessionFixed(AsyncHTMLSession):
"""
pip3 install websockets==6.0 --force-reinstall
"""
def __init__(self, **kwargs):
super(AsyncHTMLSessionFixed, self).__init__(**kwargs)
self.__browser_args = kwargs.get("browser_args", ["--no-sandbox"])
@property
async def browser(self):
if not hasattr(self, "_browser"):
self._browser = await pyppeteer.launch(
ignoreHTTPSErrors=not(self.verify),
headless=True,
handleSIGINT=False,
handleSIGTERM=False,
handleSIGHUP=False,
args=self.__browser_args
)
return self._browser
async def share_svg(tile, options, request):
logger = logging.getLogger()
filename = get_tile_filename(tile, options)
share_path = pathlib.Path(SHARE_FOLDER) / filename
if share_path.exists():
return str(share_path)
session = AsyncHTMLSessionFixed()
if tile == 6:
options_path = f"header=true&date={dt.datetime.strptime(options['date'], '%d.%m.%Y').date().isoformat()}"
else:
options_path = "&".join(f"{k}={v}" for k, v in options.items())
share_url = f'{request.host_url}{tile}?{options_path}'
logger.info(f"Requesting share for '{share_url}'")
r = await session.get(share_url)
logger.info("Rendering html for share url")
sleep = 5 if tile == 6 else 2 # SMARD data needs time to render
await r.html.arender(sleep=sleep)
soup = BeautifulSoup(r.html.html, features="lxml")
svg = soup.find("svg")
logger.info(f"Saving svg as png to '{share_path}'")
svg2png(bytestring=svg.prettify(), write_to=str(share_path))
return str(share_path)
def get_tile_filename(tile, options):
if tile == 6:
date = dt.datetime.strptime(options['date'], "%d.%m.%Y").date()
return f"t{tile}_{date.isoformat()}.png"
option_str = "_".join(options.values())
return f"t{tile}_{option_str}.png"