simple_gallery

Generate simple, static HTML/CSS gallery
Log | Files | Refs | README

jinjarender.py (4426B)


      1 #!/usr/bin/env python3
      2 from jinja2 import Environment, PackageLoader, select_autoescape
      3 import sys
      4 import os
      5 import csv
      6 import json
      7 import argparse
      8 
      9 def exifstring( exifinfo ):
     10     return "{} || {}s | f/{} | {} | ISO{} || {} + {} | {}".format( exifinfo[2], exifinfo[3], exifinfo[4][1:], exifinfo[5], exifinfo[6], exifinfo[7], exifinfo[8], exifinfo[9] ) 
     11 
     12 if __name__ == "__main__":
     13 
     14     parser = argparse.ArgumentParser(
     15         prog="Simple Gallery",
     16         description="Generate a static multi-album image gallery HTML/CSS site from a JSON description.",
     17     )
     18     
     19     parser.add_argument( 
     20         "input",
     21         help="JSON file containing the album descriptions."
     22     )
     23 
     24     parser.add_argument( 
     25         "output_path",
     26         help="Path to the folder for the rendered HTML."
     27     )
     28 
     29     args = parser.parse_args()
     30         
     31     env = Environment(
     32         loader=PackageLoader( "jinjarender", package_path="templates" ),
     33         autoescape=select_autoescape()
     34     )
     35 
     36 
     37     index = env.get_template( "index.html" )
     38     viewer = env.get_template( "viewer.html" )
     39     album = env.get_template( "album.html" )
     40 
     41     ls = os.listdir( f"{ args.output_path }/img/metadata/" )
     42     m = dict()
     43     for metadata in ls:
     44         with open( f"{ args.output_path }/img/metadata/{ metadata }" ) as f:
     45             r = csv.reader( f )
     46             row = next(r)
     47             m[ row[0] ] = row[1:]
     48 
     49     
     50     with open( args.input ) as jsonfile:
     51         jsonarray = json.load( jsonfile )
     52 
     53     allimgsdict = dict()
     54     allalbums = []
     55     for json in jsonarray:
     56         print( json["name"] )
     57         allalbums.append( json["name"] )
     58         for img in json["imgs"]:
     59             allimgsdict[img] = None
     60 
     61     allimgs = list( allimgsdict.keys() )
     62     
     63     nalbums = len( allalbums )
     64 
     65     # set rootpath to enable absolute paths
     66     # rootpath = "/mysite/something/blabla" # rememeber no trailing slash
     67     rootpath = None
     68     # rootpath = ""
     69 
     70     #generate album files
     71     for i in range( nalbums ):
     72         json = jsonarray[i];
     73         nextalbum = f"{ jsonarray[ (i+1)%nalbums ]['name'] }.html"
     74         prevalbum = f"{ jsonarray[ (i-1)%nalbums ]['name'] }.html"
     75         if rootpath == None:
     76             rootdir = "."
     77         else:
     78             rootdir = rootpath
     79 
     80         with open( f"{ args.output_path }/{ json['name'] }.html", "x" ) as f:
     81             f.write( album.render( rootdir = rootdir, nextalbum = nextalbum, prevalbum = prevalbum, title = json["name"], imgs = json["imgs"], navbar = True ) )
     82 
     83         #generate viewer files for this album
     84         os.makedirs( f"{ args.output_path }/img/viewer/{ json['name'] }", exist_ok = True )
     85 
     86         n = len( json["imgs"] )
     87         for i in range( n ):
     88             img = json["imgs"][i]
     89             exif = m[img]
     90             album_name = json['name']
     91             nexti = f"{ album_name }/{ str( json['imgs'][ (i+1)%n ] ) }.html"
     92             previ = f"{ album_name }/{ str( json['imgs'][ (i-1)%n ] ) }.html"
     93             if rootpath == None:
     94                 rootdir = "../../.."
     95             else:
     96                 rootdir = rootpath
     97             with open( f"{ args.output_path }/img/viewer/{ json['name'] }/{ img }.html", "x" ) as f:
     98                 f.write( viewer.render( rootdir = rootdir, navbar = True, album_name = album_name, img = img, exif = exifstring( exif ), nexti = nexti, previ = previ ) )
     99 
    100     #generate index file
    101     albums = []
    102     imgs = []
    103     desc = []
    104     for json in jsonarray:
    105         albums.append( json["name"] + ".html" )
    106         imgs.append( json["imgs"][0] )
    107         desc.append( json["name"] )
    108 
    109     if rootpath == None:
    110         rootdir = "."
    111     else:
    112         rootdir = rootpath
    113 
    114     with open( f"{ args.output_path }/index.html", "x" ) as f:
    115         f.write( index.render( rootdir = rootdir, title = "index", imgs = imgs, hrefs = albums, desc = desc, bodyclass = "index" ) )
    116     
    117     #generate viewer files for all imgs
    118     n = len( allimgs )
    119     for i in range( n ):
    120         img = allimgs[i]
    121         exif = m[img]
    122         nexti = f"{ str( allimgs[ (i+1)%n ] ) }.html"
    123         previ = f"{ str( allimgs[ (i-1)%n ] ) }.html"
    124         if rootpath == None:
    125             rootdir = "../.."
    126         else:
    127             rootdir = rootpath
    128         with open( f"{ args.output_path}/img/viewer/{ img }.html", "x" ) as f:
    129             f.write( viewer.render( rootdir = rootdir, navbar = True, img = img, exif = exifstring( exif ), nexti = nexti, previ = previ, album_name = "index" ) )