把 QQ 音乐歌单转换为 Bilibili 收藏夹视频(优先匹配 MV / 官方版本 / 歌曲视频)。
- 拉取 QQ 音乐歌单(自动分页,读取全量歌曲)
- 在 B 站搜索候选视频
- 按规则打分:时长、歌名命中、歌手命中、MV/官方关键词、降权词(live/cover)
- 自动创建目标收藏夹(不存在时)
- 自动添加命中视频到收藏夹
- 输出
sync_report.json供人工复核 - 支持两种同步逻辑:
incremental增量同步 /copy全量复制 - 收藏夹优先匹配:先在目标收藏夹命中同曲,命中则跳过,不再全站搜索
推荐方式:使用本地环境文件,避免每次手动 set。
- 复制模板:
Copy-Item .\.env.example .\.env.local- 编辑
.env.local填入你的 Cookie 值(不要提交到 git)。
需要的字段:
QQ_PLAYLIST_ID(可选,设置后可不传--qq-playlist-id)BILI_SESSDATABILI_JCT(csrf)BILI_DEDEUSERIDBILI_BUVID3(可选)
程序默认会自动按顺序读取:.env.local -> .env。
也可以手动指定:--env-file .\my.env。
uv run python .\main.py --qq-playlist-id <QQ_PLAYLIST_ID>常用参数:
--folder-name "我的收藏夹名":覆盖默认收藏夹名(默认用 QQ 歌单名)--sync-mode incremental:同步模式(incremental或copy)--env-file .\my.env:指定环境变量文件--dry-run:只匹配不写入 B 站--concurrency 3:并发数--request-interval 0.35:请求最小间隔秒数(越大越慢,风控更少)--retry-times 3:遇到 412/429/5xx 等时自动重试次数--retry-base-delay 1.0:重试退避基础秒数(会指数增长)--duration-tolerance 25:时长容差(秒)--score-threshold 52:最低得分阈值--max-songs 20:只处理前 N 首(调试建议)--retry-from .\sync_report.json:指定补跑来源报告--retry-mode both:补跑类型,可选error/skipped/both--report sync_report.json:报告输出路径
命名规则:
- 默认收藏夹名 = QQ 歌单名
- 若已存在同名收藏夹:直接复用该收藏夹
- 仅在“需要新建但原名冲突”时,自动尝试
原名(歌单)
示例(先试跑):
uv run python .\main.py --qq-playlist-id <QQ_PLAYLIST_ID> --dry-run --score-threshold 56长期增量同步(推荐定时执行):
uv run python .\main.py --qq-playlist-id <QQ_PLAYLIST_ID> --sync-mode incremental --concurrency 1 --request-interval 1.2 --report incremental_report.json说明:incremental 不依赖本地状态文件,每次都会扫描 QQ 歌单和 B 站收藏夹。每首歌先在收藏夹内做同曲匹配,命中即跳过;未命中才会全站搜索并尝试添加。
全量复制(会遍历整张 QQ 歌单):
uv run python .\main.py --qq-playlist-id <QQ_PLAYLIST_ID> --sync-mode copy --report copy_report.json只补 error(慢速 + 重试):
uv run python .\main.py --qq-playlist-id <QQ_PLAYLIST_ID> --retry-from .\sync_report.json --retry-mode error --concurrency 1 --request-interval 1.2 --retry-times 5 --retry-base-delay 1.5 --report retry_error_report.json同时补 error + skipped(默认 both):
uv run python .\main.py --qq-playlist-id <QQ_PLAYLIST_ID> --retry-from .\sync_report.json --retry-mode both --concurrency 1 --request-interval 1.2 --retry-times 5 --retry-base-delay 1.5 --report retry_both_report.json优先搜索词:
歌手 + 歌名 + MV歌手 + 歌名 + 官方歌手 + 歌名
打分核心:
- 时长越接近分越高
- 标题命中歌名、歌手加分
- 标题含
MV/官方/official/vevo加分 - 标题含
live/cover/翻唱/dj降权 - 播放量较高适度加分
- B 站接口策略会变动,若出现 412/风控错误,需要降低频率、切换网络或更新请求头。
- 建议先
--dry-run看报告再执行真实写入。
main.py:CLI 入口与任务编排source/config.py:环境变量与报告过滤工具source/engine.py:同步引擎source/providers/qq_music.py:QQ 音乐数据提供方source/platforms/bilibili.py:B 站搜索/收藏夹/重试与限速逻辑source/models.py:数据模型