add screenshotter test
This commit is contained in:
parent
0d982d5438
commit
a788e8d2d1
8 changed files with 148 additions and 0 deletions
17
screenshotter/Dockerfile
Normal file
17
screenshotter/Dockerfile
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
ARG BUILD_FROM=ghcr.io/hassio-addons/base-python/amd64:9.0.1
|
||||||
|
FROM ${BUILD_FROM}
|
||||||
|
|
||||||
|
RUN apk add --no-cache zlib-dev libjpeg-turbo-dev gcc chromium chromium-chromedriver
|
||||||
|
|
||||||
|
ADD rootfs /
|
||||||
|
|
||||||
|
RUN chmod 644 /usr/share/fontconfig/conf.avail/10-antialiasing.conf
|
||||||
|
RUN ln -s /usr/share/fontconfig/conf.avail/10-antialising.conf /etc/fonts/conf.d/10-antialiasing.conf
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
RUN pip3 install -r requirements.txt
|
||||||
|
|
||||||
|
# Corrects permissions for s6 v3
|
||||||
|
RUN if [ -d /etc/cont-init.d ]; then chmod -R 755 /etc/cont-init.d; fi && \
|
||||||
|
if [ -d /etc/services.d ]; then chmod -R 755 /etc/services.d; fi && \
|
||||||
|
if [ -f /entrypoint.sh ]; then chmod 755 /entrypoint.sh; fi
|
7
screenshotter/build.json
Normal file
7
screenshotter/build.json
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"build_from": {
|
||||||
|
"aarch64": "ghcr.io/hassio-addons/base-python/aarch64:9.0.1",
|
||||||
|
"amd64": "ghcr.io/hassio-addons/base-python/amd64:9.0.1",
|
||||||
|
"armv7": "ghcr.io/hassio-addons/base-python/armv7:9.0.1"
|
||||||
|
}
|
||||||
|
}
|
30
screenshotter/config.yaml
Normal file
30
screenshotter/config.yaml
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
---
|
||||||
|
name: Screenshotter
|
||||||
|
version: 1.0.0.41
|
||||||
|
#image: ghcr.io/maxwinterstein/homeassistant-addon-toogoodtogo-ha-mqtt-bridge-{arch}
|
||||||
|
slug: screenshotter
|
||||||
|
description: Screenshot images for E-Paper pricetags
|
||||||
|
panel_icon: mdi:label-variant
|
||||||
|
arch:
|
||||||
|
- amd64
|
||||||
|
- armv7
|
||||||
|
- aarch64
|
||||||
|
map:
|
||||||
|
- "share:rw"
|
||||||
|
- "config:rw"
|
||||||
|
options:
|
||||||
|
image_path: "/config/epaper-station/images"
|
||||||
|
config_file: "/config/screenshotter/config.yaml"
|
||||||
|
width: 296
|
||||||
|
height: 128
|
||||||
|
rotate: 270
|
||||||
|
wait_seconds: 5
|
||||||
|
schema:
|
||||||
|
image_path: str
|
||||||
|
config_file: str
|
||||||
|
width: int
|
||||||
|
height: int
|
||||||
|
rotate: int
|
||||||
|
wait_seconds: int
|
||||||
|
stage: experimental
|
||||||
|
init: false
|
60
screenshotter/rootfs/app/app.py
Normal file
60
screenshotter/rootfs/app/app.py
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
from selenium import webdriver
|
||||||
|
from selenium.webdriver.chrome.options import Options
|
||||||
|
from PIL import Image
|
||||||
|
import time, os
|
||||||
|
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
|
||||||
|
import yaml
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
# enable browser logging
|
||||||
|
d = DesiredCapabilities.CHROME
|
||||||
|
d['loggingPrefs'] = {'browser': 'ALL'}
|
||||||
|
|
||||||
|
image_path = os.environ.get("SCREEN_IMAGE_PATH", default='/tmp')
|
||||||
|
config_file = os.environ.get("SCREEN_CONFIG", default="/app/config.yaml")
|
||||||
|
width = os.environ.get("SCREEN_WIDTH", default="640")
|
||||||
|
height = os.environ.get("SCREEN_HEIGHT", default="480")
|
||||||
|
rotate = os.environ.get("SCREEN_ROTATE", default="0")
|
||||||
|
wait = os.environ.get("SCREEN_WAIT", default="5")
|
||||||
|
|
||||||
|
# Open another headless browser with height extracted above
|
||||||
|
chrome_options = Options()
|
||||||
|
chrome_options.add_argument("--headless")
|
||||||
|
chrome_options.add_argument('--no-sandbox')
|
||||||
|
chrome_options.add_argument(f"--window-size={width},{height}")
|
||||||
|
chrome_options.add_argument("--hide-scrollbars")
|
||||||
|
chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, '
|
||||||
|
'like Gecko) Chrome/68.0.3440.84 Safari/537.36')
|
||||||
|
|
||||||
|
config = None
|
||||||
|
with open(config_file, "r") as stream:
|
||||||
|
config = yaml.safe_load(stream)
|
||||||
|
|
||||||
|
tasks = []
|
||||||
|
|
||||||
|
for image in config.images:
|
||||||
|
image["next_execution"] = datetime.datetime.now()
|
||||||
|
tasks += [image]
|
||||||
|
|
||||||
|
while True:
|
||||||
|
now = datetime.datetime.now()
|
||||||
|
for task in tasks:
|
||||||
|
if task["next_execution"] > now:
|
||||||
|
continue
|
||||||
|
driver = webdriver.Chrome(options=chrome_options, desired_capabilities=d)
|
||||||
|
driver.implicitly_wait(10)
|
||||||
|
driver.get(url + paths.get(display))
|
||||||
|
# pause 3 second to let page loads
|
||||||
|
time.sleep(wait)
|
||||||
|
# save screenshot
|
||||||
|
file_name = f'/tmp/{task["name"]}.png'
|
||||||
|
driver.save_screenshot(file_name)
|
||||||
|
# print messages
|
||||||
|
for entry in driver.get_log('browser'):
|
||||||
|
print(entry)
|
||||||
|
image = Image.open(file_name)
|
||||||
|
image = image.rotate(rotate, expand=True)
|
||||||
|
file_name = f'{image_path}/{task["name"]}.png'
|
||||||
|
image.save(file_name)
|
||||||
|
task["next_execution"] = now + datetime.timedelta(minutes=task["period_minutes"])
|
||||||
|
time.sleep(1)
|
4
screenshotter/rootfs/app/config.yaml
Normal file
4
screenshotter/rootfs/app/config.yaml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
images:
|
||||||
|
- name: "001100"
|
||||||
|
url: https://ha.baubs.net/lovelace-teflons/0?kiosk
|
||||||
|
period_minutes: 1
|
3
screenshotter/rootfs/app/requirements.txt
Normal file
3
screenshotter/rootfs/app/requirements.txt
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
selenium
|
||||||
|
Pillow
|
||||||
|
pyyaml
|
15
screenshotter/rootfs/etc/services.d/screenshotter/run
Normal file
15
screenshotter/rootfs/etc/services.d/screenshotter/run
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#!/usr/bin/with-contenv bashio
|
||||||
|
bashio::log.info "Reading config..."
|
||||||
|
CONFIG_PATH=/data/options.json
|
||||||
|
|
||||||
|
export SCREEN_IMAGE_PATH="$(bashio::config 'image_path')"
|
||||||
|
export SCREEN_CONFIG="$(bashio::config 'config_file')"
|
||||||
|
export SCREEN_WIDTH="$(bashio::config 'width')"
|
||||||
|
export SCREEN_HEIGHT="$(bashio::config 'height')"
|
||||||
|
export SCREEN_ROTATE="$(bashio::config 'height')"
|
||||||
|
export SCREEN_WAIT="$(bashio::config 'wait_seconds')"
|
||||||
|
|
||||||
|
mkdir -p $SCREEN_IMAGE_PATH
|
||||||
|
|
||||||
|
bashio::log.info "Starting screenshotter..."
|
||||||
|
exec python /app/app.py
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
|
||||||
|
<fontconfig>
|
||||||
|
<its:rules xmlns:its="http://www.w3.org/2005/11/its" version="1.0">
|
||||||
|
<its:translateRule translate="no" selector="/fontconfig/*[not(self::description)]"/>
|
||||||
|
</its:rules>
|
||||||
|
<match target="font">
|
||||||
|
<edit name="antialias" mode="assign">
|
||||||
|
<bool>false</bool>
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
</fontconfig>
|
Loading…
Reference in a new issue