理想影音库构建之路(一):使用BGmi自动追番、刮削

我一直想构建一个影音库来着,毕竟自从整了NAS之后它就一直闲着,堪称大号路由器。最近经过摸索,终于是确定了一个比较满意的方案,算是为NAS“正名”了。所以也就又开了个新坑,希望更新进度没事。由于折腾的东西比较多,而且不同的模块之间关系也不大,所以我打算用2~3篇文章的篇幅来介绍下。

方案:Jellyfin+BGmi

最终的方案是使用Jellyfin构建媒体库、刮削(就是下载新番的剧集数据),BGmi管理新番。其实光论追番的话是没有必要使用Jellyfin的,直接使用BGmi就很完美了。不过由于我的目的是构建一个媒体库,能管理新番、旧番、演唱会等等媒体资源,所以才使用Jellyfin来观看、管理。

然后我想讨论下Jellyfin这个选择。目前主流的媒体库构建程序其实有三个:Emby、Plex、Jellyfin。那为什么我选择了Jellyfin呢?其实最开始,我就只有Jellyfin这一个选项。因为这三者之中,前两个都是闭源或半闭源、完整版收费的,只有Jellyfin是完全免费且全部开源的。所以出于支持开源与穷的原因,我肯定会选择Jellyfin。而且Jellyfin作为Emby的分支,功能和生态都不逊色于其他两者。

本文中的最终构建效果如下。可以看到番剧信息齐全、界面对我个人来说也很不错。最关键的是更新全部都是自动完成的,基本追平甚至超过了在线网站的追番体验(如果你不追求弹幕的话,不过话说回来,现在还有人追番开弹幕吗?

BGmi配置与追番

安装与配置

正常的安装过程有点麻烦,所以我只提Docker的安装方式,如果有需要可以自行在Github查看手动安装方式。Docker安装方式使用这个镜像:codysk/bgmi-docker-all-in-one。这个镜像整合了BGmi、定时任务、Transmission下载,非常的合理。配置起来也很简单:

docker pull codysk/bgmi-all-in-one
# 数据目录 /bgmi、网页端口 80、Transmission 端口 9091(别忘了这个端口)
docker run -d -v ./data:/bgmi -p 80:80 -p 9091:9091 --name bgmi codysk/bgmi-all-in-one

之后就可以通过http://ip:80进入BGmi的Web UI。

追番

简单的追番操作可以只在Web UI进行,在左侧的“Subscribe”中就可以选择需要的番剧追番。第一次点开可能要求输入Token,默认是bgmi_token。如果还是登不进去,可能是还没有获取到新番,可以手动刷新一下。首先还是进入控制台,docker exec -it bgmi bash。然后输入bgmi cal获取一下番剧时间表,能打印出即可,然后就可以在网页上看到番剧了。

当然,BGmi也支持一些复杂的需求。比如订阅后刷新下页面,就可以指定下载特定字幕组的源。还有些情况下,一个组会同时发布多个资源,如1080p/720p、简体/繁体。此时就可以通过指定过滤器来匹配特定的资源。首先使用bgmi fetch [番剧名]来查看具体情况,比如对于这种结果:

比如需要1080p、60FPS、简日,就可以把过滤器的“包含”设置为[1080p@60FPS][简日内嵌]。再次检查可以看到:

这样基本就完成追番了。如果想要立刻开始下载就运行:bgmi update --download

*Transmission配置

BGmi的原理是从BT站点搜索种子进行下载,默认使用的是萌番组(可以用bgmi source切换)。而BT下载就意味着,每一次番剧下载都是从无私的分享者中获益。所以我建议如果可能的话,就在下载完成后进行一段时间的保种,便于后来人的下载。

如果使用Docker方式安装,打开http://ip:9091就可以进入Transmission的Web UI。在设置中有一个Stop seeding at ratio,也就是分享率设置。建议至少设置为1.0,这样在上传量=下载量时程序就会停止做种。如果可以的话,还可以在路由器上设置端口转发以增强连通性,此处就不再赘述。

如果你只需要追番,那看到这里就OK了。之后的内容都是关于媒体库构建的。

硬链接配置

首先还是说明为啥要硬链接,主要原因是:

  1. 保证BGmi本身功能正常
  2. 不影响BT保种。随便修改目录结构、文件名会让Transmission没法识别
  3. 方便自动刮削。关键,如果命名合理就完全不需要手动刮削
  4. 硬链接本身不占用额外存储空间(多少还是会有一点,不过可以忽略)

然后是实现方式,我写了个脚本来自动完成硬链接:https://github.com/kaaass/bgmi_hardlink_helper。对于Docker的情况,可以这么配置:

  1. 先在bgmi配置文件夹下创建脚本目录bgmi/bgmi_hardlink_helper、硬链接目标文件夹bgmi/hardlink
  2. 然后把脚本丢进bgmi/bgmi_hardlink_helper
  3. config.py配置硬链接的目标文件夹,如果是bgmi/hardlink可以跳过这步。注意要填写Docker内的路径

之后起个bash进Docker,运行下看看有没有问题

cd /bgmi/bgmi_hardlink_helper
python3 bgmi_hardlink_helper.py preview

如果没有问题的话,直接python3 bgmi_hardlink_helper.py run看看链接是否完成。如果都没问题,就运行python3 bgmi_hardlink_helper.py install_cron创建定时任务。这样就实现了番剧文件的自动定时硬链接。

说句题外话,这个脚本其实还支持其他的命名格式,而且也可以修正一些刮削可能遇到的问题,感兴趣的话可以参阅README.md文件。

Jellyfin的安装与配置

安装

还是用Docker来安装,使用的是linuxserver/docker-jellyfin镜像(也可以用官方的jellyfin/jellyfin,不过为了方便还是建议第一个)。

docker run -d \
  --name=jellyfin \
  -e PUID=1000 \
  -e PGID=1000 \
  -v [配置文件夹]:/config \
  -v [媒体文件夹]:/media \
  --net host \
  --privileged \
  linuxserver/jellyfin

有几个点需要注意下。首先是PUIDPGID的值需要填写id [用户]指令输出的内容,并且要保证该用户有读写配置文件夹、媒体文件夹的权限,否则会看不到目录内容。使用host模式网络的原因是便于DLNA等服务,也可以根据README逐个配置端口映射。使用privilege是为了便于之后配置硬解,也可以根据README逐个挂载设备。

配置完成后,应该就可以通过http://ip:8096打开Jellyfin的Web UI了。经过设置向导后,就可以看到一个空空的控制台。

配置

这一步很简单,只需要添加通过硬链新建的hardlink文件夹为新的媒体库就行了。所以在控制台-媒体库新建一个媒体库,路径就是hardlink文件夹在Docker里的位置。不过为了和其他刮削器配合,建议勾选这几个:

  1. 语言、国家地区设置正确
  2. 勾选“优先使用内置的剧集信息而不是文件名”
  3. 勾选“启用实时监控”
  4. 在“媒体资料储存方式”勾选“NFO”
  5. 勾选“将媒体图像保存到媒体所在文件夹”

然后就成了,扫描过后应该就会生成新番媒体库。

一些情况的处理

1. 识别不了第二季

硬链脚本默认一切番剧都是第一季。但是考虑到不同数据库的情况不同,有可能出现需要调整的情况,这时候就要在config.py设置特殊的番剧规则了。比如“小林家的龙女仆S”在TMDB中没有单独条目,而是被设置成“小林家的龙女仆”的第2季。因此如果要使用TMDB的数据刮削就需要重命名番剧,并且加上季号。可以在config.py这样设置:

MAP_RULE = {
    # 键值为 BGmi 显示的番名
    '小林家的龙女仆S': {
        # name 表示映射后的番名
        'name': '小林家的龙女仆',
        # season 表示对应的季名,参照刮削数据库填写
        'season': 2,
    },
}

2. 番剧识别错误

极少数情况下番剧可能会被错误刮削,比如“小林家的龙女仆”怎么又是你会被识别成“小林家的龙女仆 迷你龙”。此时点右下角-识别,手动搜索一下就行。

3. 可以用EMBY、PLEX吗?

没试过,我猜可以。KODI我倒是试过,没啥问题。

4. 支持其他工具刮削吗?

可以,比如TMM就可以。

但是不能用重命名,不然硬链脚本就没办法跟踪文件了。真有这个需要可以参考这里修改脚本配置。

后记

自从搞完之后,我就一集番都没有追过了

分享到

KAAAsS

喜欢二次元的程序员,喜欢发发教程,或者偶尔开坑。(←然而并不打算填)

相关日志

  1. 没有图片

评论

  1. vicat 2021.12.23 2:12下午

    > 自从搞完之后,我就一集番都没有追过了
    艹,过于真实,之前搞了自动追剧自动追电影的 sonnar + raddar + jecket,自从搞好以后再也没看过

  2. youhu 2022.02.06 12:45上午

    大佬我bgmi在docker上部署后打开web界面只有一个Index of的空白页面该怎么解决

    • KAAAsS 2022.02.06 10:48上午

      docker的话我没有遇到这个情况,可以在Github给作者发个issue。

  3. mikusa 2022.05.31 4:15下午

    受教了!一直用的qb的rss订阅来追番,反正原理也差不多,我也试试BGmi

  4. 相簿 2022.07.24 4:28下午

    大佬,硬链接工具用了一段时间很好用!但现在有个问题,就是硬链接一遍后第二次硬链接的话或多链接出一个S01E0-1.mp4文件出来,我查了一下发现硬链接后bgmi数据库里会多出来一个第一集,如下
    {-1: {‘path’: ‘/在地下城寻求邂逅是否搞错了什么IV 新章 迷宫篇/S01E01.mp4’}, 1: {‘path’: ‘/在地下城寻求邂逅是否搞错了什么IV 新章 迷宫篇/1/[Lilith-Raws] Dungeon ni Deai wo Motomeru no wa Machigatteiru Darou ka S04 – 01 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4].mp4’}}
    但也不是每部番剧都会有
    但我查到这就不知道下一步该怎么改了,希望能抽空修复一下!

    • KAAAsS 2022.07.24 4:47下午

      你的硬链目录是否和下载目录重复了?BGMi 的集数识别是每次请求的时候遍历下载目录实现的,所以如果添加在一起是可能会造成冲突。

      • 相簿 2022.07.24 4:53下午

        是的,我以为那个目录是脚本获取bgmi文件保存位置呢,原来位置是直接从bgmi数据库获取文件地址的。。。。那我直接改硬链目录了,感谢!

  5. DDSRem 2022.07.26 5:46下午

    大佬,我在使用硬链目录时发现目标目录只能选择在/bgmi下才能正常连接,如果我选择/cartoon目录,就不能正常链接,会报错
    “`
    共订阅 1 番剧,开始扫描…
    Traceback (most recent call last):
    File "/bgmi/bgmi_hardlink_helper/bgmi_hardlink_helper.py", line 87, in <module>
    run_hardlink(False)
    File "/bgmi/bgmi_hardlink_helper/bgmi_hardlink_helper.py", line 60, in run_hardlink
    os.link(src_path, dst_path)
    OSError: [Errno 18] Cross-device link: ‘/bgmi/bangumi/莉可丽丝/1/[ANi] Lycoris Recoil 莉可麗絲 – 01 [1080P][Baha][WEB-DL][AAC AVC][CHT].mp4’ -> ‘/test/test/莉可丽丝/S01E01.mp4’
    “`
    我想请教一下有没有解决办法

    • KAAAsS 2022.07.26 5:57下午

      这个我在 Github README 中已经提到了 “必须和 BGmi 配置的番剧下载目录位于一个磁盘(对于 Docker 就是同一个数据卷)。”
      由于这是操作系统限制,因此只要挂载点不同就无法互相硬链。所以只能要么修改 BGmi 的下载目录,要么就是不要使用 Docker 了。

      • DDSRem 2022.07.26 6:08下午

        那我可不可以这样修改
        docker挂载目录/data
        设置下载目录为/data/downloads
        设置硬链目录为/data/cartoon

  6. DDSRem 2022.07.26 10:45下午

    大佬,我还有一个问题,就是我的transmission做种完成后我想自动删除任务和本地的文件,毕竟已经把一份硬链接到plex播放的目录了,所以怎么才能实现这种效果

    • KAAAsS 2022.07.26 10:52下午

      我自己很少删资源,所以没有看过自动化的方案,不过这个玩 PT 的应该有类似方案。
      另外,在一季还没完结前删掉某一集的话会让 BGmi 识别不到完整的集数,可能也会有一些问题。

  7. wingsofthesky 2022.11.30 9:12上午

    大佬问个问题。。。我现在是用transmission把新更新的新番下到一个文件夹里,然后在电视上看,自动啥的还没开始研究
    但是jellyfin的文件名只显示几个字符,几集动画混一块的时候我甚至看不出是第几集,有办法让jellyfin的文件名显示全部吗?

    • KAAAsS 2022.11.30 4:46下午

      Jellyfin 显示的是元数据中的名称,不是文件名。我猜测可能是因为 Jellyfin 自动从文件名里推测了一个动画的名称,不过因为我都是刮削了视频的所以不清楚怎么显示文件名,或许把对应媒体库的刮削关掉会有帮助。

      • wingsofthesky 2023.01.22 4:37下午

        我就觉得nastools自动得太彻底,比如说我电影就几部,用不着再单独分中国外语之类的

      • wingsofthesky 2023.01.22 11:03下午

        对了。。其实我是过来问问题的,“配置起来也很简单:”到后边那串命令之间到底发生了什么事。。
        我用的是黑群,docker配置完后完全不知道在哪输这些命令
        另外,这个是集成了transimission了?如果原来就装了咋办

        • KAAAsS 2023.01.23 11:36上午

          群晖的话在控制面板里打开 SSH,然后连接终端输入这些指令就行了。也可以用 Docker GUI 下载 codysk/bgmi-all-in-one,然后映射 /bgmi 目录和 80、9091 两个端口。

          Transmission 是自带的,这个镜像的话应该没有提供单独的 BGMi 版本。

在此评论中不能使用 HTML 标签。