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" ) )