TMDB + Bangumi 联动工具,为 Jellyfin 生成 NFO 元数据文件,支持 qBittorrent 下载管理。
- 剧集查询 — 输入
节目名 SXXEXX,自动交叉查询 TMDB 和 Bangumi,输出匹配结果 - NFO 生成 — 为 Jellyfin 生成剧集级 (
*.nfo)、节目级 (tvshow.nfo)、季级 (season.nfo) 元数据 - 图片下载 — 从 TMDB 下载节目海报/背景/Logo,从 Bangumi 下载季封面
- qBittorrent 集成 — 种子添加 → 文件解析 → 元数据匹配 → 重命名 → NFO 生成 → 恢复下载,全自动流程
- 目录扫描 — 监控目录,自动处理新种子,成功后删除
# 克隆项目
git clone <repo-url>
cd My-anime-manager
# 安装依赖
pip install httpx qbittorrent-api
# 或直接安装包
pip install .通过环境变量配置:
| 变量 | 必填 | 默认值 | 说明 |
|---|---|---|---|
TMDB_API_KEY |
✅ | — | TMDB API 密钥,在 tmdb.org/settings/api 申请 |
BANGUMI_UA |
— | JellyfinTmdbHelper/1.0 |
Bangumi API 的 User-Agent |
API_DELAY_MS |
— | 600 |
Bangumi 请求间隔(毫秒),避免被限流 |
PROXY_HOST |
— | — | HTTP 代理地址(TMDB/Bangumi 走代理) |
PROXY_PORT |
— | 7890 |
HTTP 代理端口 |
QBITTORRENT_URL |
— | http://localhost:8080 |
qBittorrent WebUI 地址 |
QBITTORRENT_USERNAME |
— | admin |
qBittorrent 用户名 |
QBITTORRENT_PASSWORD |
— | — | qBittorrent 密码 |
QBITTORRENT_SAVE_PATH |
— | /downloads |
qBittorrent 下载保存路径 |
TORRENT_WATCH_DIR |
— | /data/torrent |
--scan 模式的默认扫描目录 |
PowerShell:
$env:TMDB_API_KEY = "你的API密钥"
$env:QBITTORRENT_URL = "http://192.168.1.100:8080"
$env:QBITTORRENT_PASSWORD = "你的密码"
$env:QBITTORRENT_SAVE_PATH = "D:/downloads"
$env:PROXY_HOST = "127.0.0.1"
$env:PROXY_PORT = "7890"Linux / macOS (~/.bashrc 或 ~/.zshrc):
export TMDB_API_KEY="你的API密钥"
export QBITTORRENT_URL="http://192.168.1.100:8080"
export QBITTORRENT_PASSWORD="你的密码"
export QBITTORRENT_SAVE_PATH="/downloads"
export PROXY_HOST="127.0.0.1"
export PROXY_PORT="7890"查询指定剧集,打印 TMDB 和 Bangumi 的匹配信息:
python -m my_anime_manager "葬送のフリーレン S01E12"输出示例:
🎯 查询: 葬送のフリーレン S01E12
───────────────────────────────────────────────────────
📡 === TMDB 阶段 ===
🔍 TMDB 搜索: "葬送のフリーレン"
✅ 找到: 葬送的芙莉莲 (Sousou no Frieren) [id: 123456]
...
📚 === Bangumi 阶段 ===
🔍 Bangumi 搜索: "葬送のフリーレン"
→ 5 个结果
...
📺 查询结果
═══════════════════════════════════════════════════════
输入: 葬送のフリーレン S01E12
TMDB 节目: 葬送的芙莉莲
TMDB 剧集: S01E12 - "真正的勇者"
BGM 条目: 葬送のフリーレン
BGM EP URL: https://bgm.tv/ep/123456
═══════════════════════════════════════════════════════
在查询基础上,额外生成 NFO 元数据文件并下载图片:
python -m my_anime_manager "葬送のフリーレン S01E12" --nfo生成的文件结构:
葬送のフリーレン/
├── tvshow.nfo # 节目级元数据(来自 TMDB)
├── backdrop.jpg # 背景图
├── folder.jpg # 海报(Jellyfin 文件夹图)
├── landscape.jpg # 横幅图
├── logo.png # Logo
└── Season 1/
├── season.nfo # 季级元数据(来自 Bangumi)
├── season01-poster.jpg # 季海报
├── 葬送のフリーレン 01.nfo # 第1集 NFO
├── 葬送のフリーレン 01-thumb.jpg # 第1集缩略图
├── 葬送のフリーレン 02.nfo
├── ...
└── 葬送のフリーレン 12.nfo
将种子推送到 qBittorrent(暂停状态),自动匹配 TMDB/Bangumi,重命名文件结构,生成 NFO,恢复下载:
python -m my_anime_manager --torrent "/path/to/xxx.torrent"处理流程:
- 登录 qBittorrent
- 添加种子(暂停状态)
- 解析文件列表,过滤 OP/ED/Special
- 从文件名推断节目名,搜索 TMDB
- 搜索 Bangumi 并构建续集条目链
- 预加载 Bangumi 剧集数据 + 下载季海报
- 逐集匹配 TMDB → Bangumi,生成 NFO + 缩略图
- 在 qBittorrent 中重命名/重组文件结构
- 恢复下载
qBittorrent 中重命名后的文件结构:
/downloads/葬送のフリーレン/
├── tvshow.nfo
├── backdrop.jpg
├── folder.jpg
├── Season 1/
│ ├── season.nfo
│ ├── season01-poster.jpg
│ ├── 葬送のフリーレン 01.mkv
│ ├── 葬送のフリーレン 01.nfo
│ ├── 葬送のフリーレン 01-thumb.jpg
│ ├── ...
│ └── Extra/
│ ├── NCOP1.mkv
│ └── NCED1.mkv
└── Season 2/
└── ...
持续监控目录,自动处理新出现的 .torrent 文件,处理成功后删除:
# 使用默认目录($TORRENT_WATCH_DIR)
python -m my_anime_manager --scan
# 指定目录
python -m my_anime_manager --scan /path/to/torrents# 构建镜像
docker build -t my-anime-manager .
# 或使用 docker-compose
docker-compose up -ddocker-compose.yml 中配置环境变量和卷挂载后,容器会自动以 --scan 模式运行。
生成的 NFO 文件兼容 Jellyfin、Kodi、Emby 等媒体服务器:
- 剧集 NFO — 包含 TMDB 剧集标题/简介/播出日期/时长、导演/编剧/演员(含配音角色)、制作公司、Bangumi 剧集 ID、TMDB uniqueid
- 节目 NFO — 包含 TMDB 节目标题/简介/类型/评分/状态/制作公司
- 季 NFO — 包含 Bangumi 条目名称/简介/播出日期、Bangumi uniqueid
所有文本字段均经过 XML 转义处理,支持中文和日文字符。
- httpx — 异步 HTTP 客户端,支持代理
- bencodepy — torrent info hash 计算
- Python 标准库 — argparse、asyncio、pathlib、xml
ISC