diff --git a/README.md b/README.md index 6cc01f5..605a43e 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ The script supports several command-line options to customize its behavior. Belo - `--ignore-other-files`: Ignore files that do not match the specified extensions. - `--regenerate-thumbnails`: Regenerate thumbnails even if they already exist. - `--reread-metadata`: Reread image metadata if it already exists. +- `--reverse-sort`: Sort images by reverse name order. - `--theme-path PATH`: Specify the path to the CSS theme file. Default is the provided default theme. - `--use-fancy-folders`: Enable fancy folder view instead of the default Apache directory listing. diff --git a/StaticGalleryBuilder.code-workspace b/StaticGalleryBuilder.code-workspace index 996fb54..4809e68 100644 --- a/StaticGalleryBuilder.code-workspace +++ b/StaticGalleryBuilder.code-workspace @@ -39,6 +39,7 @@ "cc-by-nc-sa", "-n", "-m", + "--reverse-sort", "--regenerate-thumbnails", "--reread-metadata", ], diff --git a/help.svg b/help.svg index 28735f2..d73a5c8 100644 --- a/help.svg +++ b/help.svg @@ -1,4 +1,4 @@ - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + - + - + - - Usage:builder.py [-h] [-aAUTHOR] [-eEXTENSION] [-lLICENSE] [-m] [-n-pROOT [-r-tTITLE-wURL -                  [--exclude-folderFOLDER] [--ignore-other-files] [--theme-pathPATH] [--use-fancy-folders] -                  [--version] - -Generate HTML files for a static image hosting website. - -Options: --h--helpshow this help message and exit --a--author-nameAUTHOR -Name of the author of the images. --e--file-extensionsEXTENSION -File extensions to include (can be specified multiple times). --l--license-typeLICENSE -Specify the license type for the images. --m--web-manifestGenerate a web manifest file. --n--non-interactive-mode -Run in non-interactive mode, disabling progress bars. --p--root-directoryROOT -Root directory containing the images. --r--regenerate-thumbnails -Regenerate thumbnails even if they already exist. --t--site-titleTITLE -Title of the image hosting site. --w--web-root-urlURL -Base URL of the web root for the image hosting site. ---exclude-folderFOLDER -Folders to exclude from processing, globs supported (can be specified multiple times). ---ignore-other-filesIgnore files that do not match the specified extensions. ---theme-pathPATHPath to the CSS theme file. ---use-fancy-foldersEnable fancy folder view instead of the default Apache directory listing. ---versionshow program's version number and exit + + Usage:builder.py [-h] [-aAUTHOR] [-eEXTENSION] [-lLICENSE] [-m] [-n-pROOT-tTITLE-wURL +                  [--exclude-folderFOLDER] [--ignore-other-files] [--regenerate-thumbnails] [--reread-metadata] +                  [--reverse-sort] [--theme-pathPATH] [--use-fancy-folders] [--version] + +Generate HTML files for a static image hosting website. + +Options: +-h--helpshow this help message and exit +-a--author-nameAUTHOR +Name of the author of the images. +-e--file-extensionsEXTENSION +File extensions to include (can be specified multiple times). +-l--license-typeLICENSE +Specify the license type for the images. +-m--web-manifestGenerate a web manifest file. +-n--non-interactive-mode +Run in non-interactive mode, disabling progress bars. +-p--root-directoryROOT +Root directory containing the images. +-t--site-titleTITLE +Title of the image hosting site. +-w--web-root-urlURL +Base URL of the web root for the image hosting site. +--exclude-folderFOLDER +Folders to exclude from processing, globs supported (can be specified multiple times). +--ignore-other-filesIgnore files that do not match the specified extensions. +--regenerate-thumbnails +Regenerate thumbnails even if they already exist. +--reread-metadataReread image metadata +--reverse-sortSort images in reverse order. +--theme-pathPATHPath to the CSS theme file. +--use-fancy-foldersEnable fancy folder view instead of the default Apache directory listing. +--versionshow program's version number and exit diff --git a/modules/argumentparser.py b/modules/argumentparser.py index 79e3883..ef15404 100644 --- a/modules/argumentparser.py +++ b/modules/argumentparser.py @@ -64,6 +64,7 @@ class Args: non_interactive_mode: bool regenerate_thumbnails: bool reread_metadata: bool + reverse_sort: bool root_directory: str site_title: str theme_path: str @@ -81,6 +82,7 @@ class Args: result["license_type"] = self.license_type result["non_interactive_mode"] = self.non_interactive_mode result["regenerate_thumbnails"] = self.regenerate_thumbnails + result["reverse_sort"] = self.reverse_sort result["reread_metadata"] = self.reread_metadata result["root_directory"] = self.root_directory result["site_title"] = self.site_title @@ -123,6 +125,7 @@ def parse_arguments(version: str) -> Args: parser.add_argument("--ignore-other-files", help="Ignore files that do not match the specified extensions.", action="store_true", default=False, dest="ignore_other_files") parser.add_argument("--regenerate-thumbnails", help="Regenerate thumbnails even if they already exist.", action="store_true", default=False, dest="regenerate_thumbnails") parser.add_argument("--reread-metadata", help="Reread image metadata", action="store_true", default=False, dest="reread_metadata") + parser.add_argument("--reverse-sort", help="Sort images in reverse order.", action="store_true", default=False, dest="reverse_sort") parser.add_argument("--theme-path", help="Path to the CSS theme file.", default=DEFAULT_THEME_PATH, type=str, dest="theme_path", metavar="PATH") parser.add_argument("--use-fancy-folders", help="Enable fancy folder view instead of the default Apache directory listing.", action="store_true", default=False, dest="use_fancy_folders") parser.add_argument("--version", action="version", version=f"%(prog)s {version}") @@ -138,6 +141,7 @@ def parse_arguments(version: str) -> Args: non_interactive_mode=parsed_args.non_interactive_mode, regenerate_thumbnails=parsed_args.regenerate_thumbnails, reread_metadata=parsed_args.reread_metadata, + reverse_sort=parsed_args.reverse_sort, root_directory=parsed_args.root_directory, site_title=parsed_args.site_title, theme_path=parsed_args.theme_path, diff --git a/modules/generate_html.py b/modules/generate_html.py index 5062734..24bad53 100644 --- a/modules/generate_html.py +++ b/modules/generate_html.py @@ -115,7 +115,7 @@ def get_image_info(item: str, folder: str) -> Dict[str, Any]: if newtuple: content = newtuple if tag in ["DateTime", "DateTimeOriginal", "DateTimeDigitized"]: - epr = r'\d{4}:\d{2}:\d{2} \d{2}:\d{2}:\d{2}' + epr = r"\d{4}:\d{2}:\d{2} \d{2}:\d{2}:\d{2}" if re.match(epr, content): try: content = datetime.strptime(content, "%Y:%m:%d %H:%M:%S").strftime("%Y-%m-%d %H:%M:%S") @@ -335,6 +335,8 @@ def create_html_file(folder: str, title: str, foldername: str, images: List[Dict folder_info = info.get(urllib.parse.quote(folder), "").split("\n") _info = [i for i in folder_info if len(i) > 1] if folder_info else None + if _args.reverse_sort: + images.sort(key=lambda i: i["name"], reverse=True) html = env.get_template("index.html.j2") content = html.render( diff --git a/templates/index.html.j2 b/templates/index.html.j2 index b6023a0..c938eb0 100644 --- a/templates/index.html.j2 +++ b/templates/index.html.j2 @@ -26,7 +26,7 @@ - + @@ -70,8 +70,7 @@ {%- for image in images %}
- {{ image.name }} - {# {{ image.name }} #} + {{ image.name }} {%- set ns.count = ns.count + 1 %}
{{ image.name }} {%- if image.tiff %} @@ -165,6 +164,7 @@ {%- endfor %} ]; var re = /pid=(\d+)/; + var controllers = {} function openSwipe(img) { var options = { @@ -196,29 +196,23 @@ } function prefetch(img) { - let _img = document.createElement("img"); - _img.ariaHidden = true; - _img.style.display = "none"; - _img.className = "preload"; - _img.onload = function () { - document.body.removeChild(_img); - }; - _img.src = items[img].src; - document.body.appendChild(_img); + const controller = new AbortController() + const signal = controller.signal + controllers[img] = controller; + let urlToFetch = items[img].src; + + fetch(urlToFetch, { + method: 'get', + signal: signal, + }) + .catch(function (err) { + console.error(` Err: ${err}`); + }); } function cancel(img) { - let imgs = document.body.getElementsByTagName("img"); - for (let ing in imgs) { - let ling = imgs[ing] - try { - if (ling.getAttribute("class") == "preload" && ling.getAttribute("src") == items[img].src) { - document.body.removeChild(ling); - } - } - catch(err) { - } - } + controllers[img].abort(); + delete controllers[img]; } {%- endif %}