Files
StudyDiary-20261009/02-学习笔记/方案:yt-dlp 批量下载喜马拉雅 RSS 播客脚本(飞牛fnOS宿主机直接运行).md

126 lines
4.0 KiB
Markdown
Raw Normal View History

2026-10-09 22:06:40 +08:00
# 方案:yt\-dlp 批量下载喜马拉雅 RSS 播客脚本(飞牛fnOS宿主机直接运行)
# 方案:yt\-dlp 批量下载喜马拉雅 RSS 播客脚本(飞牛 fnOS 宿主机直接运行)
> 特性:
>
> 1. 读取喜马拉雅 RSS,自动抓取所有音频、自动建立专辑文件夹
>
> 2. 输出 m4a,自动修复 mp4 trailer 索引,不会出现 ABS 那个`Invalid seek`错误
>
> 3. 自动写入标题 / 专辑 / 艺术家等元数据,Audiobookshelf 扫描直接识别
>
> 4. 跳过已下载文件,支持断点续下
>
> 5. 宿主机运行,音频直接输出到 ABS 的 podcasts 目录,无需走 ABS 内置 ffmpeg 下载
>
>
## 一、先在飞牛宿主机安装依赖(SSH 登录飞牛执行)
```bash
# 安装yt-dlp + ffmpeg
pip install yt-dlp
# 如果没有pip
curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp
chmod a+x /usr/local/bin
# 安装ffmpeg(fnOS包管理器)
apk add ffmpeg
```
## 二、批量下载脚本 `download_ximalaya_rss.py`
> 修改两处:
>
> - `RSS_URL`:你的喜马拉雅 RSS 订阅地址
>
> - `OUTPUT_DIR`:**Audiobookshelf 容器 podcasts 对应的宿主机目录**
>
>
```python
#!/usr/bin/env python3
import subprocess
import os
# ========== 配置区,请修改 ==========
RSS_URL = "替换成你的喜马拉雅播客RSS链接"
OUTPUT_DIR = "/mnt/your_abs_podcasts" # ABS podcasts宿主机路径
# ====================================
def main():
os.makedirs(OUTPUT_DIR, exist_ok=True)
cmd = [
"yt-dlp",
"--no-warnings",
"--ignore-errors",
"--continue",
"--embed-metadata",
"--audio-format", "m4a",
"--format", "bestaudio",
"-o", os.path.join(OUTPUT_DIR, "%(album)s/%(title)s.%(ext)s"),
RSS_URL
]
print("开始执行下载命令:")
print(" ".join(cmd))
subprocess.run(cmd)
if __name__ == "__main__":
main()
```
### 使用
1. 保存文件,`chmod +x download_ximalaya_rss.py`
2. 修改 RSS\_URL 和 OUTPUT\_DIR
3. 运行:`python3 download_ximalaya_rss.py`
## 三、如果你不想用 Python,直接一行 shell 命令(推荐简单测试)
```bash
yt-dlp --continue --embed-metadata --audio-format m4a -o "/mnt/your_abs_podcasts/%(album)s/%(title)s.%(ext)s" "这里粘贴你的RSS链接"
```
## 四、Audiobookshelf 后续操作
1. 下载完成后,进入 ABS 网页后台 → 对应播客 → **重新扫描媒体库**
2. ABS 会读取本地 m4a 文件,自动识别剧集、封面、简介元数据
3. **关闭 ABS 播客自动下载**,后续新增节目,再次运行脚本增量下载即可
## 五、可选增强:定时自动检查 RSS 更新(新增节目自动下载)
用 crontab 定时,例如每天凌晨 2 点自动执行脚本,检查有没有新节目:
```bash
# 编辑定时任务
crontab -e
# 添加一行
0 2 * * * /usr/bin/python3 /root/download_ximalaya_rss.py >> /root/podcast_download.log 2>&1
```
## 六、重要注意事项(对应你之前踩坑点)
1. 脚本在**宿主机**下载,写入宿主机本地存储,**不会经过 docker 容器内的 pipe\+ffmpeg m4a seek 问题**,和群晖 ABS 下载行为一致。
2. 如果`OUTPUT_DIR`指向 SMB/NFS 网络盘:yt\-dlp 的下载写入逻辑和 ABS 内置 ffmpeg 不一样,**大概率不会触发 Invalid seek**;但最稳方案:优先存飞牛本地硬盘。
3. 喜马拉雅 RSS 链接有有效期,长期使用如果下载失败,重新去插件里拿最新 RSS 地址替换。
## 七、备选:如果想要输出 mp3(彻底规避 m4a 容器问题)
修改 yt\-dlp 参数:
```bash
yt-dlp --continue --embed-metadata --audio-format mp3 -o "/mnt/your_abs_podcasts/%(album)s/%(title)s.%(ext)s" "RSS链接"
```
---
需要我再加一个**自动下载封面图片并和音频放在同目录**的版本吗?这样 Audiobookshelf 扫描的时候自动读取封面,不用手动处理喜马拉雅封面`Invalid content type`报错。
> (注:部分内容可能由 AI 生成)