Files
StudyDiary-20261009/02-学习笔记/方案:yt-dlp 批量下载喜马拉雅 RSS 播客脚本(飞牛fnOS宿主机直接运行).md
CrazyJasonwell e97be9ac8c commit all
2026-10-09 22:06:40 +08:00

126 lines
4.0 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 方案: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 生成)