💾 Archived View for republic.circumlunar.space › users › luminar › scripts › atomgen.py captured on 2023-04-19 at 23:55:17.
⬅️ Previous capture (2020-10-31)
-=-=-=-=-=-=-
#! scripts/venv/bin/python from dataclasses import dataclass from datetime import datetime from operator import attrgetter from pathlib import Path import pytz from feedgen.feed import FeedGenerator from xmlformatter import Formatter BASE_URL = "gemini://republic.circumlunar.space/~luminar" @dataclass class Post: title: str date: datetime summary: str file_name: str def main(file_name: Path, post_dir: Path): posts = [] for post_file in post_dir.glob("*.gmi"): with open(post_file) as f: title = next(f).strip("# \n") date = pytz.timezone("Europe/Prague").localize( datetime.strptime(next(f).strip(), "%Y-%m-%d") ) date = date.replace(hour=12, minute=0, second=0, microsecond=0) # Get the next non-empty line while True: summary = next(f).strip() if summary: break # If there are multiple level one headings, append them to the title for line in f: if line.startswith("# "): title += "; " + line.strip("# ") posts.append(Post(title, date, summary, post_file.name)) by_date = sorted(posts, key=attrgetter("date")) generator = FeedGenerator() generator.title("luminar's capsule") generator.id(BASE_URL) generator.link(href=BASE_URL) generator.author(name="luminar") generator.language("en") generator.updated(by_date[-1].date) for post in by_date: entry = generator.add_entry() entry.id(post.file_name) entry.title(post.title) entry.summary(post.summary) entry.link(href=f"{BASE_URL}/text/{post.file_name}") entry.updated(post.date) feed = generator.atom_str() formatted = Formatter().format_string(feed) file_name.write_bytes(formatted) if __name__ == "__main__": main(Path("atom_feed.xml"), Path("text"))