Merge pull request #6320 from okxlin/maint-pr-6301-this-week-in-past

Maintainer rebuild: this-week-in-past update from #6301
This commit is contained in:
okxlin
2026-08-31 17:55:52 +08:00
committed by GitHub
16 changed files with 212 additions and 358 deletions
-88
View File
@@ -1,88 +0,0 @@
additionalProperties:
formFields:
- default: 40829
edit: true
envKey: PANEL_APP_PORT_HTTP
labelEn: Web Port
labelZh: Web 端口
label:
en: Web Port
zh: Web 端口
zh-Hant: Web 連接埠
ja: Web ポート
ko: Web 포트
ru: Веб-порт
ms: Port Web
pt-br: Porta Web
required: true
rule: paramPort
type: number
- default: ./data/photos
edit: true
envKey: PHOTO_LIBRARY_PATH
labelEn: Photo Library Directory
labelZh: 照片库目录
label:
en: Photo Library Directory
zh: 照片库目录
zh-Hant: 相片庫目錄
ja: 写真ライブラリーディレクトリ
ko: 사진 라이브러리 디렉터리
ru: Каталог фототеки
ms: Direktori Pustaka Foto
pt-br: Diretorio da biblioteca de fotos
required: true
type: text
- default: ./data/app
disabled: true
envKey: APP_DATA_DIR
labelEn: Application Data Directory
labelZh: 应用数据目录
label:
en: Application Data Directory
zh: 应用数据目录
zh-Hant: 應用程式資料目錄
ja: アプリケーションデータディレクトリ
ko: 애플리케이션 데이터 디렉터리
ru: Каталог данных приложения
ms: Direktori Data Aplikasi
pt-br: Diretorio de dados do aplicativo
required: true
type: text
- default: 30
edit: true
envKey: SLIDESHOW_INTERVAL
labelEn: Slideshow Interval (seconds)
labelZh: 幻灯片间隔(秒)
label:
en: Slideshow Interval (seconds)
zh: 幻灯片间隔(秒)
zh-Hant: 幻燈片間隔(秒)
ja: スライドショー間隔(秒)
ko: 슬라이드쇼 간격(초)
ru: Интервал слайд-шоу (секунды)
ms: Selang Tayangan Slaid (saat)
pt-br: Intervalo da apresentacao (segundos)
required: true
type: number
- default: "false"
edit: true
envKey: RANDOM_SLIDESHOW
labelEn: Random Slideshow
labelZh: 随机幻灯片
label:
en: Random Slideshow
zh: 随机幻灯片
zh-Hant: 隨機幻燈片
ja: ランダムスライドショー
ko: 무작위 슬라이드쇼
ru: Случайное слайд-шоу
ms: Tayangan Slaid Rawak
pt-br: Apresentacao aleatoria
required: true
type: select
values:
- label: "false"
value: "false"
- label: "true"
value: "true"
@@ -1,24 +0,0 @@
services:
this-week-in-past:
image: "rouhim/this-week-in-past:1.32.45"
container_name: ${CONTAINER_NAME}
restart: unless-stopped
environment:
- RESOURCE_PATHS=/resources
- DATA_FOLDER=/data
- PORT=8080
- SLIDESHOW_INTERVAL=${SLIDESHOW_INTERVAL}
- RANDOM_SLIDESHOW=${RANDOM_SLIDESHOW}
ports:
- "${PANEL_APP_PORT_HTTP}:8080"
volumes:
- "${PHOTO_LIBRARY_PATH}:/resources:ro"
- "${APP_DATA_DIR}:/data"
labels:
createdBy: "Apps"
networks:
- 1panel-network
networks:
1panel-network:
external: true
@@ -1,64 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)"
ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}"
fail() {
printf '%s\n' "$1" >&2
exit 1
}
read_env_value() {
local key="$1"
local value
[[ -f "$ENV_FILE" ]] || return 0
value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)"
case "$value" in
\"*\") value="${value#\"}"; value="${value%\"}" ;;
\'*\') value="${value#\'}"; value="${value%\'}" ;;
esac
printf '%s\n' "$value"
}
configured_value() {
local key="$1"
local default_value="$2"
local value="${!key:-}"
if [[ -z "$value" ]]; then
value="$(read_env_value "$key")"
fi
printf '%s\n' "${value:-$default_value}"
}
photo_path="$(configured_value PHOTO_LIBRARY_PATH ./data/photos)"
[[ -n "$photo_path" ]] || fail "PHOTO_LIBRARY_PATH must not be empty"
if [[ "$photo_path" = /* ]]; then
resolved_photo_path="$(realpath -m -- "$photo_path")"
else
resolved_photo_path="$(realpath -m -- "$ROOT_DIR/${photo_path#./}")"
case "$resolved_photo_path" in
"$ROOT_DIR"/*) ;;
*) fail "relative PHOTO_LIBRARY_PATH must remain inside the application version directory" ;;
esac
fi
mkdir -p -- "$resolved_photo_path"
[[ -d "$resolved_photo_path" ]] || fail "PHOTO_LIBRARY_PATH must resolve to a directory"
data_path="$(configured_value APP_DATA_DIR ./data/app)"
[[ -n "$data_path" ]] || fail "APP_DATA_DIR must not be empty"
[[ "$data_path" != /* ]] || fail "APP_DATA_DIR must be relative to the application version directory"
resolved_data_path="$(realpath -m -- "$ROOT_DIR/${data_path#./}")"
case "$resolved_data_path" in
"$ROOT_DIR"/*) ;;
*) fail "APP_DATA_DIR must remain inside the application version directory" ;;
esac
[[ ! -L "$resolved_data_path" ]] || fail "APP_DATA_DIR must not be a symbolic link"
install -d -m 0750 -- "$resolved_data_path"
resolved_data_path="$(realpath -e -- "$resolved_data_path")"
case "$resolved_data_path" in
"$ROOT_DIR"/*) ;;
*) fail "APP_DATA_DIR resolves outside the application version directory" ;;
esac
chown -R --no-dereference 1337:1337 "$resolved_data_path"
chmod 0750 "$resolved_data_path"
@@ -1,6 +1,6 @@
CONTAINER_NAME=this-week-in-past-compose-check
PANEL_APP_PORT_HTTP=40829
PHOTO_LIBRARY_PATH=./data/photos
APP_DATA_DIR=./data/app
SLIDESHOW_INTERVAL=30
RANDOM_SLIDESHOW=false
CONTAINER_NAME=this-week-in-past
+105
View File
@@ -0,0 +1,105 @@
additionalProperties:
formFields:
- default: 40829
edit: true
envKey: PANEL_APP_PORT_HTTP
labelEn: Web Port
labelZh: Web 端口
label:
en: Web Port
zh: Web 端口
zh-Hant: Web 連接埠
ja: Web ポート
ko: Web 포트
ru: Веб-порт
ms: Port Web
pt-br: Porta Web
required: true
rule: paramPort
type: number
- default: ./data/photos
edit: true
envKey: PHOTO_LIBRARY_PATH
labelEn: Photo Library Directory
labelZh: 照片库目录
label:
en: Photo Library Directory
zh: 照片库目录
zh-Hant: 相片庫目錄
ja: 写真ライブラリーディレクトリ
ko: 사진 라이브러리 디렉터리
ru: Каталог фототеки
ms: Direktori Pustaka Foto
pt-br: Diretorio da biblioteca de fotos
required: true
type: text
- default: ./data/app
disabled: true
envKey: APP_DATA_DIR
labelEn: Application Data Directory
labelZh: 应用数据目录
label:
en: Application Data Directory
zh: 应用数据目录
zh-Hant: 應用程式資料目錄
ja: アプリケーションデータディレクトリ
ko: 애플리케이션 데이터 디렉터리
ru: Каталог данных приложения
ms: Direktori Data Aplikasi
pt-br: Diretorio de dados do aplicativo
required: true
type: text
edit: true
- default: 30
edit: true
envKey: SLIDESHOW_INTERVAL
labelEn: Slideshow Interval (seconds)
labelZh: 幻灯片间隔(秒)
label:
en: Slideshow Interval (seconds)
zh: 幻灯片间隔(秒)
zh-Hant: 幻燈片間隔(秒)
ja: スライドショー間隔(秒)
ko: 슬라이드쇼 간격(초)
ru: Интервал слайд-шоу (секунды)
ms: Selang Tayangan Slaid (saat)
pt-br: Intervalo da apresentacao (segundos)
required: true
type: number
- default: 'false'
edit: true
envKey: RANDOM_SLIDESHOW
labelEn: Random Slideshow
labelZh: 随机幻灯片
label:
en: Random Slideshow
zh: 随机幻灯片
zh-Hant: 隨機幻燈片
ja: ランダムスライドショー
ko: 무작위 슬라이드쇼
ru: Случайное слайд-шоу
ms: Tayangan Slaid Rawak
pt-br: Apresentacao aleatoria
required: true
type: select
values:
- label: 'false'
value: 'false'
- label: 'true'
value: 'true'
- default: Asia/Shanghai
edit: true
envKey: TZ
labelEn: Timezone
labelZh: 时区
label:
en: Timezone
zh: 时区
zh-Hant: 時區
ja: タイムゾーン
ko: 시간대
ru: Часовой пояс
ms: Zon waktu
pt-br: Fuso horário
required: true
type: text
@@ -1,6 +1,6 @@
services:
this-week-in-past:
image: "rouhim/this-week-in-past:latest"
image: "rouhim/this-week-in-past:2.0.1"
container_name: ${CONTAINER_NAME}
restart: unless-stopped
environment:
+84
View File
@@ -0,0 +1,84 @@
#!/usr/bin/env bash
set -euo pipefail
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export PATH
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)"
ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}"
fail() {
printf '%s\n' "$1" >&2
exit 1
}
read_env_value() {
local key="$1"
[[ -f "$ENV_FILE" ]] || return 0
local value
value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)"
case "$value" in
\"*\") value="${value#\"}"; value="${value%\"}" ;;
\'*\') value="${value#\'}"; value="${value%\'}" ;;
esac
printf '%s\n' "$value"
}
configured_value() {
local key="$1"
local default_value="$2"
local value
value="${!key:-}"
if [[ -z "$value" ]]; then
value="$(read_env_value "$key")"
fi
printf '%s\n' "${value:-$default_value}"
}
resolve_app_path() {
local key="$1"
local raw="$2"
local clean candidate resolved current part
local -a parts=()
case "$raw" in
""|/*|.|..|../*|*/../*|*/..) echo "unsafe ${key} path" >&2; return 1 ;;
esac
if [[ "$raw" =~ [[:cntrl:]] ]]; then
echo "unsafe ${key} path" >&2
return 1
fi
clean="${raw#./}"
[[ -n "$clean" ]] || { echo "unsafe ${key} path" >&2; return 1; }
command -v realpath >/dev/null 2>&1 || { echo "realpath is required" >&2; return 1; }
candidate="$ROOT_DIR/$clean"
resolved="$(realpath -m -- "$candidate")" || { echo "unsafe ${key} path" >&2; return 1; }
case "$resolved" in
"$ROOT_DIR"/*) ;;
*) echo "unsafe ${key} path" >&2; return 1 ;;
esac
current="$ROOT_DIR"
IFS='/' read -r -a parts <<< "$clean"
for part in "${parts[@]}"; do
[[ -z "$part" || "$part" == "." ]] && continue
current="$current/$part"
if [[ -L "$current" ]]; then
echo "unsafe ${key} path" >&2
return 1
fi
done
printf '%s\n' "$resolved"
}
ensure_dir() {
local key="$1"
local default_value="$2"
local raw path
raw="$(configured_value "$key" "$default_value")"
path="$(resolve_app_path "$key" "$raw")"
mkdir -p -- "$path"
[[ "$(resolve_app_path "$key" "$raw")" == "$path" ]] || fail "unsafe ${key} path"
chmod 0750 "$path"
chown -R --no-dereference 1337:1337 "$path"
}
ensure_dir "PHOTO_LIBRARY_PATH" "./data/photos"
ensure_dir "APP_DATA_DIR" "./data/app"
+21 -18
View File
@@ -1,33 +1,36 @@
name: This Week in Past
tags:
- 多媒体
- Media
title: 展示往年本周照片的自托管幻灯片
description: 展示往年本周照片的自托管幻灯片
additionalProperties:
key: this-week-in-past
name: This Week in Past
tags:
- Media
- Media
type: website
website: https://github.com/RouHim/this-week-in-past
document: https://github.com/RouHim/this-week-in-past/blob/1cbf1e33bc96810d14549daf19e62ac0ecf9eb5d/README.md
github: https://github.com/RouHim/this-week-in-past
shortDescZh: 展示往年本周照片的自托管幻灯片
shortDescEn: A self-hosted slideshow of photos taken this week in previous years
crossVersionUpdate: true
limit: 0
architectures:
- amd64
- arm64
- armv7
- armv6
description:
en: A self-hosted slideshow that finds and displays photos taken during this week in previous years.
en: A self-hosted slideshow that finds and displays photos taken during this week
in previous years.
zh: 自托管照片幻灯片,用于查找并展示往年同一周拍摄的照片。
zh-Hant: 自託管相片幻燈片,用於尋找並展示往年同一週拍攝的相片。
ja: 過去の同じ週に撮影した写真を探して表示するセルフホスト型スライドショーです。
ko: 지난 여러 해의 같은 주에 촬영한 사진을 찾아 보여 주는 자체 호스팅 슬라이드쇼입니다.
ru: Самостоятельно размещаемое слайд-шоу из фотографий, снятых на этой неделе в прошлые годы.
ms: Tayangan slaid hos sendiri yang memaparkan foto yang diambil pada minggu ini dalam tahun-tahun lalu.
pt-br: Apresentacao de slides auto-hospedada com fotos tiradas nesta semana em anos anteriores.
type: website
crossVersionUpdate: true
limit: 0
recommend: 0
website: https://github.com/RouHim/this-week-in-past
github: https://github.com/RouHim/this-week-in-past
document: https://github.com/RouHim/this-week-in-past/blob/1cbf1e33bc96810d14549daf19e62ac0ecf9eb5d/README.md
architectures:
- amd64
- arm64
- armv7
- armv6
ru: Самостоятельно размещаемое слайд-шоу из фотографий, снятых на этой неделе
в прошлые годы.
ms: Tayangan slaid hos sendiri yang memaparkan foto yang diambil pada minggu ini
dalam tahun-tahun lalu.
pt-br: Apresentacao de slides auto-hospedada com fotos tiradas nesta semana em
anos anteriores.
@@ -1,6 +0,0 @@
PANEL_APP_PORT_HTTP=40829
PHOTO_LIBRARY_PATH=./data/photos
APP_DATA_DIR=./data/app
SLIDESHOW_INTERVAL=30
RANDOM_SLIDESHOW=false
CONTAINER_NAME=this-week-in-past
-88
View File
@@ -1,88 +0,0 @@
additionalProperties:
formFields:
- default: 40829
edit: true
envKey: PANEL_APP_PORT_HTTP
labelEn: Web Port
labelZh: Web 端口
label:
en: Web Port
zh: Web 端口
zh-Hant: Web 連接埠
ja: Web ポート
ko: Web 포트
ru: Веб-порт
ms: Port Web
pt-br: Porta Web
required: true
rule: paramPort
type: number
- default: ./data/photos
edit: true
envKey: PHOTO_LIBRARY_PATH
labelEn: Photo Library Directory
labelZh: 照片库目录
label:
en: Photo Library Directory
zh: 照片库目录
zh-Hant: 相片庫目錄
ja: 写真ライブラリーディレクトリ
ko: 사진 라이브러리 디렉터리
ru: Каталог фототеки
ms: Direktori Pustaka Foto
pt-br: Diretorio da biblioteca de fotos
required: true
type: text
- default: ./data/app
disabled: true
envKey: APP_DATA_DIR
labelEn: Application Data Directory
labelZh: 应用数据目录
label:
en: Application Data Directory
zh: 应用数据目录
zh-Hant: 應用程式資料目錄
ja: アプリケーションデータディレクトリ
ko: 애플리케이션 데이터 디렉터리
ru: Каталог данных приложения
ms: Direktori Data Aplikasi
pt-br: Diretorio de dados do aplicativo
required: true
type: text
- default: 30
edit: true
envKey: SLIDESHOW_INTERVAL
labelEn: Slideshow Interval (seconds)
labelZh: 幻灯片间隔(秒)
label:
en: Slideshow Interval (seconds)
zh: 幻灯片间隔(秒)
zh-Hant: 幻燈片間隔(秒)
ja: スライドショー間隔(秒)
ko: 슬라이드쇼 간격(초)
ru: Интервал слайд-шоу (секунды)
ms: Selang Tayangan Slaid (saat)
pt-br: Intervalo da apresentacao (segundos)
required: true
type: number
- default: "false"
edit: true
envKey: RANDOM_SLIDESHOW
labelEn: Random Slideshow
labelZh: 随机幻灯片
label:
en: Random Slideshow
zh: 随机幻灯片
zh-Hant: 隨機幻燈片
ja: ランダムスライドショー
ko: 무작위 슬라이드쇼
ru: Случайное слайд-шоу
ms: Tayangan Slaid Rawak
pt-br: Apresentacao aleatoria
required: true
type: select
values:
- label: "false"
value: "false"
- label: "true"
value: "true"
@@ -1,64 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)"
ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}"
fail() {
printf '%s\n' "$1" >&2
exit 1
}
read_env_value() {
local key="$1"
local value
[[ -f "$ENV_FILE" ]] || return 0
value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)"
case "$value" in
\"*\") value="${value#\"}"; value="${value%\"}" ;;
\'*\') value="${value#\'}"; value="${value%\'}" ;;
esac
printf '%s\n' "$value"
}
configured_value() {
local key="$1"
local default_value="$2"
local value="${!key:-}"
if [[ -z "$value" ]]; then
value="$(read_env_value "$key")"
fi
printf '%s\n' "${value:-$default_value}"
}
photo_path="$(configured_value PHOTO_LIBRARY_PATH ./data/photos)"
[[ -n "$photo_path" ]] || fail "PHOTO_LIBRARY_PATH must not be empty"
if [[ "$photo_path" = /* ]]; then
resolved_photo_path="$(realpath -m -- "$photo_path")"
else
resolved_photo_path="$(realpath -m -- "$ROOT_DIR/${photo_path#./}")"
case "$resolved_photo_path" in
"$ROOT_DIR"/*) ;;
*) fail "relative PHOTO_LIBRARY_PATH must remain inside the application version directory" ;;
esac
fi
mkdir -p -- "$resolved_photo_path"
[[ -d "$resolved_photo_path" ]] || fail "PHOTO_LIBRARY_PATH must resolve to a directory"
data_path="$(configured_value APP_DATA_DIR ./data/app)"
[[ -n "$data_path" ]] || fail "APP_DATA_DIR must not be empty"
[[ "$data_path" != /* ]] || fail "APP_DATA_DIR must be relative to the application version directory"
resolved_data_path="$(realpath -m -- "$ROOT_DIR/${data_path#./}")"
case "$resolved_data_path" in
"$ROOT_DIR"/*) ;;
*) fail "APP_DATA_DIR must remain inside the application version directory" ;;
esac
[[ ! -L "$resolved_data_path" ]] || fail "APP_DATA_DIR must not be a symbolic link"
install -d -m 0750 -- "$resolved_data_path"
resolved_data_path="$(realpath -e -- "$resolved_data_path")"
case "$resolved_data_path" in
"$ROOT_DIR"/*) ;;
*) fail "APP_DATA_DIR resolves outside the application version directory" ;;
esac
chown -R --no-dereference 1337:1337 "$resolved_data_path"
chmod 0750 "$resolved_data_path"
@@ -1,2 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
@@ -1,2 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB