7 Commits

Author SHA1 Message Date
895ac03590 fallback 2026-02-04 08:55:30 +01:00
cad6d88b22 import update 2026-02-04 08:54:19 +01:00
e06df9444d update theme color 2026-02-04 08:53:49 +01:00
9d5ce13e14 version bump 2026-02-04 08:47:29 +01:00
6593e63ea9 updated themes version 2026-02-04 08:41:54 +01:00
027a5688cb updated dependencies 2026-02-04 07:53:28 +01:00
1aa9dd716b recursive darktheme applied 2026-02-04 07:17:29 +01:00
11 changed files with 37 additions and 36 deletions

View File

@@ -9,6 +9,8 @@ jobs:
- uses: actions/setup-python@v5 - uses: actions/setup-python@v5
with: with:
python-version: '3.12' python-version: '3.12'
- name: Install PyInstaller
run: pip install pyinstaller
- name: Install Dependencies - name: Install Dependencies
run: pip install -r requirements.txt run: pip install -r requirements.txt
- name: Build Package - name: Build Package

View File

@@ -1 +1 @@
2.9.0 2.9.1

View File

@@ -218,7 +218,7 @@ def main(args) -> None:
shutil.rmtree(thumbdir) shutil.rmtree(thumbdir)
os.makedirs(thumbdir, exist_ok=True) os.makedirs(thumbdir, exist_ok=True)
darktheme = copy_static_files(args) args.darktheme = copy_static_files(args)
icons(args) icons(args)
if args.generate_webmanifest: if args.generate_webmanifest:
@@ -228,13 +228,13 @@ def main(args) -> None:
if args.non_interactive_mode: if args.non_interactive_mode:
logger.info("generating HTML files") logger.info("generating HTML files")
print("Generating HTML files...") print("Generating HTML files...")
thumbnails = list_folder(args.root_directory, args.site_title, args, raw, VERSION, logo, darktheme=darktheme) thumbnails = list_folder(args.root_directory, args.site_title, args, raw, VERSION, logo)
with Pool(os.cpu_count()) as pool: with Pool(os.cpu_count()) as pool:
logger.info("generating thumbnails") logger.info("generating thumbnails")
print("Generating thumbnails...") print("Generating thumbnails...")
pool.map(generate_thumbnail, thumbnails) pool.map(generate_thumbnail, thumbnails)
else: else:
thumbnails = list_folder(args.root_directory, args.site_title, args, raw, VERSION, logo, darktheme=darktheme) thumbnails = list_folder(args.root_directory, args.site_title, args, raw, VERSION, logo)
with Pool(os.cpu_count()) as pool: with Pool(os.cpu_count()) as pool:
logger.info("generating thumbnails") logger.info("generating thumbnails")

View File

@@ -302,6 +302,11 @@ input {
border-style: none; border-style: none;
} }
.darkmodeswitch {
font-size: smaller;
height: 100%;
}
#dark-mode-switch { #dark-mode-switch {
display: flex; display: flex;
align-items: center; align-items: center;

View File

@@ -12,7 +12,7 @@ except ModuleNotFoundError:
RICH = False RICH = False
SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)).removesuffix(__package__) SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)).removesuffix(__package__ if __package__ else "")
DEFAULT_THEME_PATH = os.path.join(SCRIPTDIR, "templates", "default.css") DEFAULT_THEME_PATH = os.path.join(SCRIPTDIR, "templates", "default.css")
DEFAULT_AUTHOR = "Author" DEFAULT_AUTHOR = "Author"
@@ -60,6 +60,8 @@ class Args:
Whether to enable fancy folder view. Whether to enable fancy folder view.
web_root_url : str web_root_url : str
The base URL of the web root for the image hosting site. The base URL of the web root for the image hosting site.
darktheme : bool
Whether a dark theme is present.
""" """
author_name: str author_name: str
@@ -80,6 +82,7 @@ class Args:
theme_path: str theme_path: str
use_fancy_folders: bool use_fancy_folders: bool
web_root_url: str web_root_url: str
darktheme: bool = False
def to_dict(self) -> dict: def to_dict(self) -> dict:
result: dict = {} result: dict = {}
@@ -102,6 +105,7 @@ class Args:
result["theme_path"] = self.theme_path result["theme_path"] = self.theme_path
result["use_fancy_folders"] = self.use_fancy_folders result["use_fancy_folders"] = self.use_fancy_folders
result["web_root_url"] = self.web_root_url result["web_root_url"] = self.web_root_url
result["darktheme"] = self.darktheme
return result return result
@@ -172,5 +176,6 @@ def parse_arguments(version: str) -> Args:
theme_path=parsed_args.theme_path, theme_path=parsed_args.theme_path,
use_fancy_folders=parsed_args.use_fancy_folders, use_fancy_folders=parsed_args.use_fancy_folders,
web_root_url=parsed_args.web_root_url, web_root_url=parsed_args.web_root_url,
darktheme=False,
) )
return _args return _args

View File

@@ -20,7 +20,7 @@ from modules.argumentparser import Args
from modules.datatypes.metadata import Metadata, ImageMetadata, SubfolderMetadata from modules.datatypes.metadata import Metadata, ImageMetadata, SubfolderMetadata
# Constants for file paths and exclusions # Constants for file paths and exclusions
SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)).removesuffix(__package__) SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)).removesuffix(__package__ if __package__ else "")
FAVICON_PATH = ".static/favicon.ico" FAVICON_PATH = ".static/favicon.ico"
GLOBAL_CSS_PATH = ".static/global.css" GLOBAL_CSS_PATH = ".static/global.css"
EXCLUDES = ["index.html", "manifest.json", "robots.txt"] EXCLUDES = ["index.html", "manifest.json", "robots.txt"]
@@ -389,7 +389,7 @@ def process_image(item: str, folder: str, _args: Args, baseurl: str, metadata: M
return image, metadata return image, metadata
def generate_html(folder: str, title: str, _args: Args, raw: list[str], version: str, logo: str, darktheme: bool = False) -> set[str]: def generate_html(folder: str, title: str, _args: Args, raw: list[str], version: str, logo: str) -> set[str]:
""" """
Generates HTML content for a folder of images. Generates HTML content for a folder of images.
@@ -459,7 +459,7 @@ def generate_html(folder: str, title: str, _args: Args, raw: list[str], version:
update_metadata(metadata, folder) update_metadata(metadata, folder)
if should_generate_html(images, contains_files, _args): if should_generate_html(images, contains_files, _args):
subfoldertags = create_html_file(folder, title, foldername, images, subfolders, _args, version, logo, subfoldertags, darktheme=darktheme) subfoldertags = create_html_file(folder, title, foldername, images, subfolders, _args, version, logo, subfoldertags)
else: else:
if os.path.exists(os.path.join(folder, "index.html")): if os.path.exists(os.path.join(folder, "index.html")):
logger.info("removing existing index.html", extra={"folder": folder}) logger.info("removing existing index.html", extra={"folder": folder})
@@ -564,16 +564,7 @@ def format_html(html: str) -> str:
def create_html_file( def create_html_file(
folder: str, folder: str, title: str, foldername: str, images: list[ImageMetadata], subfolders: list[SubfolderMetadata], _args: Args, version: str, logo: str, subfoldertags: set[str]
title: str,
foldername: str,
images: list[ImageMetadata],
subfolders: list[SubfolderMetadata],
_args: Args,
version: str,
logo: str,
subfoldertags: set[str],
darktheme: bool = False,
) -> set[str]: ) -> set[str]:
""" """
Creates the HTML file using the template. Creates the HTML file using the template.
@@ -630,7 +621,7 @@ def create_html_file(
favicon=f"{_args.web_root_url}{FAVICON_PATH}", favicon=f"{_args.web_root_url}{FAVICON_PATH}",
stylesheet=f"{_args.web_root_url}{GLOBAL_CSS_PATH}", stylesheet=f"{_args.web_root_url}{GLOBAL_CSS_PATH}",
theme=f"{_args.web_root_url}.static/theme.css", theme=f"{_args.web_root_url}.static/theme.css",
darktheme=f"{_args.web_root_url}.static/theme-dark.css" if darktheme else None, darktheme=f"{_args.web_root_url}.static/theme-dark.css" if _args.darktheme else None,
root=_args.web_root_url, root=_args.web_root_url,
parent=f"{_args.web_root_url}{urllib.parse.quote(foldername)}", parent=f"{_args.web_root_url}{urllib.parse.quote(foldername)}",
header=f"{header} - LICENSE", header=f"{header} - LICENSE",
@@ -648,7 +639,7 @@ def create_html_file(
favicon=f"{_args.web_root_url}{FAVICON_PATH}", favicon=f"{_args.web_root_url}{FAVICON_PATH}",
stylesheet=f"{_args.web_root_url}{GLOBAL_CSS_PATH}", stylesheet=f"{_args.web_root_url}{GLOBAL_CSS_PATH}",
theme=f"{_args.web_root_url}.static/theme.css", theme=f"{_args.web_root_url}.static/theme.css",
darktheme=f"{_args.web_root_url}.static/theme-dark.css" if darktheme else None, darktheme=f"{_args.web_root_url}.static/theme-dark.css" if _args.darktheme else None,
root=_args.web_root_url, root=_args.web_root_url,
parent=parent, parent=parent,
header=header, header=header,
@@ -669,7 +660,7 @@ def create_html_file(
return set(sorted(alltags)) return set(sorted(alltags))
def list_folder(folder: str, title: str, _args: Args, raw: list[str], version: str, logo: str, darktheme: bool = False) -> list[tuple[str, str, str]]: def list_folder(folder: str, title: str, _args: Args, raw: list[str], version: str, logo: str) -> list[tuple[str, str, str]]:
""" """
lists and processes a folder, generating HTML files. lists and processes a folder, generating HTML files.
@@ -683,5 +674,5 @@ def list_folder(folder: str, title: str, _args: Args, raw: list[str], version: s
Returns: Returns:
list[tuple[str, str]]: list of thumbnails generated. list[tuple[str, str]]: list of thumbnails generated.
""" """
generate_html(folder, title, _args, raw, version, logo, darktheme=darktheme) generate_html(folder, title, _args, raw, version, logo)
return thumbnails return thumbnails

View File

@@ -18,10 +18,10 @@ import gzip
import shutil import shutil
import logging import logging
from datetime import datetime from datetime import datetime
from pythonjsonlogger import jsonlogger from pythonjsonlogger import json as jsonlogger
# Constants for file paths and exclusions # Constants for file paths and exclusions
SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)).removesuffix(__package__) SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)).removesuffix(__package__ if __package__ else "")
LOG_DIR = os.path.join(SCRIPTDIR, "logs") LOG_DIR = os.path.join(SCRIPTDIR, "logs")
LATEST_LOG_FILE = os.path.join(LOG_DIR, "latest.jsonl") LATEST_LOG_FILE = os.path.join(LOG_DIR, "latest.jsonl")

View File

@@ -15,10 +15,10 @@ except ImportError:
from modules.logger import logger from modules.logger import logger
from modules.argumentparser import Args from modules.argumentparser import Args
from modules.css_color import extract_theme_color, extract_colorscheme from modules.css_color import extract_colorscheme
# Define constants for static files directory and icon sizes # Define constants for static files directory and icon sizes
SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)).removesuffix(__package__) SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)).removesuffix(__package__ if __package__ else "")
STATIC_FILES_DIR = os.path.join(SCRIPTDIR, "files") STATIC_FILES_DIR = os.path.join(SCRIPTDIR, "files")
ICON_SIZES = ["36x36", "48x48", "72x72", "96x96", "144x144", "192x192", "512x512"] ICON_SIZES = ["36x36", "48x48", "72x72", "96x96", "144x144", "192x192", "512x512"]
@@ -148,7 +148,7 @@ def render_manifest_json(_args: Args, icon_list: list[Icon], colors: dict[str, s
short_name=_args.site_title, short_name=_args.site_title,
icons=icon_list, icons=icon_list,
background_color=colors["bcolor1"], background_color=colors["bcolor1"],
theme_color=colors["theme_color"], theme_color=colors["color1"],
) )
with open(os.path.join(_args.root_directory, ".static", "manifest.webmanifest"), "w", encoding="utf-8") as f: with open(os.path.join(_args.root_directory, ".static", "manifest.webmanifest"), "w", encoding="utf-8") as f:
logger.info("rendering manifest.webmanifest", extra={"path": os.path.join(_args.root_directory, ".static", "manifest.webmanifest")}) logger.info("rendering manifest.webmanifest", extra={"path": os.path.join(_args.root_directory, ".static", "manifest.webmanifest")})
@@ -262,5 +262,4 @@ def webmanifest(_args: Args) -> None:
return return
colorscheme = extract_colorscheme(os.path.join(_args.root_directory, ".static", "theme.css")) colorscheme = extract_colorscheme(os.path.join(_args.root_directory, ".static", "theme.css"))
colorscheme["theme_color"] = extract_theme_color(os.path.join(_args.root_directory, ".static", "theme.css"))
render_manifest_json(_args, icon_list, colorscheme) render_manifest_json(_args, icon_list, colorscheme)

View File

@@ -1,13 +1,12 @@
beautifulsoup4~=4.13.4 beautifulsoup4~=4.14.3
CairoSVG~=2.7.1 CairoSVG~=2.7.1
ConfigArgParse~=1.7.1 ConfigArgParse~=1.7.1
defusedxml~=0.7.1 defusedxml~=0.7.1
html5lib~=1.1 html5lib~=1.1
Jinja2~=3.1.6 Jinja2~=3.1.6
jsmin~=3.0.1 jsmin~=3.0.1
Pillow~=11.3.0 Pillow~=12.1.0
pyinstaller~=6.11.1
python_json_logger~=2.0.7 python_json_logger~=2.0.7
rich_argparse~=1.7.1 rich_argparse~=1.7.2
selenium~=4.34.2 selenium~=4.40.0
tqdm~=4.66.4 tqdm~=4.66.6

View File

@@ -100,7 +100,7 @@
<li class="license"><a href="{{ licensefile }}">License</a></li> <li class="license"><a href="{{ licensefile }}">License</a></li>
{%- endif %} {%- endif %}
{%- if darktheme %} {%- if darktheme %}
<li> <li class="darkmodeswitch">
<a class="button" id="dark-mode-switch"> <a class="button" id="dark-mode-switch">
<input type="checkbox" class="checkbox" id="dark-mode-switch-check" /> <input type="checkbox" class="checkbox" id="dark-mode-switch-check" />
<div class="knobs"> <div class="knobs">

2
themes

Submodule themes updated: 51696f2a4d...3bb36480e7