#!/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())