Merge pull request #4713 from okxlin/feat/easy-vdl

Add Easy-VDL app
This commit is contained in:
okxlin
2026-07-11 14:10:23 +08:00
committed by GitHub
11 changed files with 290 additions and 0 deletions
+53
View File
@@ -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
+32
View File
@@ -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
+11
View File
@@ -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
+86
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
+36
View File
@@ -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
+55
View File
@@ -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"
+2
View File
@@ -0,0 +1,2 @@
#!/usr/bin/env bash
set -euo pipefail
+2
View File
@@ -0,0 +1,2 @@
#!/usr/bin/env bash
set -euo pipefail
Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

+12
View File
@@ -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."
]
}