terom@76: from degal.command import command terom@66: from degal import templates terom@88: from degal.task import threadable_task terom@48: terom@88: def render_image_html (ctx, image) : terom@66: """ terom@66: Render the thumbnails and .html for one image terom@66: """ terom@87: terom@66: # render output terom@66: tpl = templates.master(ctx.gallery, image.title, image.html, terom@66: templates.image_page(image) terom@66: ) terom@66: terom@66: # write output terom@66: tpl.render_file(image.html) terom@66: terom@88: def render_image_task (image) : terom@88: """ terom@88: Render the image output for the given image terom@88: """ terom@88: terom@88: # XXX: is this really threadsafe? terom@88: image.update() terom@88: terom@88: # return value is the image itself terom@88: return image terom@88: terom@88: def render_folder_images (ctx, images) : terom@88: """ terom@88: Render the given series of images terom@88: """ terom@88: terom@88: # render them in parallel as required terom@88: for image in ctx.tasks.execute([ terom@88: threadable_task(render_image_task, image) for image in images terom@88: ]) : terom@88: # log image path terom@88: ctx.log_info("%s", image) terom@88: terom@88: render_image_html(ctx, image) terom@88: terom@87: def render_folder_page (ctx, folder) : terom@48: """ terom@87: Render the .html output for one folder terom@48: """ terom@48: terom@87: # render each page separately terom@66: for page in xrange(folder.page_count) : terom@66: # output .html page terom@66: html_file = folder.html_file(page) terom@66: terom@66: # render template terom@66: tpl = templates.master(ctx.gallery, folder.title, html_file, terom@66: templates.folder_page(folder, page) terom@66: ) terom@66: terom@66: # write output terom@66: tpl.render_file(html_file) terom@66: terom@87: def render_folder (ctx, folder) : terom@88: """ terom@88: Render the HTML/images for this folder if needed, and recrurse into subfolders. terom@88: """ terom@88: terom@87: # index images that require updating terom@87: image_count = len(folder.images) terom@87: new_images = list(folder.index_images(for_update=(not ctx.config.force_update))) terom@87: terom@87: if new_images or ctx.config.force_update: terom@87: # update folder index terom@87: render_folder_page(ctx, folder) terom@87: terom@87: ctx.log_info("%s - render %d/%d images", folder, len(new_images), image_count) terom@87: terom@87: # update images terom@88: render_folder_images(ctx, new_images) terom@87: terom@87: else : terom@87: ctx.log_info("%s - up to date", folder) terom@87: terom@87: # index subfolders terom@87: for subfolder in folder.subfolders : terom@87: render_folder(ctx, subfolder) terom@66: terom@66: @command terom@66: def main (ctx) : terom@66: """ terom@66: Scan the gallery for new folders/images, and render updated ones terom@66: """ terom@66: terom@66: # render the gallery terom@66: render_folder(ctx, ctx.gallery) terom@48: