Nas-server для мультимедиа под ключ

| Сен 5, 2017 | 22 коммент.

Рассчитано на пользователей, знакомых с проектом XPEnology!

Этот мануал является руководством по сборке и настройке NAS-сервера аналогично DS916+ (по праву считающимся пользователями мультимедиа-комбайном) на базе комплектующих, немного превосходящих в своей производительности оригинальные, но стоящих гораздо меньших денег. В частности, вместо CPU Pentium N3710 мы используем Celeron J3455.

 

    4x SATA 6G — max. 550MB/s pro Port
   1x M.2 für W-LAN
    AESNi — Ускорение шифрования и дешифрования
   Vtx, Vtx EPT, VTd — Возможности виртуализации
   2x USB 3.0 + 1x Front-USB 3.0
    2x USB 2.0 + 2x Front-USB 2.0
   1x Gigabit LAN (Realtek RTL8111GR, Wake-On-Lan, Wake-On-Wan, 802.3az EEE, PXE)
   1x HDMI 2.0, 1x DVI + 1x VGA Display
 1x PCIe 2.0 x1

Список комплектующих:

  • Материнская плата: ASRock J3455-ITX
  • ОЗУ: Kingston ValueRAM SO-DIMM 4GB, DDR3L-1600, CL11-11-11 (KVR16LS11/4)
  • Блок питания: Be quiet! System Power 8 400W ATX 2.4 (BN240)
  • Корпус: Fractal Design Core 500 schwarz, Mini-ITX (FD-CA-CORE-500-BK)

Установка операционной системы будет происходить в два этапа:

  1. Запись на USB-флешку отредактированного образа загрузчика.
  2. Старт сервера с USB-флешки, установка и настройка ОС Synology DSM 6.1.x.

Необходимый инструментарий:

Перед записью образа загрузчика на флешку его следует немного подправить с помощью OSFMount в Notepad++

Находим файл grub.cfg и правим его с помощью Notepad++

set extra_initrd="extra.lzma"
set info="info.txt"

set vid=0x090C to vid=0x[your usb drive vid]
set pid=0x1000 to pid=0x[your usb drive pid]
set sn=C7LWN09761 to sn=generate your sn here with DS model
set mac1=0011322CA785 to mac1=[your NIC MAC address]. You can also add set mac2=[your NIC MAC address #2] and so on until mac4 if you have multiple NICs. However, this is not necessary. 
set mac2=xxxxxxxxxxxx
set rootdev=/dev/md0
set netif_num=2
set extra_args_916=''

set common_args_916='syno_hdd_powerup_seq=1 HddHotplug=0 syno_hw_version=DS916+ vender_format_version=2 console=ttyS0,115200n8 withefi elevator=elevator quiet syno_hdd_detect=0 syno_port_thaw=1'

#for testing on VM
set sata_args='SataPortMap=2'

set default='0'
set timeout='4' #timeout='1' to set timeout='4' - This will allow you more time to make a selection in the Grub Boot Menu when it appears
set fallback='1'

Есть ещё один способ установки, при котором образ загрузчика править вовсе не нужно!
Его суть:

  1. Во время загрузки при появлении меню необходимо в течение 1 секунды клавишу «C» (в латиннице).
  2. Для изменения VID введите следующее: vid 0xхххх, где хххх — это 4 цифры VID вашей флешки.
  3. То же самое для PID, SN и MAC1. После каждой команды необходимо нажать «Enter».
  4. Если при вводе цифр была допущена ошибка, просто повторно введите команду с верным значением. После окончания нажмите «Esc».

Ниже приведен пример как это выглядит в среде командной строки Grub:

Подробнее и источник  можете найти здесь

Все образы для загрузчика собраны также здесь

Если с правкой образа загрузчика всё прошло правильно то в итоге после того как задали в консоли команду

cat /usr/syno/etc/codec/activation.conf

должно получится следующее:

а в настройках приложения Video Station должна появится птичка для активации аппаратного ускорения при преобразовании кода

При проигрывании видео будет задействован gst-launch-1.0 (GStreamer) и ffmpeg

Если у вас есть учётка   то вы можете использовать бету версию плекса которую можно найти здесь

<<<<<<<<<<UPDATE>>>>>>>>>>>>  в свежих версиях PlexMediaServer уже всё исправленно!

актуальная версия PlexMediaServer-1.8.1.4140-82ea538ca-x86_64.spk

отдельно фикс здесь

который заключается в следующем:

#добавляем группу
root@DIMI-NAS:~# synogroup --get video
Group Name:
Group Type: [AUTH_LOCAL]
Group ID: [65536]
Group Members:
0:[plex]

#потом в /etc/group правим ид на  65537

#правим файл /lib/udev/rules.d/60-fix-plex-hw-transcoding.rules

#вместо `SUBSYSTEM=="dvb", GROUP="video"

#делаем

SUBSYSTEM=="drm", GROUP="video", MODE="0660"

#и перегружаем полностью нас

 

 

После чего в настройках плекса также появится «птичка» — в этом случае с плексом уже отвечает интеловский модуль i965_dri_video.so

Отдельная тема — это возможность просмотра IPTV.

Для этого у меня в репо докера есть уже несколько готовых контейнеров с уже установленными компонентами требуемыми для просмотра контента как по технологии acestream так и по noxbit

расмотрим на примере этих сборок, одна на базе ubuntu 17, другая на базе debian 8  в которых присутствуют элементы небольшой автоматизации реализованнной с помощью простых скриптов по вытягиванию из сети контента для создания плей листов .m3u и которые в свою очередь будут доступны для скачивания с нашего мини сервера для любых клиентов как домашней локальной так и внешней сети.

2017-10-15 10:18:18,262|MainThread|acestream|init segmenter done: log_path=/root/.ACEStream/logs/segmenter.log
2017-10-15 10:18:18,263|MainThread|acestream|platform=linux
2017-10-15 10:18:18,264|MainThread|acestream|app=acestream
2017-10-15 10:18:18,264|MainThread|acestream|version=3.1.16 code=3011600 revision=3258 date=2017-02-08
2017-10-15 10:18:18,265|MainThread|acestream|use_local_db=True
2017-10-15 10:18:18,265|MainThread|acestream|use_m2crypto=True
2017-10-15 10:18:18,265|MainThread|acestream|enable debug: 0
2017-10-15 10:18:18,268|MainThread|acestream|get_default_api_version: 2
2017-10-15 10:18:18,268|MainThread|acestream.coreapp|use fixed i2i_port: 62062
2017-10-15 10:18:18,269|MainThread|acestream.coreapp|state_dir='/opt/state/.ACEStream'
2017-10-15 10:18:18,785|MainThread|acestream.SocketHandler.InterruptSocket|bound on 127.0.0.1:56588
2017-10-15 10:18:18,786|MainThread|acestream.SocketHandler.SocketHandler|bind: socket bound: host=0.0.0.0 port=9944
2017-10-15 10:18:18,787|MainThread|acestream.LM|listen on 9944
2017-10-15 10:18:18,870|MainThread|acestream.VideoServer|start: addr= port=6878 allow_remote=1 allow_intranet=1
2017-10-15 10:18:20,115|MainThread|acestream.SocketHandler.InterruptSocket|bound on 127.0.0.1:33428
2017-10-15 10:18:20,117|MainThread|acestream.SocketHandler.SocketHandler|bind: socket bound: host=0.0.0.0 port=62062
2017-10-15 10:18:20,118|Instance2InstanceThread-32|acestream.APIServer|run: ready to receive remote commands on 62062

 

Создание контейнера:

  1. На вкладке «Реестр« введите ключевое слово «sybdata»
  2. В результатах поиска выберите нужный контейнер(sybdata/ace3.1-as или sybdata/debproxy). Нажмите расположенную выше кнопку «Загрузить« или просто дважды щелкните его, чтобы начать загрузку. Или выполнить команду в консоли:
    docker pull sybdata/ace3.1-as
    docker pull sybdata/debproxy

     

  3. Перейдите на вкладку Изображение и вы увидите там свой файл изображения.
  4. Контейнер можно создать с помощью мастера, вводя данные вручную, или посредством команды Docker Run. Мы создадим контейнер с помощью мастера.
  5. Пробросить следующие порты: 8621 62062 9944 9903 6878
  6. Активируйте веб сервер если ещё не сделали это раньше и создайте такую папку, например: /web/tv/m3u
  7. Смонтировать следующие папки:
  8. Стартуем контейнер

Работа скрипт генерации плейлистов

Скрипт качает json плейлист с ресурса в сети, парсит его, и генерит стандартный m3u плейлист и m3u плейлист в формате Kodi, для любителей PVR, в папку m3u.
Вам надо только заменить ip адрес в переменной url_prefix на ip вашего сервера, скрипт можно посмотреть здесь: ace.hls_parser.sh

Для редактирования скрипта зайдём в контейтер:

root@nas916:~# docker exec -it as31 /bin/bash
root@as31:/#
root@nas916:~# docker exec -it debproxy /bin/bash
root@debproxy:/#

путь для редактирования:

root@as31:/# nano /mnt/media/playlists/ace.hls_parser.sh

там же в контейнере осталось прописать и запустить в кроне:

crontab -e

Добавьте строчки и сохраните, будет обновляться раз в 6 часов:

0 */6 * * * /mnt/media/playlists/ace.hls_parser.sh > /dev/null 2>&1
@reboot sleep 20 && /mnt/media/playlists/ace_parser.sh > /dev/null 2>&1

Добавте туда же очистку кеша:

0 */2 * * * rm -r /opt/state/.ACEStream/.acestream_cache/* > /dev/null 2>&1
0 */2 * * * rm -r /opt/state/.ACEStream/collected_torrent_files/* > /dev/null 2>&1

или так удалять кеш ещё корректней будет, когда удаляются файлы старше чем 5 минут:

0 */2 * * * find /opt/state/.ACEStream/.acestream_cache/* -depth -type f -mmin +5 -print0 | xargs -0 -r rm -f > /dev/null 2>&1
0 */2 * * * find /opt/state/.ACEStream/collected_torrent_files/* -depth -type f -mmin +5 -print0 | xargs -0 -r rm -f > /dev/null 2>&1

 

Перезапустите крон:

service cron restart

Перезапускаем контейнер

Если всё корректно сделали то плейлисты будут доступны по такому адресу: http//ip nas/tv/m3u/as.m3u

Этот же плейлист можно запустить в трансляцию с помощью плекса и для этого понадобится соответствующий плагин

который можно скачать здесь

распаковать и бросить по этой директории:

/volume1/Plex/Library/Application Support/Plex Media Server/Plug-ins/IPTV.bundle

15.10.17 — подправил образ контейнера

перекачать образ

Расмотрим варианты просмотра тв контента доступные конкректно в этих сборках приведённых выше:

  1. Получение потока напрямую от движка: http:
    http://127.0.0.1:6878/ace/getstream?id=

    hls:

    http://127.0.0.1:6878/ace/manifest.m3u8?id=

    плейлист парсится скриптом ace_parser.sh или ace.hls_parser.sh

    VideoJS Player test

  2. Получение hls и http потока на выбор от встроенной прокси движка через веб интерфейс, этот вариант я специально поставил на 4 место так как он по вине того же веб интерфейса иногда ведёт себя неадекватно, короче тормозит не по теме, но что меня лично привлекает так это просмотр контента по магнет ссылкам или торрент файлам

чтобы включить этот способ необходимо в браузере набрать первый раз:

http://host:6878/webui/app/69696969/server

После первоначальной настройки сводящейся в задании пароля, веб-интерфейс будет уже доступен по этой ссылке:

http://host:6878/server

 

Теперь про кеш, куда его кидать и как его чистить(иначе память отъдает не хило!) с помощью крона, про логи и где их смотреть.

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

--live-cache-type memory

но при просмотре фильмов vod, кеш всё равно будет писатся на диск по пути который задаётся уже другим ключом:

--cache-dir /opt/state/.ACEStream

также прописан ключ на лимит кеша в live:

--live-cache-size 209715200

в кроне как уже выше было, прописываем две команды с интервалом допустим в каждые 2 часа, которые удаляют кеш и collected_torrent_files:

0 */2 * * * rm -r /opt/state/.ACEStream/.acestream_cache/* > /dev/null 2>&1
0 */2 * * * rm -r /opt/state/.ACEStream/collected_torrent_files/* > /dev/null 2>&1

или лучше так:

0 */2 * * * find /opt/state/.ACEStream/.acestream_cache/* -depth -type f -mmin +5 -print0 | xargs -0 -r rm -f > /dev/null 2>&1
0 */2 * * * find /opt/state/.ACEStream/collected_torrent_files/* -depth -type f -mmin +5 -print0 | xargs -0 -r rm -f > /dev/null 2>&1

 

 

22 комментария

  1. jonbv

    Добрый день,попробовал воспроизвести дошел до 8 пункта после строки «Для редактирования скрипта зайдём в контейтер:» не могу понять как зайти в контейнер ?

    Ответить
    • sybdata

      эту команду набираем в терминале на машине на которой у вас докер
      docker exec -it as31 /bin/bash

      Ответить
  2. jonbv

    Условия все обязательны? SN,MAC,plex pass, Учетка TTV

    Ответить
    • sybdata

      для просмотра тв контента не нужно ни одно условие
      а дальше по порядку:
      1.SN,MAC для активации лицензий кодеков в штатном приложении dsm6
      2.plex pass для активации транскодинга в плексе(не зависит от п.1!)
      3.Учетка TTV для использования и совместимости с офф. виджетами ттв например на смарт тел. или на телефоне

      P.S. мануал ещё не закончен, появились в частности новые варианты вытягивания(tor) из сети тв контента
      например если установите tor, то с этой командой получите готовый плейлист:
      root@ace3:/# curl -f -k -L --connect-timeout 30 --proxytunnel --socks5-hostname localhost:9050 -o test.m3u http://hmxuku36whbypzxi.onion/trash/ttv-list/ace.all.iproxy.m3u?ip=ваш ip сервера:6878

      где вставте только ваш ip сервера где установлен контейнер

      Ответить
  3. Viktor

    Добрый день!

    Хочу использовать ваш скрипт для создания плейлиста самого AceStream. Запускаю скрипт и он мне выдает ошибку синтаксиса с сообщением о том, что не закрыто квотирование. Листинг скрипта:

    #!/bin/sh

    path=dirname $0
    parser=»/usr/bin/jq»
    filepath=»/home/pi/playlists»

    playlist_url=»http://pomoyka.win/trash/ttv-list/ace.json»
    json=»$filepath/m3u/ace.json»
    outdir=»$filepath/m3u»

    header=»#EXTM3U»
    newline=»ZFZFaZZZ»
    informational=»informational»

    url_prefix=»http://192.168.1.38:6878/ace/manifest.m3u8?id=»
    url_postfix=»»

    mkdir -p $filepath >> /dev/null 2>&1
    mkdir $filepath/m3u >> /dev/null 2>&1

    rm $json >> /dev/null 2>&1
    wget $playlist_url -O $json

    data=cat $json |$parser '.channels|=sort_by(.cat,.name)'
    size=echo $data |$parser '.channels|length'

    if [ $size -gt 1 ]
    then
    param=»‘.channels|=sort_by(.cat,.name)|.channels[]|select(.cat = \»$informational\»)|\»#EXTINF:-1 group-title=\\»\»+.cat+\»\\», \»+.name+\»$newline\»+\»$url_prefix\»+.url+\»$url_postfix\»‘|sed ‘s/$newline/\n/g'»
    eval «echo \$header; echo \$data | » $parser «-r» $param > $outdir/as.kodi.m3u

    param=»‘.channels|=sort_by(.cat,.name)|.channels[]|select(.cat = \»$informational\»)|\»#EXTINF:-1, \»+.name+\» (\»+.cat+\»)$newline\»+\»$url_prefix\»+.url+\»$url_postfix\»‘|sed ‘s/$newline/\n/g'»
    eval «echo \$header; echo \$data | » $parser «-r» $param > $outdir/as.m3u
    fi

    Подскажите пожалуйста что не так сделал в скрипте.

    Ответить
    • sybdata

      Добрый вечер и рад проветствовать вас на новом месте!

      права на файл ace.hls_parser.sh дали?

      chmod +x /mnt/media/playlists/ace.hls_parser.sh

      если задать команду /mnt/media/playlists/ace.hls_parser.sh , то получите:
      root@aced:/# /mnt/media/playlists/ace.hls_parser.sh
      converted 'http://pomoyka.win/trash/ttv-list/ttv.json' (ANSI_X3.4-1968) -> 'http://pomoyka.win/trash/ttv-list/ttv.json' (UTF-8)
      --2017-10-16 18:02:39-- http://pomoyka.win/trash/ttv-list/ttv.json
      Resolving pomoyka.win (pomoyka.win)... 91.92.66.82, 2001:470:6e:c26:1:1:2:2
      Connecting to pomoyka.win (pomoyka.win)|91.92.66.82|:80... connected.
      HTTP request sent, awaiting response... 200 OK
      Length: 88155 (86K) [application/json]
      Saving to: '/mnt/media/playlists/m3u/ttv.json'

      /mnt/media/playlists/m3u/ttv.json 100%[==========================================================================================================================================>] 86.09K 389KB/s in 0.2s

      2017-10-16 18:02:39 (389 KB/s) - '/mnt/media/playlists/m3u/ttv.json' saved [88155/88155]

      и в папке /mnt/media/playlists/m3u должны появится листы со свежей датой:

      Ответить
  4. Viktor

    Да, дал. Сам скрипт запускается и начинает выполняться. Но в конце выполнения выдает ошибку. А вот такой вот скрипт выполняется без ошибок:

    #!/bin/sh

    path=dirname $0
    parser=»/usr/bin/jq»
    filepath=»/home/pi/playlists»

    playlist_url=»http://pomoyka.win/trash/ttv-list/ttv.json»
    json=»$filepath/m3u/ttv.json»
    outdir=»$filepath/m3u»

    header=»#EXTM3U»
    newline=»ZFZFaZZZ»
    informational=»informational»

    url_prefix=»http://192.168.1.38:6878/ace/manifest.m3u8?id=»
    url_postfix=»»

    mkdir -p $filepath >> /dev/null 2>&1
    mkdir $filepath/m3u >> /dev/null 2>&1

    rm $json >> /dev/null 2>&1
    wget $playlist_url -O $json

    data=cat $json |$parser '.channels|=sort_by(.cat,.name)'
    size=echo $data |$parser '.channels|length'

    if [ $size -gt 1 ]
    then
    param=»‘.channels|=sort_by(.cat,.name)|.channels[]|select(.cat = \»$informational\»)|\»#EXTINF:-1 group-title=\\»\»+.cat+\»\\», \»+.name+\»$newline\»+\»$url_prefix\»+.url+\»$url_postfix\»‘|sed ‘s/$newline/\n/g'»
    eval «echo \$header; echo \$data | » $parser «-r» $param > $outdir/as.kodi.m3u

    param=»‘.channels|=sort_by(.cat,.name)|.channels[]|select(.cat = \»$informational\»)|\»#EXTINF:-1, \»+.name+\» (\»+.cat+\»)$newline\»+\»$url_prefix\»+.url+\»$url_postfix\»‘|sed ‘s/$newline/\n/g'»
    eval «echo \$header; echo \$data | » $parser «-r» $param > $outdir/as.m3u
    fi

    Что в первом я не так сделал, не подскажете?

    Ответить
  5. sybdata

    ну искать пропущеный знак или что то в этом роде я не парюсь,
    просто на гите лежит всегда оригинал ace.hls_parser.sh

    скачать можно wget
    wget https://raw.githubusercontent.com/sybdata/ace3.1-as/master/ace.hls_parser.sh

    c ace.json тоже прошло
    root@aced:/# /mnt/media/playlists/ace.hls_parser.sh
    converted 'http://pomoyka.win/trash/ttv-list/ace.json' (ANSI_X3.4-1968) -> 'http://pomoyka.win/trash/ttv-list/ace.json' (UTF-8)
    --2017-10-16 18:31:26-- http://pomoyka.win/trash/ttv-list/ace.json
    Resolving pomoyka.win (pomoyka.win)... 91.92.66.82, 2001:470:6e:c26:1:1:2:2
    Connecting to pomoyka.win (pomoyka.win)|91.92.66.82|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 20345 (20K) [application/json]
    Saving to: '/mnt/media/playlists/m3u/ace.json'

    /mnt/media/playlists/m3u/ace.json 100%[==========================================================================================================================================>] 19.87K --.-KB/s in 0.06s

    2017-10-16 18:31:26 (348 KB/s) - '/mnt/media/playlists/m3u/ace.json' saved [20345/20345]

    Ответить
  6. Viktor

    C концовкой файла
    if [ $size -gt 1 ]
    then
    param=»‘.channels|=sort_by(.cat,.name)|.channels[]|select(.cat = \»$informational\»)|\»#EXTINF:-1 group-title=\\»\»+.cat+\»\\», \»+.name+\»$newline\»+\»$url_prefix\»+.url+\»$url_postfix\»‘|sed ‘s/$newline/\n/g'»
    eval «echo \$header; echo \$data | » $parser «-r» $param > $outdir/as.kodi.m3u

    param=»‘.channels|=sort_by(.cat,.name)|.channels[]|select(.cat = \»$informational\»)|\»#EXTINF:-1, \»+.name+\» (\»+.cat+\»)$newline\»+\»$url_prefix\»+.url+\»$url_postfix\»‘|sed ‘s/$newline/\n/g'»
    eval «echo \$header; echo \$data | » $parser «-r» $param > $outdir/as.m3u
    fi

    у меня тоже скрипт отрабатывает.

    Как часто потоки «протухают»? Через какой промежуток времени нужно плейлист обновлять?

    Ответить
    • sybdata

      потоки, точнее сиды каналов меняют в основном раз в сутки, некоторые долго не меняют, сиды ттв и сиды acestream разные и кстати последний долго не меняет

      6 часов на период обновления думаю достаточно

      Ответить
      • Виктор

        Спасибо!

        Ответить
  7. Viktor

    Можно еще ссылочку где скачать скрипт ace_parser.sh.

    Ответить
  8. deloza

    Вечер добрый.
    Железо то-же. Установил 916. Кодеки активные, галка в Video Station для активации аппаратного ускорения появилась.
    Но когда выбираю аппаратное ускорения то половина видео не запускается и главное не видно активного gst-launch-1.0.
    Может подскажите куда копать?
    Спасибо.

    Ответить
    • sybdata

      Добрый вечер,

      дайте мне на пробу что нибудь из «половина видео»

      Ответить
  9. sybdata

    видео с кроликом играет у меня без проблем

    Ответить
    • deloza

      да и с plex (plex pass есть) такая же ерунда, не ту заветной фразы «hwaccel».

      Ответить
      • sybdata

        я придумал или нарисовал что ли по вашему?

        фикс c плексом делали как я писал?

        на мыло скинул вам линк с кроликом

        Ответить
        • deloza

          Я за помощью, второй день танцую вокруг этого аппаратного ускорения , абсолютно без претензий. Думал может где-то что-то упустил.
          По линку кролик не пускается. Видео с лагерем то же не идет.

          Ответить
          • sybdata

            у меня идёт, без понятия где вы запускаете

            проверьте на других плеерах, девайсах

            проверил линк на телефоне, без проблем

            скинул только что знакомому на телефон, и он тоже говорит что немного вначале грузилось но потом идёт нормально

Добавить комментарий