[SSG] Complete thumbnail gen. Refactor Episode, main.

This commit is contained in:
Ceda EI 2020-01-25 23:40:25 +05:30
parent e6139b4c33
commit d0b7922c9b
1 changed files with 35 additions and 13 deletions

48
nova.py
View File

@ -3,14 +3,21 @@
import argparse
from collections import UserList
from datetime import datetime
import os
import os.path as path
import re
import subprocess
import sys
import jinja2
def gen_name(date, slug):
"Returns to file name"
return date.strftime("%Y-%m-%d-") + slug
class EpisodeList(UserList):
"Represents list of episodes"
def __init__(self, data, output, template):
@ -18,11 +25,20 @@ class EpisodeList(UserList):
self.output = output
self.template = template
def sort(self):
def sort(self, *_args, **_kwargs):
"Sorts the EpisodeList"
super().sort(key=lambda x: x.date, reverse=True)
def generate_thumnails(self):
def generate_thumbnails(self):
"Generates thumbnails for all the videos"
if not path.isdir(self.output + "assets"):
os.mkdir(self.output + "assets")
if not path.isdir(self.output + "assets/thumbnails"):
os.mkdir(self.output + "assets/thumbnails")
for episode in self.data:
location = (self.output + "assets/thumbnails/" +
gen_name(episode.date, episode.slug) + ".jpg")
episode.store_thumbnail(location)
def generate_atom(self):
"Generates the Atom feed"
@ -33,27 +49,32 @@ class EpisodeList(UserList):
class Episode:
"Represents one episode of podcast"
def __init__(self, date, slug, title, show_notes):
def __init__(self, date, slug, title, show_notes, video_src):
self.date = date
self.slug = slug
self.title = title
self.show_notes = show_notes
self.video = video_src
def render(self, template, thumbnail_src, video_src):
def render(self, template, thumbnail_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
video_src=self.video
)
def store_thumbnail(self, location):
"Stores the thumbnail for given image at path"
args = ["ffmpeg", "-i", self.video, "-ss", "00:00:01.000", "-vframes",
"1", location]
subprocess.run(args, check=False)
def main():
"Main method"
root = path.dirname(sys.argv[0])
parser = argparse.ArgumentParser()
parser.add_argument("input_dir", help="Input directory")
parser.add_argument("output_dir", help="Output directory")
@ -71,27 +92,28 @@ def main():
os.mkdir(args.output_dir)
template = jinja2.Environment(
loader=jinja2.FileSystemLoader(input_dir),
loader=jinja2.FileSystemLoader(root),
autoescape=jinja2.select_autoescape("html")
).get_template("index.html")
podcast = EpisodeList([], output_dir, template)
split = re.compile(r"((?P<date>\d{4}-[01]?\d-[0123]?\d)-(?P<slug>.*))")
split = re.compile(r"((?P<date>\d{4}-[01]?\d-[0123]?\d)-(?P<slug>.*).md)")
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")
date = datetime.strptime(match.group("date"), "%Y-%M-%d")
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))
with open(input_dir + "md/" + file) as episode:
title = episode.readline()
show_notes = episode.read()
video = input_dir + "videos/" + gen_name(date, slug) + ".mp4"
podcast.append(Episode(date, slug, title, show_notes, video))
podcast.sort()
podcast.generate_thumnails()
podcast.generate_thumbnails()
podcast.generate_atom()
podcast.generate_site()