add webshot module
This commit is contained in:
parent
e093a13477
commit
f0cb8528b8
70
README.md
70
README.md
@ -1,9 +1,9 @@
|
|||||||
# Welcome to inkycal v2.0.3!
|
# Welcome to inkycal v2.0.3!
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="https://raw.githubusercontent.com/aceisace/Inkycal/assets/Repo/logo.png" width="900">
|
<img src="https://raw.githubusercontent.com/aceisace/Inkycal/assets/Repo/logo.png" width="900" alt="aceinnolab logo">
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="https://github.com/aceinnolab/Inkycal/blob/c1c274878ba81ddaee6186561e6ea892da54cd6a/Repo/inkycal-featured-gif.gif" width="900">
|
<img src="https://github.com/aceinnolab/Inkycal/blob/c1c274878ba81ddaee6186561e6ea892da54cd6a/Repo/inkycal-featured-gif.gif" width="900" alt="featured-image">
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
@ -48,44 +48,44 @@ Before you can start, please ensure you have one of the supported displays and o
|
|||||||
|
|
||||||
**❗️Important note: e-paper displays cannot be simply connected to the Raspberry Pi, but require a driver board. The links below may or may not contain the required driver board. Please ensure you get the correct driver board for the display!**
|
**❗️Important note: e-paper displays cannot be simply connected to the Raspberry Pi, but require a driver board. The links below may or may not contain the required driver board. Please ensure you get the correct driver board for the display!**
|
||||||
|
|
||||||
| type | vendor | affiliate links to product |
|
| type | vendor | affiliate links to product |
|
||||||
| -- | -- | -- |
|
|-------------------------------------------|-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| 7.5" Inkycal (plug-and-play) | Author of Inkycal | [Buy on Tindie](https://www.tindie.com/products/aceisace4444/inkycal-build-v1/) Pre-configured version of Inkycal with custom frame and a web-ui. You do not need to buy anything extra. Includes Raspberry Pi Zero W, 7.5" e-paper, microSD card, driver board, custom packaging and 1m of cable. Comes pre-assembled for plug-and-play. |
|
| 7.5" Inkycal (plug-and-play) | Author of Inkycal | [Buy on Tindie](https://www.tindie.com/products/aceisace4444/inkycal-build-v1/) Pre-configured version of Inkycal with custom frame and a web-ui. You do not need to buy anything extra. Includes Raspberry Pi Zero W, 7.5" e-paper, microSD card, driver board, custom packaging and 1m of cable. Comes pre-assembled for plug-and-play. |
|
||||||
| Inkycal frame | Author of Inkycal | coming soon (ultraslim frame with custom-made front and backcover inkl. ultraslim driver board). You will need a Raspberry Pi and a 7.5" e-paper display |
|
| Inkycal frame | Author of Inkycal | coming soon (ultraslim frame with custom-made front and backcover inkl. ultraslim driver board). You will need a Raspberry Pi and a 7.5" e-paper display |
|
||||||
| `[serial]` 12.48" (1304×984px) display | waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=7e08c6110a1a5b3511ead10db2fd909a&camp=1638&creative=6742&index=computers&keywords=Waveshare 12.48 Inch E-Paper">Waveshare 12.48 Inch E-Paper</a>
|
| `[serial]` 12.48" (1304×984px) display | waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=7e08c6110a1a5b3511ead10db2fd909a&camp=1638&creative=6742&index=computers&keywords=Waveshare 12.48 Inch E-Paper">Waveshare 12.48 Inch E-Paper</a> |
|
||||||
| `[serial]` 7.5" (640x384px) -> v1 display | waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=1bf1a6338786c0a4e7b877335afa0683&camp=1638&creative=6742&index=computers&keywords=Waveshare 7.5 Inch E-Paper">Waveshare 7.5 Inch E-Paper</a> |
|
| `[serial]` 7.5" (640x384px) -> v1 display | waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=1bf1a6338786c0a4e7b877335afa0683&camp=1638&creative=6742&index=computers&keywords=Waveshare 7.5 Inch E-Paper">Waveshare 7.5 Inch E-Paper</a> |
|
||||||
| `[serial]` 7.5" (800x400px) -> v2 display| waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=1bf1a6338786c0a4e7b877335afa0683&camp=1638&creative=6742&index=computers&keywords=Waveshare 7.5 Inch E-Paper">Waveshare 7.5 Inch E-Paper</a> |
|
| `[serial]` 7.5" (800x400px) -> v2 display | waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=1bf1a6338786c0a4e7b877335afa0683&camp=1638&creative=6742&index=computers&keywords=Waveshare 7.5 Inch E-Paper">Waveshare 7.5 Inch E-Paper</a> |
|
||||||
| `[serial]` 7.5" (880x528px) -> v3 display | waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=1bf1a6338786c0a4e7b877335afa0683&camp=1638&creative=6742&index=computers&keywords=Waveshare 7.5 Inch E-Paper">Waveshare 7.5 Inch E-Paper</a> |
|
| `[serial]` 7.5" (880x528px) -> v3 display | waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=1bf1a6338786c0a4e7b877335afa0683&camp=1638&creative=6742&index=computers&keywords=Waveshare 7.5 Inch E-Paper">Waveshare 7.5 Inch E-Paper</a> |
|
||||||
| `[serial]` 5.83" (400x300px) display | waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=a4239753343f5fbbdb8f5be2f6b5e2b1&camp=1638&creative=6742&index=computers&keywords=Waveshare 5.83 Inch E-Paper">Waveshare 5.83 Inch E-Paper</a> |
|
| `[serial]` 5.83" (400x300px) display | waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=a4239753343f5fbbdb8f5be2f6b5e2b1&camp=1638&creative=6742&index=computers&keywords=Waveshare 5.83 Inch E-Paper">Waveshare 5.83 Inch E-Paper</a> |
|
||||||
| `[serial]` 4.2" (400x300px)display | waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=7575de79f1728ab9f2bfb6a46d2238ee&camp=1638&creative=6742&index=computers&keywords=Waveshare 4.2 Inch E-Paper">Waveshare 4.2 Inch E-Paper</a> |
|
| `[serial]` 4.2" (400x300px)display | waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=7575de79f1728ab9f2bfb6a46d2238ee&camp=1638&creative=6742&index=computers&keywords=Waveshare 4.2 Inch E-Paper">Waveshare 4.2 Inch E-Paper</a> |
|
||||||
| `[parallel]` 10.3" (1872×1404px) display | waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=b453e16c373b0d86e4828b22edecc206&camp=1638&creative=6742&index=computers&keywords=Waveshare 10.3 Inch E-Paper">Waveshare 10.3 Inch E-Paper</a> |
|
| `[parallel]` 10.3" (1872×1404px) display | waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=b453e16c373b0d86e4828b22edecc206&camp=1638&creative=6742&index=computers&keywords=Waveshare 10.3 Inch E-Paper">Waveshare 10.3 Inch E-Paper</a> |
|
||||||
| `[parallel]` 9.7" (1200×825px) display | waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=eef2be91cc3f850943109276a63a7162&camp=1638&creative=6742&index=computers&keywords=Waveshare 9.7 Inch E-Paper">Waveshare 9.7 Inch E-Paper</a> |
|
| `[parallel]` 9.7" (1200×825px) display | waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=eef2be91cc3f850943109276a63a7162&camp=1638&creative=6742&index=computers&keywords=Waveshare 9.7 Inch E-Paper">Waveshare 9.7 Inch E-Paper</a> |
|
||||||
| `[parallel]` 7.8" (1872×1404px) display | waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=f1863f9686b0eeeb04ce147791ba3789&camp=1638&creative=6742&index=computers&keywords=Waveshare 7.8 Inch E-Paper">Waveshare 7.8" E-Paper</a> |
|
| `[parallel]` 7.8" (1872×1404px) display | waveshare / gooddisplay | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=f1863f9686b0eeeb04ce147791ba3789&camp=1638&creative=6742&index=computers&keywords=Waveshare 7.8 Inch E-Paper">Waveshare 7.8" E-Paper</a> |
|
||||||
| Raspberry Pi Zero W | Raspberry Pi | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=8f9c223197e1ab91b0372b1fe56ed508&camp=1638&creative=6742&index=computers&keywords=Raspberry Pi Zero W">Raspberry Pi Zero W</a> |
|
| Raspberry Pi Zero W | Raspberry Pi | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=8f9c223197e1ab91b0372b1fe56ed508&camp=1638&creative=6742&index=computers&keywords=Raspberry Pi Zero W">Raspberry Pi Zero W</a> |
|
||||||
| MicroSD card | Sandisk | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=530a2b371c40bfeca48e875fb735a4a1&camp=1638&creative=6742&index=computers&keywords=Sandisk microSD 16GB U1 A1">MicroSD card (8GB)</a> |
|
| MicroSD card | Sandisk | <a target="_blank" href="https://www.amazon.de/gp/search?ie=UTF8&tag=aceisace-21&linkCode=ur2&linkId=530a2b371c40bfeca48e875fb735a4a1&camp=1638&creative=6742&index=computers&keywords=Sandisk microSD 16GB U1 A1">MicroSD card (8GB)</a> |
|
||||||
|
|
||||||
|
|
||||||
## Configuring the Raspberry Pi
|
## Configuring the Raspberry Pi
|
||||||
1. Flash Raspberry Pi OS on your microSD card (min. 4GB) with [Raspberry Pi Imager](https://rptl.io/imager). Use the following settings:
|
Flash Raspberry Pi OS on your microSD card (min. 4GB) with [Raspberry Pi Imager](https://rptl.io/imager). Use the following settings:
|
||||||
|
|
||||||
| option | value |
|
| option | value |
|
||||||
| :-- | :--: |
|
|:---------------------------|:----------------------------:|
|
||||||
| hostname | inkycal |
|
| hostname | inkycal |
|
||||||
| enable ssh | yes |
|
| enable ssh | yes |
|
||||||
| set username and password | yes |
|
| set username and password | yes |
|
||||||
| username | a username you like |
|
| username | a username you like |
|
||||||
| password | a password you can remember |
|
| password | a password you can remember |
|
||||||
| set Wi-Fi | yes |
|
| set Wi-Fi | yes |
|
||||||
| Wi-Fi SSID | your Wi-Fi name |
|
| Wi-Fi SSID | your Wi-Fi name |
|
||||||
| Wi-Fi password | your Wi-Fi password |
|
| Wi-Fi password | your Wi-Fi password |
|
||||||
|
|
||||||
|
|
||||||
2. Create and download `settings.json` file for Inkycal from the [WEB-UI](https://aceisace.eu.pythonanywhere.com/inkycal-config-v2-0-0). Add the modules you want with the add module button.
|
1. Create and download `settings.json` file for Inkycal from the [WEB-UI](https://aceisace.eu.pythonanywhere.com/inkycal-config-v2-0-0). Add the modules you want with the add module button.
|
||||||
3. Copy the `settings.json` to the flashed microSD card in the `/boot` folder of microSD card. On Windows, this is the only visible directory on the SD card. On Linux, copy these files to `/boot` of the microSD card.
|
2. Copy the `settings.json` to the flashed microSD card in the `/boot` folder of microSD card. On Windows, this is the only visible directory on the SD card. On Linux, copy these files to `/boot` of the microSD card.
|
||||||
4. Eject the microSD card from your computer now, insert it in the Raspberry Pi and power the Raspberry Pi.
|
3. Eject the microSD card from your computer now, insert it in the Raspberry Pi and power the Raspberry Pi.
|
||||||
5. Once the green LED has stopped blinking after ~3 minutes, you can connect to your Raspberry Pi via SSH using a SSH Client. We suggest [Termius](https://termius.com/download/windows)
|
4. Once the green LED has stopped blinking after ~3 minutes, you can connect to your Raspberry Pi via SSH using a SSH Client. We suggest [Termius](https://termius.com/download/windows)
|
||||||
on your smartphone. Use the address: `inkycal.local` with the username and password you set earlier. For more detailed instructions, check out the page from the [Raspberry Pi website](https://www.raspberrypi.org/documentation/remote-access/ssh/)
|
on your smartphone. Use the address: `inkycal.local` with the username and password you set earlier. For more detailed instructions, check out the page from the [Raspberry Pi website](https://www.raspberrypi.org/documentation/remote-access/ssh/)
|
||||||
6. After connecting via SSH, run the following commands, line by line:
|
5. After connecting via SSH, run the following commands, line by line:
|
||||||
```bash
|
```bash
|
||||||
sudo raspi-config --expand-rootfs
|
sudo raspi-config --expand-rootfs
|
||||||
sudo sed -i s/#dtparam=spi=on/dtparam=spi=on/ /boot/config.txt
|
sudo sed -i s/#dtparam=spi=on/dtparam=spi=on/ /boot/config.txt
|
||||||
@ -118,9 +118,9 @@ These commands expand the filesystem, enable SPI and set up the correct timezone
|
|||||||
Run the following steps to install Inkycal. Do **not** use sudo for this, except where explicitly specified.
|
Run the following steps to install Inkycal. Do **not** use sudo for this, except where explicitly specified.
|
||||||
```bash
|
```bash
|
||||||
# the next line is for the Raspberry Pi only
|
# the next line is for the Raspberry Pi only
|
||||||
sudo apt-get install zlib1g libjpeg-dev libatlas-base-dev rustc libopenjp2-7 python3-dev scons libssl-dev python3-venv python3-pip git libfreetype6-dev
|
sudo apt-get install zlib1g libjpeg-dev libatlas-base-dev rustc libopenjp2-7 python3-dev scons libssl-dev python3-venv python3-pip git libfreetype6-dev wkhtmltopdf
|
||||||
cd $HOME
|
cd $HOME
|
||||||
git clone --branch main --single-branch https://github.com/aceisace/Inkycal
|
git clone --branch main --single-branch https://github.com/aceinnolab/Inkycal
|
||||||
cd Inkycal
|
cd Inkycal
|
||||||
python3 -m venv venv
|
python3 -m venv venv
|
||||||
source venv/bin/activate
|
source venv/bin/activate
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
#!/usr/bin/python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""
|
"""
|
||||||
Inkycal custom-functions for ease-of-use
|
Inkycal custom-functions for ease-of-use
|
||||||
|
|
||||||
@ -11,7 +9,7 @@ import time
|
|||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
from PIL import Image, ImageDraw, ImageFont
|
from PIL import ImageFont
|
||||||
|
|
||||||
logs = logging.getLogger(__name__)
|
logs = logging.getLogger(__name__)
|
||||||
logs.setLevel(level=logging.INFO)
|
logs.setLevel(level=logging.INFO)
|
||||||
@ -279,6 +277,7 @@ def internet_available():
|
|||||||
|
|
||||||
from PIL import Image, ImageDraw
|
from PIL import Image, ImageDraw
|
||||||
|
|
||||||
|
|
||||||
def draw_dotted_line(draw, start, end, colour, thickness):
|
def draw_dotted_line(draw, start, end, colour, thickness):
|
||||||
"""Draws a dotted line between start and end points using dots."""
|
"""Draws a dotted line between start and end points using dots."""
|
||||||
delta_x = end[0] - start[0]
|
delta_x = end[0] - start[0]
|
||||||
@ -292,7 +291,8 @@ def draw_dotted_line(draw, start, end, colour, thickness):
|
|||||||
# Drawing a circle at each dot position to create a dotted effect
|
# Drawing a circle at each dot position to create a dotted effect
|
||||||
draw.ellipse([(dot_position[0] - thickness, dot_position[1] - thickness),
|
draw.ellipse([(dot_position[0] - thickness, dot_position[1] - thickness),
|
||||||
(dot_position[0] + thickness, dot_position[1] + thickness)],
|
(dot_position[0] + thickness, dot_position[1] + thickness)],
|
||||||
fill=colour)
|
fill=colour)
|
||||||
|
|
||||||
|
|
||||||
def draw_dashed_line(draw, start, end, colour, thickness):
|
def draw_dashed_line(draw, start, end, colour, thickness):
|
||||||
"""Draws a dashed line between start and end points."""
|
"""Draws a dashed line between start and end points."""
|
||||||
@ -309,6 +309,7 @@ def draw_dashed_line(draw, start, end, colour, thickness):
|
|||||||
segment_start[1] + (step_size * delta_y / distance))
|
segment_start[1] + (step_size * delta_y / distance))
|
||||||
draw.line((segment_start, segment_end), fill=colour, width=thickness)
|
draw.line((segment_start, segment_end), fill=colour, width=thickness)
|
||||||
|
|
||||||
|
|
||||||
def draw_border(image, xy, size, radius=5, thickness=1, shrinkage=(0.1, 0.1), style='solid'):
|
def draw_border(image, xy, size, radius=5, thickness=1, shrinkage=(0.1, 0.1), style='solid'):
|
||||||
"""
|
"""
|
||||||
Draws a border at given coordinates with specified styles (solid, dotted, dashed).
|
Draws a border at given coordinates with specified styles (solid, dotted, dashed).
|
||||||
|
@ -8,3 +8,4 @@ from .inkycal_jokes import Jokes
|
|||||||
from .inkycal_stocks import Stocks
|
from .inkycal_stocks import Stocks
|
||||||
from .inkycal_slideshow import Slideshow
|
from .inkycal_slideshow import Slideshow
|
||||||
from .inkycal_textfile_to_display import TextToDisplay
|
from .inkycal_textfile_to_display import TextToDisplay
|
||||||
|
from .inkycal_webshot import Webshot
|
||||||
|
164
inkycal/modules/inkycal_webshot.py
Normal file
164
inkycal/modules/inkycal_webshot.py
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
"""
|
||||||
|
Webshot module for Inkycal
|
||||||
|
by https://github.com/worstface
|
||||||
|
"""
|
||||||
|
|
||||||
|
from htmlwebshot import WebShot
|
||||||
|
|
||||||
|
from inkycal.custom import *
|
||||||
|
from inkycal.modules.inky_image import Inkyimage as Images
|
||||||
|
from inkycal.modules.template import inkycal_module
|
||||||
|
from tests import Config
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class Webshot(inkycal_module):
|
||||||
|
name = "Webshot - Displays screenshots of webpages"
|
||||||
|
|
||||||
|
# required parameters
|
||||||
|
requires = {
|
||||||
|
|
||||||
|
"url": {
|
||||||
|
"label": "Please enter the url",
|
||||||
|
},
|
||||||
|
"palette": {
|
||||||
|
"label": "Which color palette should be used for the webshots?",
|
||||||
|
"options": ["bw", "bwr", "bwy"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
optional = {
|
||||||
|
|
||||||
|
"crop_x": {
|
||||||
|
"label": "Please enter the crop x-position",
|
||||||
|
},
|
||||||
|
"crop_y": {
|
||||||
|
"label": "Please enter the crop y-position",
|
||||||
|
},
|
||||||
|
"crop_w": {
|
||||||
|
"label": "Please enter the crop width",
|
||||||
|
},
|
||||||
|
"crop_h": {
|
||||||
|
"label": "Please enter the crop height",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self, config):
|
||||||
|
|
||||||
|
super().__init__(config)
|
||||||
|
|
||||||
|
config = config['config']
|
||||||
|
|
||||||
|
self.url = config['url']
|
||||||
|
self.palette = config['palette']
|
||||||
|
|
||||||
|
if "crop_h" in config and isinstance(config["crop_h"], str):
|
||||||
|
self.crop_h = int(config["crop_h"])
|
||||||
|
else:
|
||||||
|
self.crop_h = 2000
|
||||||
|
|
||||||
|
if "crop_w" in config and isinstance(config["crop_w"], str):
|
||||||
|
self.crop_w = int(config["crop_w"])
|
||||||
|
else:
|
||||||
|
self.crop_w = 2000
|
||||||
|
|
||||||
|
if "crop_x" in config and isinstance(config["crop_x"], str):
|
||||||
|
self.crop_x = int(config["crop_x"])
|
||||||
|
else:
|
||||||
|
self.crop_x = 0
|
||||||
|
|
||||||
|
if "crop_y" in config and isinstance(config["crop_y"], str):
|
||||||
|
self.crop_y = int(config["crop_y"])
|
||||||
|
else:
|
||||||
|
self.crop_y = 0
|
||||||
|
|
||||||
|
# give an OK message
|
||||||
|
print(f'Inkycal webshot loaded')
|
||||||
|
|
||||||
|
def generate_image(self):
|
||||||
|
"""Generate image for this module"""
|
||||||
|
|
||||||
|
# Create tmp path
|
||||||
|
tmpFolder = Config.TEMP_PATH
|
||||||
|
|
||||||
|
if not os.path.exists(tmpFolder):
|
||||||
|
print(f"Creating tmp directory {tmpFolder}")
|
||||||
|
os.mkdir(tmpFolder)
|
||||||
|
|
||||||
|
# Define new image size with respect to padding
|
||||||
|
im_width = int(self.width - (2 * self.padding_left))
|
||||||
|
im_height = int(self.height - (2 * self.padding_top))
|
||||||
|
im_size = im_width, im_height
|
||||||
|
logger.info('image size: {} x {} px'.format(im_width, im_height))
|
||||||
|
|
||||||
|
# Create an image for black pixels and one for coloured pixels (required)
|
||||||
|
im_black = Image.new('RGB', size=im_size, color='white')
|
||||||
|
im_colour = Image.new('RGB', size=im_size, color='white')
|
||||||
|
|
||||||
|
# Check if internet is available
|
||||||
|
if internet_available():
|
||||||
|
logger.info('Connection test passed')
|
||||||
|
else:
|
||||||
|
raise Exception('Network could not be reached :/')
|
||||||
|
|
||||||
|
logger.info(
|
||||||
|
f'preparing webshot from {self.url}... cropH{self.crop_h} cropW{self.crop_w} cropX{self.crop_x} cropY{self.crop_y}')
|
||||||
|
|
||||||
|
shot = WebShot()
|
||||||
|
|
||||||
|
shot.params = {
|
||||||
|
"--crop-x": self.crop_x,
|
||||||
|
"--crop-y": self.crop_y,
|
||||||
|
"--crop-w": self.crop_w,
|
||||||
|
"--crop-h": self.crop_h,
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info(f'getting webshot from {self.url}...')
|
||||||
|
|
||||||
|
try:
|
||||||
|
shot.create_pic(url=self.url, output=f"{tmpFolder}/webshot.png")
|
||||||
|
except:
|
||||||
|
print(traceback.format_exc())
|
||||||
|
print("If you have not already installed wkhtmltopdf, please use: sudo apt-get install wkhtmltopdf. See here for more details: https://github.com/1Danish-00/htmlwebshot/")
|
||||||
|
raise Exception('Could not get webshot :/')
|
||||||
|
|
||||||
|
|
||||||
|
logger.info(f'got webshot...')
|
||||||
|
|
||||||
|
webshotSpaceBlack = Image.new('RGBA', (im_width, im_height), (255, 255, 255, 255))
|
||||||
|
webshotSpaceColour = Image.new('RGBA', (im_width, im_height), (255, 255, 255, 255))
|
||||||
|
|
||||||
|
im = Images()
|
||||||
|
im.load(f'{tmpFolder}/webshot.png')
|
||||||
|
im.remove_alpha()
|
||||||
|
|
||||||
|
imageAspectRatio = im_width / im_height
|
||||||
|
webshotAspectRatio = im.image.width / im.image.height
|
||||||
|
|
||||||
|
if webshotAspectRatio > imageAspectRatio:
|
||||||
|
imageScale = im_width / im.image.width
|
||||||
|
else:
|
||||||
|
imageScale = im_height / im.image.height
|
||||||
|
|
||||||
|
webshotHeight = int(im.image.height * imageScale)
|
||||||
|
|
||||||
|
im.resize(width=int(im.image.width * imageScale), height=webshotHeight)
|
||||||
|
|
||||||
|
im_webshot_black, im_webshot_colour = im.to_palette(self.palette)
|
||||||
|
|
||||||
|
webshotCenterPosY = int((im_height / 2) - (im.image.height / 2))
|
||||||
|
|
||||||
|
centerPosX = int((im_width / 2) - (im.image.width / 2))
|
||||||
|
|
||||||
|
webshotSpaceBlack.paste(im_webshot_black, (centerPosX, webshotCenterPosY))
|
||||||
|
im_black.paste(webshotSpaceBlack)
|
||||||
|
|
||||||
|
webshotSpaceColour.paste(im_webshot_colour, (centerPosX, webshotCenterPosY))
|
||||||
|
im_colour.paste(webshotSpaceColour)
|
||||||
|
|
||||||
|
im.clear()
|
||||||
|
logger.info(f'added webshot image')
|
||||||
|
|
||||||
|
# Save image of black and colour channel in image-folder
|
||||||
|
return im_black, im_colour
|
@ -1,12 +1,12 @@
|
|||||||
arrow==1.3.0
|
arrow==1.3.0
|
||||||
certifi==2023.7.22
|
certifi==2023.11.17
|
||||||
cycler==0.12.1
|
cycler==0.12.1
|
||||||
feedparser==6.0.10
|
feedparser==6.0.10
|
||||||
fonttools==4.44.0
|
fonttools==4.45.0
|
||||||
icalendar==5.0.11
|
icalendar==5.0.11
|
||||||
kiwisolver==1.4.5
|
kiwisolver==1.4.5
|
||||||
lxml==4.9.3
|
lxml==4.9.3
|
||||||
matplotlib==3.8.1
|
matplotlib==3.8.2
|
||||||
numpy==1.24.4
|
numpy==1.24.4
|
||||||
packaging==23.2
|
packaging==23.2
|
||||||
Pillow==10.1.0
|
Pillow==10.1.0
|
||||||
@ -14,14 +14,15 @@ pyparsing==3.1.1
|
|||||||
PySocks==1.7.1
|
PySocks==1.7.1
|
||||||
python-dateutil==2.8.2
|
python-dateutil==2.8.2
|
||||||
pytz==2023.3.post1
|
pytz==2023.3.post1
|
||||||
recurring-ical-events==2.1.0
|
recurring-ical-events==2.1.1
|
||||||
requests==2.31.0
|
requests==2.31.0
|
||||||
sgmllib3k==1.0.0
|
sgmllib3k==1.0.0
|
||||||
six==1.16.0
|
six==1.16.0
|
||||||
todoist-api-python==2.1.3
|
todoist-api-python==2.1.3
|
||||||
typing_extensions==4.8.0
|
typing_extensions==4.8.0
|
||||||
urllib3==2.0.7
|
urllib3==2.1.0
|
||||||
python-dotenv==1.0.0
|
python-dotenv==1.0.0
|
||||||
setuptools==68.2.2
|
setuptools==69.0.1
|
||||||
html2text==2020.1.16
|
html2text==2020.1.16
|
||||||
yfinance==0.2.32
|
yfinance==0.2.32
|
||||||
|
htmlwebshot~=0.1.2
|
65
tests/test_inkycal_webshot.py
Executable file
65
tests/test_inkycal_webshot.py
Executable file
@ -0,0 +1,65 @@
|
|||||||
|
"""
|
||||||
|
Test Inkycal Webshot Module
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
from inkycal.modules import Webshot
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
|
||||||
|
tests = [
|
||||||
|
{
|
||||||
|
"position": 1,
|
||||||
|
"name": "Webshot",
|
||||||
|
"config": {
|
||||||
|
"size": [400, 100],
|
||||||
|
"url": "https://google.com",
|
||||||
|
"palette": "bwr",
|
||||||
|
"padding_x": 10, "padding_y": 10, "fontsize": 12, "language": "en"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 1,
|
||||||
|
"name": "Webshot",
|
||||||
|
"config": {
|
||||||
|
"size": [400, 200],
|
||||||
|
"url": "https://google.com",
|
||||||
|
"palette": "bwy",
|
||||||
|
"padding_x": 10, "padding_y": 10, "fontsize": 12, "language": "en"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 1,
|
||||||
|
"name": "Webshot",
|
||||||
|
"config": {
|
||||||
|
"size": [400, 300],
|
||||||
|
"url": "https://google.com",
|
||||||
|
"palette": "bw",
|
||||||
|
"padding_x": 10, "padding_y": 10, "fontsize": 12, "language": "en"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 1,
|
||||||
|
"name": "Webshot",
|
||||||
|
"config": {
|
||||||
|
"size": [400, 400],
|
||||||
|
"url": "https://google.com",
|
||||||
|
"palette": "bwr",
|
||||||
|
"padding_x": 10, "padding_y": 10, "fontsize": 12, "language": "en"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class TestWebshot(unittest.TestCase):
|
||||||
|
|
||||||
|
def test_generate_image(self):
|
||||||
|
for test in tests:
|
||||||
|
logger.info(f'test {tests.index(test) + 1} generating image..')
|
||||||
|
module = Webshot(test)
|
||||||
|
module.generate_image()
|
||||||
|
logger.info('OK')
|
||||||
|
|
Loading…
Reference in New Issue
Block a user