add webshot module
This commit is contained in:
@@ -1,5 +1,3 @@
|
||||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Inkycal custom-functions for ease-of-use
|
||||
|
||||
@@ -11,7 +9,7 @@ import time
|
||||
import traceback
|
||||
|
||||
import requests
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
from PIL import ImageFont
|
||||
|
||||
logs = logging.getLogger(__name__)
|
||||
logs.setLevel(level=logging.INFO)
|
||||
@@ -279,6 +277,7 @@ def internet_available():
|
||||
|
||||
from PIL import Image, ImageDraw
|
||||
|
||||
|
||||
def draw_dotted_line(draw, start, end, colour, thickness):
|
||||
"""Draws a dotted line between start and end points using dots."""
|
||||
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
|
||||
draw.ellipse([(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):
|
||||
"""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))
|
||||
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'):
|
||||
"""
|
||||
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_slideshow import Slideshow
|
||||
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
|
Reference in New Issue
Block a user