# Jellyfin 真的好用吗? 我的结论是:实则不然。但 DIY 这一块本就是矮个子拔高个,也没那么多平替可以挑。 > [!important] > - 本文字里行间夹带着作者的私货,行文并不严谨,谨慎阅读。 > - 本文有关的折腾流程时间跨度较长,经验之谈不说没有,也只能说碎得跟渣一样。~~所以不是笔记而是大作文。~~ ## 硬件加速,硬件呢 我是 Linux Docker 部署的。由于因特耳的核显驱动闭源,**官版 Docker 容器搞起来后还需要`exec -it`进去装 Intel 驱动**。即便是`nyanmisaka`版开箱即用 Jellyfin 镜像,也需要**手动映射渲染节点**(他们就没设置过`render`用户组,若要**映射整个`/dev/dri`后续就需要进去`groupadd`**)。 ::: details docker-compose.yml See [AgxCOy@liteyuki/agserver.svc](https://git.liteyuki.org/AgxCOy/agserver.svc). ```yaml 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 影音库搭建及踩坑》](https://sspai.com/post/90896)所说,“为什么不直接读取音乐标签进行专辑聚合”呢? ### 音乐:混乱的元数据 然而事实上,即使真的能做到自动专辑聚合,元数据本身的刻录和查询也是一片混乱。上面援引的博文推荐 MusicTag 这个工具,但同是从网易云那刮削,下载下来本是《紫罗兰永恒花园 OST》的曲目能给它识别成《凹凸世界五周年》,也是给我看笑了。更别说国外的 MusicBrainZ 数据库有相当一部分冷门曲目并没有收录(尽管 Spotify 等平台能够找到),手动录入更是个吃力不讨好的体力活。 ![误刮削](./musictag-misfetch.webp) ::: 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 全局块里,目前也不清楚会不会对其他监听造成影响,我就先没整这个了。