вторник, 27 декабря 2016 г.

HTPC + NAS Домашний медиа сервер

В этой заметке я хочу поделиться своим опытом создания HTPC.

Вступление: Изначально идея заключалась в установке OpenMediaVault, дистрибутива на базе debian 7. Но на этапе установки медиа платформы возникли проблемы, как с запуском так и с нормальной работой. В итоге, пришлось от этой идеи отказаться, в пользу Ubuntu 16.10.
OMV привлекал своим вэбинтерфейсом с возможностью создания софтварного рейда прямо из него;
создания логических томов и подключения их; создания samba шар. Но рассмотрев поближе webmin я понял, что он ничем не хуже. Да, его предназначение несколько другое, нежели управление NASом, но для HTPC он подходит отлично. В конце концов консоль и ssh никуда не делись и в крайнем случае настроить все можно руками ;)
Остро стоял вопрос мониторинга самой железки, что в OMV реализовано «изкоробки», но как оказалось webmin умеет и это.

Вводные данные:
Железо:
asus P5L-MX
Intel(R) Celeron(R) D CPU 3.46GHz
Оперативной памяти 2Гб
ОС: lubuntu 16.10
Медиа платформа KODI
ip адрес сервера: x.x.x.x
Дисклеймер:В заметке используются статьи собранные из интернетов. Цель выдать чье-то творение за свое не преследуется, но ввиду того, что заметка пишется постфактум, ссылки на источники были утрачены. Я с удовольствием их добавлю, если авторы источников того пожелают.
Обо всем по порядку:
На свеже установленную ОС ставим необходимое.
Добавляем репозитории  
Webmin
$ sudo nano /etc/apt/sources.list.d/webmin.list 

deb http://download.webmin.com/download/repository sarge contrib
Kodi  

$ sudo add-apt-repository ppa:team-xbmc/ppa 
$ sudo apt-get update 
$ sudo apt-get install kodi kodi-pvr-iptvsimple webmin openssh-server

Настроим автовход и автозапуск kodi

 $ sudo nano /etc/lightdm/lightdm.conf  
autologin-guest=false #отключаем гостя 
autologin-user=user #автологин пользователя user 
autologin-user-timeout=0 #логинимся сразу 
user-session=kodi #выбираем сессию. Список доступных можно посмотреть тут: /usr/share/xsessions/ (на случай если захочется вернуть все обратно ))

На данном этапе мы имеем рабочий KODI.
В целом штукенция весьма интересная, но оставим подробное изучение за кадром. Отмечу только ключевые возможности: плеер умеет показывать видео; :) играть музыку; показывать фотки; и показывать ip-tv. При добавлении музыки информацию берет из тэгов разумеется, поэтому очень важно что бы они были и были правильными. Иначе в медиатеке будет бардак. Однако, ничего не мешает искать файлы через файловый менеджер, но с тэгами удобнее.
Вернемся к настройке.

ТВ:
Для того что бы смотреть IP-tv нам нужно добавить плейлист.
Идем в настройки — ТВ — Клиент — Настройки клиента. Или настройки — дополнения — мои дополнения — Клиенты PVR — PVR IPTV Simple Client — Настройки. В расположении выбираем «Удаленный путь» и вбиваем ссылку. Ссылку на плейлист ищем в интернетах.
Небольшое отступление:
Бесплатные плейлисты хороши своей бесплатностью. В остальном не самый удачный выбор, вот несколько причин:
1. Очень часто они теряют свою актуальность и каналы просто перестают показывать. А поскольку плейлист бесплатный, то за его актуальностью никто не следит.
2. Каналы часто подвисают в буферизации, либо из-за большой нагрузки, либо из-за узкого канала. Я использовал отсюда http://iptvsensei.ru/samoobnovlyayemyye-pleylisty-iptv/. Но очень скоро поменял на платный. Невозможно смотреть.
Из платных могу выделить один сервис: Edem.tv Стоимость пакета составляет всего 1$ в месяц. Одновременно плейлист можно просматривать на двух устройствах. Ничего не подвисает, работает стабильно. (Ссылка реферальная. Вам все равно, а мне приятно ))
Снимаем птичку с пункта «Кэшировать m3u в локальное хранилище» так мы гарантированно каждый раз будем получать свежий плейлист. Нажимаем ок и запускаем дополнение.
Возвращаемся в настройки — ТВ — Общие — и включаем ТВ. В основном меню появится пункт ТВ. Там мы найдем доступные каналы.

 Он-лайн радио:
Добавим репозиторий с дополнениями kodi. Инструкция
Из репозитория из раздела «Видеодополнения» ставим «IPTV». Заходим по ssh на наш сервер в ~/.kodi/addons/plugin.video.IPTV/playlists создаем там файл radio.m3u
#EXTM3U
#EXTINF:0,Наше радио
http://nashe1.hostingradio.ru:80/nashe-128.mp3 


что бы включить радио идем в главное меню — Видео — Дополнения — IPTV — radio.m3u и выбираем «Наше». Вызвав контекстное меню, можно добавить радиостанцию в избранное.

Torrent:
Какой медиацентр без торрент качалки? Ставим:

$ sudo apt-get install transmission-daemon

Настраиваем:
Первым делом копируем все в домашнюю директорию

$ sudo cp /etc/transmission-daemon ~/.config/
$ sudo chown -R user:user ~/.config/transmission-daemon

Правим конфиг ~/.config/transmission-daemon/settings.json:

"download-dir" #путь куда качаем
"rpc-authentication-required": false, #Отключаем авторизацию
"rpc-whitelist-enabled": false, # Отключаем whitelist либо же добавляем в пункт "rpc-whitelist" свою подсеть например 192.168.1.*
"watch-dir": "/home/user/.torrents", #для автоматического старта загрузки включаем watch-dir
"watch-dir-enabled": true,
"script-torrent-done-filename": "/home/user/.config/transmission-daemon/complete.sh" #включаем скрипт, который будет выполняться после загрузки. (об этом чуть позже)
"script-torrent-done-enabled": true,

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


Настроим запуск transmission от имени пользователя и подхват нашего конфига из домашней директории.

$ sudo nano /etc/init/transmission-daemon.conf
setuid user
setgid user
$ sudo nano /etc/default/transmission-daemon
CONFIG_DIR="/home/user/.config/transmission-daemon"


Данный метод описывается почти во всех статьях к transmission но у меня он все равно стартовал от имени своего пользователя. Видимо потому, что демон управляется не скриптами а systemd, поэтому правим еще и тут:

$ sudo nano /lib/systemd/system/transmission-daemon.service
[Service]
User=user
ExecStart=/usr/bin/transmission-daemon -f -g /home/user/.config/transmission-daemon --log-error

Спасибо kononvaler за подсказку.


Скрипт сортировки закаченных файлов:



$ nano /home/user/.config/transmission-daemon/complete.sh



#################################################################################

# These are inherited from Transmission.                                        #

# Do not declare these. Just use as needed.                                     #

#                                                                               #

# TR_APP_VERSION                                                                #

# TR_TIME_LOCALTIME                                                             #

# TR_TORRENT_DIR                                                                #

# TR_TORRENT_HASH                                                               #

# TR_TORRENT_ID                                                                 #

# TR_TORRENT_NAME                                                               #

#                                                                               #

#################################################################################







#################################################################################

#                                    CONSTANTS                                  #

#                         configure directories and filetypes                   #

#################################################################################





HARDLINKS=false



# The file for logging events from this script

LOGFILE="/home/user/.config/transmission-daemon/complete.log"



# Listening directories

MUSIC_DIR="/home/user/Музыка"

VIDEO_DIR="/home/user/Видео"



# Transmission remote login details. Leave user:pass blank if no authentication

TR_HOST="0.0.0.0"



# Music extensions

MUSIC_EXTS[0]="flac"

MUSIC_EXTS[1]="mp3"



# Video extensions

VIDEO_EXTS[0]="avi"


# Path to new content from transmission

TR_DOWNLOADS="$TR_TORRENT_DIR/$TR_TORRENT_NAME"

#################################################################################

#                                 SCRIPT CONTROL                                #

#                               edit with caution                               #

#################################################################################



function edate

{

  echo "`date '+%Y-%m-%d %H:%M:%S'`    $1" >> "$LOGFILE"

}



function trans_check

{

    edate "$1"

    files=$(find "$TR_DOWNLOADS" -type f -name *.$1 | wc -l) 2> /dev/null

    if [ $files != "0" ]

    then

      echo "$files"

    fi

}


edate "Directory is $TR_TORRENT_DIR"

edate "Torrent ID is $TR_TORRENT_ID"

edate "Torrent Hash is $TR_TORRENT_HASH"

edate "Working on the new download $TR_DOWNLOADS"



# Move new music dir and files to the listening location

# Passes through if none of your extension types are found in

# the new music dir

for i in "${MUSIC_EXTS[@]}"; do

if [ $(trans_check "$i") ]

then

  edate "File $TR_TORRENT_NAME contains audio files!"

  if [ $HARDLINKS == false ]

  then

    edate "Simlink file contents to listening directory. Success!"

    ln -s "$TR_DOWNLOADS" "$MUSIC_DIR" >> "$LOGFILE"

  fi

  if [ $HARDLINKS == true ]

  then

    edate "Hardlinking file contents to listening directory. Success!"

    cp -al "$TR_DOWNLOADS" "$MUSIC_DIR" >> "$LOGFILE"

  fi

fi

done


for i in "${VIDEO_EXTS[@]}"; do

if [ $(trans_check "$i") ]

then

  edate "File $TR_TORRENT_NAME contains video files!"

  if [ $HARDLINKS == false ]

  then

    edate "Simlink file contents to listening directory. Success!"

    ln -s "$TR_DOWNLOADS" "$VIDEO_DIR" >> "$LOGFILE"

  fi

  if [ $HARDLINKS == true ]

  then

    edate "Hardlinking file contents to listening directory. Success!"

    cp -al "$TR_DOWNLOADS" "$VIDEO_DIR" >> "$LOGFILE"

  fi

fi

done

сохраняем и даем права на выполнение

$ chmod +x complete.sh

стартуем демон

$ sudo service transmission-daemon start

Проверяем работоспособность. Кидаем в ~/.torrents торрент файл и заходим в вэб морду http://x.x.x.x:9091/

Загрузка начнется автоматически и в папке Загрузки появится наш файл. Проверяем владельца нового файла, если это наш юзер, то все хорошо. Ждем окончания загрузки и смотрим как отработает скрипт. Скрипт должен создать симлинк на файл или каталог согласно расширениям.

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

Инструкция здесь Вкратце. Скачиваем. Устанавливаем:
$ sudo install gdrive-linux* /usr/local/bin/drive
выполняем
$ drive
программа выдаст линк на авторизацию доступа и будет ждать ввода кодовой фразы. Проходим, получаем кодовую фразу, вставляем в терминал.
Получить список содержимого гуглодиска можно командой
$ drive list
Создаем на гуглодиске каталог .torrents
выполняем drive list и копируем id только что созданного каталога.
Что бы забрать каталог выполним
$ drive download --recursive ID
Для регулярного обновления каталога напишем крохотный скрипт.
$ mkdir ~/.scripts
$ nano ~/.scripts/gupdate.sh

#!/bin/bash
cd /home/user/
drive download --recursive ВАШID

Сохраняем и даем права на выполнение
$ chmod +x ~/.scripts/gupdate.sh
Добавим его в crontab
$ sudo nano /etc/crontab
*/5 * * * * user /home/user/.scripts/gupdate.sh #Раз в пять минут забирать файлы с гуглодиска.

Теперь достаточно кинуть торрент файл в папку .torrents на гуглодиске и через пять минут transmission начнет загрузку.
Для просмотра статуса загрузок и управления ими из kodi, можно поставить плагин Transmission. Он есть в стандартном репозитории.
Есть еще один клиент для синхронизации с гуглдиском google-drive-ocamlfuse
Отличается он тем, что гугл диск монтируется непосредственно в ФС, правда в случае с transmission такая связка не заработала. Но это может быть полезным для синхронизации например фотографий. Впрочем, загрузить что-либо на диск можно и gdrive-ом
В самом kodi необходимо добавить каталоги с музыкой и видео.
Естественно, в доме не только этот медиа сервер. Есть ноутбуки и настольные ПК, а так же телефоны и планшеты.
Первым делом нам необходимо получить доступ к нашей медиатеки с ноутов и ПК. Для этого нам понадобится samba.
$ sudo apt-get install samba
для настройки мы воспользуемся webmin-ом
https://x.x.x.x:10000
Вводим логин и пароль нашего юзера.
Переходим в раздел службы — Файл-сервер Samba
Создаем новый ресурс с гостевым доступом. Затем, в настройках ресурса, в разделе «права на файлы»,выставляем принудительные права на каталоги и файлы от нашего user.
Теперь на адресе \\x.x.x.x мы увидим нашу шару. В win-системах можно настроить подключение сетевого диска. В linux ИМХО, проще sftp, а можно и smb, дело вкуса.

С доступом к медиатеке с других машин разобрались. Можно теперь туда слить все медиафайлы со своего ноута. Не забываем поправить тэги к муз файлам. Например этой утилитой

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

Создаем на сервере папку например /home/user/Фотографии/HTCOne а на телефон скачиваем и устанавливаем приложение «FolderSync»

Это приложение умеет синхронизировать в обе стороны, как по отдельности так и разом.
Может синхронизировать с огромным количеством «облачных» дисков. По большому счету, достаточно было бы синхронизации с гугл диском о чем мы говорили выше. Но цель не размножить контент на все устройства, а перенести его на одно.
В FolderSync добавляем учетную запись с типом SMB. А в заданиях создаем новое. Выбираем созданную учетную запись. Тип синхронизации — на удаленную папку. Выбираем ранее созданную папку на сервере, локальную папку. И настраиваем расписание. Дабы отчистить телефон, выбираем опцию «Удалить исходные файлы». Можно таким же образом кидать фотки на гугл диск, а htpc будет от туда к себе их копировать, так остается доступ к фотографиям из гугл диска. (Но мне оно не надо)

Кстати, в репозитории kodi есть фотодополнение «My Pictures Dstabase». Оно позволяет просматривать фотографии с сортировкой по датам, создавать сборники и т.д.

Вернемся к ОС. На данный момент у нас есть готовый, так сказать, NAS с медиаплеером kodi. Для надежности сохранности данных и для личного спокойствия, необходимо настроить мониторинг самой железки.

Идем в webmin раздел webmin — настройка webmin — Sending Email
Вбиваем настройки почтового ящика. Рекомендую для этих целей создать отдельный ящик.
Отправляем тестовое сообщение, если пришло, продолжаем. Если нет, пробуем разные методы аутентификации. Для ящиков на mail.ru работает метод Login

Установим пакеты:
$ sudo apt-get install smartmontools lm-sensors
включим смарт
$ sudo smartctl -s on /dev/sda

Переходим к настройке мониторинга. Webmin — Прочее — Состояние системы и служб
Выбираем датчик «Проверка SMART диска» жмем добавить датчик. В настройках выбираем диск, остальное оставляем как есть.
Так же точно добавляем датчик «LM Sensors Status». В настройках выбираем наблюдаемые показания и задаем границы для них.

Включаем плановую проверку. По умолчанию раз в пять минут. ИМХО, оптимально.
Для проверки, настроим мониторинг сервера samba и отключим samba. Через пять минут должно прийти сообщение об упавшей самбе.

Немного коснусь темы удаленного управления плеером.
Для этих целей есть отличное мобильное приложение «kore»
Работает на ура, достаточно удобное и функциональное.
Но, в планах прикрутить пульт с ird. Есть how-to

Для медиацентра, имеющегося на данный момент функционала, достаточно. Но мы же помним, что под kodi у нас обычная десктопная Lubuntu. А значит есть возможность как минимум запустить браузер.
Из репозитория superRepo раздел «Программные дополнения» ставим «Advanced Launcher». Заходим на сервер и создаем две папки
$ mkdir ~/.kodi/programs
$ mkdir ~/.kodi/icons

теперь создадим симлинк на браузер
$ ln -s /etc/alternatives/x-www-browser /home/user/.kodi/programs/x-www-browser
и на иконку $ ln -s /usr/share/icons/gnome/256x256/apps/web-browser.png /home/user/.kodi/icons/web-browser.png
В kodi переходим в система — менеджер файлов и добавляем наши источники ~/.kodi/programs ~/.kodi/icons
Запускаем из меню kodi — программы — advanced launcher
Вызываем контекстное меню и выбираем добавить Лаунчер. Прописываем путь до симлинка на исполняемый файл. В дополнительные параметры (модинг параметр) необходимо прописать размер окна с которым будет запускаться браузер. Например: [tt]--width=1024 --height=768[/tt]. Затем путь до иконки и фанарта. Добавим лаунчер в избранное, вызвав контекстное меню. Запустим браузер. Тут все как обычно, за исключением отсутствующего заголовка окна. Для выхода пользуемся хоткеями — Ctrl+Q закроет браузер.

UPD Для плавного воспроизведения IP TV при отсутствии стабильного пинга или инет соединения на компе\сервере добавим файл расширенных настроек.
$ nano ~/.kodi/userdata/advancedsettings.xml

<advancedsettings>
<network>
<cachemembuffersize>157286400</cachemembuffersize>
</network>
<minvideocachelevel>80</minvideocachelevel>
<cacheindvdplayer>false</cacheindvdplayer>
</advancedsettings>

3 комментария:

ksgray комментирует...

А зачем городить в transmission папку .Torrent и gdisk? Не проще ли использовать rpc клиент для Desktop и какой-нибудь Transdroid на Android? У меня подобная связка давненько живёт. Да и домашним привычнее - дважды кликнул на .torrent, увидел интерфейс как у мюторрент в лучшие годы и алга)

Nird комментирует...

Задача была в удаленном запуске торрента. А дома нет статического ip адреса. Да и динамический выдется серый. Следовательно снаружи к домашнему NAS не подключится. А что же до локальной сети, то никого не напрягает открыть web-морду к трансмишену в браузере. В общем даже не рассматривал такой вариант. Но с удовольствием почитал бы о реализации.

ksgray комментирует...

Ну да... без нормального ip смотрящего в интернеты не из за NAT - тяжело((
Да там 4 строки в settings.json и приложение по вкусу. Я использую Transmission Remote GUI, а на телефоне Transdriod.