外链 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 来的,根本不是通过对文件信息摘要所得。