Домашний стриминговый сервис с помощью Jellyfin
14 января 2024 г. linux self-hosted

У меня дома стоит Qnap в качестве домашнего медиаплеера. С него я стримлю на телевизор фильмы через DLNA. Всё прекрасно, но эта схема работает только внутри локальной сети, а я хочу лежать в отпуске под пальмой и по десятому кругу пересматривать все сезоны Друзей, которых больше нет на Кинопоиске.
В гугле подсказали чудесный open-source проект Jellyfin. Запуск в докере за две минуты:
#mkdir /opt/jellyfin/config && mkdir /opt/jellyfin/cache
#docker run -d --name=jellyfin --net=host --restart=always -v /opt/jellyfin/config:/config -v /opt/jellyfin/cache:/cache -v /media/root/complete:/media --net=host jellyfin/jellyfin:latest
И вуаля — self-hosted нетфликс ready for accept connections. Но, как обычно бывает с open-source-ом, есть нюанс.
Нюанс
Первоначальная настройка не вызывает никаких проблем. Я просто замаунтил папку с фильмами внутрь контейнера, и на порту 8096 нашел веб-интерфейс jellyfin. Далее->Далее->Готово.
Нюанс заключается в том, что если на клиенте нет кодека, которым упакован проигрываемый файл, то jellyfin начинает его перекодировать на сервере с помощью ffmpeg. Процесс этот очень тяжелый, а если это 4к видео, то 4 ядра моего Celeron J1900 упираются в полку, и видео начинает тормозить. FullHD прожёвывает, но на пределе. А если же кодек на клиенте есть, то jellyfin просто стримит данные без ffmpeg, почти не занимая процессорное время, даже если это 4к.

Запускаю одно и то же FullHD видео на клиенте у которого есть кодек и на клиенте у которого его нет
Далее выясняется, что на разных клиентах разная поддержка кодеков. Вообще я думал, что проблема отсутствия кодеков осталась где-то в 2007. Не так я представлял себе его возвращение.
Вот таблица наличия кодеков у разных клиентов
На iOS я установил Swiftfin, и это отличный клиент. Он умеет большинство кодеков, поэтому даже 4к видео играет без задержек.
Десктоп клиент, который есть под все ОС работает тоже хорошо.
А вот с Android есть проблемы. Я не смог найти нормальный клиент, который умел бы столько же форматов, как Swiftfin. А некоторые видео вообще не открывает (об этом есть информация в таблице). Пользоваться можно, но только если тщательно подходить к выбору кодеков у фильмов.
DLNA
У Jellyfin есть поддержка DLNA для стриминга в локалке. Но здесь тоже всплывает проблема перекодировки. Сервер не знает о кодеках на клиенте и запускает ffmpeg на всех видео. Настройки перекодирования пока отсутствуют. Надеюсь добавят в будущих версиях, а пока для DLNA продолжу использовать Kodi.
Мой сетап
В итоге получилась такая конфигурация:

Очень понравился интерфейс выбора фильмов у Jellyfin. Автоматически скачивает обложки для фильмов, показывает рейтинги IMDB и RottenTomatoes, список актёров с фото. Выбор аудиодорожек и субтитров тоже есть. Словом, почти нетфликс. Иногда, правда, промахивается с определением фильма по имени файла, но это редко происходит, и скорее связано с кривыми именами файлов.
Для оффлайн просмотра на телефоне можно скачивать файлы, но только через браузер. В мобильных приложениях такой функции нет.

Интерфейс десктоп клиента