Files
StudyDiary/03-工作笔记/应用部署/方案:yt-dlp 批量下载喜马拉雅 RSS 播客脚本(飞牛fnOS宿主机直接运行).md

4.0 KiB
Raw Permalink Blame History

方案: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 登录飞牛执行)

# 安装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 对应的宿主机目录

#!/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 命令(推荐简单测试)

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 点自动执行脚本,检查有没有新节目:

# 编辑定时任务
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 参数:

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 生成)