From e7dc10f1bd0ad3a1ddcaed37bb53e82a5e6e934d Mon Sep 17 00:00:00 2001 From: Julian T Date: Tue, 8 Jun 2021 20:20:31 +0200 Subject: Output to index.json instead of html template --- build.py | 98 ++++++++++++++++++++++++++++------------------------------------ 1 file changed, 42 insertions(+), 56 deletions(-) (limited to 'build.py') diff --git a/build.py b/build.py index f018b94..9dccb8e 100755 --- a/build.py +++ b/build.py @@ -3,6 +3,7 @@ import jinja2 import PIL.Image import PIL.ImageOps import argparse +import json import yaml import os import re @@ -11,6 +12,7 @@ import glob from datetime import datetime imagereg = re.compile("([a-z0-9]*)\\..*") +thumbsize = 480 def hashfile(fname): @@ -38,9 +40,10 @@ class FileLoader(jinja2.BaseLoader): class ImageLocation: - def __init__(self, folder): + def __init__(self, folder, extension): self.folder = folder self.stuff = {} + self.ext = extension self.unused = set() self.existing = {} @@ -61,11 +64,11 @@ class ImageLocation: self.unused.add(fhash) self.existing[fhash] = name - def convert(self, imgname, settings): + def convert(self, imgname, resolution): # First determine the hash from settings thash = hashlib.md5( bytes( - f"{settings['res']}+{settings['ext']}" + imgname, + f"{resolution}+{self.ext}" + imgname, encoding="utf8") ).hexdigest() @@ -75,12 +78,12 @@ class ImageLocation: return self.existing[thash], thash # Okay convert it - fname = f"{thash}.{settings['ext']}" + fname = f"{thash}.{self.ext}" print(f"Converting file {imgname} to {fname}") - tmpname = f"{self.tmpname}.{settings['ext']}" + tmpname = f"{self.tmpname}.{self.ext}" with PIL.Image.open(imgname) as im: - target_height = settings["res"] + target_height = resolution im = PIL.ImageOps.exif_transpose(im) if im.size[0] > target_height: res = (int((im.size[0] / im.size[1]) * target_height), target_height) @@ -95,9 +98,9 @@ class ImageLocation: return fname, thash - def fetch(self, imgname, settings, relto=None): + def fetch(self, imgname, resolution, relto=None): # Check if we already have it - fname, hash = self.convert(imgname, settings) + fname, hash = self.convert(imgname, resolution) # Mark the hash as used self.unused.remove(hash) @@ -115,13 +118,16 @@ class ImageLocation: print(f"Removing file {fname}") os.remove(fname) + class Image: def __init__(self, filename): self.name = os.path.basename(filename) self.filename = filename self.description = "" - self.scaledpath = "" + self.url = "" + self.thumburl = "" self.fullurl = "" + self.file = filename self.taken = None self.load_metadata() @@ -179,67 +185,47 @@ class Loader: datetime.min), reverse=True) - -class Renderer: - def __init__(self, loader, resolution, extension): - self.loader = loader - self.scaled = None - - self.settings = { - "res": parse_res(resolution), - "ext": extension, - } - - def build_to(self, dest, template, context, loc=None, clean=False): - # Load images - if loc is None: - loc = ImageLocation(os.path.join(dest, "imgs")) - - def imgproc(img): - if context["cgit"] is not None: - img.fullurl = os.path.join(context["cgit"], "plain", img.name) - - img.scaledpath = loc.fetch(img.filename, self.settings, relto=dest) - - return img - - self.loader.load(imgproc, clear=True) - - jenv = jinja2.Environment( - loader=FileLoader(), - autoescape=jinja2.select_autoescape(['html', 'xml']) - ) - - tmpl = jenv.get_template(template) - - with open(os.path.join(dest, "index.html"), "w") as f: - f.write(tmpl.render({ - "ctx": context, - "images": self.loader.images - })) - - if clean: - loc.clean() + def to_json(self): + jsonable = [img.__dict__ for img in self.images] + return json.dumps(jsonable) parser = argparse.ArgumentParser() -parser.add_argument("--dest", "-d", default="build", help="where to put resulting files") -parser.add_argument("--size", "-s", default="1080", help="size to scale web images to") +parser.add_argument("--dest", "-d", default="dist", help="where to put resulting files") +parser.add_argument("--size", "-s", type=int, default="1080", help="size to scale web images to") parser.add_argument("--commit", "-g", help="git commit hash to announce") parser.add_argument("--clean", help="clean unused image files", action="store_true") -parser.add_argument("--config", "-c", default="imginfo.yml", help="where to load image definitions from") +parser.add_argument("--config", "-c", default=None, help="where to load image definitions from") parser.add_argument("--template", "-t", default="index.html.j2", help="html template to use") parser.add_argument("--cgit", "-w", help="cgit repo base url") -parser.add_argument("--load", "-l", default=".", help="where to load full size images from") +parser.add_argument("load", help="where to load full size images from") parser.add_argument("--ext", "-e", default="png", help="image extension to use") args = parser.parse_args() +if args.config is None: + args.config = os.path.join(args.load, "imginfo.yml") + context = { "cgit": args.cgit, "git": args.commit } loader = Loader(args.config, args.load) -rend = Renderer(loader, args.size, args.ext) -rend.build_to(args.dest, args.template, context, clean=args.clean) +loc = ImageLocation(os.path.join(args.dest, "imgs"), args.ext) + + +def imgload(img): + if context["cgit"] is not None: + img.fullurl = os.path.join(context["cgit"], "plain", img.name) + + img.url = loc.fetch(img.file, args.size, relto=args.dest) + img.thumburl = loc.fetch(img.file, thumbsize, relto=args.dest) + + return img + + +loader.load(imgload, clear=True) + +with open(os.path.join(args.dest, "imgs", "index.json"), "w") as f: + f.write(loader.to_json()) -- cgit v1.2.3