#!/usr/bin/env python3 import jinja2 import os import sys from datetime import datetime def timestamp_to_datetime(timestamp): return datetime.fromtimestamp(timestamp) def main(inputfolder, outputfolder, ignore_files): jinjaenv = jinja2.Environment(autoescape=jinja2.select_autoescape()) jinjaenv.filters["timestamp_to_datetime"] = timestamp_to_datetime template = jinjaenv.from_string("""<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta name="viewport" content="width=device-width"> <style type="text/css"> body,html { background: #fff; font-family: "Bitstream Vera Sans","Lucida Grande","Lucida Sans Unicode",Lucidux,Verdana,Lucida,sans-serif; } tr:nth-child(even) { background:#f4f4f4; } th,td { padding:0.1em 0.5em; } th { text-align:left; font-weight:bold; background:#eee; border-bottom:1px solid #aaa; } #list { border:1px solid #aaa; width:100%; } a { color:#a33; } a:hover { color:#e33; } </style> </head> <body> <h1>Index of /{{ path }}</h1> <table id="list"> <thead> <tr> <th style="width:55%"> File Name </th> <th style="width:20%"> File Size</th> <th style="width:25%"> Date </th> </tr> </thead> <tbody> <tr> <td class="link"> <a href="../">Parent directory/</a> </td> <td class="size">-</td> <td class="date">-</td> </tr> {% for entry, stat, is_dir in entries %} <tr> <td class="link"> <a href="{{ entry + ('/' if is_dir else '') }}" title="{{ entry }}">{{ entry + ('/' if is_dir else '') }}</a> </td> <td class="size">{{ '-' if is_dir else stat.st_size|filesizeformat }}</td> <td class="date">{{ (stat.st_mtime|timestamp_to_datetime).isoformat(timespec='seconds') }}</td> </tr> {% endfor %} </tbody> </table> <p><a href="https://legal.cccv.de">Impressum - Datenschutzerklärung</a></p> </body> </html> """) for path, dirs, files in os.walk(inputfolder): dirs.sort() files.sort() relativ_path_to_input = os.path.relpath(path, inputfolder) entries = [(i, os.stat(os.path.join(path, i)), i in dirs) for i in dirs+files if not i in ignore_files] html_index = template.render(path=relativ_path_to_input, entries=entries) html_index_folder = os.path.join(outputfolder, relativ_path_to_input) html_index_path = os.path.join(html_index_folder, 'index.html') os.makedirs(html_index_folder, exist_ok=True) outputfile = open(html_index_path, "w") outputfile.write(html_index) outputfile.close() if __name__ == '__main__': if len(sys.argv) != 3: print(f'Usage: {sys.argv[0]} <directory tree to create index from> <output path for index tree>') sys.exit(1) main(inputfolder=sys.argv[1], outputfolder=sys.argv[2], ignore_files=['index.html'])