文章目录
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
emby可以用这样的方法吗?emby的webhook插件好像没法自定义内容
emby没有研究过呢