From c8c58fd8086fd362909ca83b0a06eb2cb8ac44f1 Mon Sep 17 00:00:00 2001 From: Flo Greistorfer Date: Wed, 26 Jun 2024 22:24:00 +0200 Subject: [PATCH] v1 --- generate-html.py | 188 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 151 insertions(+), 37 deletions(-) diff --git a/generate-html.py b/generate-html.py index 33a63c0..2861ae9 100644 --- a/generate-html.py +++ b/generate-html.py @@ -1,78 +1,192 @@ #!/usr/bin/env python3 import sys import os +import urllib.parse +from multiprocessing import Pool +import numpy as np """ root and webroot must point to the same folder, one on filesystem and one on the webserver. Use absolut paths, e.g. /data/pictures/ and https://pictures.example.com/ """ -root = "/mnt/small-data/nfs/pictures/" -webroot = "https://pictures.sorogon.eu/" +ROOT = "/mnt/nfs/pictures/" +WEBROOT = "https://pictures.sorogon.eu/" imgext = [".jpg", ".jpeg", ".JPG", ".JPEG"] rawext = [".ARW", ".tif", ".tiff", ".TIF", ".TIFF"] -htmlheader = """ +thumbnails: list[tuple[str, str]] = [] + +HTMLHEADER = """ - - - -Pictures - - - + + + + Pictures + + + """ +def thumbnail_convert(arguments: tuple[str, str]): + folder, item = arguments + os.system(f'magick "{os.path.join(folder, item)}" -quality 75% -define jpeg:size=1024x1024 -define jpeg:extent=100kb -thumbnail 512x512 -auto-orient "{os.path.join(ROOT, ".previews", folder.removeprefix(ROOT), item)}"') + + def listfolder(folder: str): items: list[str] = os.listdir(folder) items.sort() images: list[str] = [] subfolders: list[str] = [] - if not os.path.exists(os.path.join(root, ".previews", folder.removeprefix(root))): - os.mkdir(os.path.join(root, ".previews", folder.removeprefix(root))) + if not os.path.exists(os.path.join(ROOT, ".previews", folder.removeprefix(ROOT))): + os.mkdir(os.path.join(ROOT, ".previews", folder.removeprefix(ROOT))) - with open(os.path.join(folder, "list.txt"), "w", encoding="utf-8") as f: - f.write(htmlheader) + with open(os.path.join(folder, "index.html"), "w", encoding="utf-8") as f: + f.write(HTMLHEADER) for item in items: if item != "Galleries" and item != ".previews": if os.path.isdir(os.path.join(folder, item)): - subfolders.extend([f'{item}
']) + subfolders.extend([f'
Folder icon
{item}
']) listfolder(os.path.join(folder, item)) else: if os.path.splitext(item)[1] in imgext: - images.extend([f'{item}
']) - if not os.path.exists(os.path.join(root, ".previews", folder.removeprefix(root), item)): - # os.system(f'magick {os.path.join(folder, item)} -resize 1024x768! {os.path.join(root, ".previews", folder.removeprefix(root), item)}') - print(f'magick {os.path.join(folder, item)} -resize 1024x768! {os.path.join(root, ".previews", folder.removeprefix(root), item)}') + image = f'
{item}
{item}' + if not os.path.exists(os.path.join(ROOT, ".previews", folder.removeprefix(ROOT), item)): + thumbnails.append((folder, item)) for raw in rawext: if os.path.exists(os.path.join(folder, os.path.splitext(item)[0] + raw)): - images.extend([f'RAW
']) - for image in images: - f.write(image) - f.write("\n") + image += f': RAW' + image += "
" + images.extend([image]) + f.write('
\n') for subfolder in subfolders: f.write(subfolder) f.write("\n") - f.write("") + f.write("
\n") + f.write('
\n') + for chunk in np.array_split(images, 8): + f.write('
\n') + for image in chunk: + f.write(f" {image}\n") + f.write("
\n") + f.write("
\n") + f.write(" \n") f.close() def main(): - global root - global webroot - if not root.endswith("/"): - root += "/" - if not webroot.endswith("/"): - webroot += "/" - if not os.path.exists(os.path.join(root, ".previews")): - os.mkdir(os.path.join(root, ".previews")) - listfolder(root) - # @TODO: write actual html files (and css 🙄) + global ROOT + global WEBROOT + if not ROOT.endswith("/"): + ROOT += "/" + if not WEBROOT.endswith("/"): + WEBROOT += "/" + if not os.path.exists(os.path.join(ROOT, ".previews")): + os.mkdir(os.path.join(ROOT, ".previews")) + print("Generating html files...") + listfolder(ROOT) + + with Pool(os.cpu_count()) as p: + print("Generating thumbnails...") + p.map(thumbnail_convert, thumbnails) if __name__ == "__main__":