helixnebula.space/generate.py
2025-03-21 05:53:24 +00:00

127 lines
4.6 KiB
Python

from sys import argv
import subprocess
from PIL import Image
from jinja2 import Environment, FileSystemLoader
from markdown import markdown
from glob import glob
from json import dump, dumps, load
from os import path
import re
numbers = re.compile("[0-9]+")
out_dir = "/var/www/html/"
base_url = "https://helixnebula.space/"
template_environment = Environment(
loader=FileSystemLoader("templates/"))
with open("metadata.json", "r") as f:
metadata = load(f)
for placename in metadata.keys():
read_path = f"{out_dir}{placename}/"
photos = [
path.basename(photo).split('/')[-1] for photo in
glob(read_path + "*")
]
try:
photos.remove("index.html")
except ValueError:
pass
metadata[placename]["count"] = len(photos)
metadata[placename]["photos"] = photos
metadata[placename]["photos"].sort(key=lambda path: int(numbers.search(path).group(0)))
with open(f"{out_dir}photos.json", "w") as f:
dump(metadata, f)
def covers(overwrite=False):
print("running covers")
for placename, info in metadata.items():
read_path = f"{out_dir}{placename}/{info['cover']}"
write_path = f"{out_dir}cover/cover_{info['cover']}"
if not overwrite and path.exists(write_path):
continue
command = ["convert", read_path, "-strip", "-interlace", "Plane", "-gaussian-blur", "0.05",
"-auto-orient", "-resize", "700x525>", "-quality", "80%", write_path]
subprocess.run(command)
def thumbnails(overwrite=False):
print("running thumbnails")
for placename in metadata.keys():
for photo in metadata[placename]["photos"]:
read_path = f"{out_dir}{placename}/{photo}"
write_path = f"{out_dir}thumbnail/thumbnail_{photo}"
if not overwrite and path.exists(write_path):
continue
command = ["convert", read_path, "-strip", "-interlace", "Plane", "-gaussian-blur", "0.05",
"-auto-orient", "-resize", "300x200>", "-quality", "65%", write_path]
subprocess.run(command)
def compressed(overwrite=False):
print("running compressed")
for placename in metadata.keys():
for photo in metadata[placename]["photos"]:
read_path = f"{out_dir}{placename}/{photo}"
write_path = f"{out_dir}compressed/compressed_{photo}"
if not overwrite and path.exists(write_path):
continue
command = ["convert", read_path, "-auto-orient", "-strip", "-resize", "1200>", "-quality", "90%", write_path]
subprocess.run(command)
def render_index():
template = template_environment.get_template("main")
data = {key: value for key, value in sorted(metadata.items(), key=lambda item: item[1]['title'])}
photo_counts = {placename: metadata[placename]["count"] for placename in metadata.keys()}
total_count = 0
for _, info in metadata.items():
total_count = info["count"] + total_count
with open(out_dir + "index.html", "w") as f:
f.write(template.render({
"metadata": data,
"album_count": len(metadata.keys()),
"photo_counts": photo_counts,
"total_count": total_count
}))
def render_places():
template = template_environment.get_template("place")
for placename, info in metadata.items():
working_path = out_dir + placename
photos = metadata[placename]["photos"]
photos_json = dumps(photos)
count = len(photos)
widths = []
heights = []
for photo in photos:
photo_path = out_dir + "thumbnail/thumbnail_" + photo
img = Image.open(photo_path)
width, height = img.size
widths.append(width)
heights.append(height)
photo_specs = zip(widths, heights, photos)
try:
with open("md/" + placename + ".md", "r") as f:
md = markdown(f.read())
except FileNotFoundError:
md = "<h1>Blog Work In Progress</h1>"
with open(working_path + "/index.html", "w") as f:
f.write(template.render({
"count": count,
"placename": placename,
"info": info,
"markdown": md,
"photos": photo_specs,
"photos_json": photos_json
}))
if __name__ == "__main__":
try:
overwrite = "overwrite" in argv
covers(overwrite=overwrite)
thumbnails(overwrite=overwrite)
compressed(overwrite=overwrite)
except KeyboardInterrupt:
exit()
render_index()
render_places()