Compare commits
7
Commits
v2.1
...
2e93e8172c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2e93e8172c | ||
|
|
9d56d729c1 | ||
|
|
193b1704f8 | ||
|
|
40a01c4701 | ||
|
|
28e3b087b0 | ||
|
|
116a9574ce | ||
|
|
6c7216c0e1 |
+11
-6
@@ -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,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."
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user