Signed-off-by: SilverAg.L <caclx@outlook.com>
8.0 KiB
Jellyfin 真的好用吗?
我的结论是:实则不然。但 DIY 这一块本就是矮个子拔高个,也没那么多平替可以挑。
Important
- 本文字里行间夹带着作者的私货,行文并不严谨,谨慎阅读。
- 本文有关的折腾流程时间跨度较长,经验之谈不说没有,也只能说碎得跟渣一样。
所以不是笔记而是大作文。
硬件加速,硬件呢
我是 Linux Docker 部署的。由于因特耳的核显驱动闭源,官版 Docker 容器搞起来后还需要exec -it进去装 Intel 驱动。即便是nyanmisaka版开箱即用 Jellyfin 镜像,也需要手动映射渲染节点(他们就没设置过render用户组,若要映射整个/dev/dri后续就需要进去groupadd)。
::: details docker-compose.yml See AgxCOy@liteyuki/agserver.svc.
services:
jellyfin:
image: nyanmisaka/jellyfin:latest
container_name: jellyfin
network_mode: 'host'
volumes:
- /var/lib/jellyfin:/config
- jellyfin-cache:/cache
- /media:/media
# - /dev/dri/renderD128:/dev/dri/renderD128
- type: bind
source: /usr/share/fonts/opentype
target: /usr/local/share/fonts/custom
read_only: true
devices:
- /dev/dri/renderD128:/dev/dri/renderD128
#- /dev/dri/card0:/dev/dri/card0
restart: 'unless-stopped'
# Optional - alternative address used for autodiscovery
# environment:
# - JELLYFIN_PublishedServerUrl=
extra_hosts:
- 'host.docker.internal:host-gateway'
volumes:
jellyfin-cache:
driver: local
:::
媒体库组织
我还是更习惯树形文件系统,媒体库还是太难为我了。那样的话,事情或许也很简单——许多成品 NAS 都有自带视频、相册之类的浏览功能。但很遗憾,自己装的 Ubuntu Server 自然什么都没有。
我针对的还是 Jellyfin “神奇”的资源组织方式。就像这篇《基于 Jellyfin 和音流的 nas 影音库搭建及踩坑》所说,“为什么不直接读取音乐标签进行专辑聚合”呢?
音乐:混乱的元数据
然而事实上,即使真的能做到自动专辑聚合,元数据本身的刻录和查询也是一片混乱。上面援引的博文推荐 MusicTag 这个工具,但同是从网易云那刮削,下载下来本是《紫罗兰永恒花园 OST》的曲目能给它识别成《凹凸世界五周年》,也是给我看笑了。更别说国外的 MusicBrainZ 数据库有相当一部分冷门曲目并没有收录(尽管 Spotify 等平台能够找到),手动录入更是个吃力不讨好的体力活。
::: tip 最简方案 文档这么说:我管你怎么整理,我只知道是同一张专辑就该塞在同一个文件夹。
那么事情也好办,就按专辑名来呗。好比如:music/{album or "[standalone]"}/{artist1,artist2} - {title}。
-
为什么要
or "[standalone]"?- 不单独收纳没有专辑的单曲,结果就会被淹没在大几百首、好几页的“歌曲”页面。
-
要是有专辑重名了(比如两张专都叫
Fragrance)?- 没招,默认合并(甚至可以看到重复的曲号,都是第六首)。只能手工分离(
Fragrance - SoundzImage和Fragrance - Hatsune Miku)。 :::
- 没招,默认合并(甚至可以看到重复的曲号,都是第六首)。只能手工分离(
电子书:组织难绷,查阅也难绷
至于小说漫画,或者说书籍媒体库,那只能说真搭一个私人图书馆也是同样的格式要求。平时在各种论坛搜罗的 TXT、DOC(X) 显然难登“书架”之上。
但 Jellyfin 对书籍库的编排属于是并不上心(也许他们真在用 Calibre?到处都能看到推荐它的),默认是文件夹视图,却又因为元数据裸放要求一本(或者说一章?一话?)一个文件夹。这棵文件夹子树能长多繁茂我都不敢想。
::: tip 最简方案 那当然是通通转换成 PDF,单纯当作文件管理器那样访问文件夹、文件最简单。只是这种方法对于文字读物不太友好。毕竟 PDF 只能缩放整页,内容又不会自适应。 :::
尝试一番之后,的确还是适应它们那一套更为高效。Jellyfin 这边对于文本读物最友好的还是 EPUB(当然阅读体验也就那样,但总比 PDF 好)。至于漫画,通用的扩展名是.cbz、.cbr、.cb7(对应.zip .rar .7z)。其中 Jellyfin 只支持前两种。查了下 vivo 的 BlueLM Copilot,似乎.cbr的支持也算不上好,所以建议还是.cbz。
元数据这一块,Jellyfin 似乎集成在电子书里还是裸放均可(仅考虑上述格式)。我还是觉得集成更好,要不然漫画每一话都开一个文件夹裸放.cbz和ComicInfo.xml,我是觉得有些抽象。
::: info EPUB 索引 现有的 EPUB 编辑器几乎都是放个 HTML 编辑器让用户手改。基于此,的确不如考虑用在线转换器,一键导入 TXT 等通用格式。但这种转换出来的 EPUB 的目录似乎无法跳转(只能逐页翻),暂时还不知道怎么回事。 :::
元数据刮削:一笔糊涂账
前面我也论述过,音乐专辑的元数据库就是几桌草台班子。但比起草台班子,更令我恼火的当属大把大把的、查无此作的“黑户”。怎么来的?音声、同人志、网文。
我的整理方式和 acgdb 类似:3D 区、音声区(作者分发、油管录播、DLsite 正作)、书目区(漫画和文集)、写真区、插画区。
3D 区无论玩恋活还是 MMD,既有图集又有视频,无法按媒体类型区分(即便真要分,它算电视节目?电影?MV?分不明白)。音声区大量的音频资源,摆烂一点直接用电子书库、按文件夹访查也不是不行,但显示出来反倒是专辑名(或者说 DLsite、系列作品名)更显眼,而非每一集的标题;若要用音乐库收纳,就得改造一番目录树适配它那个“一个专辑只有一个目录”的原则,工作量也不小。
偏偏这种不在台面上的“资源”我收纳了不少,哪怕有自动化工具,后续校对也是个体力活,何况很多资源只能一件件手工入库。饶了我吧。
穿透与反向代理
写着写着总会变成报流水账。
在部署好 frp 穿透后,我遇到了子网划分的问题。经由 frp 进来的流量再进 Jellyfin,源 IP 默认就变换为localhost,Jellyfin 默认对本地回环不设限速,在 Dashboard 里全局设置流比特率的做法并不起作用。
在实地测试后,发现 Jellyfin 并不直接支持 Proxy Protocol,那么就只能在前面套多一层 nginx 做反向代理了。
方法很简单,frp 侧仍旧启用 Proxy Protocol,在 nginx 里剥离真实 ip。我是在 Ubuntu Server 上安装的 nginx,据称已集成realip模块。那么编辑/etc/nginx/sites-enabled/default(我是图方便直接原地开刀了):
server {
listen 8097 proxy_protocol;
listen [::]:8097 proxy_protocol;
#root /var/www/html;
set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;
# Add index.php to the list if you are using PHP
#index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
proxy_pass http://127.0.0.1:8096;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Forwarded-Host $http_host;
# for websocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
#try_files $uri $uri/ =404;
}
# ...
}
此外 Jellyfin 文档还提到要给真实 IP“打码”。由于有些配置项是写在 http 全局块里,目前也不清楚会不会对其他监听造成影响,我就先没整这个了。
