diff --git a/.gitignore b/.gitignore
index c8aefce..7580638 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
/extern
/thumbnails-small
+/site
diff --git a/scripts/generate-pages.py b/scripts/generate-pages.py
new file mode 100755
index 0000000..c2a9a42
--- /dev/null
+++ b/scripts/generate-pages.py
@@ -0,0 +1,158 @@
+#!/usr/bin/env python3
+
+import sys
+import os
+import shutil
+import html
+
+import yaml
+
+
+def read(path):
+ with open(path) as f:
+ return f.read()
+
+def write(path, text):
+ with open(path, 'w') as f:
+ f.write(text)
+
+def load_settings(settings_file):
+ with open(settings_file) as f:
+ settings = {name: value
+ for name, value
+ in (line.split('=', 1) for line in
+ f.read().strip().split('\n'))}
+ return settings
+
+def load_media(media_file):
+ with open(media_file) as f:
+ c = yaml.load(f)
+ c['year'] = int(c['year'])
+ c['ident'] = ident(media_file)
+ return c
+
+def ident(media_file):
+ return os.path.splitext(os.path.split(media_file)[1])[0]
+
+def thumbnail_path(name):
+ return os.path.join(name, 'thumbnail.jpg')
+
+def thumbnail_url(link):
+ return link + 'thumbnail.jpg'
+
+def setup_directory_structure(settings, base_dir, template_dir):
+ site_new_dir = os.path.join(base_dir, 'site-new')
+ os.mkdir(site_new_dir)
+ extern_dir = os.path.join(base_dir, 'extern')
+ extern_dir_site = os.path.join(site_new_dir, 'extern')
+ os.symlink(extern_dir, extern_dir_site)
+
+ style = read(os.path.join(template_dir, 'style.css'))
+ style_out = style.replace('{', '{{').replace('}', '}}') \
+ .replace('[', '{').replace(']', '}').format(**settings)
+ style_new_file = os.path.join(site_new_dir, 'style.css')
+ write(style_new_file, style_out)
+
+ return site_new_dir
+
+def publish_new_site(site_dir, site_new_dir):
+ shutil.rmtree(site_dir, ignore_errors=True)
+ shutil.move(site_new_dir, site_dir)
+
+def generate_index_page(out_dir, base_html, section_html, medias):
+ sections = [generate_video_section_html(section_html, media)
+ for media in medias]
+
+ all_sections = '\n'.join(sections)
+ html_out = base_html.format(content=all_sections,
+ style_url='style.css')
+
+ out_file = os.path.join(out_dir, 'index.html')
+ write(out_file, html_out)
+
+def generate_video_section_html(section_html, media):
+ title = media['title']
+ link = media['ident'] + '/'
+ thumbnail = thumbnail_url(link)
+
+ html_out = section_html.format(
+ title=html.escape(title),
+ thumbnail=thumbnail, link=link)
+ return html_out
+
+def extern_video(file_src):
+ url = '../extern/' + file_src
+ return '''\
+
+'''.format(file_src=file_src)
+
+def youtube_video(file_src):
+ return '''\
+
+'''.format(file_src=file_src)
+
+def generate_video_page(base_dir, out_dir, base_html, showing_html, media):
+ title = media['title']
+ year = media['year']
+ description = media['description']
+ name = media['ident']
+ video_dir = os.path.join(out_dir, name)
+ os.mkdir(video_dir)
+ thumbnail_file = thumbnail_path(video_dir)
+ thumbnail_file_local = os.path.join(
+ base_dir, 'thumbnails-small', name + '.jpg')
+ shutil.copyfile(thumbnail_file_local, thumbnail_file)
+
+ file_type, file_src = media['file'].split(':', 1)
+ actions = {
+ 'extern': extern_video,
+ 'youtube': youtube_video
+ }
+ video_html = actions[file_type](file_src)
+
+ html_inner = showing_html.format(
+ title=html.escape(title),
+ year=str(year),
+ description=html.escape(description),
+ video=video_html)
+ html_out = base_html.format(content=html_inner,
+ style_url='../style.css')
+
+ out_file = os.path.join(video_dir, 'index.html')
+ write(out_file, html_out)
+
+def main():
+ script_dir = os.path.dirname(__file__)
+ settings_file = os.path.join(script_dir, 'settings')
+ settings = load_settings(settings_file)
+ base_dir = os.path.split(script_dir)[0]
+
+ template_dir = os.path.join(base_dir, 'template')
+ base_html = read(os.path.join(template_dir, 'base.html'))
+ section_html = read(os.path.join(template_dir, 'section.html'))
+ showing_html = read(os.path.join(template_dir, 'showing.html'))
+
+ media_dir = os.path.join(base_dir, 'media')
+ media_files = [os.path.join(media_dir, media_file)
+ for media_file in os.listdir(media_dir)]
+ medias = [load_media(media_file) for media_file in media_files]
+ medias.sort(key=lambda m: (m['year'], m['ident']), reverse=True)
+
+ site_new_dir = setup_directory_structure(settings, base_dir, template_dir)
+ generate_index_page(site_new_dir, base_html, section_html, medias)
+ for media in medias:
+ generate_video_page(base_dir, site_new_dir, base_html, showing_html,
+ media)
+ site_dir = os.path.join(base_dir, 'site')
+ publish_new_site(site_dir, site_new_dir)
+
+ return 0
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/scripts/generate-site.sh b/scripts/generate-site.sh
new file mode 100755
index 0000000..3dfe97f
--- /dev/null
+++ b/scripts/generate-site.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+base_dir="$(dirname "$0")"
+
+"$base_dir"/resize-thumbnails.sh
+"$base_dir"/generate-pages.py