Jellyfin通过Mirai QQ机器人推送新增影片信息

0 系统环境和工具链

  • RSS:用于收取订阅信息
  • qBittorrent:BT下载工具
  • DSM:群晖NAS系统
  • Jellyfin:媒体库管理平台
  • Mirai:QQ聊天机器人框架

1 inotify服务配置

inotify是Linux系统内置的文件变化通知服务,Jellyfin也是调用该服务的API实现媒体库的自动刷新。群晖DSM系统默认允许用户通过inotify服务最大监控128个文件,这导致媒体库中的文件达到一定数量后,Jellyfin就无法再自动扫描刷新媒体库[1],只能通过定时任务来刷新。

为解决这一问题,在DSM的“任务面板→任务计划”“新增→触发任务→用户定义的脚本”以root账号执行,事件为开机,在运行命令中输入以下两行:

sysctl fs.inotify.max_user_watches=1048576
sysctl fs.inotify.max_user_instances=4096

保存并启用该任务,即可在每次NAS开机后临时增加Linux系统中inotify的最大用户监视数(max_user_watches)和最大用户实例数(max_user_instances)。

手动运行一次该任务,让变更立即生效。

2 Mirai机器人配置

Mirai机器人需要安装并启用mirai-api-http插件,在config/net.mamoe.mirai-api-http/setting.yml文件中配置http接口

# 启用的接口适配器
adapters:
  - http

# 调试模式:开
debug: true

# 启用验证:关,由于Jellyfin的Webhook插件并不支持该功能,所以关闭
enableVerify: false

# 验证秘钥,不用理会
verifyKey: 1234567890

# 单机器人模式:开,适用于Mirai只配置了一个聊天机器人Bot,此项开启后无需在消息中配置session
singleMode: true

cacheSize: 4096

persistenceFactory: 'built-in'

adapterSettings:
  ## HTTP 服务的主机, 端口和跨域设置
  http:
    # 主机名,默认为localhost,这里配置为mirai
    host: mirai

    # HTTP服务监听端口,可自定义这里选用8080
    port: 8080

    # 配置跨域, 默认允许来自所有域名
    cors: [*]

保存配置文件后重启Mirai机器人以应用更改

友情提醒:如果Mirai是通过Docker部署,或与Jellyfin服务器不在同一网络下,则需要对上面配置的HTTP服务监听端口做映射,使Jellyfin能够访问该端口。

参考mirai-api-http插件的接口文档[2],在命令行中尝试使用POST指令测试连通性:

curl -X POST -H Content-Type:application/json -d '
{
  target:123456789,
  messageChain:[
    { "type":"Plain", "text":"hello\n" },
    { "type":"Plain", "text":"world" },
    { "type":"Image", "url":"https://i0.hdslb.com/bfs/album/67fc4e6b417d9c68ef98ba71d5e79505bbad97a1.png" }
  ]
}
' 192.168.31.141:8080/sendFriendMessage

POST成功后,一般会返回以下字段,并且QQ机器人会向目标QQ好友发送消息

{code:0,msg:success,messageId:×××××}

3 Jellyfin配置

3.1 媒体库配置

创建或者修改当前已有的媒体库,要实现自动刷新,Jellyfin媒体库需要勾选“启用实时监控”

3.2 安装Webhook插件

进入Jellyfin控制台,在“插件→目录”中找到Webhook插件,安装后重启Jellyfin服务器。

注:因为一些网络问题,访问插件目录可能很慢,需要自行配置镜像站或者代理。

3.3 配置WebHook插件

1. 重启完成后,在“插件→我的插件”中找到Wenhook,点击进入插件配置

2. 在“Server Url”一栏中填写自己Jellyfin服务器的访问地址(记得带端口),然后点击第二项“Add generic Destination”,添加一个通用推送任务。

3. 接下来一一介绍需要填写/勾选的关键项

Webhook Name:推送任务的名称,可自定义。这里我填写了Mirai。

Webhook Url:POST推送地址,即Mirai的HTTP监听地址+消息指令。我选择的是好友私聊消息所对应的消息指令

Notification Type:触发推送的事件类型。Webhook插件提供了多种触发事件可供选择,这里我只勾选了“Item Added”,即新增项。

Item Type:新增哪些项目时触发提醒。我这里只勾选了Episodes,即单集。

4. 完成上述项目配置后,在“Template”框中填写需要发送的消息主体,我是这样填写的:

{
    "target":123456789,
    "messageChain":[
    { "type":"Plain", "text":"老板,您订阅的《{{{SeriesName}}}》更新辣\n" },
    { "type":"Image", "url":"{{ServerUrl}}/Items/{{ItemId}}/Images/Primary" },
    { "type":"Plain", "text":"S{{SeasonNumber00}}E{{EpisodeNumber00}} - {{{Name}}}\n" },
    { "type":"Plain", "text":"时长:{{RunTime}}" }
  ]
}

5. 花括号项目为Handlebars模板语言的参数,Webhook会把对应项传入参数然后POST出去:

参数解释
{{ServerUrl}}Jellyfin服务器地址
{{{SeriesName}}}新增项对应的剧集名称
{{ItemId}}新增项对应的单集ID
{{SeasonNumber00}}新增项对应的季号
{{EpisodeNumber00}}新增项对应的集数
{{{Name}}}新增项对应的单集标题
{{RunTime}}新增项的影片时长

更多参数说明可以参考插件的官方文档[3]

6. 点击“Add Request Header”添加请求头,mirai-api-http插件要求请求类型为“application/json”,因此填写如下:

Key:Content-Type

Value:application/json

7. 点击“Save”保存插件设置

8. 在Jellyfin控制台中找到“计划任务→Webhook Item Added Notifier”,可以修改Webhook插件检测新增项的周期(默认为30秒检测一次),即30秒检测一次媒体库是否有新增项,有则通过POST指令上报至目标URL。

4 最终效果

参考资料

[1] EMBY启用实时监控不生效的解决办法 https://zhuanlan.zhihu.com/p/670876624

[2] Mirai Http Adapter https://docs.mirai.mamoe.net/mirai-api-http/adapter/HttpAdapter.html

[3] Jellyfin Webhook Plugin https://github.com/jellyfin/jellyfin-plugin-webhook?tab=readme-ov-file

2人评论了“Jellyfin通过Mirai QQ机器人推送新增影片信息”

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注