ykozxy / bangumi-sync

A script that automatically syncs all anime collections from bgm.tv to Anilist. | 一个自动同步所有 bgm.tv 动画收视记录到 Anilist 的脚本。
MIT License
49 stars 6 forks source link
anilist anime bangumi docker-container nodejs

Bangumi-Sync

中文 | English

一个自动同步所有 Bangumi 动画收视记录到 Anilist 的脚本.

安装

本项目依赖于 Node.js 环境。 在终端中运行以下命令下载项目并安装依赖:

git clone https://github.com/ykozxy/bangumi-sync
cd bangumi-sync
npm i

运行

image-20220522130730661

首次运行时会先从提供的数据源下载动画数据库,由于数据库文件较大,可能需要一段时间。然后,脚本会自动在浏览器中打开 Bangumi 和 Anilist 的授权界面,按提示操作即可。

单次同步模式

单次执行模式中脚本仅会执行单次同步并结束。配置文件内中的 manual_confirm 项可用于设置是否在同步更新前手动确认。在终端中执行以下命令来以单次执行模式运行脚本:

npm start

Docker 模式

使用如下命令来构建容器并运行:

docker build -t bangumi-sync .
docker run -d \
    --name="bangumi-sync" \
    -v $(pwd):/app \
    --restart=unless-stopped bangumi-sync

使用 Docker 运行时,manual_confirm 变量会被自动忽略,脚本会以配置文件中的 server_mode_interval 项设置的时间间隔(秒)为周期同步,所有的输出会写入以脚本启动时间命名的 log 文件。

在第一次运行前,需要先执行以下命令来获取两个平台的 token:

npm run token

在 Docker 运行时发生 token 过期或缺失的问题时,也可使用如上命令来刷新 token。

配置

配置文件为 config/config.json,其中可配置内容为:

变量 描述 可选参数
sync_comments 是否同步评论 true / false
manual_confirm 是否在上传更新前手动确认,server 模式中自动关闭 true / false
server_mode_interval 控制 server 模式中两次同步的时间间隔(秒) number
enable_notifications 是否在 server 模式中开启桌面通知(仅失败时)(不再使用) true / false
cache_path 缓存路径 相对路径
log_path 日志文件路径 相对路径
log_file_level 日志文件最低输出级别 debug / info/ warn / error
log_console_level 控制台最低输出级别 debug / info/ warn / error
global_anime_database_url Global 动画数据库地址,如果原地址访问过慢可尝试更改(但务必保证数据库文件格式一致)。 url
china_anime_database_url China 动画数据库地址,默认使用 jsdelivr 加速。 url

手动条目匹配

因为本项目未能做到 100% 的自动匹配,所以可以通过编辑 config/manual_relations.json 来手动添加条目匹配或编辑 config/ignore_entries.json 来忽略某些条目。

manual_relation.json 中的每一项应为 [bangumi_id, anilist_id] 的形式,代表强制将这两个条目进行匹配。

ignore_entries.json 中的每一项应为对应平台的 ID,遇到与这些 ID 相同的条目时将会忽略它们。

条目匹配原理

由于我能找到的所有国内动画数据库均与外网基于 MAL/anidb 的数据库条目信息有出入,所以简单进行条目名称匹配受到限制。因此,本项目的匹配方式采用了将每一个条目进行名称模糊匹配+信息精确匹配的方式。由于每一次匹配需要进行大量模糊查询,这种方式一定程度上牺牲了效率来换取较高的精度。

经测试,本人 bangumi 收藏中的 250+ 个动画条目仅有 22 个匹配失败。去除欧美动画以及 bangumi 本身信息缺失的条目,仅有 9 个因为数据库信息不匹配而导致失败。总成功率约为 95%。

匹配的具体实现方式在 data_util.ts 中。

已知限制

TODO

数据来源