126 lines
4.0 KiB
Markdown
Executable File
126 lines
4.0 KiB
Markdown
Executable File
# 方案: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 生成)
|