Как стать автором
Обновить

KODI: собираем удобный и функциональный медиацентр для дома. Часть 1

Время на прочтение 27 мин
Количество просмотров 374K
Kodi (ранее XBMC)

Бесплатный кроссплатформенный медиаплеер и программное обеспечение для организации HTPC с открытым исходным кодом. Графический интерфейс программы позволяет управлять видеофайлами, фотографиями и музыкой, находящимися на компьютере, оптическом диске, в интернете или в локальной сети. Может управляться с помощью пульта дистанционного управления. Популярная альтернатива «Андроид ТВ». Kodi поддерживает пользовательские плагины и темы оформления.
Поддерживаемые ОС - Linux, macOS, Apple tvOS, iOS, Windows, Android, Raspberry Pi.
Официальная страница проекта - kodi.tv

Содержание:

  1. Лирическое отступление

  2. Мои требования к медиацентру

  3. Аппаратная часть, программная платформа

    1. Неттоп

    2. Пульт дистанционного управления

    3. Bluetooth-адаптер

  4. Операционная система

    1. Подготовка и установка Kubuntu 20.04 LTS

    2. Первичная настройка, удаление лишнего и установка пакетов для работы с системой

    3. Монтирование основного диска для хранения данных

    4. Сетевые каталоги

    5. Установка и настройка VNC-сервера

    6. Настройка профиля HDMI в PulseAudio

    7. Настройка профиля управления питанием и частотой процессора

    8. Автоматическое обновление и профилактическая перезагрузка системы

  5. Установка и базовая настройка KODI

  6. IPTV. Как установить и настроить, какой сервис выбрать

  7. Библиотека KODI. Что это такое и как настроить

  8. Elementum и Burst. Настраиваем просмотр контента торрент-онлайн

Продолжение и дополнительные возможности – в других публикациях

К сожалению, объем одной публикации на Хабре ограничен, потому всё, чем хотел бы поделиться никак не уместить в один пост. Разделил на несколько частей...
Часть 2. YouTube, qBittorrent, управление Yatse и Kore, учет трафика VnStat
Часть 3. Ретро-игры
Часть 4. Архив IPTV
Часть 5. Яндекс.Музыка
Часть 6. MariaDB и синхронизация медиатеки
Часть 7. Управление iOS-устройством
Часть 8. Telegram-бот для qBittorrent
Часть 9. Spotify
Часть 10. IVI и Netflix
Часть 11. Kodi+Plex

1. Лирическое отступление

Еще во времена своего первого телевизора со Smart TV часто ловил себя на мысли, что это все не то, неудобно, не стабильно, не всегда красиво… А еще когда это все сопровождалось долгим откликом встроенной ОС Tizen от Samsung, вылетами, требующие перезагрузок, начались поиски решения.

DLNA на какое-то время удовлетворял все потребности, хотя неудобств в его использовании хватало. Не устраивали лишние телодвижения для просмотра фильма, а особенно необходимость иметь компьютер, на котором хранится библиотека и просмотр только оффлайн контента.

Поиски продолжались и первым программным решением на базе самого телевизора был популярный тогда Fork Player, для установки которого еще нужно было поиграться с прошивкой самого телевизора, а после еще и с настройкой самого плеера. Здесь уже был получен онлайн-просмотр контента и IPTV. Работало все не очень стабильно, а интерфейс и юзабилити оставляли желать лучшего, и постоянно выводил из себя, живущих во мне эстета и перфекциониста.

И вот, практически год назад, было найдено и собрано ровно под свои нужды решение на базе KODI. Год использования и «вылизывания» всех нюансов дали мне понять, насколько великолепно это решение, насколько огромны возможности и насколько я сожалею о том, что не нашел его раньше.

Публикаций, подобных этой, на тему «как я строил свой медиацентр» в сети достаточно. Но все же, целью я ставлю донести в массы, в очередной раз, о том, что «смотреть» телевизор и любимый сериал можно не только в предустановленном на телевизоре приложении Netflix.

Да и просто хочется поделиться всем своим пройденным путем, по порядку, в одном месте. Мне бы такой «гайд», когда я начинал знакомство с KODI, точно бы пригодился, потому как информацию черпал обрывками и в разных источниках… А возможно и старый пользователь KODI почерпнет что-то новое.

2. Мои требования к медиацентру

Прежде, чем я начал погружаться в тему домашних медиацентров, я составил перечень задач, которые хотел бы на него возложить, а также общих требований как аппаратных, так и программных.

Мой перечень задач и требований:

  • Просмотр IPTV. Как бы для некоторых это не было странно в 2021 году, но телевизор в первую очередь должен быть телевизором. С хорошим набором каналов с EPG на борту и в хорошем качестве. Архив передач приветствуется, но не обязателен.

  • Торрент-видео. Обязательна интеграция с популярными русскоязычными трекерами, просмотр «на лету», скачивание во время просмотра.

  • Приятный и понятный интерфейс, юзабилити. Что бы все домочадцы без труда смогли самостоятельно посмотреть очередную серию «Маша и Медведь» или любимого сериала, а кто-то и новости по ТВ. Перегруженный интерфейс не приветствую.

  • Встроенная библиотека. С возможностью загружать информацию о фильме/сериале из внешних источников. Данный функционал должен быть полностью автоматизирован и не требовать моего участия.

  • Торрент-качалка. Обязательно внешнее управление.

  • Аппаратные требования. Платформа x86-64. Работа 24/7/365, бесшумность, управление аэромышью.

  • Требования к ПО. Полноценная ОС, желательно семейства GNU/Linux. Удаленный доступ. Внешнее управление (желательна поддержка android-устройств). Обновление и длительная поддержка.

  • Лицензирование и стоимость. Исключительно Open Source, 0$.

3. Аппаратная часть, программная платформа

Все знакомства проводил на виртуальных машинах или мобильном телефоне с Android на борту. Когда поиски были завершены и выбор пал на KODI, нужно было определиться с платформой. На этапе знакомства были испробованы и готовые сборки, с отчасти урезанной ОС, типа LibreELEC и на базе Windows 8/10. Из-за желания использования медиацентра, как полную замену всей «начинки» телевизора и использования его, лишь как экрана, от Windows пришлось отказаться. Нужна была работа 24/7/365 – включил телевизор – включился экран, а KODI уже готов к работе, он и не выключался. Из-за надежности, стабильности и небольших навыков в работе, остановился на Ubuntu с окружением рабочего стола KDE Plasma – Kubuntu.

К слову, вариант с одноплатным компьютером, например Raspberry Pi, не рассматривал. Учитывая ARM-платформу, невысокую производительность и SD-карту под хранилище, с моими задачами не справился бы.

3.1. Неттоп

Был приобретен мини-ПК на AliExpress, благо выбор различных исполнений и комплектующих огромен. Сразу хочется оговориться - изначально он покупался под другой проект, никак не связанный с видео. Но проект не состоялся и неттопу не нашлось никакого применения. Решил его отдать под медиацентр. Накопители и ОЗУ в комплект не входили - из собственных «запасов». Меньший по объему отдал под ОС, больший – под основное хранилище. Габариты неттопа очень компактные, блок питания внешний. Охлаждение пассивное, корпус выполнен из металла и сам по себе является большим радиатором. Учитывая отсутствие воздушного охлаждения и даже жестких дисков, мой медиацентр не будет издавать ни малейшего шума, как вентилятора охлаждения так и даже щелчков головки HDD. Полная тишина.

Поделиться ссылкой, к сожалению, не могу - магазин исчез с просторов Aliexpress.

Характеристики, внешний вид и внутреннее устройство:

• ЦП - Intel Core i3 5005U, 2 ядра и 4 потока с частотой 2 ГГц
• ГПУ - Intel HD Graphics 5500
• ОЗУ - 8 Гб DDR3L 1866 МГц
• SSD - 480 Гб (SATA III)
• SSD - 64 Гб (mSata)
• LAN – 1 Гбит/с
• HDMI 1.4
• VGA
• 2xUSB 2.0
• 2xUSB 3.0



Забегая немного вперед, с уверенностью могу сказать, что такая конфигурация даже избыточна (для FHD точно). В самые пики, максимальное значение LA, которое мне удалось увидеть – редко превышало 3. Оперативной памяти 8 Гб также с большим запасом – чуть более 3 Гб – это максимум, сколько могла загрузить система. По температурам также все отлично, в простое – 36-40 °С, при нагрузках – 48-52 °С.


Покупка на то время обошлась в 110 долларов с доставкой в г. Минск. Напомню, это без SSD-накопителей и оперативной памяти.

3.2. Пульт дистанционного управления

К сожалению, видеочип моего экземпляр неттопа не поддерживает HDMI-CEC, потому подружить медиацентр с великолепным пультом от самого телевизора Samsung не предоставляется возможным. Но для управления нужна была аэромышь, и она же пульт вкл/выкл телевизора (ИК), дабы не плодить количество устройств и все управление совместить в одном. Там же, в поднебесной, был заказан пульт L8STAR G10S Pro со встроенным гироскопом, голосовым вводом и подсветкой кнопок. Адаптер USB в комплекте, с подключением не возникло никаких проблем.

L8STAR G10S Pro
L8STAR G10S Pro

Единственное, что не будет работать в моем кейсе – голосовой ввод. На Android все работает из коробки, поскольку используется Google-ассистент. В Linux, к большому сожалению, таких решений нет.

Все кнопки управления работали по своему предназначению, конфликтов с Ubuntu и KODI не было. Необходимо было только запрограммировать кнопку вкл/выкл на нужный ключ, чтобы им управлять питанием телевизора Samsung. Для этого удерживая кнопку вкл/выкл на аэромыши поднести пульт от телевизора и также зажать кнопку вкл/выкл. LED-индикатор медленно замигает – это будет означать, что пульт закончил обучение.

Уже потом, в ходе эксплуатации, обратил внимание на слишком большие «шаги» кнопок регулировки громкости. Этот параметр также можно подкорректировать.

Регулировка скорости клавиш управления звуком:

  • От медленной к быстрой:
    Нажмите и удерживайте кнопки "OK" "Volume+"
    Скорость регулируется на быструю, пока горит LED-индикатор

  • От быстрой к медленной:
    Нажмите и удерживайте кнопки " OK " "Volume-"
    Скорость регулируется на медленную, пока горит LED-индикатор

Учитывая, что при запросе "L8STAR G10S Pro" Aliexpress вернет вам множество магазинов с различными названиями модели, но одинаковым внешним видом и разными ценами - ссылка на магазин и пульт, который заказывал себе (к продавцу, доставке и пульту претензий нет):
Беспроводной смарт-пульт L8STAR G10S Pro

L8STAR G20S Pro
L8STAR G20S Pro

За год эксплуатации модели G10S нареканий по работе не было, но совмещенные кнопки - не самое лучшее решение. Наощупь не всегда можно точно попасть в нужную кнопку.
Производитель L8STAR учел пожелания пользователей и выпустил новую модель G20S Pro. Она лишена этого недостатка, все кнопки раздельные, выпуклые и тактильно приятные. Подсветка также присутствует и еще мягче, чем у старой модели. Приятный бонус - две программируемые ИК-кнопки (у G10 одна).

На сегодняшний день использую именно эту модель - очень доволен.
Покупал в мае 2021, с доставкой в Минск цена составила чуть больше 12 долларов.

Покупал как и предыдущую модель в официальном магазине - L8STAR G20S Pro. Доставили быстро, претензий к продавцу нет.

L8STAR G20BTS Pro - аналогичная модель, но с поддержкой bluetooth 5.0. Стоить будет на пару долларов дороже. Поставляется также с донглом, поэтому может работать в двух вариантах - с донглом или же прямым подключением к устройству по bluetooth без донгла. Внешне отличие лишь в подсветке кнопок. В обычной версии - белая, с поддержкой bluetooth 5.0 - неоновая. Также у этой модели возможны проблемы из коробки - фантомные нажатия и неработающая кнопка "ОК" (enter). Проблема решается обновлением прошивки. Выполняется прошивка по воздуху с помощью android-устройства. О том, как прошить и не превратить пульт в кирпич, а также файл прошивки и apk-утилита - на сайте smartzone.ru.

3.3. Bluetooth-адаптер

Если, на борту материнской платы, как и у моего неттопа отсутствует Bluetooth-модуль, а необходимость подключения Bluetooth-устройств есть, то могу порекомендовать недорогой внешний USB-адаптер от производителя Ugreen. Поддерживает стандарт Bluetooth версии 5.0, без проблем работает в Windows и Unix системах, прилично выглядит. В марте 2022 года обошелся в $5.49 с бесплатной доставкой в Беларусь. Ссылка на адаптер в официальном магазине - Ugreen CM390.

Для работы адаптера в Kubuntu 20.04 необходимо будет установить драйвер. Скачиваем во временный каталог и устанавливаем.

cd /tmp
wget https://github.com/arboozov/kodi/raw/master/20201202_linux_bt_driver.tar.gz
tar -xvf ./20201202_linux_bt_driver.tar.gz
cd /tmp/20201202_linux_bt_driver
sudo make install INTERFACE=all

После сборки и установки драйверов, подключаем адаптер – в разделе «Bluetooth» параметров системы он должен успешно определиться, можно запустить обнаружение устройств. Для сопряжения, например, все того же пульта L8STAR G20BTS Pro необходимо включить на нем Bluetooth. Для этого зажать кнопки «OK» и «Return». Пульт начнет быстро мигать светодиодом и практически мгновенно Kubuntu его обнаружит.

Соединяемся с «G20BTS PRO», не забываем в настройках указать «Доверять устройству». Все готово, можно проверять. После перезагрузки системы интерфейс поднимается автоматически, также как и сопряжение с пультом.

Системное уведомление Ubuntu
Системное уведомление Ubuntu

К слову, о том, насколько прекрасно взаимодействует адаптер Ugreen CM390 с пультом G20BTS Pro. Вы будете получать уведомления даже о низком заряде батареек вашего пульта в процентах.

4. Операционная система

Kubuntu

Производный от Ubuntu дистрибутив Linux. Использует графическое окружение KDE.
Официальная страница проекта - kubuntu.org

Так как с операционной системой я определился в предыдущем разделе, перейдем к ее установке и настройке. Версию рекомендую использовать стабильную и с длительной поддержкой. На момент запуска моего медиацентра это 20.04.2 LTS.

4.1. Подготовка и установка Kubuntu 20.04 LTS

Являясь пользователем Windows на домашнем ПК, готовил загрузочный flash-накопитель с помощью Rufus. Скачать последнюю версию, в том числе и портативную, всегда можно с официального сайта rufus.ie. Сам ISO-образ загружаем по ссылке kubuntu.org, я использовал 64-битную версию системы с длительной поддержкой (20.04.2 LTS).

Не думаю, что стоит подробно описывать ход установки ОС. Инструкция со скриншотами доступна в разделе Wiki на сайте Ubuntu. Для Kubuntu актуальной версии отличия будут лишь незначительные и то косметические в интерфейсе.

По завершении установки обязательно выполнить обновление системы

sudo apt-get update && sudo apt full-upgrade

4.2. Первичная настройка, удаление лишнего и установка пакетов для работы с системой

Устанавливаем минимальный набор программ для работы с системой. Я использую файловый менеджер midnight commander со строенным текстовым редактором mcedit, htop – утилита мониторинга, ssh – для удаленного управления, net-tools – утилита для работы с сетевыми интерфейсами, landscape-common - отображает системную информацию в приветствии, при подключении по SSH.

sudo apt-get install mc htop ssh net-tools landscape-common
landscape-common
landscape-common

landscape-common достаточно информативная утилита, отображающая при ssh-подключении системную сводку, включающую в себя температуру ЦП, количество используемой памяти ОЗУ и доступных обновлениях, а также уведомит о заканчивающихся ресурсах дисковой подсистемы.

Изначально, сетевой интерфейс работает по DHCP. Рекомендую сразу же присвоить статический IP-адрес, дабы в какой-то момент времени он не сменился, и вы не потеряли доступ к своему медиацентру.

Определяем все доступные сетевые интерфейсы в системе с помощью net-tools, выполнив команду

ifconfig
kodi@kodi-pc:~$ ifconfig
enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.19  netmask 255.255.255.0  broadcast 192.168
        inet6 fe80::8461:dcf8:d2c6:2d48  prefixlen 64  scopeid 0x20
        ether 40:62:31:0a:11:a5  txqueuelen 1000  (Ethernet)
        RX packets 3417519  bytes 5024924041 (5.0 GB)
        RX errors 0  dropped 2  overruns 0  frame 0
        TX packets 1059086  bytes 169628765 (169.6 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

В моем случае интерфейс enp1s0, ему назначен IP-адрес 192.168.0.19.

Назначим ему статический адрес 192.168.0.50 и будем дальше работать именно с ним, для этого необходимо отредактировать файл конфигурации netplan:

sudo mcedit /etc/netplan/00-installer-config.yaml

Привести к виду:

network:
 ethernets:
  enp0s3:
   addresses:
    - 192.168.0.50/24
   gateway4: 192.168.0.1
   nameservers:
    addresses: [192.168.0.1, 1.1.1.1]
   optional: true
 version: 2
 renderer: networkd

Где:
addresses – IP-адрес, который будет назначен нашему сетевому интерфейсу
gateway4 – IP-адрес нашего роутера
nameservers – DNS сервера. Первый - наш роутер, 1.1.1.1 – общедоступный DNS от Cloudflare

Сохраняем изменения и для надежности перезагружаем систему и проверяем (снова командой ifconfig). IP-адрес должен быть 192.168.0.50.

Для удобства, дальше работу продолжаю с домашнего ПК под управлением Windows 10 с помощью утилиты PuTTY по SSH-протоколу. SSH у нас уже установлен, используем порт 22.

К слову, можно обойтись и встроенными в Windows 10 инструментами. Командная строка (cmd) также отлично с этим справится

ssh имя_пользователя@ip

Но мне по душе старый добрый PuTTY, а еще лучшее – putty-nd. В нем еще удобнее хранятся все сессии, логины и пароли. Рекомендую.

SSH/SFTP-клиент для android-устройств

Среди домашних гаджетов у меня в обиходе есть планшет под управлением Android, который также иногда использую для администрирования. Могу порекомендовать очень удобного, но, к сожалению, платного клиента Termius.

Удаляем ненужные медиацентру приложения

sudo apt remove libreoffice-draw skanlite okular kpat ksudoku kmahjongg kmines kdeconnect konversation krdc ktorrent thunderbird firefox elisa vlc libreoffice-math libreoffice-calc libreoffice-writer usb-creator-kde kwalletmanager

Удаляем неиспользуемые пакеты из кэша, очищаем кэш утилиты apt и ненужные зависимости

sudo apt autoclean && sudo apt clean && sudo apt autoremove

Устанавливаем Google Chrome на замену Firefox. Это мои личные предпочтения, можно оставить и Firefox. Принципиальной разницы для медиацентра нет.

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i --force-depends google-chrome-stable_current_amd64.deb

В качестве торрент-клиента использую qBittorrent. Устанавливаем

sudo apt install qbittorrent

Если не планируете работать с GUI-интерфейсом и вам достаточно лишь веб-интерфейса - можно использовать qBittorrent-nox. Также отличной альтернативой является Transmission или Transmission-daemon.

4.3. Монтирование основного диска для хранения данных

В моем медиацентре используется два SSD-накопителя (64 и 480 Гб). Меньший по объему уже используется и размечен под систему и приложения. Хранить все медиа-данные, торренты буду на накопителе большего объема. Для этого смонтируем его в файловую систему.

В моем случае накопитель sda1 отформатирован и имеет один раздел (ext4). Определяем его UUID

ls -l /dev/disk/by-uuid

Вывод:

lrwxrwxrwx 1 root root 10 мар 14 18:01 40792859-581c-46cb-be9d-ad9d9e6ce843 -> ../../sdb1
lrwxrwxrwx 1 root root 10 мар 14 18:01 4f311605-04ff-4e66-8121-187f270a51f4 -> ../../sdb5
lrwxrwxrwx 1 root root 10 мар 14 18:01 760198b6-694e-4d6f-b21c-ea0c530398c3 -> ../../sda1
lrwxrwxrwx 1 root root 10 мар 14 18:01 c53e5dd8-c36a-48b1-8591-3aeb4bce60a0 -> ../../sdb7
lrwxrwxrwx 1 root root 10 мар 14 18:01 f09293e9-209e-4dce-ba4f-56d2e33657e8 -> ../../sdb6

Все устройства на медиацентре буду монтировать в каталог /mnt. Вложенный каталог (например, kodi), куда непосредственно необходимо смонтировать раздел, создаем вручную и назначаем права

sudo mkdir /mnt/kodi
sudo chmod -R 0777 /mnt/kodi

Открываем для редактирования fstab

sudo mcedit /etc/fstab

и в конец файла добавляем параметры монтирования для нашего накопителя

UUID=760198b6-694e-4d6f-b21c-ea0c530398c3 /mnt/kodi ext4 rw,nosuid,nodev,relatime 0 0

Все, можно перезагрузить систему и проверить, что накопитель автоматически монтируется при старте.

4.4. Сетевые каталоги

Так как медиацентр, в моем случае, предполагает работу 24/7, удобно использовать его как общий ресурс для обмена данными между всеми домашними устройствами.

Я использую два каталога:

  • /mnt/smb – каталог для обмена между устройствами. Удобно для обмена файловой информации между домашним ПК, ноутбуками и android-устройствами. На ПК с Windows 10 каталог примонтирован в систему, как сетевой диск. На мобильном телефоне использую файловый менеджер X-Plore, в котором также примонтирован этот каталог, всегда быстро и удобно скопировать информацию.

  • /mnt/kodi/qbittorrent – каталог для загрузки торрентов с помощью qBittorrent (не забыть настроить сам qBittorrent на использование этого каталога, по умолчанию используется стандартный каталог загрузок). Так как загружать планирую не только видео-контент для просмотра на телевизоре, удобно использовать медиацентр как торрент-качалку, работающую 24/7. А забрать скачанную информацию всегда можно с помощью все того же смонтированного сетевого диска в Windows 10.

Создаем каталоги и назначаем права на чтение и запись

sudo mkdir /mnt/smb
sudo mkdir /mnt/qbittorrent
sudo chmod -R 0777 /mnt/smb
sudo chmod -R 0777 /mnt/qbittorrent

Расшаривать каталоги будем с помощью samba. Устанавливаем нужный нам пакет

sudo apt-get install samba

Конфигурируем samba

sudo mcedit /etc/samba/smb.conf

Так как «секретную» информацию держать там не планирую и все находится в домашнем окружении, гостевой доступ без пароля разрешаю для простоты авторизации и подключения сетевых дисков. В конец конфигурационного файла вставляем:

[smb]
comment = smb
path = /mnt/smb
browsable = yes
writable = yes
guest ok = yes
read only = no
force user = nobody
force group = nogroup
force create mode = 0777
force directory mode = 0777

[kodi-qbittorrent]
comment = kodi-qbittorrent
path = /mnt/kodi/qbittorrent
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

Можно проверить с других устройств доступность каталогов и наличие прав на чтение и запись.

В случае проблем с доступом из Windows 10 под гостевой учетной записью, необходимо иметь ввиду, что в версиях Windows 10 (начиная с 1709) по умолчанию запрещен сетевой доступ к сетевым папкам под гостевой учетной записью по протоколу SMB2, а версия протокола SMB1 по умолчанию отключен в Windows 10 1709. В итоге сетевой каталог будет не доступен.

Пути решения:

  • Включить SMB1 на стороне Windows. Параметры -> Программы и компоненты -> SMB 1.0/CIFS Client.

  • Разрешить небезопасные гостевые входы на стороне Windows. Конфигурация компьютера -> Административные шаблоны -> Сеть -> Рабочая станция Lanman -> Включить небезопасные гостевые входы.

4.5. Установка и настройка VNC-сервера

Для администрирования и работ в системе медиацентра не планирую использовать собственные клавиатуру и мышь. SSH-протокола не всегда достаточно и иногда хорошо бы иметь доступ к рабочему столу. Этим и займемся.

Решено было использовать VNC-сервер, устанавливаем

sudo apt install x11vnc

Устанавливаем пароль "kodi" и сохраняем в файл в шифрованном виде

sudo x11vnc -storepasswd "kodi" /etc/x11vnc.pass
sudo chmod ugo+r /etc/x11vnc.pass

Запускаем сервер

/usr/bin/x11vnc -noxdamage -shared -dontdisconnect -many -noxfixes -rfbauth /etc/x11vnc.pass -bg

Для подключения я использую Real VNC Viewer для Windows или Android/iOS. Порт по умолчанию - 5900.

К сожалению, после перезагрузки системы VNC-сервер автоматически сам не запустится. Добавим в автозагрузку вручную с помощью юнита подсистемы systemd.

Создаем юнит

sudo mcedit /usr/lib/systemd/system/vnc.service

Вставляем содержимое

[Unit]
Description=Start x11VNC at startup
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -noxdamage -shared -dontdisconnect -many -noxfixes -rfbauth /etc/x11vnc.pass -auth /home/kodi/.Xauthority -display :0
ExecStop=kill $MAINPID

[Install]
WantedBy=multi-user.targetbg

Перечитываем внесенные изменения в systemd, запускаем наш сервис vnc и создаем символическую ссылку в автозапуск, при старте системы

sudo systemctl daemon-reload
sudo systemctl start vnc
sudo systemctl enable vnc

Проверить состояние сервиса можно командой systemctl и ключом status

sudo systemctl status vnc

4.6. Настройка профиля HDMI в PulseAudio

У меня телевизор подключен к мини-ПК через HDMI, а аудио разъем акустической системы подключен к разъему для наушников телевизора, но PulseAudio настаивает на том, что он отключен. Вручную в микшере можно выбрать выходное устройство. Все корректно, но после ближайшей перезагрузки системы профиль снова слетает. Решить проблему можно иначе - отключить модуль switch-on-port-available в конфигурационном файле PulseAudio

sudo mcedit /etc/pulse/default.pa

Закомментировать параметр

#load-module module-switch-on-port-available

После этих изменений с выводом звука не было никаких проблем.

4.7. Настройка профиля управления питанием и частотой процессора

С моим процессором Intel Core i3 5005U система работала не совсем корректно и сбивала частоту процессора до 400 МГц, не поднимая ее даже при выполнении тяжелых задач. Возможно, связано с "кривым" китайским BIOS моего неттопа. Имея довольно неплохой процессор для медиацентра я не стал мириться с этим и решил все же принудительно указать системе, как работать с процессором и "выжать" из него по максимум.

Решено было использовать демона cpufreq и производительный (performance) профиль управления питанием и частотой процессора.

Устанавливаем cpufreq

sudo apt-get install cpufrequtils

Можно использовать GUI-интерфейс и апплет в трее, установив режим "Производительность", но эта настройка сохранится только для текущей сессии.

Установим performance по умолчанию

echo 'GOVERNOR="performance"' | sudo tee /etc/default/cpufrequtils
sudo systemctl disable ondemand

Теперь частота процессора постоянна и равна 1995 МГц.

4.8. Автоматическое обновление и профилактическая перезагрузка системы

Преследуя цель собрать максимально автономный медиацентр, стоит предусмотреть поддержание системы и ее компонентов в актуальном состоянии. Можно воспользоваться системным планировщиком обновления пакетов или автоматизировать этот процесс при помощи демона cron и собственного bash-скрипта, который помимо обновления решит еще одну важную задачу. А именно, будет перезагружать наш сервер для профилактики.

Для чего нужна перезагрузка? При длительном и интенсивном использовании я заметил, что Elementum (особенно при загрузке торрента) потребляет не мало ресурсов оперативной памяти. И самое неприятное то, что по завершении загрузки и просмотра высвобождает лишь ее часть. Да и сама Ubuntu направляет в swap редко используемые данные. Освободить эти ресурсы способна лишь перезагрузка системы. Также после обновления системы перезагрузка лишней не будет.

В отдельной публикации я рассказывал о резервном копировании Kodi, которое выполняется каждый понедельник в 4:00. Потому было решено обновлять и перезагружать систему в 6:00. Два часа достаточно для создания резервной копии и выгрузки ее в облако.

Итак, задачи и инструменты определены - приступаем. Создаем скрипт в домашнем каталоге пользователя (в моем случае - пользователь kodi):

mcedit /home/kodi/update.sh

И вставляем содержимое:

#!/bin/bash
#Отправляем в Kodi по протоколу JSON-RPC команду на завершение работы.
#Если вы не используете авторизацию, то ключ -u с логином и паролем не указывайте
curl -u user:pass http://127.0.0.1:8080/jsonrpc -fs -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"Application.Quit","id":1}'
#Обновляем список пакетов, устанавливаем доступные обновления.
#Сохраняем всю информацию в лог
sudo apt-get update -y && sudo apt dist-upgrade -y > /var/log/auto-update.log
#Перезагружаем систему
sudo reboot -h now

Делаем скрипт update.sh исполняемым

chmod +x /home/kodi/update.sh

И назначаем cron расписание на выполнение это скрипта - каждый понедельник в 6:00. Для управления планировщиком выполнить команду

sudo crontab -e

И вставить содержимое

0 6 * * 1 /home/kodi/update.sh

Готово. Теперь сервер без вашего участия способен сам «привести себя в порядок», высвободив оперативную память и swap, не забыв, установить последние обновления.

Будем считать, основа нашего медиацентра – ОС в лице Kubuntu 20.04 – полностью готова. Можно приступать к установке и настройке KODI!

Рабочий стол Kubuntu 20.04
Рабочий стол Kubuntu 20.04

5. Установка и базовая настройка KODI

Переходим непосредственно к KODI. Он есть в официальных репозиториях Ubuntu, но я бы рекомендовал использовать репозиторий стабильных версий сообщества XBMC (так до 2014 года назывался медиацентр). Например, на момент написания этого материала в середине марта 2021 года, в репозиториях Ubuntu версия KODI была 18.7, тогда как в репозитории сообщества уже была версия 19.0 «Matrix».

Добавляем репозиторий, обновляем список пакетов и устанавливаем KODI

sudo add-apt-repository ppa:team-xbmc/ppa
sudo apt update
sudo apt install kodi

KODI установлен, запускаем. Нас приветствует стартовая страница медиацентра и несколько предложений включить неактивные дополнения. Отвечаем «Yes» только на дополнении PVR IPTV Simple Client, остальные – отклоняем. Также будет предложено сразу настроить это дополнение – пропускаем, им займемся позже.

Первым делом меняем язык, благо KODI поддерживает различные языки интерфейса, русский/белорусский/украинский не исключение.

Settings/Interface/Regional/Russian
Settings/Interface/Regional/Russian

Попутно во всех разделах устанавливаем уровень настроек в «Экспертный», это даст чуть больше параметров для настройки.

В настройках стиля включаем:

  • Использовать скользящую анимацию. Интерфейс будет более привлекательно сменять страницы, диалоговые окна и выводить уведомления.

  • Включить автопрокрутку для сюжетов и обзоров. В библиотеке и видеодополнениях информация о фильме/сериале/серии длинное описание будет плавно прокручиваться.

  • Режим касания. Добавит кнопки управления на экран. Необходимо при использовании мыши/аэромыши.

  • Выбрать рейтинг для показа мультимедийных элементов – «Рейтинг». В медиатеке и видеодополнениях на эскизе фильма/сериала/серии будет добавлена пиктограмма с рейтингом TVDB (чуть позже установим и его).

Настройки/Интерфейс/Стиль/Настроить стиль
Настройки/Интерфейс/Стиль/Настроить стиль

Установим и настроим дополнение погоды. В этом же разделе включаем «Показывать сведения о погоде на верхней панели». Вы будете направлены на страницу выбора дополнения, нажимаем «Еще» и устанавливаем Gismeteo.

Установка дополнения Gismeteo
Установка дополнения Gismeteo

После установки будет предложено сразу и настроить. Вводим название города, выбираем его из списка. Информация о погоде должна отображаться сверху под часами и на главном экране в разделе «Погода». Если сразу этого не произошло – перезапустите KODI.

Раздел погода на главном экране
Раздел погода на главном экране

Возвращаемся к настройке стиля и в разделе «Элементы главного меню». Отключаем лишнее. Я оставил лишь фильмы, сериалы, ТВ, дополнения, избранное.

Настройки/Интерфейс/Стиль/Настроить стиль/Элементы главного меню
Настройки/Интерфейс/Стиль/Настроить стиль/Элементы главного меню

В разделе «Картинки» можно выбрать и установить набор фанартов из стандартного репозитория. Это фоновые изображения всех страниц медиацентра. Можно установить любой из понравившихся в списке с префиксом «Skin Backgrounds - …».

Настройки/Интерфейс/Стиль/Настроить стиль/Картинки
Настройки/Интерфейс/Стиль/Настроить стиль/Картинки

Какое-то время у меня был установлен набор Darkwood Design. Со временем, из нескольких официальных наборов репозитория Kodi.tv собрал самые удачные в дополнение, которое можете также установить себе - resource.images.skinbackgrounds.arbuzov.zip.

Что касаемо самих стилей, их предостаточно даже в официальных репозиториях. Но перебрав их все, остался на стиле по умолчанию – Estuary, с цветовой схемой Midnight. Сторонний скин, который мне очень понравился, но так и не дошли руки его полноценно настроить – Aeon MQ 8. Он просто великолепен. Но требует значительно больше ресурсов, много весит и тянет за собой множество зависимостей при установке (рекомендую сделать бэкап, если решитесь «примерить» его себе). Скин "полегче", но не менее прекрасный - Arctic: Zephyr - Reloaded. Рекомендую взглянуть на оба для сравнения.

Оставшиеся параметры системы оставляем по умолчанию, кроме «Настройки/Система/Дополнения»«Неизвестные источники». Этот параметр включить обязательно. Потребуется для установки некоторых дополнений из файлов.

Параметры «Проигрывателя» я также оставлял без изменений.

Переходим в раздел «Настройки/Службы». В «Управлении» разрешаем удаленное управление по HTTP и устанавливаем пароль. Это нам понадобится для управления KODI с других устройств. Чуть позже разберемся, как это сделать.

Настройки/Службы/Управление
Настройки/Службы/Управление

В разделе «Сведения о системе» можно наблюдать за состоянием вашего медиацентра. Здесь и общая информация о системе, накопителях, температурах, сети, а также о каналах PVR.

В разделе «Сведения» есть счетчик общего времени «наработки» KODI. Любопытная информация. Мой медиацентр уже наработал 434 дня.

Настройки/Сведения о системе/Сведения
Настройки/Сведения о системе/Сведения

Раздел с наиболее значимой информацией – «Оборудование». Из коробки температура ЦП у меня отображалась как «Температура ЦП: -1°C».

Настройки/Сведения о системе/Оборудование
Настройки/Сведения о системе/Оборудование

Необходимо KODI указать, где брать информацию о температуре. Настраивается в конфигурационном файле advancedsettings.xml. В нем вообще много чего интересного, можно прочесть на официальной странице KODI/Wiki.

Если файла нет – создаем его самостоятельно

mcedit /home/имя_пользователя/.kodi/userdata/advancedsettings.xml
<advancedsettings>
<cputempcommand>sed -e 's/\([0-9]*\)[0-9]\{3\}.*/\1 C/' /sys/class/thermal/thermal_zone0/temp</cputempcommand>
</advancedsettings>

После перезапуска KODI, температура отображается верно. Какой параметр использовать, например, для Raspberry Pi можно прочесть здесь.

6. IPTV. Как установить и настроить, какой сервис выбрать

Для вещания IPTV в KODI потребуется дополнение PVR IPTV Simple Client, которое мы согласились включить при первом запуске.

Что делать, если при первом запуске дополнение не было предложено включить и сейчас его вообще нет в списке дополнений или было включено, но не запускается и отмечено, как неактивное, а попытки запустить вручную завершаются ошибкой?

Ошибка при попытке включить дополнение PVR IPTV Simple Client
Ошибка при попытке включить дополнение PVR IPTV Simple Client

Трудно сказать с чем связано, но на этапе тестирования на виртуальных машинах и установке на «боевой» сервер год назад у меня возникли проблемы с его запуском из коробки (при первом запуске KODI ничего не предложил и в списке моих дополнений его не было).

Установку выполнил вручную. Обязательно использовать последнюю версию deb-пакета. Смотрим актуальную версию здесь - pkgs.org/download/kodi-pvr-iptvsimple. Не забыть верно выбрать дистрибутив и архитектуру.

В моем случае последняя версия 7.5.0 – скачиваем для Ubuntu 20.04 LTS (Focal Fossa) и устанавливаем

wget http://ppa.launchpad.net/team-xbmc/ppa/ubuntu/pool/main/k/kodi-pvr-iptvsimple/kodi-pvr-iptvsimple_7.5.0-1~focal_amd64.deb
sudo dpkg -i ./kodi-pvr-iptvsimple_7.5.0-1_focal_amd64.deb

После установки запускаем KODI, проверяем установлен и запущен ли наш PVR IPTV Simple Client.

Прежде, чем перейдем к настройкам клиента, необходимо определиться с сервисом. На просторах сети их достаточно большое количество, как платных, так и бесплатных, с архивами и без, хороших и плохих. Какое-то время пользовался бесплатными «самообновляемыми» плейлистами. Мне показалось это дорогой в никуда. Много не рабочих каналов, иногда и вовсе не работал ни один, низкая скорость передачи, постоянная буферизация, особенно в вечернее время и на выходных. К набору каналов, особенно в HD качестве, также есть вопросы.

Был найден оптимальный вариант - ZeDom IPTV (бывший Edem TV/ILook TV). Сервис платный – 1$/месяц. За эту «неподъемную» сумму я получил просто огромный список каналов, чуть более 100 из которых в HD-качестве. За год использования – не было ни одного сбоя в работе. Что касается скорости передачи, то при моем интернете 25 Мбит/с - проблем не возникало ни разу. Каналы открываются мгновенно, без буферизации. Также хочется отметить качественные логотипы каналов. У других сервисов с этим явные проблемы, во всяком случае, у тех которыми пользовался я.

Сервис позволяет просматривать один плейлист на двух устройствах, что тоже не плохо. Потому как некоторые сервисы и вовсе предлагают просмотр не более, чем на одном устройстве. Второй телевизор в доме - покупай вторую подписку. Не наш метод. В качестве альтернативы можно рассмотреть сервис Cbilling - будет, правда, немного дороже по стоимости (цены здесь). В остальном – отличный IPTV-провайдер, какое-то время им тоже пользовался.

IPTV-плейлист готов, скачиваем
IPTV-плейлист готов, скачиваем

С регистрацией и оплатой на сервисе ZeDom, думаю, проблем возникнуть не должно. Описывать подробно это не буду. Первые сутки, кстати, можно попробовать бесплатно.

В личном кабинете в разделе «Плейлист» рекомендую выбрать только нужные вам группы каналов (много зарубежных, не «русскоговорящих»). Помимо выбора групп, также рекомендую пройтись и по самим каналам и отключить не нужные. Это сделать можно в разделе «Конструктор». Так, например, изначально мой плейлист составлял 1800+ каналов. После выключения лишних осталось 593 канала.

Будем считать плейлист готов, можно подключать в KODI. Переходим в личном кабинете в раздел «Плейлист/Скачать». Использовать можно как ссылку, так и m3u8-плейлист. При использовании ссылки возможны проблемы с доступом к сервису из-за блокировок провайдера. Скачиваем плейлист.

Переходим к настройкам клиента – «Дополнения/Мои дополнения/Клиенты PVR/PVR IPTV Simple Client».

В разделе «Основные» указываем локальное расположение нашего плейлиста

В разделе «EPG» указываем ссылку на программу передач (ГИД):

http://epg.it999.ru/edem.xml.gz

При некорректном взаимодействии с часовыми поясами и разницей во времени, можно вручную настроить смещение +/- в часах.

В разделе «Channel Logos» расположение не трогаем, для «Channel logos from XMLTV» установить «Предпочтительно M3U».

Применяем настройки и перезапускаем KODI. При старте KODI выполнит сканирование плейлиста и обновит программу передач. Об этом будет информировать нас в верхнем правом углу. По завершении переходим в раздел ТВ и наблюдаем все наши каналы, наслаждаемся просмотром.

Раздел "ТВ" на главном экране KODI
Раздел "ТВ" на главном экране KODI
Список каналов, справа подробная информация
Список каналов, справа подробная информация
ТВ-программа
ТВ-программа
В разделе «Сведения о системе/Служба PVR» также должна появиться общая информация о каналах
В разделе «Сведения о системе/Служба PVR» также должна появиться общая информация о каналах

О том как настроить catchup и timeshift для IPTV и получить возможность просмотра из архива и перемотку текущих передач читайте в другой части.

KODI: собираем удобный и функциональный медиацентр для дома. Часть 4. Архив IPTV

В публикации подробно рассказываю, как настроить PVR IPTV Simple Client для работы с архивом и перемоткой. Читать дальше →

7. Библиотека KODI. Что это такое и как настроить

Библиотека KODI великолепна по своему функционалу и автоматизации всех процессов. Для меня это просто находка. Она структурирует по разделам Фильмы/Сериалы/Музыка и т.д. ваши медиа-данные, загружая автоматически со сторонних ресурсов трейлеры, постеры, информацию о сюжете, актерах, рейтинг и прочее, прочее... Лично я не использую офлайн-медиа, так как локально у меня не хранятся ни фильмы, ни сериалы. Но библиотека отлично взаимодействует и с другими видеодополнениями для просмотра онлайн, в частности с Elementum, который установим чуть позже.

Прежде, чем будем настраивать библиотеку, необходимо установить несколько дополнений с источниками сведений. Мой медиацентр работает с TVDB и КиноПоиск.

Дополнения KinoPoisk в официальных репозиториях нет. Необходимо установить сторонний репозиторий Seppius (скачиваем по ссылке). В браузере дополнений выбрать установку из файла ZIP и указать путь к только что скачанному архиву.

По завершении установки репозитория, возвращаемся назад и выбираем «Установить из репозитория/Все репозитории/Источники сведений» и устанавливаем в разделе «Сведения о сериалах»TVDB (new), а в разделе «Сведения о фильмах» - KinoPoisk.

Дополнения установлены, переходим к настройке библиотеки. Создаем два каталога, для раздельного хранения информации о фильмах и сериалах, например:

/mnt/kodi/library/Movies – библиотека фильмов
/mnt/kodi/library/Shows – библиотека сериалов

Далее переходим в «Настройки/Медиа/Медиатека/Видео» и нажимаем добавить «Видеоисточник». Добавляем каталог с фильмами, даем произвольное название источнику.

В типе содержимого указываем, что этот каталог содержит фильмы, источник сведений – KinoPoisk. Параметры сканирования, как на скриншоте.

Аналогично поступаем и с источником для сериалов. Обратите внимание на отличие в настройках и параметрах сканирования, это важно.

Настройка библиотеки завершена. Пока она пуста, после установки Elementum сможете добавить в нее несколько фильмов/сериалов и проверить, верно ли все настроено. Таким же образом вы можете добавить и локальные (или сетевые) каталоги с фильмами/сериалами/клипами/музыкой, KODI просканирует ваши медиафайлы, и они уже будут отображаться на главном экране в соответствующих разделах. Не забудьте только для работы с клипами и музыкой установить нужные дополнения источников сведений.

8. Elementum и Burst. Настраиваем просмотр контента торрент-онлайн

Это, наверное, самый важный функционал всего медиацентра, из-за которого все и затевалось. Elementum – видеодополнение, которое у нас будет работать с торрент-трекерами. Дополнение отлично справляется не только с проигрыванием онлайн торрент-контента, но и с поиском, отличным отображением всей информации о фильмах и сериалах с постерами, актерами и их фотографиями. В общем, просто не заменимая вещь. Burst – дополнение к Elementum – провайдер, который непосредственно взаимодействует с трекерами.

Итак, все по порядку. В официальных репозиториях Elementum нет. Его необходимо скачать с сайта разработчика - elementum.surge.sh, выбрав платформу (у нас Linux x64).

Устанавливаем также из файла ZIP, как устанавливали репозиторий для Кинопоиска, при подготовке библиотеки. По завершении установки KODI сам предложит установить дополнение Burst – соглашаемся.

Переходим к настройкам Elementum. Привожу свои настройки на скриншотах. Обязательно указать пути для загрузок, торрентов, включить интеграцию с библиотекой KODI и указать путь к самой библиотеке (ее создавали в предыдущем разделе).

Что касается настроек загрузок, то мой накопитель в 480 Гб совершенно не лимитирует. Я установил параметры в использование файлов, максимальное. Файлы автоматически не удаляются после просмотра. Их периодически удаляю вручную.

Настройки BitTorrent оставил по умолчанию. Торренты загружаются и сидируются без ограничений по скорости. Прокси-сервер не включаем, это важно.

Переходим к настройкам провайдера Burst в «Дополнения/Программные дополнения». Прокси также не используем. В разделах «Разрешение» и «Качество» выбрал только 1080p/720p и качество выше «Screener/SCR», так как телевизор не поддерживает 2K/4K, а «экранки» не смотрю.

Настройки Elementum Burst
Настройки Elementum Burst

И самое главное, указываем трекеры, с которыми будем работать. Я использую следующие (остальные отключил, так как большее количество трекеров увеличит время поиска и, как показала практика, ничего стоящего они дают в выдачах):

Открытые:
MegaPeer

Закрытые (нужна регистрация на сайте, в настройках Burst указать логин/пароль):
Rustorka
• NNM-Club
• RuTracker
• Кинозал

Этого небольшого списка трекеров хватает с головой. За все время использования и множества просмотренных фильмов – лишь несколько раз не были найдены раздачи. Но, если у кого-то есть инвайты на самые закрытые трекеры – буду рад принять.

Применяем настройки и запускаем Elementum.

Главное меню дополнения Elementum
Главное меню дополнения Elementum

Перейдите, например, в раздел «Фильмы/Самые просматриваемы» и выберите любой фильм.

Если все верно настроено – Burst просканирует, указанные вами трекеры, и предложит выбрать стрим.

Список доступных раздач. Сортировка по количеству сидов.
Список доступных раздач. Сортировка по количеству сидов.

Выбрав стрим, Elementum буферизирует порядка 20-50 Мб (в зависимости от общего размера фильма) и начинает его воспроизведение.

Если завершить просмотр, согласно нашим настройкам, скачивание продолжится в фоновом режиме, информация о прогрессе будет в верхнем правом углу. Этот параметр можно отключить в настройках Elementum, тогда при остановке просмотра, загрузка будет останавливаться (или останавливаться и удаляться торрент + файл).

Для того, чтобы добавить фильм/сериал из Elementum в библиотеку из контекстного меню выбрать «Добавить в библиотеку».

Контекстное меню фильма/сериала в Elementum
Контекстное меню фильма/сериала в Elementum

Все добавленные фильмы и сериалы в библиотеку будут доступны из главного экрана, в соответствующих разделах. Автоматически отмечаются просмотренные фильмы/серии/сезоны, загружаются постеры, рейтинг и описание.

"Сериалы" на главном экране
"Сериалы" на главном экране
Список серий в разделе "Сериалы"
Список серий в разделе "Сериалы"
Раздел "Фильмы" на главном экране
Раздел "Фильмы" на главном экране

На главном экране будут отображаться лишь недавние и просматриваемые. После того, как фильм/сериал просмотрен, он пропадает с главного экрана и находится уже в «общей библиотеке», в соответствующем разделе. Указывается общее количество фильмов и сериалов, режим отображения и сортировки можно настроить под себя.

Все фильмы библиотеки
Все фильмы библиотеки
Все сериалы библиотеки
Все сериалы библиотеки

Заключение

На данном этапе основные настройки выполнены, а главная цель достигнута - медиацентр, включающий в себя комфортный просмотр ТВ, фильмов и сериалов собран. Предусмотрены и автоматизированы процессы, которые позволят без вашего участия работать ему 365 дней в году. Можно спокойно наслаждаться просмотром - об остальном сервер позаботится сам.

В следующей публикации поговорим о возможности внешнего управления Kodi/Elementum и qBittorrent с помощью веб-интерфейса и Android-устройств. А также внедрим в наш медиацентр функцию учета трафика с возможностью отображения и анализа в веб-интерфейсе. Не забудем и о резервном копировании, как операционной системы, так и самого Kodi.

Продолжение и дополнительные возможности – в других публикациях

К сожалению, объем одной публикации на хабре ограничен, потому всё, чем хотел бы поделиться никак не уместить в один пост. Разделил на несколько частей...
Часть 2. YouTube, qBittorrent, управление Yatse и Kore, учет трафика VnStat
Часть 3. Ретро-игры
Часть 4. Архив IPTV
Часть 5. Яндекс.Музыка
Часть 6. MariaDB и синхронизация медиатеки
Часть 7. Управление iOS-устройством
Часть 8. Telegram-бот для qBittorrent
Часть 9. Spotify
Часть 10. IVI и Netflix
Часть 11. Kodi+Plex
Часть 12. Настраиваем просмотр IPTV в Plex Media Server

Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
+68
Комментарии 189
Комментарии Комментарии 189

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн