Лирическое отступление
Уже более года в качестве медиацентра использую KODI. Начиналось всё с каких-то базовых вещей, но даже от такого функционала я был в полном восторге. Просмотр ТВ, фильмов и сериалов теперь не выглядит каким-то квестом, а все мои домашние также полюбили KODI, и я даже не представляю, как раньше могли справляться без него.
Но я все больше погружался в его возможности и постепенно наращивал функционал. Реализовал, казалось бы, простые вещи, но, если сложить все мелкие детали воедино – понимаешь, насколько все комфортно, логично и продумано, а главное - функционально. Именно такую оценку я даю всему конечному результату. Для кого-то это будет вовсе не так, конечно, ведь у всех «свои фломастеры». Но после первых публикаций я получил массу положительных откликов от аудитории и гостей хабра, и понял, что кому-то пригодился мой опыт. Это приятно. Поэтому, хочется продолжать.
Если вы пропустили предыдущие публикации – обязательно загляните в них, возможно и для вас найдется что-то интересное. Если в двух словах – установили и настроили с нуля ОС и KODI, настроили просмотр торрент-контента, YouTube, IPTV. Поговорили об управлении с других устройств, резервном копировании, анализе трафика и даже научили KODI запускать ретро-игры.
Все предыдущие публикации:
KODI: собираем удобный и функциональный медиацентр для дома. Часть 1
KODI: собираем удобный и функциональный медиацентр для дома. Часть 2
KODI: собираем удобный и функциональный медиацентр для дома. Часть 3. Ретро-игры
KODI: собираем удобный и функциональный медиацентр для дома. Часть 4. Архив IPTV
KODI: собираем удобный и функциональный медиацентр для дома. Часть 5. Яндекс.Музыка
Зачем это все затевалось?
Среди медиаустройств, в моем домашнем обиходе – два телевизора. Основной – в гостиной работает с KODI, второй – на кухне под управлением Tizen OS. Мысль о том, что последнего также нужно посадить на KODI возникла спустя пару недель после запуска медиацентра на основном телевизоре. Но руки все никак не доходили…
Каждый раз, переключая ужасного качества каналы кабельного ТВ на кухне, я вспоминал о своей затее. И вот пришло время воплотить ее в жизнь. Для этой задачи в поднебесной был заказан Raspberry Pi 3 и все та же аэромышь, как и для основного телевизора (подробнее о ней в первой части).
Итого, в гостиной – KODI на базе неттопа с Kubuntu 20.04 на борту, на кухне – LibreELEC на базе третьей малинки.
«Кухонный» медиацентр должен выполнять всего две задачи:
просмотр IPTV. Буду использовать все тот же сервис ilook и дополнение PVR IPTV Simple Client. К слову, сервис позволяет использовать плейлист на двух устройствах без дополнительной платы за тариф.
просмотр торрент-видео. Потому как локальной библиотеки фильмов и сериалов у меня нет.
О том, как установить LibreELEC на малинку описывать, думаю, не стоит. А как подключить IPTV и Elementum для просмотра торрентов я рассказывал в другой публикации.
Общее понимание архитектуры есть, причем же здесь MariaDB в заголовке? Представьте, вы смотрите фильм в гостиной, идете обедать на кухню и продолжаете просмотр ровно с того места, на котором остановились. Здорово, не правда ли?
KODI позволяет реализовать синхронизацию медиатеки на разных устройствах. Для этого потребуется MySQL-сервер, на котором и будет храниться эта медиатека. Сервер может быть поднят на совершенно сторонней машине, хоть под управлением Windows. В моем случае, основной медиацентр работает 24/7, аппаратные ресурсы позволяют – сервером назначаем его, на нем и будем поднимать базу данных.
Надеюсь, суть и прелести такой архитектуры домашних медиацентров понятна.
Подготовка серверной части. MariaDB
Прочитав Wiki на официальном сайте KODI, решил, что все довольно просто и понятно – бери и делай. Но на практике оказалось все иначе – БД не наполняется моей медиатекой, в логах ошибки не поддаются пониманию или записей нет вообще, от того понять, что сделано не так – достаточно трудно. Второе устройство подключать к БД смысла нет – синхронизировать нечего.
В комментариях к предыдущей публикации был затронут этот вопрос и @vyacheslavteplyakov дал понять, что Wiki не обновляется и информация, вероятно, устарела. Но и указал на основные подводные камни и как их обойти.
Особенности:
Использовать MariaDB;
Медиатека должна быть размещена в сетевом каталоге;
Все пути к медиатеке на всех устройствах должны быть абсолютные;
Сетевые каталоги – NFS или SMB, если вынуждены использовать NTFS, то только с авторизацией по учетной записи с паролем;
Версии KODI на всех устройствах должны быть одинаковы.
С задачей и подводными камнями разобрались – приступаем к работе. Напомню, сервером у нас будет KODI на неттопе с Kubuntu 20.04.
Устанавливаем сервер MariaDB
sudo apt update
sudo apt install mariadb-server
Cледующим шагом является запуск встроенного скрипта безопасности. Этот скрипт меняет ряд наименее защищенных опций, используемых по умолчанию, для таких функций, как, например, удаленный вход для пользователя root и тестовые пользователи.
Запускаем скрипт безопасности
sudo mysql_secure_installation
Откроется серия диалогов, где можно внести некоторые изменения в параметры безопасности установки MariaDB. Параметры установите, исходя из собственной безопасности. Учитывая, что моя БД будет наполняться лишь медиатекой и находится она в изолированной домашней сети – сделал так:
root@kodi-pc:/# sudo mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
Оставляем пользователя root без пароля. Ничего не вводим, нажимаем ENTER.
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Set root password? [Y/n]
Отклоняем (N).
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n]
Удаляем анонимных пользователей (Y).
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n]
Оставим возможность удаленного подключения для пользователя root. Отклоняем (N).
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n]
Удаляем тестовую БД, она нам ни к чему (Y).
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n]
Обновляем таблицу привилегий. Соглашаемся (Y).
Теперь создадим пользователя, из-под которого будут работать с БД наши медиацентры. Для создания пользователя kodi с паролем kodi запускаем оболочку MariaDB и выполняем команду
sudo mariadb
GRANT ALL ON *.* TO 'kodi'@'localhost' IDENTIFIED BY 'kodi' WITH GRANT OPTION;
Разрешаем доступ с любого хоста ко всем базам данных на сервере для пользователя kodi
GRANT ALL PRIVILEGES ON *.* TO kodi@'%' IDENTIFIED BY 'kodi';
Очищаем привилегии, чтобы они были сохранены и доступны в текущем сеансе
FLUSH PRIVILEGES;
Оболочку MariaDB можно закрывать, выполнив команду
exit
Для организации доступа вне локального хоста, необходимо указать порт 3306 и bind-address 0.0.0.0. Открываем конфигурационный файл MariaDB
sudo mcedit /etc/mysql/mariadb.conf.d/50-server.cnf
Раскомментировать параметр
port = 3306
Для параметра bind-address установить 0.0.0.0 (вместо 127.0.0.1)
bind-address = 0.0.0.0
Для применения изменений перезапускаем MySQL-сервер
sudo service mysql restart
На данном этапе можно проверить, верно ли мы все сделали. Для этого лучше всего подключиться к нашему серверу со сторонней машины. Это гарантирует работоспособность доступа к БД вне локального хоста.
Как вариант, можно использовать MySQL Workbench.
Создаем новое подключение:
Connection Method - Standart (TCP/IP)
Hostname – 192.168.0.50 (заменить на адрес вашего сервера)
Port – 3306
Username – kodi (имя пользователя, если создавали своего)
Нажимаем «Test Connection», вводим пароль и в случае, если все корректно – получаем соответствующее сообщение:
Подключение к серверу также должно быть успешным. Вы должны увидеть «ничего». Это тоже хороший знак. Настройка сервера MariaDB завершена, сейчас мы займемся наполнением базы данных нашей медиатекой.
Подготовка серверной части. KODI
Как и говорил выше, медиатека должна быть размещена в сетевом каталоге, так как она будет одна на все устройства. В моем случае библиотека фильмов и сериалов состоит не из локальных медиафайлов, а наполняется из торрент-трекеров дополнения Elementum.
Библиотеку мы настраивали еще в первой части. Никуда ее не переносим, пути оставляем прежние:
/mnt/kodi/library/Movies – библиотека фильмов
/mnt/kodi/library/Shows – библиотека сериалов
Необходимо лишь расшарить каталог /mnt/kodi/library. Конфигурируем samba
sudo mcedit /etc/samba/smb.conf
В конец конфигурационного файла вставляем:
[library]
comment = library
path = /mnt/kodi/library/
browsable = yes
writable = yes
guest ok = yes
read only = no
force user = nobody
force group = nogroup
force create mode = 0777
force directory mode = 0777
И перезапускаем сервис samba
sudo /etc/init.d/smbd restart
Теперь наша библиотека будет доступна всем устройствам в домашней сети.
Важно! В источниках медиатеки также необходимо указать абсолютный путь к директории с файлами библиотеки! Хоть она и находится локально на этом устройстве (сервере).
Переходим в «Настройки/Медиа/Медиатека/Видео» и в существующих источниках Movies и Shows изменяем пути на нужные, выбрав «Добавить сетевой адрес». В качестве логина и пароля используйте данные вашей учетной записи в Kubuntu.
После изменения путей, источники будут отображаться и в KODI, как сетевые.
Теперь дадим понять KODI, что мы хотим работать с базой данных. Для этого в файле advancedsettings.xml (/home/имя_пользователя/.kodi/userdata/) добавить:
<advancedsettings>
<videodatabase>
<type>mysql</type>
<host>192.168.0.50</host>
<port>3306</port>
<user>kodi</user>
<pass>kodi</pass>
</videodatabase>
<videolibrary>
<importwatchedstate>true</importwatchedstate>
<importresumepoint>true</importresumepoint>
</videolibrary>
</advancedsettings>
Если файл advancedsettings.xml отсутствует – создайте его вручную. Параметры изменить в соответствии с вашими настройками, где:
Host – IP-адрес вашего MySQL-сервера;
User – имя пользователя MariaDB;
Pass – пароль пользователя MariaDB.
На стороне сервера всё готово. Можно проверить. Перезапускаем KODI и, в зависимости от объема вашей медиатеки, ждем какое-то время, пока KODI ее обработает.
Информация о моей медиатеке:
Фильмов – 322
Сериалов – 68
Сезонов сериалов - 319
Эпизодов сериалов - 2254
Размер библиотеки - 380 Кб
Общее количество файлов (nfo и strm) – 3826
Медиатека такого размера обрабатывалась порядка 10 минут. По завершении обновления, давайте посмотрим на нашу БД. Снова подключаемся к серверу с помощью MySQL Workbench.
Как видим, KODI самостоятельно создал БД «MyVideos119» и наполнил ее всеми нашими фильмами и сериалами. Например, в таблице «Movie» - фильмы. Значит, мы все сделали правильно.
После завершения импорта медиатеки в БД, можно еще оценить и ее ресурсопотребление. Моя медиатека заняла в ОЗУ чуть более 100 Мб. Это дает понять, что, даже значительный рост количества фильмов и сериалов, не скажется на производительности основного моего медиацентра.
Настройка клиентской части
Настройки других устройств, которые необходимо синхронизировать с сервером, очень просты:
advancedsettings – настраиваем, также как на сервере;
добавляем источники в «Настройки/Медиа/Медиатека/Видео» также, как и на сервере, указывая абсолютные сетевые пути;
если вы, как и я используете дополнение Elementum – в его настройках также изменить пути на абсолютные до сервера (путь к библиотеке и путь к торрент-файлам). Таким образом, где бы вы не начали смотреть (скачивать) фильм, сохранится он на сервере. Да и в моем случае, не рационально было бы для малинки иметь свое файловое хранилище.
Для упрощения настройки своей малинки я просто перенес конфигурационные файлы с основного медиацентра:
/home/kodi/.kodi/userdata/advancedsettings.xml
/home/kodi/.kodi/userdata/sources.xml
/home/kodi/.kodi/userdata/addon_data/plugin.video.elementum/settings.xml
/home/kodi/.kodi/userdata/addon_data/script.elementum.burst/settings.xml
По завершении настройки, перезапускаем KODI и наблюдаем, как пустая библиотека начинает наполняться и полностью соответствует библиотеке на основном медиацентре, вплоть до просмотренных или не просмотренных серий, а также просматриваемые сейчас и даже с временной меткой, на которой был остановлен просмотр.
Дополнительные возможности
Все мои медиацентры работают только с библиотекой видео. Если у вас есть аудиобиблиотека, вы точно также можете синхронизировать и ее на всех устройствах.
Для этого в файле advancedsettings.xml укажите параметры для musicdatabase
<musicdatabase>
<type>mysql</type>
<host>192.168.0.50</host>
<port>3306</port>
<user>kodi</user>
<pass>kodi</pass>
</musicdatabase>
Конфигурационный файл advancedsettings.xml достаточно гибко настраивается, например наша секция videolibrary может принять еще несколько параметров. Я их не использовал, но кому-то это может и пригодится - ссылка.
Заключение
Проделав этот путь, понимаешь, что все было так просто, но в тоже время – не так и очевидно с первого взгляда. Надеюсь, кому-то мой опыт поможет избежать зря потраченных сил и времени.
Если мой медиацентр обзаведется еще какими-то интересными возможностями - обязательно сделаю отчет в следующих публикациях.
Всем хорошего времяпрепровождения с медиацентром KODI!
13werwolf13
имхо samba и mariadb для такой задачи перебор, вот nfs и sqlite было бы самое оно. вопрос только поддерживает ли он sqlite, а nfs точно будет лучше (проверено).
arboozof Автор
Почему перебор?
13werwolf13
Может я не прав, но samba структурного сложнее и накладывает больше оверхэда
Попробуй банально fio тест по самбе и nfsv4 разница обычно очень заметна невооружённым взглядом
Ну а монструозная субд против одно файловой самоесебе базы вообще несравнимы.
arboozof Автор
Насколько знаю, с sqlite kodi работает. Именно в ней ведь kodi и хранит все данные локально. Но для синхронизации она не поддерживается.
13werwolf13
жаль
но в целом если больше одной точки использования то я бы заменил kodi на emby или plex
UPD: а что если (да знаю что костылизм, но интересный эксперимент) не настраивать синхронизацию а сделать им общий локальный sqlite db файл? например на шаре или синхронизируемый?
arboozof Автор
Была такая же мысль по подобному костылю, но не нашёл, где можно изменить путь хранения db. Вероятно, это глубоко в коде, а не конф. файлах.
13werwolf13
ну для эксперимента можно сделать симлинк базы оттуда где её хранишь туда где её ищет сам коди или примонтировать шару туда, ну или в конце концов сделать синхронизацию файла каким нибудь rsync или скриптом сливать содержимое файлов между тачками
господи какие же костыли я придумываю непонятно зачем))
arboozof Автор
Да, это уже точно перебор))
arboozof Автор
Погуглил тесты. В ближайшем будущем, думаю, стоит отойти от самбы.
NAS Performance: NFS vs. SMB vs. SSHFS
13werwolf13
В моих тестах самба показывала себя прилично хуже (увы результатов не сохранилось). Либо я что-то не так делал либо железо имеет большое значение либо за эти пару лет самба подтянулась…
arboozof Автор
Возможно я не прав. Пролистал все возможные параметры advancedsettings.xml на оф. сайте.
И обнаружил:
2) Configure a database for an sqlite database.
Note: The videodatabase, musicdatabase, tvdatabase, epgdatabase, and adspdatabase tags are interchangeable here.
Вероятно, kodi все же работает с SQLite. Но мне уже как-то не хочется переизобретать…