Показаны сообщения с ярлыком xbmc. Показать все сообщения
Показаны сообщения с ярлыком xbmc. Показать все сообщения

вторник, 20 января 2015 г.

HTPC своими руками (часть 3)

Это третья, заключительная, часть цикла постов о самостоятельной сборке HTPC (первая и вторая части). В предыдущих частях я рассказывал о "железной" и программной начинке, а также слегка коснулся истории моего HTPC-строения. В этой части я опишу интеграцию HTPC с сервисом IPTV от провайдера Атлант Телеком.

Мой тарифный план от интернет-провайдера включает пакет каналов IPTV, сейчас этот пакет включает более 70 каналов, в том числе один в HD качестве. Плейлист для IPTV плеера находится тут (доступен только из сети Атлант Телекома).

Для просмотра IPTV провайдер предлагает использовать либо программный плеер (для просмотра ТВ на компьютере), либо цифровую приставку STB MAG250 Micro.

STB MAG250 Micro

Эта цифровая приставка используется многими IPTV провайдерами, но не подходила мне, т.к. на тот момент вся сеть была на базе wifi, а не ethernet. Мои первые попытки смотреть IPTV через wifi, используя для этого multicast, заканчивались зависанием или перезагрузкой точки доступа уже через секунд 15-20 просмотра. Через ethernet-кабель, приходящий от провайдера, IPTV работал нормально. Чтобы решить эту проблему нужно преобразовывать multicast трафик в unicast. К тому моменту я уже немного игрался с tvheadend, так что вместо экспериментов с udpxy и прочими поставил его. Установка для Debian Wheezy проста

$ wget -O- http://apt.tvheadend.org/repo.gpg.key | sudo apt-key add -
$ echo 'deb http://apt.tvheadend.org/stable wheezy main' | sudo tee /etc/apt/sources.list.d/tvheadend.list
$ sudo apt-get update
$ sudo apt-get install tvheadend

При установке у вас попросит задать логин и пароль администратора, которые вам пригодятся чтобы зайти в настройки Tvheadend. Для этого вам нужно в браузере перейти по адресу http://server-ip:9981/. Свежеустановленный Tvheadend выглядит как-то так


Первый раз я скрупулезно выполнил мартышкин труд и создал в Tvheadend'е более 70 каналов, включил в XBMC плагин tvheadend pvr и настроил подключение к серверной части. После небольшой паузы (на тот момент у меня был еще HTPC на базе Raspberry PI) появилась картинка и звук на телевизоре. Я прошелся по каналам и обнаружил что для некоторых есть только звук, а вместо картинки - черный экран. Расследование показало, что проблемные каналы вещаются в MPEG2, а работающие в H264. Гугление привело меня на страницу покупки лицензионных ключей для аппаратного декодера Rapsberry PI. Дело в том, что декодирование MPEG-2 и VC-1 требует отчисление роялти и потому заблокировано по-умолчанию. Чтобы не заморачиваться в будущем я купил сразу ключи для MPEG-2 и VC-1. После прописывания ключей в загрузчик Raspberry и перезагрузки заработали и "проблемные" каналы.

Недоставало только программы передач (EPG) для работы записи по расписанию. Для MythTV я использовал программу передач с сайта teleguide.info и все было замечательно, но однажды на этом сайте появилось уведомление, что сервис закрывается - пришлось искать альтернативы.

Атлант Телеком предоставляет программу передач в формате JTV (http://help.telecom.by/_files/TelecomTV/TelecomTVepg.zip), но Tvheadend поддерживает только формат XMLTV. Попробовал покопаться в содержимом файлов EPG провайдера - мое внимание привлекла запись, которая присутствовала в начале каждого файла с расширением .pdt (сейчас этой записи уже нет)


В названии каждой первой передачи была вставка
-- Телепрограмма с сайта: www.vipiko.tv --
Зайду-ка я на этот сайтик. Bingo! На этом сайте выложена программа передач не только в формате JTV, но и нужном мне XMLTV. Похоже Атлант Телеком просто собирает в архив нужные каналы, не особо заботясь о "чистке". Подключив этот сервис к Tvheadend, я пользовался им примерно год и прекратил, когда после очередной "отмены времени" в РФ, для многих каналов смещение времени стало неверным. К этому времени выяснилось, что teleguide.info толи восстал из пепла, то ли не до конца помер - теперь пользуюсь им.

На этом можно было бы и закончить рассказ, если бы Атлант Телеком слишком часто не менял каналы IPTV. Приходилось отслеживать изменения и перенастраивать Tvheadend. Вскоре делать это надоело и я написал утилиту tvheadend-iptv-damavik, которая заботится об актуальности настроек каналов и импорте EPG.

понедельник, 12 января 2015 г.

HTPC своими руками (часть 2)

В первой части я рассказывал про аппаратную начинку своего HTPC. Теперь пора рассказать про его программную составляющую.

В самом начала HTPC-строения я использовал MythTV, серверная часть которого была установлена на обычном десктопе, а клиенты на том же компьютере и ноутбуке.


MythTV использовал аналоговый тв-тюнер (Beholder 507 FM), что давало возможность записывать интересные передачи с кабельного тв и смотреть их в удобное время на любом компьютере. Этот тюнер замечательно поддерживается в Linux, а его пульт дистанционного управления поддерживается LIRC.

Позже в одном из обновлений MythTV сломали работу с аналоговыми тюнерами и не спешили чинить, так что пришлось искать альтернативу. Еще один недостаток этого решения - записывать можно было только одну передачу одновременно, ведь тюнер может быть настроен только на один канал. Это ограничение можно было обойти добавив второй тюнер, но от этого апгрейда я отказался. Из положительных моментов - поддержка записи по расписанию, timeshift (вы можете поставить телепередачу на паузу и сходить за чаем) и пропуск рекламных блоков (не всегда определяло правильно).

С появлением Raspberry PI я начал миграцию своего HTPC на эту платформу. К сожалению использовать MythTV на Raspberry PI не получится, так как у него нет поддержки аппаратных декодеров, а на программную обработку не хватит ресурсов. В процессе поиска альтернативы для MythTV я пришел к XBMC (сейчас он уже называется Kodi, но поскольку версия, установленная у меня еще называется XMBC, то дальше я буду называть его по-старому).


Для raspberry pi есть несколько дистрибутивов с поддержкой XBMC - я точно помню что тестировал Raspbmc, OpenELEC и Raspbian. Наиболее стабильным и простым в установке оказался OpenELEC - дальше я работал только с этим дистрибутивом. У Raspberry PI есть поддержка CEC, которую я обнаружил совершенно случайно. Оказалось очень удобным, но на моем телевизоре LG работали только базовые функции вроде play/pause, stop, forward, rewind, next, previous и крестовина навигации (up, down, left, right). Чтобы заработал CEC, нужно включить поддержку SimpLink в телевизоре (в других телевизорах эта фича называется по-другому). В принципе этого хватало, а расширенное управление выполнялось со смартфона через Official XBMC Remote.

Поскольку Raspberry PI уже не используется, то дальнейшее описание приводится для HTPC на базе Gigabyte GB-XM14-1037. Установка очень проста - скачиваем дистрибутив с сайта OpenELEC и готовим установочный диск (в моем случае это флешка /dev/sdd). Будьте внимательны при выполнении этих команд - вы можете испортить содержимое другого диска.

$ wget -P /tmp http://releases.openelec.tv/OpenELEC-Generic.x86_64-4.2.1.tar
$ cd /tmp
$ tar -xf OpenELEC-Generic.x86_64-4.2.1.tar
$ cd OpenELEC-Generic.x86_64-4.2.1
$ sudo ./create_installstick /dev/sdd

Для начала установки нужно загрузить HTPC с созданной флешки. Сам процесс установки очень прост и состоит из далее, далее, далее...

Первая же загрузка показалась просто мгновенной в сравнении со старым вариантом на базе raspberry pi. Сказывается более мощный процессор и скорость ssd диска. Осталось подключить ресурсы домашней сети: фотографии, видео и IPTV от АтлантТелеком. Домашний сервер раздает ресурсы через Samba и NFS - поддержка обоих протоколов есть в XMBC.

Для поддержки IPTV на сервере установлен Tvheadend, который принимает multicast траффик и преобразует его в unicast - раньше сеть работала через wifi и это было необходимо. Сейчас HTPC подключен через ethernet, но менять что-то не вижу смысла. В следующей части я опишу особенности настройки Tvheadend в сети АтлантТелекома - возможно это кому-то пригодится. Tvheadend поддерживает запись по расписанию, timeshift и web клиент (нужен установленный плагин vlc).

Из плагинов установлен только Yahoo weather (для прогноза погоды), Youtube (для просмотра отложенного видео), tvheadend pvr клиент и retroarch для поддержки эмуляции старых консолей. С retroarch пришлось повозиться, т.к. версия для xbmc не устанавливается на 4.2.1. Я перепробовал много разных сборок, пока не нашелся рабочий вариант. После установки плагина нужно настроить соответствие кнопок gamepad'а и эмулятора. Мне пришлось пожертвовать одной из кнопок select, чтобы сохранился доступ к меню retroarch. Осталось скопировать rom-файлы в ~/emulators/retroarch/rom/ и насладиться игровым процессом. Как же мне не хватало возможности сохраниться в том же Comix Zone на сеге!

Пару слов о костылях, которыми пришлось поправлять некоторые моменты. Самым неприятным была случайная попытка выключить телевизор не тем пультом. При нажатии на "power" на пульте от HTPC последний без лишних вопросов выключался, а чтобы его включить приходилось нащупывать кнопку включения за телевизором. Эта проблема была решена радикально - я просто отключил реакцию на событие в конфигурации XBMC

$ cat ~/.xbmc/userdata/keymaps/remote.xml 
<keymap>
  <global>
      <remote>
          <power>NOOP</power>
      </remote>
  </global>
</keymap>

Вторым неприятным моментом было отсутствие повторения нажатия для Volume Up/Down и выражалось в невозможности быстро уменьшить или увеличить звук. Поиск в интернете навело меня на маленький скрипт, который решает эту проблему.

$ cat ~/volume.py
import json, sys, xbmc
step = 10
if sys.argv[1] == 'down':
    step *= -1
rpc = '{"jsonrpc": "2.0", "method": "Application.GetProperties", "params": {"properties": ["volume"]}, "id": 1}'
vol = json.loads(xbmc.executeJSONRPC(rpc))["result"]["volume"]
xbmc.executebuiltin('SetVolume(%d,showVolumeBar)' % (vol + step))

Теперь нужно повесить вызов этого скрипта в качестве обработчика VolUp/VolDown. Добавляем в файл ~/.xbmc/userdata/keymaps/remote.xml секцию

<keymap>
  <global>
      <remote>
          <volumeplus>RunScript("/storage/volume.py", "up")</volumeplus>
          <volumeminus>RunScript("/storage/volume.py", "down")</volumeminus>
      </remote>
  </global>
</keymap>

Теперь регулировка уровня звука идет с шагом 10%, если нужно меньше, то измените значение "step = 10" в файле ~/xbmc-volume.py.

четверг, 13 февраля 2014 г.

Резервное копирование домашнего медиацентра

Сегодня наводил окончательный лоск в настройках домашнего медиацентра (Raspberry PI + OpenELEC) после переноса его директории /storage с SD карты на сервер NFS (SD карта используется только для загрузки, а все файлы конфигурации и пользовательских данных хранятся на сервере и доступны через NFS).

Когда с настройками было покончено я сделал резервную копию средствами OpenELEC, но вот что интересно - резервная копия выполняется без завершения работы XBMC, а значит часть файлов копируется в процессе использования.

Узнать список файлов, которые в данный момент используются, можно на самом медиацентре

OpenELEC:~ # lsof | grep /storage
866 /usr/sbin/connmand /storage/.cache/connman/ethernet_b827eb9ace35_cable/data
946 /usr/lib/xbmc/xbmc.bin /storage/.xbmc/temp/xbmc.log
946 /usr/lib/xbmc/xbmc.bin /storage/.xbmc/userdata/Database/Addons15.db
946 /usr/lib/xbmc/xbmc.bin /storage/.xbmc/userdata/Database/Textures13.db
946 /usr/lib/xbmc/xbmc.bin /storage/.xbmc/userdata/Database/TV22.db
946 /usr/lib/xbmc/xbmc.bin /storage/.xbmc/userdata/Database/Epg7.db
946 /usr/lib/xbmc/xbmc.bin /storage/.xbmc/userdata/Database/Addons15.db

Открытые файлы *.db это базы SQLite, которые могут быть в промежуточном состоянии на момент создания резервной копии.

Чтобы избежать копирования открытых файлов можно выключить оболочку XBMC, создать резервную копию и затем включить XBMC обратно.

После изучения системы инициализации в OpenELEC оказалось, что самым простым способом достичь желаемого - выполнить перезагрузку всего медиацентра. В процессе завершения работы системы выполняется скрипт /storage/.config/shutdown.sh, который запускается после выключения XBMC, но до перезагрузки всей системы.

Собственно скрипт

if [ "`date +'%H'`" != "05" ]; then
 echo "Seems triggered not by cron job, simply exiting"
 exit 0
fi

STAMP=`date +'%Y%m%d%H%M%S'`

if [ ! -d /storage/backup ]; then
 mkdir /storage/backup
fi

echo "Settings backup..."
tar -cf /storage/backup/${STAMP}.tar /storage/.cache /storage/.config /storage/.xbmc

if [ "`date +'%u'`" == "7" ]; then
 echo "Flash backup..."
 tar -cf /storage/backup/${STAMP}_flash.tar /flash
fi

echo "Backup finished, syncing..."
sync
sleep 30s

Скрипт проверяет в котором часу он запущен и если сейчас не 5 часов утра, то создание резервной копии отменяется - скорее всего это перезагрузка по требованию пользователя, а не задания крона. Далее создается TAR-архив, содержащий конфигурацию OpenELEC и XBMC. Также если скрипт запущен в воскресенье, то дополнительно создается резервная копия всей системы (защита от неудачного обновления самого OpenELEC или выхода из строя SD карточки). Перед завершением скрипта выполняется сброс буферов и выжидается 30 секунд (на всякий случай).

Задание крона выглядит так

# crontab -u root -l

# Reboot to create semi-offline backup
10 5 * * * /usr/bin/xbmc-send --action="XBMC.Reboot"

Согласно этому заданию в каждый день в 5:10 утра выполняется команда перезагрузки средствами XBMC, что гарантирует корректное завершение работы.