From 7cad56eb1fd973b49e14c8f8d38285f34c58cb8b Mon Sep 17 00:00:00 2001 From: nebula Date: Tue, 8 Apr 2025 04:13:39 +0000 Subject: [PATCH] add atom feed support (this code is getting messy) --- .gitignore | 6 ++++++ generate.py | 59 ++++++++++++++++++++++++++++++++++++++++++++++----- metadata.json | 30 +++++++++++++++++--------- 3 files changed, 80 insertions(+), 15 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..744fb66 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +bin +include +lib +lib64 +pyvenv.cfg + diff --git a/generate.py b/generate.py index b6cb0a9..a6406ea 100644 --- a/generate.py +++ b/generate.py @@ -1,15 +1,18 @@ from sys import argv -from subprocess import Popen, PIPE, STDOUT, run, call +from subprocess import Popen, PIPE, run, call 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 +from feedgen.feed import FeedGenerator import re +import datetime -numbers = re.compile("[0-9]+") -name_from_url = re.compile(r"https:\/\/helixnebula.space/(.*)/") +numbers_re = re.compile("[0-9]+") +name_from_url_re = re.compile(r"https:\/\/helixnebula.space/(.*)/") +md_links_re = re.compile(r"\[([^\]]*)\]\([^\)]*\)") out_dir = "/var/www/html/" gemini_out_dir = "/var/gemini/" base_url = "https://helixnebula.space/" @@ -37,11 +40,22 @@ for placename in metadata.keys(): pass metadata[placename]["count"] = len(photos) metadata[placename]["photos"] = photos - metadata[placename]["photos"].sort(key=lambda path: int(numbers.search(path).group(0))) + metadata[placename]["photos"].sort(key=lambda path: int(numbers_re.search(path).group(0))) with open(f"{out_dir}photos.json", "w") as f: dump(metadata, f) +def header_from_code(code): + path = f"{md_dir}{code}.md" + with open(path, "r") as f: + md = f.read() + header = "" + for char in md[2:]: + if char == "\n": + break + header += char + return header + def covers(overwrite=False): print("running covers") for placename, info in metadata.items(): @@ -153,7 +167,7 @@ def render_gemini_places(): content = f.read() process = Popen(["gemgen"], stdout=PIPE, stdin=PIPE, stderr=PIPE, text=True) gemtext = process.communicate(input=content)[0] - gemtext_with_local_urls = name_from_url.sub(sub_http_local_urls, gemtext) + gemtext_with_local_urls = name_from_url_re.sub(sub_http_local_urls, gemtext) with open(gemini_out_dir + post_name + ".gmi", "w") as f: f.write(template.render({ "post_code": post_name, @@ -162,6 +176,40 @@ def render_gemini_places(): "state": metadata[post_name]["state"] })) +def md_from_code(code): + with open(f"{md_dir}{code}.md", "r") as f: + return markdown(f.read()) + +def path_to_story_name(story_path): + return path.basename(story_path).split('/')[-1][:-3] + +def render_atom(): + posts_sorted = story_names.copy() + posts_sorted.sort(key=lambda i: metadata[i]["story_time"]) + feed = FeedGenerator() + feed.id("helixnebula.space") + feed.title("helixnebula.space") + feed.updated(datetime.datetime.fromtimestamp(metadata[posts_sorted[-1]]["story_time"], datetime.timezone.utc)) + feed.author({"name":"~nebula","email":"nebula@tilde.town"}) + feed.link(href="https://helixnebula.space/", rel="alternate") + feed.link(href="https://helixnebula.space/feed.atom", rel="self") + feed.subtitle("Exploring America the Beautiful") + feed.icon("https://helixnebula.space/favicon.ico") + feed.language("en") + for post_code in posts_sorted: + post_metadata = metadata[post_code] + header = header_from_code(post_code) + title = f"{post_metadata['title']}, {post_metadata['state']}: {header}" + entry = feed.add_entry() + entry.id(post_code) + entry.title(title) + entry.updated(datetime.datetime.fromtimestamp(metadata[post_code]["story_time"], datetime.timezone.utc)) + entry.link(href=f"https://helixnebula.space/{post_code}/") + entry.summary(header) + entry.description(header) + entry.content(md_from_code(post_code), type="html") + feed.atom_file(out_dir + "feed_html.atom") + def copy_files(): call(f"cp js/* {out_dir}js/", shell=True) call(f"cp style.css {out_dir}style.css", shell=True) @@ -179,3 +227,4 @@ if __name__ == "__main__": copy_files() render_gemini_index() render_gemini_places() + render_atom() diff --git a/metadata.json b/metadata.json index 564e255..eea9de6 100644 --- a/metadata.json +++ b/metadata.json @@ -2,7 +2,8 @@ "BasinRange": { "title": "Basin & Range National Monument", "state": "Nevada", - "cover": "99.jpg" + "cover": "99.jpg", + "story_time": 1740873600 }, "Berlin": { "title": "Berlin Ichthyosaur State Park", @@ -12,7 +13,8 @@ "Bisti": { "title": "Bisti Badlands", "state": "New Mexico", - "cover": "19.jpg" + "cover": "19.jpg", + "story_time": 1740787200 }, "Canyonlands": { "title": "Canyonlands National Park", @@ -82,7 +84,8 @@ "Caballo": { "title": "Caballo", "state": "New Mexico", - "cover": "IMG_0760.JPEG" + "cover": "IMG_0760.JPEG", + "story_time": 1742662800 }, "Peralta": { "title": "Peralta Trail (Weaver's Needle)", @@ -107,7 +110,8 @@ "Rubies": { "title": "Ruby Mountains", "state": "Nevada", - "cover": "IMG_0667.JPEG" + "cover": "IMG_0667.JPEG", + "story_time": 1742058000 }, "ElMalpais": { "title": "El Malpais National Monument", @@ -162,7 +166,8 @@ "PrescottNF": { "title": "Prescott National Forest", "state": "Arizona", - "cover": "IMG_7458.JPEG" + "cover": "IMG_7458.JPEG", + "story_time": 1744009200 }, "BoyceThompson": { "title": "Boyce Thompson Arboretum", @@ -172,12 +177,14 @@ "ToApacheLake": { "title": "To Apache Lake", "state": "Arizona", - "cover": "IMG_1735.JPG" + "cover": "IMG_1735.JPG", + "story_time": 1742749200 }, "SonoranSnow": { "title": "Sonoran Desert Snow Day", "state": "Arizona", - "cover": "IMG_8764.JPEG" + "cover": "IMG_8764.JPEG", + "story_time": 1744083545 }, "GoldwaterLakes": { "title": "Goldwater Lakes", @@ -197,7 +204,8 @@ "ChiNaturePark": { "title": "Chihuahuan Desert Nature Park", "state": "New Mexico", - "cover": "IMG_6236.JPEG" + "cover": "IMG_6236.JPEG", + "story_time": 1743699600 }, "Bumblebee": { "title": "Bumblebee", @@ -227,12 +235,14 @@ "Pushawalla": { "title": "Pushawalla Palms Trail", "state": "California", - "cover": "IMG_1424.JPG" + "cover": "IMG_1424.JPG", + "story_time": 1744002000 }, "SmokyMountains": { "title": "Smoky Mountains", "state": "Tennessee", - "cover": "IMG_5708.JPEG" + "cover": "IMG_5708.JPEG", + "story_time": 1742922000 }, "TruthOrConsequences": { "title": "Truth or Consequences",