外链 Jellyfin 视频播放页地址

我自己的检索服务

本人珍藏的视频比较多,有 TB 级别,所以之前我通过人工给视频文件打 tag 的方式,自创了一套文件检索系统。比如:

1
snis243_吉川爱美_单体_好身材_漂亮.mp4

这样一个文件名,约定以下划线分隔 tag,且第一个 tag 总是视频标题。

生成检索数据库后,我用 Sanic + React 实现了 B/S 结构的检索服务。

首页展示所有的 tag:

检索结果页列出所有的匹配视频:

因为是在本地播放,Windows 上有比较万能的播放器,所以当时就没做转码服务,直接用默认浏览器播放选中视频即可。

这套系统很符合我个人阅片习惯,可以依着自己当时的心情按 tag 选片。

把 Jellyfin 和检索服务结合起来

6.18 入手了群晖 NAS,支持 Docker。赶紧把电脑上珍藏了好久的视频资源拷贝到了 NAS 上一份,也学别人在 Docker 上用 Jellyfin 搭建了个视频播放服务。

但是 Jellyfin 不识别我的 tag 约定,我的检索系统又没有转码播放服务,两边都用得不顺手。就想到把两边的功能结合一下,用检索系统选片后,跳转到 Jellyfin 的视频详细页面,利用 Jellyfin 播放视频。

Jellyfin 视频页面的地址格式如下:

1
http://192.168.3.34:8096/web/index.html#!/details?serverId=xxxxxx&id=xxxxxxxx

serverId id 都是一个 32 字符的字符串,serverId 值可以视为一个常量,硬编码到代码里即可。难的是 id 参数值的规则。

最终通过翻阅 Jellyfin 源码,发现所有媒体信息都存储在 library.db 的 sqlite 数据库中,在一个叫 TypedbaseItems 的表里,存储了视频文件路径到 PresentationUniqueKey 的映射关系,这个 PresentationUniqueKey 就是 id

直接把我生成检索数据库的 generator.py 改掉,无需再遍历文件系统,通过读取 library.db 就满足需求了。

至此,当我在自己的检索服务中选中某项后,就可以跳转到视频对应的 Jellyfin 页面了。

小小后记

最开始盲猜 serverId id 都是 md5 或其它摘要算法的产出,在 Jellyfin 源码里一顿全局搜索,浪费了一些时间。后来才想到可以直接查阅它的数据库,”暴破”文件到 id 的映射。事后才发现,id 是 Guid 来的,根本不是通过对文件信息摘要所得。

评论