7 Commits
Author SHA1 Message Date
Djeex a7ce49b989 v2.1.2 2026-08-17 15:13:36 +02:00
Djeex 26e3ca684b Fixed: Preserve embedded ICC color profiles when converting and resizing images
Image.open() reads the source's ICC profile into img.info, but that dict resets to empty after convert() or resize(), and save() was never passing icc_profile anyway. DCI-P3 and Rec.2020 photos were silently falling back to sRGB interpretation once processed.
2026-08-17 15:13:36 +02:00
Djeex 193b1704f8 Chrome HDR artefacting fix 2026-08-16 22:43:02 +02:00
Djeex 40a01c4701 Merge pull request 'Multi-stage smaller alpine docker image and python 3.13' (#24) from alpine into main
Reviewed-on: #24
2025-09-19 22:51:22 +02:00
Djeex 28e3b087b0 Alpine - smaller image 2025-09-19 22:40:30 +02:00
Djeex 116a9574ce Merge branch 'Beta-2.1' 2025-09-04 11:23:59 +00:00
Djeex 6c7216c0e1 Hotfix - default copy 2025-09-04 13:18:42 +02:00
5 changed files with 32 additions and 16 deletions
+11 -6
View File
@@ -1,10 +1,18 @@
FROM python:3.11-slim FROM python:3.13-alpine AS builder
WORKDIR /app WORKDIR /app
COPY requirements.txt . RUN apk add --no-cache gcc musl-dev jpeg-dev zlib-dev
RUN pip install --no-cache-dir -r requirements.txt COPY requirements.txt .
RUN pip wheel --no-cache-dir --wheel-dir=/wheels -r requirements.txt
FROM python:3.13-alpine
WORKDIR /app
COPY --from=builder /wheels /wheels
RUN pip install --no-cache-dir --find-links=/wheels /wheels/* && rm -rf /wheels
COPY build.py gallery.py VERSION /app/ COPY build.py gallery.py VERSION /app/
COPY ./src/ ./src/ COPY ./src/ ./src/
@@ -12,7 +20,4 @@ COPY ./config /app/default
COPY ./docker/.sh/entrypoint.sh /app/entrypoint.sh COPY ./docker/.sh/entrypoint.sh /app/entrypoint.sh
RUN chmod +x /app/entrypoint.sh RUN chmod +x /app/entrypoint.sh
RUN printf '#!/bin/sh\n/app/entrypoint.sh build\n' > /usr/local/bin/build && chmod +x /usr/local/bin/build && \
printf '#!/bin/sh\n/app/entrypoint.sh gallery\n' > /usr/local/bin/gallery && chmod +x /usr/local/bin/gallery
ENTRYPOINT ["/app/entrypoint.sh"] ENTRYPOINT ["/app/entrypoint.sh"]
+1 -1
View File
@@ -1 +1 @@
2.1.0 2.1.2
+7 -8
View File
@@ -1,4 +1,4 @@
#!/bin/bash #!/bin/sh
set -e set -e
CYAN="\033[1;36m" CYAN="\033[1;36m"
@@ -6,27 +6,26 @@ NC="\033[0m"
copy_default_config() { copy_default_config() {
echo "[~] Checking configuration directory..." echo "[~] Checking configuration directory..."
if [ ! -d "/app/config" ]; then mkdir -p /app/config
mkdir -p /app/config
fi
echo "[~] Checking if default config files/folders need to be copied..." echo "[~] Checking if default config files/folders need to be copied..."
files_copied=false files_copied=false
# Recursively check all files and folders in /app/default for src in $(find /app/default -mindepth 1); do
while IFS= read -r src; do
relpath="${src#/app/default/}" relpath="${src#/app/default/}"
target="/app/config/$relpath" target="/app/config/$relpath"
if [ ! -e "$target" ]; then if [ ! -e "$target" ]; then
echo "[→] Copying: $relpath" echo "[→] Copying: $relpath"
if [ -d "$src" ]; then if [ -d "$src" ]; then
cp -r "$src" "$target" mkdir -p "$target"
cp -r "$src/" "$target/"
else else
mkdir -p "$(dirname "$target")"
cp "$src" "$target" cp "$src" "$target"
fi fi
files_copied=true files_copied=true
fi fi
done < <(find /app/default -mindepth 1) done
if [ "$files_copied" = true ]; then if [ "$files_copied" = true ]; then
echo "[✓] Default configuration files/folders copied successfully." echo "[✓] Default configuration files/folders copied successfully."
+8
View File
@@ -32,6 +32,14 @@ window.addEventListener("DOMContentLoaded", () => {
img.classList.add("loaded"); img.classList.add("loaded");
}; };
// Chrome HDR artefacting fix
const clearWillChange = (e) => {
if (e.propertyName !== "transform") return;
img.style.willChange = "auto";
img.removeEventListener("transitionend", clearWillChange);
};
img.addEventListener("transitionend", clearWillChange);
if (img.complete && img.naturalHeight !== 0) { if (img.complete && img.naturalHeight !== 0) {
onLoad(); // already loaded onLoad(); // already loaded
} else { } else {
+5 -1
View File
@@ -11,6 +11,7 @@ def convert_and_resize_image(input_path, output_path, resize=True, max_width=114
return return
img = Image.open(input_path) img = Image.open(input_path)
icc_profile = img.info.get("icc_profile")
if img.mode != "RGB": if img.mode != "RGB":
img = img.convert("RGB") img = img.convert("RGB")
@@ -27,7 +28,10 @@ def convert_and_resize_image(input_path, output_path, resize=True, max_width=114
if fmt == "JPEG": if fmt == "JPEG":
output_path = output_path.with_suffix(".jpg") output_path = output_path.with_suffix(".jpg")
img.save(output_path, fmt, quality=90 if fmt == "JPEG" else 100) save_kwargs = {"quality": 90 if fmt == "JPEG" else 100}
if icc_profile:
save_kwargs["icc_profile"] = icc_profile
img.save(output_path, fmt, **save_kwargs)
logging.info(f"[✓] Processed image: {input_path}{output_path}") logging.info(f"[✓] Processed image: {input_path}{output_path}")
except Exception as e: except Exception as e: