MeTube 自托管视频下载器:5 个问题快速上手
【免费下载链接】metubeSelf-hosted video downloader for YouTube and other sites (web UI for yt-dlp)项目地址: https://gitcode.com/GitHub_Trending/me/metube
MeTube 是一款自托管视频下载服务,本质上是给 yt-dlp 套了一层网页界面。跑起来一个容器之后,你在浏览器里粘贴链接,视频和音频文件就落到你指定的目录里,进度通过 WebSocket 实时刷新。全程不需要背 yt-dlp 的命令行参数。全部环境变量清单可以对照 README.md 查。
🐳 怎么跑起来:从一条命令到 compose
一条命令先跑通
docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube执行完服务就在后台运行,监听 8081 端口。把/path/to/downloads换成宿主机上真实存在的目录,下载的文件会一直存在那里;不挂卷的话,文件只活在容器里,删容器就没了。
用 docker compose 长期管理
常驻部署建议写进 compose,顺带加两个常用变量:DOWNLOAD_MODE控制调度策略,MAX_CONCURRENT_DOWNLOADS限定并发数。
services: metube: image: ghcr.io/alexta69/metube restart: unless-stopped ports: - "8081:8081" volumes: - /path/to/downloads:/downloads environment: - DOWNLOAD_MODE=limited - MAX_CONCURRENT_DOWNLOADS=3DOWNLOAD_MODE=limited时,超出并发上限的任务排队等待,而不是同时挤进来,机器配置小的时候更稳。再配一个container_name: metube,后面进容器排障会方便很多。
从源码运行(开发者)
需要看代码或改功能时,按仓库说明用 Node.js 22+ 和 Python 3.13 本地跑:
git clone https://gitcode.com/GitHub_Trending/me/metube cd metube cd ui && npm install && node_modules/.bin/ng build cd .. && uv sync && uv run python3 app/main.py另外,社区有浏览器扩展支持右键把视频直接发到 MeTube。装扩展后要设CORS_ALLOWED_ORIGINS;在 HTTPS 页面上使用时,你的实例也必须走 HTTPS(HTTPS=true或反代终结)。
📁 视频下载放在哪、叫什么名字:目录与命名
音频和视频分开存
默认两者存在同一个目录。想让音乐独立成库,就设AUDIO_DOWNLOAD_DIR,比如/downloads/music,配合 beets 之类的打标工具按 Artist/Album 归档。
每次下载选子目录
CUSTOM_DIRS=true时,网页界面上的添加按钮旁会出现目录下拉框;CREATE_CUSTOM_DIRS=true时还能直接输入新名字,目录会被递归创建。两个开关默认都是开的,按专辑或主题各存一个文件夹即可。
用模板给文件改名
默认文件名是%(title)s.%(ext)s。改它用OUTPUT_TEMPLATE,比如把分辨率写进名字:OUTPUT_TEMPLATE=%(title)s_[%(resolution)s].%(ext)s。播放列表有单独的OUTPUT_TEMPLATE_PLAYLIST,默认值会让每个播放列表自动落在以列表名命名的子目录里。
🎚 带宽、并发、下载数量怎么限制
限带宽
YTDL_OPTIONS是一个 JSON 对象,直接透传给 yt-dlp,键名约等于命令行参数去掉连字符、换成下划线:
environment: - YTDL_OPTIONS={"ratelimit": 500000}ratelimit对应--limit-rate,单位是字节每秒,500000 即约 500KB/s。不想让下载占满上行时加上它。
控制并发与播放列表数量
MAX_CONCURRENT_DOWNLOADS是并发下载上限,默认 3,多出来的任务排队。共享机器上可以降到 2。
播放列表有两种识别模式:默认的宽松模式会自动关联视频所属的播放列表;严格模式只在链接本身就是播放列表时才批量拉取。怕误下整个频道,就给DEFAULT_OPTION_PLAYLIST_ITEM_LIMIT设一个数字,0 表示不限制。
如果目标是 iPhone 或 iPad,界面上 Quality 选项里的 "Best (iOS)" 会自动挑 h264 兼容格式。更严格的控制是在YTDL_OPTIONS里传exec,下载完成后自动调 ffmpeg 转码成libx264 + aac。
🔑 需要登录的会员内容怎么下
上传 Cookie
下载受限视频需要带上浏览器的 Cookie。用浏览器扩展把目标站点的 Cookie 导出成cookies.txt,挂进容器并告诉 yt-dlp 文件位置:
volumes: - /path/to/cookies:/cookies environment: - YTDL_OPTIONS={"cookiefile":"/cookies/cookies.txt"}不想动容器也可以走网页:在 Advanced Options 里点 Upload Cookies 上传文件,上传后 Cookie 指示器变亮,同一面板的 Delete Cookies 可以删掉。
🩺 出问题了怎么办
日志与权限
把LOGLEVEL设为DEBUG,再看容器日志,多数失败原因能直接定位。报权限错误时检查宿主机下载目录的权限,755 是个稳妥的起点。文件名出现中文乱码,就在YTDL_OPTIONS里加"outtmpl_encoding": "utf-8"强制 UTF-8 输出。
反向代理背后的 WebSocket
挂在现有站点后面(比如 Nginx)时,两行 WebSocket 头不能省,否则浏览器里的进度刷新会卡住:
location /metube/ { proxy_pass http://metube:8081; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }挂在子目录下时记得同步设置URL_PREFIX。如果实例要直接对外提供 HTTPS,设HTTPS=true并用CERTFILE、KEYFILE挂上证书。
让 yt-dlp 跟上版本
视频平台改版频繁,yt-dlp 发新版后 MeTube 镜像会自动发布新构建,配合 watchtower 可以自动拉取重启。想紧跟 nightly 构建,设YTDL_NIGHTLY_UPDATE_TIME为HH:MM格式的 24 小时制时间,容器会在指定时刻切换版本并重启。
MeTube 适合手里有一台服务器、想把视频存量沉淀到自己目录里、偶尔还要批量拉播放列表或频道的人;如果你只是偶尔下一个视频,本地装个下载客户端更省事。下一步:把第一条命令里的/path/to/downloads改成真实目录执行,浏览器打开 8081 端口,粘贴一条链接,几分钟内就能看到第一个文件落盘。
【免费下载链接】metubeSelf-hosted video downloader for YouTube and other sites (web UI for yt-dlp)项目地址: https://gitcode.com/GitHub_Trending/me/metube
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考