diff --git a/apps/easy-vdl/README.md b/apps/easy-vdl/README.md new file mode 100644 index 000000000..c572ae8dd --- /dev/null +++ b/apps/easy-vdl/README.md @@ -0,0 +1,53 @@ +# Easy-VDL + +## 产品介绍 + +Easy-VDL 是面向多平台视频下载、作者订阅、直播录制和媒体整理的可视化平台,支持生成 Emby/Jellyfin 元数据、在线回放以及可选的 AI 高光处理。 + +## 主要功能 + +- 下载并订阅抖音、Bilibili、YouTube、快手、小红书等平台内容。 +- 检测并录制直播,保存弹幕与回放数据。 +- 管理下载文件、元数据、海报和媒体库目录。 +- 通过企业微信回调端口接收相关机器人请求。 + +## 访问说明 + +- Web 端口默认 `888`,企业微信回调端口默认 `8001`。 +- 使用安装表单生成的管理员账号和密码登录。 +- 首次启动需要初始化镜像内置的 PostgreSQL 数据目录,可能比普通 Web 应用耗时更长。 + +## 数据持久化 + +- `DOWNLOAD_DIR` 挂载到 `/app/downloads`,保存视频和媒体文件。 +- `LOG_DIR` 挂载到 `/app/logs`,保存运行日志。 +- `DATABASE_DIR` 挂载到 `/app/database`,保存内置数据库、配置、Cookie 和浏览器状态。 +- 升级前应备份三个目录,尤其是数据库目录。 + +## 权限与硬件说明 + +官方镜像入口脚本会根据 `PUID` 和 `PGID` 调整挂载目录权限,并会将下载目录设置为兼容 NAS 多用户访问的宽松权限。数据库目录中可能包含平台 Cookie,请限制宿主机访问权限。 + +本适配默认使用 CPU 模式,不挂载 `/dev/dri`、不授予 `PERFMON` capability,也不请求 NVIDIA 设备,因此可在无显卡服务器上直接安装。硬件转码与 GPU 监控需要管理员按上游说明自行扩展 Compose,并承担相应设备访问风险。 + +## 风险与内容说明 + +- 下载和录制功能可能受到目标平台服务条款、地区限制与账号风控影响。 +- 请控制订阅与检测频率,只保存您有权访问和使用的内容。 +- Cookie、机器人凭据和通知密钥会保存在数据库目录,请使用 HTTPS 并限制公网访问。 + +## Introduction + +Easy-VDL is a visual platform for multi-site video downloads, subscriptions, live recording, and media management. + +## Features + +- Subscribe to creators and download videos from multiple platforms. +- Detect and record live streams with comments and replay metadata. +- Organize downloads for Emby and Jellyfin libraries. +- Run in CPU mode by default without host GPU permissions. + +## Links + +- Project and deployment guide: https://github.com/wlaosj/easy-vdl +- Image: https://hub.docker.com/r/qq918652593/easy-vdl diff --git a/apps/easy-vdl/data.yml b/apps/easy-vdl/data.yml new file mode 100644 index 000000000..fd254a67d --- /dev/null +++ b/apps/easy-vdl/data.yml @@ -0,0 +1,32 @@ +name: Easy-VDL +tags: + - 多媒体 + - 下载 +title: 支持多平台下载、订阅、直播录制和媒体管理的可视化平台 +description: 支持多平台下载、订阅、直播录制和媒体管理的可视化平台 +additionalProperties: + key: easy-vdl + name: Easy-VDL + tags: + - Media + - Tool + shortDescZh: 支持多平台下载、订阅、直播录制和媒体管理的可视化平台 + shortDescEn: Visual platform for multi-site downloads, subscriptions, live recording, and media management + description: + en: Download and subscribe to multi-site videos, record live streams, and organize media through a self-hosted WebUI. + zh: 通过自托管 WebUI 下载和订阅多平台视频、录制直播并整理媒体内容。 + zh-Hant: 透過自託管 WebUI 下載和訂閱多平台影片、錄製直播並整理媒體內容。 + ja: セルフホストWebUIで複数サイトの動画をダウンロード・購読し、ライブ配信を録画してメディアを整理します。 + ko: 자체 호스팅 WebUI에서 여러 사이트의 동영상을 다운로드하고 구독하며 라이브 방송을 녹화하고 미디어를 관리합니다. + ru: Загружайте видео с разных платформ, подписывайтесь на каналы, записывайте трансляции и управляйте медиатекой через собственный WebUI. + ms: Muat turun dan langgan video pelbagai platform, rakam siaran langsung dan urus media melalui WebUI hos kendiri. + pt-br: Baixe e acompanhe vídeos de várias plataformas, grave transmissões e organize mídia por uma WebUI auto-hospedada. + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://github.com/wlaosj/easy-vdl + github: https://github.com/wlaosj/easy-vdl + document: https://github.com/wlaosj/easy-vdl + architectures: + - amd64 diff --git a/apps/easy-vdl/latest/.env.sample b/apps/easy-vdl/latest/.env.sample new file mode 100644 index 000000000..f110ec81a --- /dev/null +++ b/apps/easy-vdl/latest/.env.sample @@ -0,0 +1,11 @@ +PANEL_APP_PORT_HTTP=888 +PANEL_APP_PORT_CALLBACK=8001 +EASY_VDL_ADMIN_USERNAME=admin +EASY_VDL_ADMIN_PASSWORD=replace-with-a-strong-password +PUID=1000 +PGID=100 +DOWNLOAD_DIR=./data/downloads +LOG_DIR=./data/logs +DATABASE_DIR=./data/database +TZ=Asia/Shanghai +CONTAINER_NAME=easy-vdl-compose-check diff --git a/apps/easy-vdl/latest/data.yml b/apps/easy-vdl/latest/data.yml new file mode 100644 index 000000000..5b2f38e53 --- /dev/null +++ b/apps/easy-vdl/latest/data.yml @@ -0,0 +1,86 @@ +additionalProperties: + formFields: + - default: 888 + 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: 8001 + edit: true + envKey: PANEL_APP_PORT_CALLBACK + labelEn: WeCom Callback Port + labelZh: 企业微信回调端口 + label: {en: WeCom Callback Port, zh: 企业微信回调端口, zh-Hant: 企業微信回呼連接埠, ja: WeCom コールバックポート, ko: WeCom 콜백 포트, ru: Порт обратного вызова WeCom, ms: Port Panggil Balik WeCom, pt-br: Porta de Retorno WeCom} + required: true + rule: paramPort + type: number + - default: admin + edit: true + envKey: EASY_VDL_ADMIN_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: EASY_VDL_ADMIN_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: 1000 + edit: true + envKey: PUID + labelEn: Runtime UID + labelZh: 运行用户 UID + label: {en: Runtime UID, zh: 运行用户 UID, zh-Hant: 執行使用者 UID, ja: 実行ユーザー UID, ko: 실행 사용자 UID, ru: UID пользователя, ms: UID Pengguna, pt-br: UID do Usuário} + required: true + type: number + - default: 100 + edit: true + envKey: PGID + labelEn: Runtime GID + labelZh: 运行用户 GID + label: {en: Runtime GID, zh: 运行用户 GID, zh-Hant: 執行使用者 GID, ja: 実行ユーザー GID, ko: 실행 사용자 GID, ru: GID пользователя, ms: GID Pengguna, pt-br: GID do Usuário} + required: true + type: number + - default: ./data/downloads + edit: true + envKey: DOWNLOAD_DIR + labelEn: Download Directory + labelZh: 下载目录 + label: {en: Download Directory, zh: 下载目录, zh-Hant: 下載目錄, ja: ダウンロードディレクトリ, ko: 다운로드 디렉터리, ru: Каталог загрузок, ms: Direktori Muat Turun, pt-br: Diretório de Downloads} + required: true + type: text + - default: ./data/logs + edit: true + envKey: LOG_DIR + labelEn: Log Directory + labelZh: 日志目录 + label: {en: Log Directory, zh: 日志目录, zh-Hant: 日誌目錄, ja: ログディレクトリ, ko: 로그 디렉터리, ru: Каталог журналов, ms: Direktori Log, pt-br: Diretório de Logs} + required: true + type: text + - default: ./data/database + edit: true + envKey: DATABASE_DIR + labelEn: Database Directory + labelZh: 数据库目录 + label: {en: Database Directory, zh: 数据库目录, zh-Hant: 資料庫目錄, ja: データベースディレクトリ, ko: 데이터베이스 디렉터리, ru: Каталог базы данных, ms: Direktori Pangkalan Data, pt-br: Diretório do Banco de Dados} + 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/easy-vdl/latest/data/.gitkeep b/apps/easy-vdl/latest/data/.gitkeep new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/easy-vdl/latest/data/.gitkeep @@ -0,0 +1 @@ + diff --git a/apps/easy-vdl/latest/docker-compose.yml b/apps/easy-vdl/latest/docker-compose.yml new file mode 100644 index 000000000..0f68f6d68 --- /dev/null +++ b/apps/easy-vdl/latest/docker-compose.yml @@ -0,0 +1,36 @@ +services: + easy-vdl: + image: "qq918652593/easy-vdl:latest" + container_name: ${CONTAINER_NAME} + restart: unless-stopped + environment: + - EASY_VDL_PORT=80 + - EASY_VDL_ADMIN_USERNAME=${EASY_VDL_ADMIN_USERNAME} + - EASY_VDL_ADMIN_PASSWORD=${EASY_VDL_ADMIN_PASSWORD} + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ} + volumes: + - "${DOWNLOAD_DIR}:/app/downloads" + - "${LOG_DIR}:/app/logs" + - "${DATABASE_DIR}:/app/database" + ports: + - "${PANEL_APP_PORT_HTTP}:80" + - "${PANEL_APP_PORT_CALLBACK}:8001" + healthcheck: + test: + - CMD + - /bin/bash + - /app/healthcheck.sh + start_period: 60s + interval: 30s + timeout: 30s + retries: 3 + labels: + createdBy: "Apps" + networks: + - 1panel-network + +networks: + 1panel-network: + external: true diff --git a/apps/easy-vdl/latest/scripts/init.sh b/apps/easy-vdl/latest/scripts/init.sh new file mode 100755 index 000000000..e149b7c16 --- /dev/null +++ b/apps/easy-vdl/latest/scripts/init.sh @@ -0,0 +1,55 @@ +#!/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 "DOWNLOAD_DIR" "./data/downloads" +ensure_dir "LOG_DIR" "./data/logs" +ensure_dir "DATABASE_DIR" "./data/database" diff --git a/apps/easy-vdl/latest/scripts/uninstall.sh b/apps/easy-vdl/latest/scripts/uninstall.sh new file mode 100755 index 000000000..6e877466e --- /dev/null +++ b/apps/easy-vdl/latest/scripts/uninstall.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +set -euo pipefail diff --git a/apps/easy-vdl/latest/scripts/upgrade.sh b/apps/easy-vdl/latest/scripts/upgrade.sh new file mode 100755 index 000000000..6e877466e --- /dev/null +++ b/apps/easy-vdl/latest/scripts/upgrade.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +set -euo pipefail diff --git a/apps/easy-vdl/logo.png b/apps/easy-vdl/logo.png new file mode 100644 index 000000000..405a0539e Binary files /dev/null and b/apps/easy-vdl/logo.png differ diff --git a/apps/easy-vdl/source-evidence.json b/apps/easy-vdl/source-evidence.json new file mode 100644 index 000000000..9910b607d --- /dev/null +++ b/apps/easy-vdl/source-evidence.json @@ -0,0 +1,12 @@ +{ + "repository": "https://github.com/wlaosj/easy-vdl", + "dockerDocs": "https://github.com/wlaosj/easy-vdl#%E6%8E%A8%E8%8D%90%E4%BD%BF%E7%94%A8-docker-compose-%E4%B8%80%E9%94%AE%E9%83%A8%E7%BD%B2", + "composeFile": "https://github.com/wlaosj/easy-vdl#%E6%8E%A8%E8%8D%90%E4%BD%BF%E7%94%A8-docker-compose-%E4%B8%80%E9%94%AE%E9%83%A8%E7%BD%B2", + "imageRegistry": "https://hub.docker.com/r/qq918652593/easy-vdl", + "release": "https://github.com/wlaosj/easy-vdl/releases/tag/v1.2", + "notes": [ + "The official latest image is linux/amd64 only; upstream publishes a separate moving arm64 tag and no fixed v1.2 image tag.", + "The official image embeds and initializes PostgreSQL under /app/database; this is an image-owned runtime rather than a replaceable Compose sidecar.", + "GPU devices and PERFMON are optional upstream accelerators and are intentionally omitted from the default CPU-compatible package." + ] +}