Jellyfin on Docker of MacOS

Jellyfin是一个非常好用的Home Media Center,电影电视剧等资源下载好放到Server里就可以自动刮削资源,显示封面图、演职员信息,下载相对应的字幕等,可以起到一个归档分类资源的作用,界面也非常的炫酷。

最初计划是使用原生的MacOS APP,可是还是因为几点原因弃用了。一是装好后有一次把我的资源都莫名其妙的删掉了,这个简直不能忍,不过这个可能是操作失误什么的,不过总归还是观感很不好;二是原生app多了的话管理起来有点费劲,每次重启后还得一个个的启动,配置也不是很方便;再加上后来Mac上的服务我都尽量容器化了,所以最终版本还是采用了Docker部署。

不过Docker部署也有问题,尤其是在MacOS上。如果要使用DLNA来在电视上用Jellyfin,Docker网络模式需要使用host,bridge模式即使把1900 tcp/udp 都映射到宿主机,也不能顺利识别出dlna设备,总归是有些问题。但坑爹的就在于MacOS上的Docker Desktop不支持host网络,所以我的部署就暂时告别了DLNA,不过好在我一般是用pad来看这些资源,也算可以接受。以后也可以试试在电视上装个Kodi一类的客户端来看。

启动脚本:

docker run -d \
 --volume /Volumes/mass-data/jellyfin-docker/config:/config \
 --volume /Volumes/mass-data/jellyfin-docker/cache:/cache \
 --volume /Volumes/mass-data/movie:/movie \
 --volume /Volumes/mass-data/tv-series:/tv-series \
 --volume /Volumes/mass-data/r18:/r18 \
 --user 1000:1000 \
 -p 8096:8096 \
 -p 1900:1900 \
 -p 1900:1900/udp \
 --restart=unless-stopped \
 --name=jellyfin \
 jellyfin/jellyfin

Config里的配置默认就可以,基本不用修改什么。资源目录有几个挂载几个,最好是按资源类别分好类,在Jellyfin系统里就可以按照资源类别建不同的Library。

User倒是最好多建一个,平时看什么也没必要一直用Admin账号,而且也可以限制子账号的资源权限,r18什么的就不开放了,家里来客人也可以用子账号打开来看电影,2333。

启动ok后,把资源放到挂载好的目录里,等一段时间,就可以发现目录里多了不少文件,就是Jellyfin刮削来的资源信息和字幕文件等。可以在设置里设置好默认的字幕语言,Jellyfin就会优先下载这个语言的字幕,要是找不到貌似就会下载英文字幕。下载字幕需要安装好【Open Subtitles】插件。

另外,字幕也可以自己下载好,和视频文件放在同一个目录下,两者的文件名必须完全匹配。字幕文件可以加上语言后缀,也可以加上default标志。示例文件结构:

/Movies
    /Film (1946)
        Film.mkv
        Film.vtt
        Film.de.vtt
        Film.german.vtt
        Film.chinese.default.srt

不同媒体的目录结构:

电影文件应该放在Library的根目录下,或者放在电影名命名的子目录下。在电影文件名后加上(年份)可以得到更精确的刮削结果。示例:

Movies
├── Film (1990).mp4
├── Film (1994).mp4
├── Film (2008)
│   └── Film - 1080P.mkv
│   └── Film - 720P.mkv
└── Film (2010)
    ├── Film-cd1.avi
    └── Film-cd2.avi

电视剧以剧名为目录名,每一季为一个子目录,或者在每集的文件名中标注出季数和集数后直接放在剧名目录下:

Shows
├── Series (2010)
│   ├── Season 01
│   │   ├── Episode S01E01.mkv
│   │   └── Episode S01E02.mkv
│   └── Season 02
│       ├── Episode S02E01.mkv
│       └── Episode S02E02.mkv
└── Series (2018)
    ├── Episode S01E01.mkv
    ├── Episode S01E02.mkv
    ├── Episode S02E01.mkv
    └── Episode S02E02.mkv

音乐文件就按照Artist -- Album -- Songs的目录结构安排就好:

/Music
    /Artist
        /Album
            01 - Song.mp3
            02 - Song.mp3

最后在Local Nginx上做一个反向代理,就可以了:

server {
    listen 80;
    listen [::]:80;

    server_name jellyfin.gzj1000xp.top;
    set $jellyfin 127.0.0.1;

    # Security / XSS Mitigation Headers
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    location / {
        # Proxy main Jellyfin traffic
        proxy_pass http://$jellyfin: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;
        proxy_buffering off;
    }

    # location block for /web - This is purely for aesthetics so /web/#!/ works instead of having to go to /web/index.html/#!/
    location ~ ^/web/$ {
        # Proxy main Jellyfin traffic
        proxy_pass http://$jellyfin:8096/web/index.html/;
        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;
    }

    location /socket {
        # Proxy Jellyfin Websockets traffic
        proxy_pass http://$jellyfin:8096;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        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;
    }
}

Jellyfin只在Local做了代理,毕竟是个视频资源,开放在Remote上带宽压力大不说,流量钱也扛不住,需求也不高,就不放了。

自动识别并刮削的EVA-Q。封面图不是很完美,貌似是自己截的图。
电影库的截图。可以看到除了EVA这部,其他的识别都还是很完美的。

发表评论

您的电子邮箱地址不会被公开。