From 25d6b58d1527617669e37f4402ae156b72d01679 Mon Sep 17 00:00:00 2001 From: okxlin <61420215+okxlin@users.noreply.github.com> Date: Sat, 11 Jul 2026 13:32:17 +0800 Subject: [PATCH] Add Quark Auto Save app --- apps/quark-auto-save/0.8.7/.env.sample | 9 ++ apps/quark-auto-save/0.8.7/data.yml | 133 ++++++++++++++++++ apps/quark-auto-save/0.8.7/data/.gitkeep | 1 + apps/quark-auto-save/0.8.7/docker-compose.yml | 34 +++++ apps/quark-auto-save/0.8.7/scripts/init.sh | 54 +++++++ .../0.8.7/scripts/uninstall.sh | 2 + apps/quark-auto-save/0.8.7/scripts/upgrade.sh | 2 + apps/quark-auto-save/README.md | 50 +++++++ apps/quark-auto-save/data.yml | 34 +++++ apps/quark-auto-save/latest/.env.sample | 9 ++ apps/quark-auto-save/latest/data.yml | 133 ++++++++++++++++++ apps/quark-auto-save/latest/data/.gitkeep | 1 + .../quark-auto-save/latest/docker-compose.yml | 34 +++++ apps/quark-auto-save/latest/scripts/init.sh | 54 +++++++ .../latest/scripts/uninstall.sh | 2 + .../quark-auto-save/latest/scripts/upgrade.sh | 2 + apps/quark-auto-save/logo.png | Bin 0 -> 4362 bytes apps/quark-auto-save/source-evidence.json | 12 ++ 18 files changed, 566 insertions(+) create mode 100644 apps/quark-auto-save/0.8.7/.env.sample create mode 100644 apps/quark-auto-save/0.8.7/data.yml create mode 100644 apps/quark-auto-save/0.8.7/data/.gitkeep create mode 100644 apps/quark-auto-save/0.8.7/docker-compose.yml create mode 100755 apps/quark-auto-save/0.8.7/scripts/init.sh create mode 100755 apps/quark-auto-save/0.8.7/scripts/uninstall.sh create mode 100755 apps/quark-auto-save/0.8.7/scripts/upgrade.sh create mode 100644 apps/quark-auto-save/README.md create mode 100644 apps/quark-auto-save/data.yml create mode 100644 apps/quark-auto-save/latest/.env.sample create mode 100644 apps/quark-auto-save/latest/data.yml create mode 100644 apps/quark-auto-save/latest/data/.gitkeep create mode 100644 apps/quark-auto-save/latest/docker-compose.yml create mode 100755 apps/quark-auto-save/latest/scripts/init.sh create mode 100755 apps/quark-auto-save/latest/scripts/uninstall.sh create mode 100755 apps/quark-auto-save/latest/scripts/upgrade.sh create mode 100644 apps/quark-auto-save/logo.png create mode 100644 apps/quark-auto-save/source-evidence.json diff --git a/apps/quark-auto-save/0.8.7/.env.sample b/apps/quark-auto-save/0.8.7/.env.sample new file mode 100644 index 000000000..38f0659cb --- /dev/null +++ b/apps/quark-auto-save/0.8.7/.env.sample @@ -0,0 +1,9 @@ +PANEL_APP_PORT_HTTP=5005 +WEBUI_USERNAME=admin +WEBUI_PASSWORD=replace-with-a-strong-password +TASK_TIMEOUT=1800 +PLUGIN_FLAGS= +APP_CONFIG_DIR=./data/config +MEDIA_DIR=./data/media +TZ=Asia/Shanghai +CONTAINER_NAME=quark-auto-save-compose-check diff --git a/apps/quark-auto-save/0.8.7/data.yml b/apps/quark-auto-save/0.8.7/data.yml new file mode 100644 index 000000000..5fe1aa3e5 --- /dev/null +++ b/apps/quark-auto-save/0.8.7/data.yml @@ -0,0 +1,133 @@ +additionalProperties: + formFields: + - default: 5005 + 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: admin + edit: true + envKey: WEBUI_USERNAME + labelEn: Admin Username + labelZh: 管理用户名 + label: + en: Admin Username + zh: 管理用户名 + zh-Hant: 管理員使用者名稱 + ja: 管理者ユーザー名 + ko: 관리자 사용자 이름 + ru: Имя администратора + ms: Nama Pengguna Pentadbir + pt-br: Usuário Administrador + required: true + type: text + - default: "" + edit: true + envKey: WEBUI_PASSWORD + labelEn: Admin Password + labelZh: 管理密码 + label: + en: Admin Password + zh: 管理密码 + zh-Hant: 管理員密碼 + ja: 管理者パスワード + ko: 관리자 비밀번호 + ru: Пароль администратора + ms: Kata Laluan Pentadbir + pt-br: Senha do Administrador + random: true + required: true + rule: paramComplexity + type: password + - default: 1800 + edit: true + envKey: TASK_TIMEOUT + labelEn: Task Timeout (seconds) + labelZh: 任务超时(秒) + label: + en: Task Timeout (seconds) + zh: 任务超时(秒) + zh-Hant: 任務逾時(秒) + ja: タスクのタイムアウト(秒) + ko: 작업 시간 제한(초) + ru: Тайм-аут задачи (секунды) + ms: Tamat Masa Tugas (saat) + pt-br: Tempo Limite da Tarefa (segundos) + required: true + type: number + - default: "" + edit: true + envKey: PLUGIN_FLAGS + labelEn: Plugin Flags + labelZh: 插件标志 + label: + en: Plugin Flags + zh: 插件标志 + zh-Hant: 外掛標誌 + ja: プラグインフラグ + ko: 플러그인 플래그 + ru: Флаги плагинов + ms: Bendera Pemalam + pt-br: Opções de Plugins + required: false + type: text + - default: ./data/config + edit: true + envKey: APP_CONFIG_DIR + labelEn: Configuration Directory + labelZh: 配置目录 + label: + en: Configuration Directory + zh: 配置目录 + zh-Hant: 設定目錄 + ja: 設定ディレクトリ + ko: 설정 디렉터리 + ru: Каталог конфигурации + ms: Direktori Konfigurasi + pt-br: Diretório de Configuração + required: true + type: text + - default: ./data/media + edit: true + envKey: MEDIA_DIR + labelEn: Media Directory + labelZh: 媒体目录 + label: + en: Media Directory + zh: 媒体目录 + zh-Hant: 媒體目錄 + ja: メディアディレクトリ + ko: 미디어 디렉터리 + ru: Каталог медиафайлов + ms: Direktori Media + pt-br: Diretório de Mídia + required: true + type: text + - 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 diff --git a/apps/quark-auto-save/0.8.7/data/.gitkeep b/apps/quark-auto-save/0.8.7/data/.gitkeep new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/quark-auto-save/0.8.7/data/.gitkeep @@ -0,0 +1 @@ + diff --git a/apps/quark-auto-save/0.8.7/docker-compose.yml b/apps/quark-auto-save/0.8.7/docker-compose.yml new file mode 100644 index 000000000..73107f486 --- /dev/null +++ b/apps/quark-auto-save/0.8.7/docker-compose.yml @@ -0,0 +1,34 @@ +services: + quark-auto-save: + image: "cp0204/quark-auto-save:v0.8.7" + container_name: ${CONTAINER_NAME} + restart: unless-stopped + environment: + - WEBUI_USERNAME=${WEBUI_USERNAME} + - WEBUI_PASSWORD=${WEBUI_PASSWORD} + - TASK_TIMEOUT=${TASK_TIMEOUT} + - PLUGIN_FLAGS=${PLUGIN_FLAGS:-} + - TZ=${TZ} + volumes: + - "${APP_CONFIG_DIR}:/app/config" + - "${MEDIA_DIR}:/media" + ports: + - "${PANEL_APP_PORT_HTTP}:5005" + healthcheck: + test: + - CMD + - python + - -c + - import urllib.request; urllib.request.urlopen('http://127.0.0.1:5005/', timeout=5) + start_period: 15s + interval: 30s + timeout: 10s + retries: 5 + labels: + createdBy: "Apps" + networks: + - 1panel-network + +networks: + 1panel-network: + external: true diff --git a/apps/quark-auto-save/0.8.7/scripts/init.sh b/apps/quark-auto-save/0.8.7/scripts/init.sh new file mode 100755 index 000000000..4789d345b --- /dev/null +++ b/apps/quark-auto-save/0.8.7/scripts/init.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}" + +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 raw="$1" + if [[ "$raw" = /* ]]; then + printf '%s\n' "$raw" + else + printf '%s\n' "$ROOT_DIR/${raw#./}" + fi +} + +ensure_dir() { + local path + path="$(resolve_app_path "$(configured_value "$1" "$2")")" + mkdir -p "$path" +} + +ensure_file_parent() { + local path + local parent + path="$(resolve_app_path "$(configured_value "$1" "$2")")" + parent="$(dirname "$path")" + mkdir -p "$parent" +} + +ensure_dir "APP_CONFIG_DIR" "./data/config" +ensure_dir "MEDIA_DIR" "./data/media" diff --git a/apps/quark-auto-save/0.8.7/scripts/uninstall.sh b/apps/quark-auto-save/0.8.7/scripts/uninstall.sh new file mode 100755 index 000000000..6e877466e --- /dev/null +++ b/apps/quark-auto-save/0.8.7/scripts/uninstall.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +set -euo pipefail diff --git a/apps/quark-auto-save/0.8.7/scripts/upgrade.sh b/apps/quark-auto-save/0.8.7/scripts/upgrade.sh new file mode 100755 index 000000000..6e877466e --- /dev/null +++ b/apps/quark-auto-save/0.8.7/scripts/upgrade.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +set -euo pipefail diff --git a/apps/quark-auto-save/README.md b/apps/quark-auto-save/README.md new file mode 100644 index 000000000..05178111b --- /dev/null +++ b/apps/quark-auto-save/README.md @@ -0,0 +1,50 @@ +# Quark Auto Save + +## 产品介绍 + +Quark Auto Save 提供 WebUI,用于自动执行夸克网盘签到、分享链接转存、文件名整理、通知推送和媒体库刷新。它适合管理持续更新的网盘资源,并可通过插件与 Emby、OpenList、SmartStrm 等服务联动。 + +## 主要功能 + +- 定时签到并自动转存持续更新的分享资源。 +- 使用正则表达式整理、重命名和筛选文件。 +- 发送任务通知,并通过插件刷新媒体库或生成 STRM 文件。 +- 通过 WebUI 管理多个账号、转存任务和插件配置。 + +## 访问说明 + +- Web 端口由安装表单设置,默认 `5005`。 +- 使用安装表单生成的管理用户名和密码登录 WebUI。 +- 夸克账号 Cookie、任务和插件配置保存在配置目录中,请定期备份。 +- 媒体目录挂载到容器内 `/media`,供 STRM 等插件生成或读写媒体文件。 +- `PLUGIN_FLAGS` 可按上游格式禁用插件,例如 `-emby,-aria2`;不了解时请留空。 + +## 数据持久化 + +- `APP_CONFIG_DIR` 挂载到 `/app/config`,保存账号、任务和应用配置。 +- `MEDIA_DIR` 挂载到 `/media`,保存或访问插件生成的媒体内容。 +- 升级前至少备份配置目录。将媒体目录指向已有媒体库时,应先在少量数据上验证插件行为。 + +## 风险与限制 + +- 本应用会保存夸克账号 Cookie。请限制面板和 WebUI 的访问范围,并使用强管理密码与 HTTPS 反向代理。 +- 转存、重命名和媒体插件可能修改云端或挂载目录中的内容,请先验证任务规则。 +- 不要设置过高的定时执行频率,以免触发账号风控或对上游服务造成过量请求。 +- 请仅处理您有权访问和保存的内容,并遵守服务条款和当地法律。 + +## Introduction + +Quark Auto Save automates Quark cloud-drive sign-in, share-link transfers, file renaming, notifications, and media-library refresh tasks through a self-hosted WebUI. + +## Features + +- Schedule sign-in and transfer tasks for continuously updated shares. +- Filter and rename files with regular-expression rules. +- Send notifications and integrate media-library or STRM plugins. +- Manage accounts, tasks, and plugins through the WebUI. + +## Links + +- Project: https://github.com/Cp0204/quark-auto-save +- Documentation: https://github.com/Cp0204/quark-auto-save/wiki +- Image: https://hub.docker.com/r/cp0204/quark-auto-save diff --git a/apps/quark-auto-save/data.yml b/apps/quark-auto-save/data.yml new file mode 100644 index 000000000..a3a3c89fe --- /dev/null +++ b/apps/quark-auto-save/data.yml @@ -0,0 +1,34 @@ +name: Quark Auto Save +tags: + - 工具 + - 云存储 +title: 夸克网盘自动转存、整理与媒体库联动工具 +description: 夸克网盘自动转存、整理与媒体库联动工具 +additionalProperties: + key: quark-auto-save + name: Quark Auto Save + tags: + - Tool + - Storage + shortDescZh: 夸克网盘自动转存、整理与媒体库联动工具 + shortDescEn: Automate Quark cloud-drive transfers, renaming, notifications, and media-library refreshes + description: + en: Automate Quark cloud-drive sign-in, transfers, renaming, notifications, and media-library refresh tasks. + zh: 自动完成夸克网盘签到、转存、重命名、通知和媒体库刷新任务。 + zh-Hant: 自動完成夸克網盤簽到、轉存、重新命名、通知和媒體庫重新整理任務。 + ja: Quarkクラウドドライブのサインイン、転送、名前変更、通知、メディアライブラリ更新を自動化します。 + ko: Quark 클라우드 드라이브 로그인, 전송, 이름 변경, 알림 및 미디어 라이브러리 새로 고침을 자동화합니다. + ru: Автоматизирует вход, перенос, переименование, уведомления и обновление медиатеки Quark Cloud Drive. + ms: Automatikkan daftar masuk, pemindahan, penamaan semula, pemberitahuan dan muat semula pustaka media Quark Cloud Drive. + pt-br: Automatize login, transferências, renomeação, notificações e atualização da biblioteca de mídia do Quark Cloud Drive. + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://github.com/Cp0204/quark-auto-save + github: https://github.com/Cp0204/quark-auto-save + document: https://github.com/Cp0204/quark-auto-save/wiki + architectures: + - amd64 + - arm + - arm64 diff --git a/apps/quark-auto-save/latest/.env.sample b/apps/quark-auto-save/latest/.env.sample new file mode 100644 index 000000000..38f0659cb --- /dev/null +++ b/apps/quark-auto-save/latest/.env.sample @@ -0,0 +1,9 @@ +PANEL_APP_PORT_HTTP=5005 +WEBUI_USERNAME=admin +WEBUI_PASSWORD=replace-with-a-strong-password +TASK_TIMEOUT=1800 +PLUGIN_FLAGS= +APP_CONFIG_DIR=./data/config +MEDIA_DIR=./data/media +TZ=Asia/Shanghai +CONTAINER_NAME=quark-auto-save-compose-check diff --git a/apps/quark-auto-save/latest/data.yml b/apps/quark-auto-save/latest/data.yml new file mode 100644 index 000000000..5fe1aa3e5 --- /dev/null +++ b/apps/quark-auto-save/latest/data.yml @@ -0,0 +1,133 @@ +additionalProperties: + formFields: + - default: 5005 + 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: admin + edit: true + envKey: WEBUI_USERNAME + labelEn: Admin Username + labelZh: 管理用户名 + label: + en: Admin Username + zh: 管理用户名 + zh-Hant: 管理員使用者名稱 + ja: 管理者ユーザー名 + ko: 관리자 사용자 이름 + ru: Имя администратора + ms: Nama Pengguna Pentadbir + pt-br: Usuário Administrador + required: true + type: text + - default: "" + edit: true + envKey: WEBUI_PASSWORD + labelEn: Admin Password + labelZh: 管理密码 + label: + en: Admin Password + zh: 管理密码 + zh-Hant: 管理員密碼 + ja: 管理者パスワード + ko: 관리자 비밀번호 + ru: Пароль администратора + ms: Kata Laluan Pentadbir + pt-br: Senha do Administrador + random: true + required: true + rule: paramComplexity + type: password + - default: 1800 + edit: true + envKey: TASK_TIMEOUT + labelEn: Task Timeout (seconds) + labelZh: 任务超时(秒) + label: + en: Task Timeout (seconds) + zh: 任务超时(秒) + zh-Hant: 任務逾時(秒) + ja: タスクのタイムアウト(秒) + ko: 작업 시간 제한(초) + ru: Тайм-аут задачи (секунды) + ms: Tamat Masa Tugas (saat) + pt-br: Tempo Limite da Tarefa (segundos) + required: true + type: number + - default: "" + edit: true + envKey: PLUGIN_FLAGS + labelEn: Plugin Flags + labelZh: 插件标志 + label: + en: Plugin Flags + zh: 插件标志 + zh-Hant: 外掛標誌 + ja: プラグインフラグ + ko: 플러그인 플래그 + ru: Флаги плагинов + ms: Bendera Pemalam + pt-br: Opções de Plugins + required: false + type: text + - default: ./data/config + edit: true + envKey: APP_CONFIG_DIR + labelEn: Configuration Directory + labelZh: 配置目录 + label: + en: Configuration Directory + zh: 配置目录 + zh-Hant: 設定目錄 + ja: 設定ディレクトリ + ko: 설정 디렉터리 + ru: Каталог конфигурации + ms: Direktori Konfigurasi + pt-br: Diretório de Configuração + required: true + type: text + - default: ./data/media + edit: true + envKey: MEDIA_DIR + labelEn: Media Directory + labelZh: 媒体目录 + label: + en: Media Directory + zh: 媒体目录 + zh-Hant: 媒體目錄 + ja: メディアディレクトリ + ko: 미디어 디렉터리 + ru: Каталог медиафайлов + ms: Direktori Media + pt-br: Diretório de Mídia + required: true + type: text + - 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 diff --git a/apps/quark-auto-save/latest/data/.gitkeep b/apps/quark-auto-save/latest/data/.gitkeep new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/quark-auto-save/latest/data/.gitkeep @@ -0,0 +1 @@ + diff --git a/apps/quark-auto-save/latest/docker-compose.yml b/apps/quark-auto-save/latest/docker-compose.yml new file mode 100644 index 000000000..14e693f4b --- /dev/null +++ b/apps/quark-auto-save/latest/docker-compose.yml @@ -0,0 +1,34 @@ +services: + quark-auto-save: + image: "cp0204/quark-auto-save:latest" + container_name: ${CONTAINER_NAME} + restart: unless-stopped + environment: + - WEBUI_USERNAME=${WEBUI_USERNAME} + - WEBUI_PASSWORD=${WEBUI_PASSWORD} + - TASK_TIMEOUT=${TASK_TIMEOUT} + - PLUGIN_FLAGS=${PLUGIN_FLAGS:-} + - TZ=${TZ} + volumes: + - "${APP_CONFIG_DIR}:/app/config" + - "${MEDIA_DIR}:/media" + ports: + - "${PANEL_APP_PORT_HTTP}:5005" + healthcheck: + test: + - CMD + - python + - -c + - import urllib.request; urllib.request.urlopen('http://127.0.0.1:5005/', timeout=5) + start_period: 15s + interval: 30s + timeout: 10s + retries: 5 + labels: + createdBy: "Apps" + networks: + - 1panel-network + +networks: + 1panel-network: + external: true diff --git a/apps/quark-auto-save/latest/scripts/init.sh b/apps/quark-auto-save/latest/scripts/init.sh new file mode 100755 index 000000000..4789d345b --- /dev/null +++ b/apps/quark-auto-save/latest/scripts/init.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}" + +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 raw="$1" + if [[ "$raw" = /* ]]; then + printf '%s\n' "$raw" + else + printf '%s\n' "$ROOT_DIR/${raw#./}" + fi +} + +ensure_dir() { + local path + path="$(resolve_app_path "$(configured_value "$1" "$2")")" + mkdir -p "$path" +} + +ensure_file_parent() { + local path + local parent + path="$(resolve_app_path "$(configured_value "$1" "$2")")" + parent="$(dirname "$path")" + mkdir -p "$parent" +} + +ensure_dir "APP_CONFIG_DIR" "./data/config" +ensure_dir "MEDIA_DIR" "./data/media" diff --git a/apps/quark-auto-save/latest/scripts/uninstall.sh b/apps/quark-auto-save/latest/scripts/uninstall.sh new file mode 100755 index 000000000..6e877466e --- /dev/null +++ b/apps/quark-auto-save/latest/scripts/uninstall.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +set -euo pipefail diff --git a/apps/quark-auto-save/latest/scripts/upgrade.sh b/apps/quark-auto-save/latest/scripts/upgrade.sh new file mode 100755 index 000000000..6e877466e --- /dev/null +++ b/apps/quark-auto-save/latest/scripts/upgrade.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +set -euo pipefail diff --git a/apps/quark-auto-save/logo.png b/apps/quark-auto-save/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6430470097cc60c2b2ec7c131fb234148645b64f GIT binary patch literal 4362 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 JsW