Jellyfin on TrueNAS
在服务器分开为 TrueNAS 和 Proxmox 两个实体之后,原本计划的在 Proxmox 上面直接 CPU 软解 Jellyfin。但是最近使用中,发现 nyanmisaka 大佬的 Jellyfin Image 版本似乎有些落后了。Jellyfin 进入 10.9 之后,似乎在 Android TV 客户端上面,对老版本的 Jellyfin Server 兼容性有点问题。想要升级,但是 nyanmisaka 大佬的 image 似乎还没有更新。于是想着试试 TrueNAS 上面的 Jellyfin Application。遂有此文。
基础信息
我这里的 Jellyfin 选择的是 Community Train 的 10.9.7 版本。 TrueNAS Scale 版本是 Dragonfish-24.04。截止此时,Helm Chart 的 version 是 1.3.1。
在首次使用 Application 的时候,TrueNAS 会要求提供一个 datapool 给 Application 作为 persistent storage 使用。这里我已经在之前选择了一个由 NVME 组成的 zpool 给 Application 提供存储。当然,对于 Jellyfin 来说,media storage 肯定要跟 application config 分开了。
ACL 部分则根据需要打开。目前先不去调整了。Addition Storage 主要是给 Media storage 和加载额外字体使用。这里需要注意一下 Permission 的问题。要确保 Run As 的 User 或者 Group 可以访问这个目录。
Read Only 自然就是对应 Docker Volume Bind 里面的只读挂载。
说到底,还是 Container 那套玩意。又套了一层 Kubernetes charts 而已。
硬件解码
在安装 Jellyfin 的时候,如果机器的 intel CPU 有核显,应该可以自动检测在 GPU configuration 中找到,如果没有 非零 的选项,很可能说明 BIOS 设置有问题。我这里遇到的情况是,如果 BIOS 里面,打开了核显的 multiple display support,在 GPU configuration 中就没法找到 Intel 的核显。
我这里用的是10代的CPU,比较新的CPU可能会有驱动上面的问题。有时候需要在 TrueNAS 的 advance setting 里面加命令行 arguments 。10代的老CPU目前已经不会有这个问题了。
点开 i915 栏之后,应该只需要选择 Allocate 1 gpu.intel.com/i915 GPU 应该就可以了。网上也看到过有人说需要 Allocate 两个的情况。所以如果一个无法打开 Hardware Acceleration,那就试试两个。
到这里其实就可以部署了。
TrueNAS 非常贴心的可以一键就访问 web portal。
之后在 Console -> Playback -> Transcode 里面调整使用 QuickSync (QSV) 硬件加速即可。另外别忘了:
- 把能选的硬件解码格式都选上。
- 开启 VPP 色调映射 (VPP tone mapping)
- 开启色调映射 (tone mapping)
- 最后别忘了最下面的“保存”
此时硬件加速转码就应该可以用了。播放时选择更低的码率,打开 “播放信息(playback info)” 应该就可以看到转码的效果了。
初步使用下来,新版 Jellyfin 的使用体验得到了大幅改善。系统的响应速度比以前快了很多。
有坑:添加用户
目前在使用的这个 10.9.7 版本有个坑:添加第二个用户(也就是管理员之后的第一个用户)的时候,保存用户时会失败:error: must supply a userId
后来发现是 URL 编码有误:
删除掉URL里面,第一个 '#' 之前的那个 '?' 就可以了。可以算是相当低级的错误了。可是诡异的是,创建第三个用户(管理员之后的第二个用户)时,这个问题又不出现了。所以可能只有第一个用户有这个问题,也可能是第一个 “普通” 用户才会出现的问题。
中文字体
其实现在使用 nyanmisaka 大佬的 Image 而不用官方 image,最大的原因就是字体。字体这个问题属于配置起来可能不那么容易,reproduce 起来也很难面面俱到的那种 bug。nyanmisaka 大佬的 image 目前使用下来,从来没有遇到过字体的问题。无论是浏览器,Android, IPhone,Android TV,都从来都没有问题。如果有小伙伴不着急升级 10.9 的话,还是相当推荐 nyanmisaka 的 image 的。同时 nyanmisaka 大佬的镜像很早之前就已经搞定了硬件加速的问题。对于中文环境来讲,已经是开箱即用的状态了。
DockerHub: https://hub.docker.com/r/nyanmisaka/jellyfin
验证是不是有字体也不一定非要用看个剧集,看看能不能显示一个中文字幕。在media library 里面添加新的 library 时候,选择使用中文的 “显示名称” 。等这个 library 的背景图搞定之后,Jellyfin 在给出 “标题+背景图” 的时候,就会发现有方格子了。
但是现在很多字幕的烧录,似乎也已经支持的不错了(简单使用的一下,似乎手上的电影字幕都是可以正常烧录的)。所以如果 Library name 选择英文的话,大多数情况下也是可以用的。
对于 Library Name 这个问题,实际上用 Fallback Font 大概是无法解决的。因为 Fallback Fonts 似乎只在烧录字幕的时候才会使用。所以这个问题大概:
- 只能在 Build Image 的时候在 Base Image 上面把字体都安装好。
- 或者 Volume Bind Mount 的时候,直接把准备好的字体目录覆盖到 Image 用的 Fonts 目录上,大概也可以解决。
后者是比较好做到的。这个Github Comment算是说的非常清楚了:
我这里的步骤是:
- 从 NotoCJK 下载字体。这里我们并不需要所有的字体,应该是只需要 Sans/OTC/NotoSansCJK-Bold.ttc。个人为了保险,把 NotoSansCJK-Black.ttc 和 NotoSansCJK-Regular.ttc 一并下载了。
- 把这些文件都挂载到 Jellyfin Container 的 /usr/share/fonts/ 文件夹下面即可
- 等同于:
-v <dir>/NotoCJK:/usr/share/fonts/NotoCJK
。
- 等同于:
不过如果是之前就已经 render 出来的图片,则不会自动重新 render。个人就直接删除了之前的 library,然后直接重新创建了 library。这样就强制重新 render 了 library 的封面图片。
迁移用户
迁移用户的重要性比想象中的大。这么些年下来的观影记录还是需要保留一下的,有些动漫看了好几百集,还是需要记录一下观看进度的。
[Emby]
EMBY_APIKEY = xxxxx
EMBY_URLBASE = http://192.168.x.x:8096/
[Jelly]
JELLY_APIKEY = yyyyy
JELLY_URLBASE = http://192.168.y.y:8096
之后运行 python3 APImain.py
就可以了。但是在 10.8 迁移到 10.9 的时候出现了一个问题:
KeyError: 'Name'
Github 上面看到了这个解决方法:
在 Line 335 做相应的更改即可
diff --git a/APImain.py b/APImain.py
index bc63202..9c444b8 100644
--- a/APImain.py
+++ b/APImain.py
@@ -332,7 +332,7 @@ def jelly(newUser_pw):
def search_byName(MigrationMedia,Library):
for jelly_movie in Library['Items'] :
- if jelly_movie['Name'] == MigrationMedia['Name']:
+ if 'Name' in jelly_movie and 'Name' in MigrationMedia and jelly_movie['Name'] == MigrationMedia['Name']:
print("found by name {0}".format(jelly_movie['Name']))
return jelly_movie['Id']
return None
这个迁移会自动按照相同的 Username 来找到已经创建了的用户。如果是没有创建的用户,应该是会自动创建的。