gemfeed/gemfeed.py

77 lines
2.5 KiB
Python
Raw Normal View History

import argparse
import datetime
import glob
import os.path
from feedgen.feed import FeedGenerator
2020-03-16 17:54:49 +00:00
def find_files():
files = []
for extension in ("gmi", "gem", "gemini"):
files.extend(glob.glob("*.{}".format(extension)))
index = "index.{}".format(extension)
if index in files:
files.remove(index)
return files
2020-03-16 17:54:49 +00:00
def populate_entry_from_file(filename, base_url, entry):
url = base_url + filename
entry.guid(url)
entry.link(href=url)
updated = os.path.getctime(filename)
updated = datetime.datetime.fromtimestamp(updated, tz=datetime.timezone.utc)
entry.updated(updated)
with open(filename) as fp:
for line in fp:
if line.startswith("#"):
while line[0] == "#":
line = line[1:]
title = line.strip()
break
else:
title = filename
entry.title(title)
def main():
# Parse arguments
parser = argparse.ArgumentParser(description='Generate an Atom feed for Gemini content.')
parser.add_argument('-b', '--base', dest='base_url', type=str,
required=True, help='base URL for feed and entries')
parser.add_argument('-o', '--output', dest='output', type=str,
default="atom.xml", help='output filename')
parser.add_argument('-t', '--title', dest='title', type=str,
default="A Gemini feed", help='feed title')
args = parser.parse_args()
# Normalise base URL, quick and dirty
if not args.base_url.startswith("gemini://"):
args.base_url = "gemini://" + args.base_url
if not args.base_url.endswith("/"):
args.base_url = args.base_url + "/"
2020-03-16 17:54:49 +00:00
# Setup feed
feed = FeedGenerator()
feed.id(args.base_url)
feed.title(args.title)
feed.link(href=args.base_url, rel='alternate')
feed.link(href=args.base_url + "atom.xml", rel='self')
2020-03-16 17:54:49 +00:00
# Add one entry per .gmi file
files = find_files()
latest_update = datetime.datetime.fromtimestamp(0, tz=datetime.timezone.utc)
for filename in files:
entry = feed.add_entry()
populate_entry_from_file(filename, args.base_url, entry)
2020-03-16 17:54:49 +00:00
print("Adding {} with title '{}'...".format(filename, entry.title()))
if entry.updated() > latest_update:
latest_update = entry.updated()
feed.updated(latest_update)
# Write file
feed.atom_file(args.output, pretty=True)
print("Wrote Atom feed to {}.".format(args.output))
2020-03-16 17:54:49 +00:00
if __name__ == "__main__":
main()