diff --git a/nova.py b/nova.py new file mode 100755 index 0000000..448a9f2 --- /dev/null +++ b/nova.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python3 +"Creates a static site for redacted.life" + +import argparse +from collections import UserList +import os +import os.path as path +import re +import sys + +import jinja2 + + +class EpisodeList(UserList): + "Represents list of episodes" + def __init__(self, data, output, template): + super().__init__(data) + self.output = output + self.template = template + + def sort(self): + "Sorts the EpisodeList" + + def generate_thumnails(self): + "Generates thumbnails for all the videos" + + def generate_atom(self): + "Generates the Atom feed" + + def generate_site(self): + "Generates the entire " + + +class Episode: + "Represents one episode of podcast" + def __init__(self, date, slug, title, show_notes): + self.date = date + self.slug = slug + self.title = title + self.show_notes = show_notes + + def render(self, template, thumbnail_src, video_src): + "Renders the Episode with the given template" + return template.render( + title=self.title, + show_notes=jinja2.Markup(self.show_notes), + thumbnail_src=thumbnail_src, + video_src=video_src + ) + + def store_thumbnail(self, location): + "Stores the thumbnail for given image at path" + + +def main(): + "Main method" + parser = argparse.ArgumentParser() + parser.add_argument("input_dir", help="Input directory") + parser.add_argument("output_dir", help="Output directory") + args = parser.parse_args() + input_dir = args.input_dir.rstrip("/") + "/" + output_dir = args.output_dir.rstrip("/") + "/" + + # Input validation + if not all(path.isdir(i) for i in (input_dir, input_dir + "md", + input_dir + "videos")): + print("Invalid Input", file=sys.stderr) + return + + if not path.isdir(args.output_dir): + os.mkdir(args.output_dir) + + template = jinja2.Environment( + loader=jinja2.FileSystemLoader(input_dir), + autoescape=jinja2.select_autoescape("html") + ).get_template("index.html") + + podcast = EpisodeList([], output_dir, template) + + split = re.compile(r"((?P\d{4}-[01]?\d-[0123]?\d)-(?P.*))") + for file in os.listdir(input_dir + "md"): + match = split.match(file) + if not match: + print(f"Invalid filename: {file}", file=sys.stderr) + continue + date = match.group("date") + slug = match.group("slug") + with open(file) as f: # pylint: disable=invalid-name + title = f.readline() + show_notes = f.read() + podcast.append(Episode(date, slug, title, show_notes)) + + podcast.sort() + podcast.generate_thumnails() + podcast.generate_atom() + podcast.generate_site() + + +if __name__ == "__main__": + main()