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