| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- #!/usr/bin/python3
- import logging
- import os
- from os import listdir
- from os.path import isdir, isfile, join
- import re
- from string import Template
- import sys
- import traceback
- #import Image
- from configparser import ConfigParser
- from optparse import OptionParser
- __all__ = []
- __version__ = 0.1
- __date__ = '2021-12-27'
- __updated__ = '2021-12-27'
- DEBUG = 1
- TESTRUN = 0
- PROFILE = 0
- html = Template("""<html>
- <head>
- <script src="/res/js/jquery.min.js"></script>
- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
- <link type="text/css" rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.0.0-beta.3/css/lightgallery-bundle.css" />
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
- <link type="text/css" rel="stylesheet" href="/res/user.css" />
- <link type="text/css" rel="stylesheet" href="/res/galleryindex.css" />
- </head>
- <body class="index">
- <div id="header" class="index">
- <h1>$title</h1>
- <div class="searchcontainer">
- <form role="form">
- <div class="form-group">
- <input type="input" class="form-control input-lg" id="txt-search" placeholder="Suchbegriff eingeben">
- </div>
- </form>
- </div>
- </div><!-- end header -->
- <div id="outer_lightgallery">
- <ul class="nav nav-tabs" id="myTab" role="tablist">
- <li class="nav-item">
- <a class="nav-link active" id="lightgallery-tab" data-toggle="tab" href="#lightgallery" role="tab" aria-controls="lightgallery" aria-selected="true">Alle Galerien</a>
- </li>
- <li class="nav-item">
- <a class="nav-link" id="filters-tab" data-toggle="tab" href="#filters" role="tab" aria-controls="filters" aria-selected="false">Filter</a>
- </li>
- <li class="nav-item">
- <a class="nav-link" id="results-tab" data-toggle="tab" href="#results" role="tab" aria-controls="results" aria-selected="false">Filter-Ergebnisse</a>
- </li>
- </ul>
- <div class="tab-content" id="myTabContent">
- <div class="tab-pane fade active index" id="lightgallery" role="tabpanel" aria-labelledby="lightgallery-tab">
- $dirlist
- </div>
- <div class="tab-pane fade" id="filters" role="tabpanel" aria-labelledby="filters-tab"><div style="padding:5em;">Zum Filtern bitte einen Suchbegriff in das Suchfeld eingeben.</div></div>
- <div class="tab-pane fade" id="results" role="tabpanel" aria-labelledby="results-tab"><div style="padding:5em;">Es gibt noch keine Filter-Ergebnisse</div></div>
- </div>
- </div>
- <script src="headerimages.js"></script>
- <script>
- function choosePic() {
- var randomNum = Math.floor(Math.random() * myPix.length);
- document.getElementById("header").style.backgroundImage = "url('" + myPix[randomNum] + "')";
- }
- function gallery_startup() {
- choosePic();
- $$('#myTab li:first-child a').tab('show')
- }
- window.onload = gallery_startup();
- </script>
- <script src="/res/js/lightgallery.min.js"></script>
- <script src="/res/plugins/relativeCaption/lg-relative-caption.min.js"></script>
- <script src="/res/plugins/fullscreen/lg-fullscreen.min.js"></script>
- <script src="/res/plugins/autoplay/lg-autoplay.min.js"></script>
- <script src="/res/plugins/thumbnail/lg-thumbnail.min.js"></script>
- <script src="/res/plugins/zoom/lg-zoom.min.js"></script>
- <script src="searchdata.js"></script>
- <script src="/res/lightgallery_search.js"></script>
- </body>
- </html>""")
- def maketitle(x):
- x = str(x)
- x = re.sub('^\d\d\d_', '', x)
- x = re.sub('_', ' ', x)
- return x
- def remove_prefix(text, prefix):
- return text[text.startswith(prefix) and len(prefix):]
- def getthumb(gallerydir, webrootdir):
- thumb = ''
- try:
- for f in listdir(join(gallerydir, '_thumbnails')):
- # print(f)
- thumbfile = join(gallerydir, '_thumbnails', f)
- if isfile(thumbfile):
- if str(f).lower().endswith('jpg'):
- thumb = remove_prefix(join(gallerydir, '_thumbnails', f), webrootdir)
- break
- except:
- pass
- return(thumb)
- def get_headerimage(gallerydir, webrootdir):
- print(gallerydir)
- return(remove_prefix(join(gallerydir, 'header/header.jpg'), webrootdir))
- def get_directories_in_gallerydir(gallerydir):
- onlydirs = []
- for f in listdir(gallerydir):
- if isdir(join(gallerydir, f)):
- if str(f) != '_thumbnails':
- onlydirs.append(f)
- onlydirs.sort()
- return(onlydirs)
- def read_config(opts):
- try:
- config_object = ConfigParser()
- config_object.read( "." + os.path.splitext(os.path.basename(__file__))[0] )
- ini = dict(config_object.items('default'))
- for key in ini:
- if not opts.__dict__[key]:
- opts.__dict__[key] = ini[key]
- except:
- pass
- def write_config(opts):
- ini = {}
- for key in opts.__dict__:
- value = opts.__dict__[key]
- if value is None:
- pass
- elif key == 'verbose':
- pass
- else:
- ini[key] = str(value)
-
- config_object = ConfigParser()
- config_object.read_dict({'default' : ini})
- with open("." + os.path.splitext(os.path.basename(__file__))[0], 'w') as conf:
- config_object.write(conf)
-
- def create_index_html(gallerydir, opts):
- read_config(opts)
- logging.info(f"Creating index in {gallerydir}")
- dirs = get_directories_in_gallerydir(gallerydir)
- logging.info(dirs)
- dirlist = ''
- headerimages = ''
- for d in dirs:
- headerimages = headerimages + '","' + get_headerimage(join(gallerydir,d), opts.webrootdir)
- thumb = getthumb(join(gallerydir,d), opts.webrootdir)
- print(thumb)
- # dirlist = dirlist + f"<div class='direntry'><a href='{d}'><img src='{thumb}'> " + maketitle(d) + "</a></div>\n"
- dirlist = dirlist + f"<div class='img-wrapper'><img src='{thumb}'><div class='p'><a href='{d}'>" + maketitle(d) + "</a></div></div>\n"
- #print(dirlist)
- headerimages = re.sub('^",', '', headerimages)
- with open(join(gallerydir, 'headerimages.js'), 'w') as e:
- e.write('var myPix = new Array(' + headerimages + '");')
- title = opts.title or os.path.basename(os.path.normpath(os.getcwd()))
- with open(join(gallerydir, 'index.html'), 'w') as f:
- dirlist2 = dirlist
- f.write(html.substitute( dirlist=dirlist2, title=title ))
- write_config(opts)
- def main(argv=None):
- '''Command line options.'''
- program_name = os.path.basename(sys.argv[0])
- program_version = "v0.1"
- program_build_date = "%s" % __updated__
- program_version_string = '%%prog %s (%s)' % (program_version, program_build_date)
- #program_usage = '''usage: spam two eggs''' # optional - will be autogenerated by optparse
- program_longdesc = '''create index for directory of lightgallery galleries''' # optional - give further explanation about what the program does
- program_license = "Copyright 2021 Markus Spring (markus-spring.info). \
- Licensed under the Apache License 2.0\nhttp://www.apache.org/licenses/LICENSE-2.0"
- if argv is None:
- argv = sys.argv[1:]
- try:
- # setup option parser
- parser = OptionParser(version=program_version_string, epilog=program_longdesc, description=program_license)
- # parser.add_option("-i", "--in", dest="infile", help="set input path [default: %default]", metavar="FILE")
- # parser.add_option("-o", "--out", dest="outfile", help="set output path [default: %default]", metavar="FILE")
- parser.add_option("-v", "--verbose", dest="verbose", action="count", help="set verbosity level [default: %default]")
- parser.add_option("-t", "--title", action="store", dest="title", help="set index title [default: %default]")
- parser.add_option("-w", "--webrootdir", action="store", dest="webrootdir", help="webserver root dir [default: %default]")
- parser.set_defaults( verbose=0)
- (opts, args) = parser.parse_args(argv)
- if opts.verbose > 0:
- print(("verbosity level = %d" % opts.verbose))
- if opts.title:
- print(("title = %s" % opts.title))
- if len(args) < 1:
- parser.error("directory argument missing")
-
- # MAIN BODY #
- logging.basicConfig(filename=os.path.basename(sys.argv[0]) + '.log', level=logging.INFO)
- create_index_html(args[0], opts)
- except BaseException as ex:
- ex_type, ex_value, ex_traceback = sys.exc_info() # Get current system exception
- trace_back = traceback.extract_tb(ex_traceback) # Extract unformatter stack traces as tuples
- stack_trace = list() # Format stacktrace
- for trace in trace_back:
- stack_trace.append("File : %s , Line : %d, Func.Name : %s, Message : %s" % (trace[0], trace[1], trace[2], trace[3]))
- print("Exception type : %s " % ex_type.__name__)
- print("Exception message : %s" %ex_value)
- print("Stack trace : %s" %stack_trace)
- if __name__ == "__main__":
- if DEBUG:
- sys.argv.append("-v")
- if TESTRUN:
- import doctest
- doctest.testmod()
- if PROFILE:
- import cProfile
- import pstats
- profile_filename = 'config_reader.config_reader_profile.txt'
- cProfile.run('main()', profile_filename)
- statsfile = open("profile_stats.txt", "wb")
- p = pstats.Stats(profile_filename, stream=statsfile)
- stats = p.strip_dirs().sort_stats('cumulative')
- stats.print_stats()
- statsfile.close()
- sys.exit(0)
- sys.exit(main())
- #Local Variables:
- #compile-command: "./create_gallery_index.py -t 'Dias Ed Spring 1958-1998' /media/thinc_webserver_data/vaters_dias/"
- #End:
|