Что такое minidlna на роутере

Время на прочтение
10 мин

Количество просмотров 61K

На кой черт это надо?

Так сложились обстоятельства, что мне удалось скоммуниздить старенький ПК, да и чтобы он просто не пылился, так как такое старье продавать за 5-7 тысяч (цена в моем регионе за подобную конфигурацию) мне стыдно, а получать за него 3 тысячи — ну такое. Я решил, сделаю дома небольшую библиотеку фильмов, музыки, да и у жены очень много фотографий, которые её очень дороги. Задумка была следующей.

  • Некий медиа сервер, который будет транслировать медиаконтент на телевизор.

  • Некое локальное хранилище для файлов, порой приходится с флешками побегать, а то жесткого диска на 500ГБ не хватает.

  • Торрент клиент, который будет качать все что я пожелаю.

Цели поставлены, осталось их реализовать. Вряд ли опытные пользователи найдут здесь что-то полезное для себя, наверное, только начинающие пользователи Linux, так как все действия очень простые в исполнении.

Установка Linux

То, как поставить линукс, я думаю, не стоит говорить. Я просто опишу что я сделал после установки. Во-первых, пока компьютер был возле меня, я настроил статический адрес в файле /etc/netplan/00-installer-config.yaml

# This is the network config written by 'subiquity'
#ens34
network:
ethernets:
 ens34:
  addresses:
   - 192.168.31.5/24
  gateway4: 192.68.31.1
  nameservers:
   addresses: [192.168.31.1, 8.8.8.8]
 optional: true
 version: 2

Думаю, тут вроде понятно, что где что и как. Конечно, правильнее было бы привязать ip-адрес через роутер, но у меня роутер Xiaomi, и там все в иероглифах… Я просто сделал статический ip-адрес на компьютере. После этого я его отнес в подвал и подключил к роутеру и сел за рабочую машину. Теперь стоит создать пару ssh-ключей для удобства

maks@Kubuntu:~/.ssh$ ssh-keygen -f ~/.ssh/home
Generating public/private rsa key pair.

Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/maks/.ssh/home
Your public key has been saved in /home/maks/.ssh/home.pub
The key fingerprint is:
SHA256:i4rpsCZdQq5S+M2JyPWavEtCZqjsIJj2rHa69dzPgz0 maks@Kubuntu
The key's randomart image is:
+---[RSA 3072]----+
|                 |
|                 |
|                 |
|. .              |
|.B      S        |
|O.+..  . .       |
|OX.O... +        |
|X*@+Bo...E       |
|**OO=o ..oo      |
+----[SHA256]-----+
maks@Kubuntu:~/.ssh$ 

Ну и отправил ключ на медиа сервер

$ ssh-copy-id -i ~/.ssh/home.pub maks@192.168.31.5
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/maks/.ssh/home.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed%sudo   ALL=(ALL:ALL) NOPASSWD:ALL
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
maks@192.168.31.5's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'maks@192.168.31.5'"
and check to make sure that only the key(s) you wanted were added.

Теперь настрою файл ~/.ssh/config

Host home
        HostName        192.168.31.5
        User            maks
        IdentityFile    /home/maks/.ssh/home

И теперь для подключения достаточно написать ssh home,и последний момент, которой наверное не стоит делать, это убрать ввод пароля при использовании sudo. Для этого достаточно добавить NOPASSWD в файл /etc/sudoerc что бы вышло так

%sudo   ALL=(ALL:ALL) NOPASSWD:ALL

Установка transmission-daemon

И так, начну с торрент-клиента transmiss-daemon.

$ sudo apt update && sudo apt upgrade -y && sudo apt install -y transmission-daemon

Так обновятся все пакеты и установится transmiss-daemon. Вообще не рекомендуется ставить без ведома все подряд, но так как у меня система только что установленная, установятся только обновления системных пакетов, и вряд тли что-то сломается. После установки transmission-daemon нужно его выключить для того что произвести настройку.

$ sudo systemctl stop transmission-daemon.service 

Если править файл конфигурации /etc/transmission-daemon/settings.json в тот момент как демон работает, изменения не сохранятся. И так мне надо поправить несколько строк, но для начала создам папки куда будет все качаться. Я создам все папки для медиа контента в /media и будет /media/torrent/downloads для загружаемых файлов и /media/torrent/complete для файлов которые уже загрузились

$ mkdir -p /media/torrent/{downloads,complete}

сразу сменю владельца на папки для загрузки на debian-transmission

$ sudo chown -R debian-transmission:debian-transmission /media/torrent

Теперь можно приступать к настройке transmission. Как уже говорилось, все настройки хранятся в файле /etc/transmission-daemon/settings.json. Нам необходимо поправить несколько строк, а именно

  • "download-dir": "/var/lib/transmission-daemon/downloads" — указываем папку куда будут помещаться загруженные файлы, у меня в /media/torrent/complete Лучше указывать полный путь

  • "incomplete-dir": "/var/lib/transmission-daemon/Downloads"— указываем папку в которой будут храниться не докачавшиеся файлы, у меня /media/torrent/downloads

  • "incomplete-dir-enabled": false — указываем true что бы хранить скачавшиеся файлы отдельно

  • "rpc-authentication-required": true — меняем на false для отключения авторизации по логину и паролю, это пожеланию

  • "rpc-host-whitelist-enabled": true — меняем на false для отключения использования «белого списка ip-адресов»

  • "rpc-password": "{a3edc70552a46d634e81ad9fabca6f51f9303197F8.No4L4" — указываем свой пароль для авторизации, если вы оставили авторизацию по паролю. Так же сразу хочу сказать, что после того как вы включите transmiss-daemon то пароль автоматически зашифруется

  • "rpc-username": "transmission" — указываем логин для авторизации

  • "rpc-whitelist-enabled": true — опять-таки отключаем авторизацию по разрешенным ip-адресам меняя true на false соответственно

И запуск transmission

sudo systemctl start transmission-daemon.service

и захожу в web-панель transmission по ip-адресу и порту 9091, у меня это 192.168.31.5:9091

web-интерфейс transmission

web-интерфейс transmission

transmission почти готов теперь настрою проксирование через NGINX

Установка NGINX и настройка проксирования

Я поставил весь nginx, но в теории достаточно и самого пакета nginx

sudo apt install -y nginx-full

После установки проверю, работает ли веб сервер зайдя на ip-адрес машины

Приветственное сообщение от Nginx

Приветственное сообщение от Nginx

Теперь выполню настройку nginx. Все конфигурационные файлы находятся в /etc/nginx/*. Для начала я удалю все лишнее из файла /etc/nginx/nginx.conf и приведу его к такому виду

nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
}

http {
        sendfile on;
        tcp_nopush on;
        types_hash_max_size 2048;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;


        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/home.conf;
}

И создам файл /etc/nginx/sites-enabled/home.conf с базовым содержимым

home.conf

server {
        listen 80;

        root /var/www/home;

        server_name home.ru;

        location / {
                index index.html;
                try_files $uri $uri/ =404;
        }
}

Немного объясню файл. listen 80 указываем на каком порту будет слушаться сайт, root /var/wwww/home я создал папку от имени root и поместил туда простую страницу html взятую из интернета для проверки как будет все работать.

html страница скачанная из интернета

html страница скачанная из интернета

Так же я добавил строку 192.168.31.5    home.ru в рабочей машине в файл /etc/hosts для того что бы сайт мог открываться в браузере с рабочей машины по адресу home.ru что и указал в файле home.conf server_name home.ru

Настройка проксирования transmission-daemon через nginx

NGINX вообще мощная фигня, и для того что бы открывать web-панель transmisson через http://home.ru/transmission/ его будет более чем достаточно. Все правки я буду делать в файле /etc/nginx/sites-enabled/home.conf для начала добавлю новый location и в нём укажу что бы он проксировал запрос с home.ru/transmission/ на 127.0.0.1:9091

блок location для transmission

        location /transmission/ {
                proxy_pass http://localhost:9091 ;
        }

transmission-daemon просит X-Transmission-Session-Id

transmission-daemon просит X-Transmission-Session-Id

Перенаправление пошло, но вот только transmission жалуется на отсутствие хедера X-Transmission-Id. Немного поковырявши хедеры, так же добавив 2 блока location мне удалось завести transmission. Вот полный файл конфигурации

полный файл home.conf

server {
        listen 80;

        root /var/www/home;

        server_name home.ru;

        location / {
                index index.html;
                try_files $uri $uri/ =404;
        }

        location /transmission/ {
                proxy_read_timeout 300;
                proxy_pass_header  X-Transmission-Session-Id;
                proxy_set_header   X-Forwarded-Host $host;
                proxy_set_header   X-Forwarded-Server $host;
                proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass         http://127.0.0.1:9091/transmission/web/;
        }

        location /rpc {
                proxy_pass         http://127.0.0.1:9091/transmission/rpc;
        }
       
        location /upload {
                proxy_pass         http://127.0.0.1:9091/transmission/upload;
        }
}

transmission заработал

transmission заработал

Написание скрипта

Так сложилось, что у меня телевизор Samsung толком не воспроизводит видео в формате avi, а если и воспроизводит то как то криво. Нельзя перемотать, длительность фильма такая — что люди стока не живут, да и самое неприятное заключается в том что посреди фильма он может просто оборваться. А вот формат mkv он ест нормально. И поэтому я решил написать небольшой скрипт на bash который будет запускать сам transmission-daemon после загрузки файла. Немного подумав над логикой и посмотрев как качаются разные файлы, выстроил себе цепочку действий. Во-первых надо понять, скачалась папка или файл. Если папка, то создать такую же папку в директории для DNLA сервера, если файл, то пропускаем. Возвращаемся к папке, теперь смотрим на содержимое папки, если файлы avi то конвертируем их через ffmpeg в конечную папку, если в папке файлы mkv то просто перемещаю их, но если там то-то другое, просто кидаю в /tmp для дальнейшего анализа. Теперь возвращаемся к началу скрипта, если же это не папка, а файл то, смотрим на формат и при необходимости конвертируем. Вроде ничего сложного, вот сам скрипт

скрипт download.sh

#!/bin/bash
COMPLETE="путь_к_конечным_файлам"
CHAT_ID="сюда_чат_айди"
TELEGRAM_BOT="сюда_айди_телеграм_бота"

#Функция для обработки папки
dir () {
        #Создаю папку для медиасервера
        mkdir $COMPLETE/$TR_TORRENT_NAME
        #Прохожу по всем файлам в папке
        for movie in $(ls $TR_TORRENT_DIR/$TR_TORRENT_NAME)
        do
                #Если фильм ави
                if [[ $movie == *avi ]]; then
                        #Конвертирую его в mkv
                        ffmpeg -i $TR_TORRENT_DIR/$TR_TORRENT_NAME/$movie $COMPLETE/$TR_TORRENT_NAME/$movie.mkv
                #Если фильм mkv
                elif [[ $movie == *mkv ]]; then
                        #Перемещаю фильм в конечную папку
                        mv $TR_TORRENT_DIR/$TR_TORRENT_NAME/$movie $COMPLETE/$movie
                #Если непонятный файл, отправляю его в /tmp
                else
                        mkdir /tmp/$TR_TORRENT_NAME
                        mv $TR_TORRENT_DIR/$TR_TORRENT_NAME/$movie /tmp/$TR_TORRENT_NAME/$movie
                        echo -e "$movie\nбыл непонятен скрипту. Нужно сюда заглянуть\n/tmp/$TR_TORRENT_NAME/$movie" >> /tmp/$TR_TORRENT_NAME.message
                fi
        done
        echo -e "Торент\n$TR_TORRENT_NAME\nзагружен" >> /tmp/$TR_TORRENT_NAME.message
}

#Если скачался просто файл
file () {
        #Так же проверяю на формат
        if [[ $TR_TORRENT_DIR/$TR_TORRENT_NAME == *avi ]]; then
                #Крнвертирую
                ffmpeg -i $TR_TORRENT_DIR/$TR_TORRENT_NAME $COMPLETE/$TR_TORRENT_NAME.mkv
        elif [[ $TR_TORRENT_DIR/$TR_TORRENT_NAME == *mkv ]]; then
                #Перемещаю
                mv $TR_TORRENT_DIR/$TR_TORRENT_NAME $COMPLETE/$TR_TORRENT_NAME
        else
                mkdir /tmp/$TR_TORRENT_NAME
                mv $TR_TORRENT_DIR/$TR_TORRENT_NAME /tmp/$TR_TORRENT_NAME/$TR_TORRENT_NAME
                echo -e "Торрент\n$TR_TORRENT_NAME\nзагружен и не понятен скрипту" >> /tmp/$TR_TORRENT_NAME.message
        fi
        echo -e "Торрент\n$TR_TORRENT_NAME\nзагружен" >> /tmp/$TR_TORRENT_NAME.message
}

send_message () {
        curl https://api.telegram.org/bot$TELEGRAM_BOT/sendMessage?parse_mode=markdown -d chat_id=$CHAT_ID -d text="$(</tmp/$TR_TORRENT_NAME)"
}

if [[ -d $TR_TORRENT_DIR/$TR_TORRENT_NAME ]]; then
        dir
else
        file
fi
send_message

#Удаляю старые файлы если они есть
rm -rf $TR_TORRENT_DIR/$TR_TORRENT_NAME
rm -rf /tmp/$TR_TORRENT_NAME.message

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

sudo mv download.sh /etc/transmission-daemon/ 

даю скрипту права на исполнения

sudo chmod +x download.sh

и меняю владельца

sudo chown debian-transmission:debian-transmission /etc/transmission-daemon/download.sh

После останавливаю transmission-daemon  

sudo systemctl stop transmission-daemon

  и меняю 2 параметра в /etc/transmission-daemon/setings.json

  • «script-torrent-done-enabled»: false

  • «script-torrent-done-filename»: «»

done-enabled перевожу на true, то-есть включаю активацию скрипта по окончанию загрузки, а done-file указываю полный путь к файлу, можно указать только название файла если файл лежит в папке transmission, но мне легче указать полный путь.

"script-torrent-done-enabled": true,
"script-torrent-done-filename": "/etc/transmission-daemon/download.sh",

Установка медиа сервера

В качестве медиа сервера DNLA я выбрал minidlna. Ставится из репозитория ubuntu, прост в настройке.

sudo apt install -y minidlna

Файл конфигурации находится /etc/minidlna.conf, я в нем внес несколько правок, а именно, указал где находятся медиаконтент

  • media_dir=A,/media/gerbera/music

  • media_dir=P,/media/gerbera/photo

  • media_dir=V,/media/gerbera/movie

Указал где хранить базу данных файлов minidlna

db_dir=/var/cache/minidlna

Указал куда писать логи

log_dir=/var/log/minidlna

и указал имя сервера

friendly_name=Home_Media

и в конце перезапустил сервер

sudo systemctl restart minidlna

И получил результат

Напоследок

Писать о том как я настроил временно samba не буду. Есть очень много мануалов в котором все описано куда лучше, чем смогу описать я, но хочу поделится несколькими мыслями на будущие) Целый комп для этого излишнее, тем более у меня есть роутер с прошивкой OpenWRT на котором можно все это реализовать, но жена мне раз дала идею сделать мониторинг цен. Я такое уже делал, написал небольшой скрипт на bash который парсил страницу, брал оттуда название товара, картинку и цену. Скрипт запускался через cron. Идея неплохая, но для каждого сайта необходимо делать свой шаблон. И скорее всего сайты по типу Wildberries при авторизации будут показывать другую цену. Идею думаю реализовать на C++, которые будут брать ссылку для просмотра из БД и смотреть на цену. Если цена записанная в БД будет больше, то отправлять сообщение в том же телеграме о том что на такой-то товар ценна изменилась. Да и для разных экспериментов и обучения можно поднимать сервере виртуальную машину и её ковырять. Так же есть идея реализовать некую запись телепередач. У нас нет обычного телевидения, есть всего 1 канал XD, и жена смотрит несколько передач. Думаю просто настроить запись их в тот же медиа сервер. Но все это планы, желание на исполнения не много.

P.S.

Я впервые пишу такой длинный текст, и вообще в первые куда-то пишу по мимо личных сообщений. Не судите строго.

MiniDLNA is a lightweight DLNA/UPnP media server. The MiniDNLA daemon serves media files (music, pictures, and video) to clients on a network.

opkg update
opkg install minidlna

Edit one of the following files depending on your miniDLNA Version:

/etc/minidlna.conf
/etc/config/minidlna.conf
/tmp/minidlna.conf
#------------------------------------------------------#
# port for HTTP (descriptions, SOAP, media transfer) traffic
#------------------------------------------------------#
port=8200
 
#------------------------------------------------------#
# network interfaces to serve, comma delimited
#------------------------------------------------------#
network_interface=br-lan
 
#------------------------------------------------------#
# set this to the directory you want scanned.
# * if have multiple directories, you can have multiple media_dir= lines
# * if you want to restrict a media_dir to a specific content type, you
#   can prepend the type, followed by a comma, to the directory:
#   + "A" for audio  (eg. media_dir=A,/home/jmaggard/Music)
#   + "V" for video  (eg. media_dir=V,/home/jmaggard/Videos)
#   + "P" for images (eg. media_dir=P,/home/jmaggard/Pictures)
#------------------------------------------------------#
# Directory of media is depend on your storage
#------------------------------------------------------#
media_dir=A,/mnt/sda1/music
media_dir=P,/mnt/sda1/picture
media_dir=V,/mnt/sda1/video
#------------------------------------------------------#
# set this if you want to customize the name that shows up on your clients
#------------------------------------------------------#
friendly_name=My DLNA Server
 
#------------------------------------------------------#
# set this if you would like to specify the directory where you want MiniDLNA to store its database and album art cache
#------------------------------------------------------#
db_dir=/mnt/sda1/minidlna/db
 
#------------------------------------------------------#
# set this if you would like to specify the directory where you want MiniDLNA to store its log file
#------------------------------------------------------#
log_dir=/mnt/sda1/minidlna/log
 
#------------------------------------------------------#
# this should be a list of file names to check for when searching for album art
# note: names should be delimited with a forward slash ("/")
#------------------------------------------------------#
album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg
 
#------------------------------------------------------#
# set this to no to disable inotify monitoring to automatically discover new files
# note: the default is yes
#------------------------------------------------------#
inotify=yes
 
#------------------------------------------------------#
# set this to yes to enable support for streaming .jpg and .mp3 files to a TiVo supporting HMO
#------------------------------------------------------#
enable_tivo=no
 
#------------------------------------------------------#
# set this to strictly adhere to DLNA standards.
# * This will allow server-side downscaling of very large JPEG images,
#   which may hurt JPEG serving performance on (at least) Sony DLNA products.
#------------------------------------------------------#
strict_dlna=no
 
#------------------------------------------------------#
# default presentation url is http address on port 80
#------------------------------------------------------#
presentation_url=http://192.168.1.1:8200/
 
#------------------------------------------------------#
# notify interval in seconds. default is 895 seconds.
#------------------------------------------------------#
notify_interval=900
 
#------------------------------------------------------#
# serial and model number the daemon will report to clients
# in its XML description
#------------------------------------------------------#
serial=12345678
model_number=1
 
#------------------------------------------------------#
# specify the path to the MiniSSDPd socket
#------------------------------------------------------#
#minissdpdsocket=/var/run/minissdpd.sock
 
#------------------------------------------------------#
# use different container as root of the tree
# possible values:
#   + "." - use standard container (this is the default)
#   + "B" - "Browse Directory"
#   + "M" - "Music"
#   + "V" - "Video"
#   + "P" - "Pictures"
# if you specify "B" and client device is audio-only then "Music/Folders" will be used as root
#------------------------------------------------------#
#root_container=.

This describes the configuration options in /etc/config/minidlna.

FIXME This is just an initial dump of all the options I found, I am not certain about any other options or their actual meaning!

FIXME I just guessed the Type entries. — hcc23 2013/02/21 02:02

Name Type Required Default Description
enabled boolean ??? 0
port string ??? 8200 port for HTTP (descriptions, SOAP, media transfer) traffic
interface string ??? br-lan network interfaces to serve; comma (,) delimited
friendly_name string no (none) set this if you want to customize the name that shows up on your clients
db_dir string no /var/run/minidlna set this if you would like to specify the directory where you want MiniDLNA to store its database and album art cache
log_dir string no /var/log set this if you would like to specify the directory where you want MiniDLNA to store its log file
inotify boolean no 1 set this to no to disable inotify monitoring to automatically discover new files
enable_tivo boolean no 0 set this to yes to enable support for streaming .jpg and .mp3 files to a TiVo supporting HMO
strict_dlna boolean ??? 0 strictly adhere to DLNA standards; This will allow server-side down-scaling of very large JPEG images, which may hurt JPEG serving performance on (at least) Sony DLNA products.
notify_interval integer no 895 notify interval in seconds
serial integer ??? 12345678 model number the daemon will report to clients in its XML description
model_number integer ??? 1 model number the daemon will report to clients in its XML description
root_container .,B,M,V,P no . container for the tree root; .: default, B:browse directory, M:music, V:video, P:pictures
media_dir string ??? /mnt set this to the directory you want scanned;if have multiple directories, you can have multiple media_dir lines; if you want to restrict a media_dir to a specific content type, you can prepend the type, followed by a comma, to the directory: A for audio (eg. A,/home/jmaggard/Music)V for video, P for pictures; if you specify B and client device is audio-only then “Music/Folders” will be used as root
album_art_names string no Cover.jpg/
cover.jpg/
AlbumArtSmall.jpg/
albumartsmall.jpg/
AlbumArt.jpg/
albumart.jpg/
Album.jpg/
album.jpg/
Folder.jpg/
folder.jpg
a list of file names to check when searching for album art; / delimited
presentation_url string ??? default presentation url is http address on port 80
minisdpdsocket string ??? specify the path to the MiniSSDPd socket

MiniDLNA’s inotify support may not work as expected when trying to watch on an overlayfs filesystem.
In the case of extroot, e.g. you can watch on /overlay/root/minidlna instead of /root/minidlna.

If you have a decent size music library, you will more than likely find building the minidlna database on your OpenWrt device extremely slow or impossible due to RAM constraints.
The solution is to build the minidlna database on a Linux PC.

# Create a directory on your OpenWrt hard or flash drive to hold the minidlna log and database files
mkdir /mnt/hdd/minidlna
 
# Configure minidlna to put database and log file on the hard or flash drive connected to your OpenWrt device
uci set minidlna.@minidlna[0].option.inotify="0"
uci set minidlna.@minidlna[0].db_dir="/mnt/hdd/minidlna"
uci set minidlna.@minidlna[0].log_dir="/mnt/hdd/minidlna"
uci add_list minidlna.@minidlna[0].media_dir="A,/mnt/hdd/media"
uci commit minidlna
 
# Create a minidlna configuration file on the hard or flash drive connected to your OpenWrt device
cat << EOF > cp_minidlna_conf.sh
#!/bin/sh
 
source /lib/functions.sh
 
minidlna_cfg_append() {
	echo "$1" 
}
 
minidlna_cfg_addbool() {
	local cfg="$1"
	local key="$2"
	local def="$3"
	local val
 
	config_get_bool val "$cfg" "$key" "$def"
	[ "$val" -gt 0 ] && val="yes" || val="no"
	minidlna_cfg_append "$key=$val"
}
 
minidlna_cfg_addstr() {
	local cfg="$1"
	local key="$2"
	local def="$3"
	local val
 
	config_get val "$cfg" "$key" "$def"
	[ -n "$val" ] && minidlna_cfg_append "$key=$val"
}
 
minidlna_cfg_add_media_dir() {
	local val="$1"
 
	minidlna_cfg_append "media_dir=$val"
}
 
minidlna_create_config() {
	local cfg="$1"
	local port
	local interface
 
	config_get port "$cfg" port
	config_get interface "$cfg" interface
 
	[ -z "$interface" -o -t "$port" ] && return 1
 
	echo "# this file is generated automatically, don't edit" 
 
	minidlna_cfg_append "port=$port"
	minidlna_cfg_append "network_interface=$interface"
 
	minidlna_cfg_addstr "$cfg" friendly_name
	minidlna_cfg_addstr "$cfg" db_dir
	minidlna_cfg_addstr "$cfg" log_dir
	minidlna_cfg_addbool "$cfg" inotify "1"
	minidlna_cfg_addbool "$cfg" enable_tivo "0"
	minidlna_cfg_addbool "$cfg" strict_dlna "0"
	minidlna_cfg_addstr "$cfg" album_art_names
	minidlna_cfg_addstr "$cfg" presentation_url
	minidlna_cfg_addstr "$cfg" notify_interval "900"
	minidlna_cfg_addstr "$cfg" serial "12345678"
	minidlna_cfg_addstr "$cfg" model_number "1"
	minidlna_cfg_addstr "$cfg" minissdpsocket
	minidlna_cfg_addstr "$cfg" root_container "."
	config_list_foreach "$cfg" media_dir minidlna_cfg_add_media_dir
 
	return 0
}
 
config_load minidlna
 
minidlna_create_config config
EOF
 
chmod +x cp_minidlna_conf.sh
./cp_minidlna_conf.sh > /mnt/hdd/minidlna/minidlna.conf
 
# Remove the hard or flash drive from the OpenWrt device and connect it to your Linux PC
block umount
 
# Build the minidlna database on a Linux PC with http://sourceforge.net/projects/minidlna/files/minidlna/1.1.4/
minidlnad -d -R -v -f /mnt/hdd/minidlna/minidlna.conf
 
# Remove the hard or flash drive from your Linux PC and reconnect to your OpenWrt device
block mount

Ensure that the Linux PC portable hard or flash drive mount point is exactly the same as the OpenWrt hard or flash drive mount point. Otherwise, the OpenWrt minidlna will delete and rescan the database you generated on the PC since the paths don’t match

This method has been tested with an Openwrt device with 32MB of RAM and a music library of over 11,000 songs. You may also want to add swap if you are running low on memory.

В
настоящее время подавляющее большинство маршрутизаторов с USB-портом
имеют медиа-сервер DLNA, это означает, что, если мы подключим внешний
жесткий диск или флешку, мы сможем воспроизводить мультимедийный контент
на любом устройстве, подключенном к домашней локальной сети, без
необходимость ничего не делать. Однако возможно, что наш маршрутизатор
недостаточно мощный для выполнения этой задачи, тем более, что для
чтения фильма или сериала, который мы собираемся воспроизвести,
используется много процессора, и, в зависимости от битрейта
мультимедийного контента, он может не хватить. По этой причине наиболее
распространенным является использование внешнего сервера DLNA на любом
сервере на базе Linux, таком как Debian на NAS, Raspberry Pi или любое устройство.

Для всего этого нам будет служить DLNA-сервер на сервере с операционной системой Linux:

  • Это
    позволяет нашему телевизору обнаруживать сервер и воспроизводить
    контент (аудио, видео и фотографии), который находится на сервере.
  • Другие
    устройства, такие как смартфоны, планшеты и даже наша консоль, также
    могут обнаруживать его и воспроизводить содержимое сервера DLNA через
    Wi-Fi.
  • Мы можем подключить другие устройства, например, совместимые колонки.

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

Серверы DLNA, которые мы можем использовать

Одним из наиболее широко используемых серверов DLNA является популярный miniDLNA
, который совместим со многими операционными системами и практически со
всеми устройствами. В нашем случае это тот, который всегда давал нам
лучший результат, хотя есть и другие, такие как Fuppes, которые также
работают очень хорошо (интегрированы в XigmaNAS-ориентированную
операционную систему NAS). Другими широко используемыми серверами DLNA
являются, например, Plex Media Server, который не только включает Plex,
но и встроенный сервер DLNA для тех телевизоров, которые несовместимы с
вашим приложением.

Основными характеристиками miniDLNA является то, что это сервер DLNA, который потребляет очень мало ресурсов, как на CPU / ЦЕНТРАЛЬНЫЙ ПРОЦЕССОР и Оперативная память
На уровне, все будет работать очень быстро, а загрузка процессора будет
как раз при чтении мультимедийного содержимого внешнего диска. Этот
сервер DLNA может быть установлен на любом Linux, независимо от
оборудования, хотя по логике нам нужно, чтобы он был чем-то мощным,
чтобы не было никаких проблем, и мы должны учитывать его потребление
электроэнергии, потому что он будет активирован 24 часа в сутки. .
Другие характеристики заключаются в том, что он имеет действительно
простую конфигурацию, но очень важная деталь заключается в том, что он
не позволяет перекодировать аудио и / или видео, таким образом, мы
должны убедиться, что наш телевизор поддерживает различные существующие
видеоформаты.

В этой статье мы использовали miniDLNA более 5 лет, и
за все это время у нас не было никаких проблем с воспроизведением
мультимедийного контента, за исключением тех старых телевизоров, которые
не поддерживают новые видеокодеки, такие как H.265, но если ваш
телевизор новый (относительно), у вас не должно возникнуть проблем. +

Установка и ввод в эксплуатацию MiniDLNA

Программа
miniDLNA настолько хорошо известна, что у нас есть она доступна в
официальных репозиториях основных дистрибутивов GNU / Linux, поэтому она
будет у нас через диспетчер пакетов. В этом руководстве мы использовали
Debian 10, но вы можете использовать любую версию, например Ubuntu, Linux Mint или любой другой дистрибутив, потому что все они работают одинаково.

Первое, что нужно сделать, это установить miniDLNA со всеми ее зависимостями:

sudo apt install minidlna

После установки запускаем службу miniDLNA:

sudo service minidlna start

Автоматически
эта служба запускается вместе с операционной системой, нам не нужно
делать абсолютно ничего другого, как вы можете видеть, когда мы
добавляем:

sudo service minidlna status

Настроить сервер miniDLNA

Этот
сервер DLNA настраивается с помощью одного файла конфигурации, который
нам придется редактировать, поэтому он значительно облегчает его
настройку и запуск, потому что нам не нужно будет редактировать
несколько, а только один. Для его редактирования мы будем использовать
любой текстовый редактор, обычно используется vim или nano, в нашем
случае мы будем использовать nano.

sudo nano /etc/minidlna.conf

В
самом файле конфигурации у нас будет вся необходимая документация для
запуска сервера DLNA, но в этой статье мы подробно объясним, как его
настроить, поскольку он поставляется на английском языке. Важной деталью
является то, что у нас есть справочная страница (руководство)
медиа-сервера miniDLNA, поэтому мы можем получить больше информации об
операции.

man minidlna

Первое,
что нам нужно узнать, это загрузить источники мультимедийного контента,
в зависимости от того, есть ли у нас видео, аудио или фотографии,
синтаксис будет следующим:

media_dir=A,/home/bron/multimedia/audio

media_dir = P, / home / bron / multimedia / фотографии

media_dir = V, / главная / броня / мультимедиа / видео

Как
видите, если мы хотим загрузить «A» — это звук, P — это фотографии, а V
— видео, таким образом, на телевидении он будет выглядеть идеально
классифицированным. Если мы хотим, чтобы появились видео и фотографии,
мы также могли бы это сделать, что идеально подходит для камер, которые
также записывают видео:

media_dir=PV,/home/bron/multimedia/camara_fotos

Еще
одно предложение, которое мы должны настроить, — где хранить базу
данных DLNA, в этом случае это делается раскомментированием следующей
строки:

db_dir=/var/cache/minidlna

То же самое происходит с каталогом журналов или регистров, в случае какой-либо ошибки:

log_dir=/var/log/minidlna

Остальные параметры конфигурации можно оставить таким образом:

port 8200

friendly_name = DLNA-сервер

inotify = да

notify_interval = 30

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

sudo service minidlna restart

Как только мы все это сделаем, мы сможем получить доступ к нашему телевизору или смартфону и протестировать медиа-сервер DLNA.

Настроить брандмауэр сервера Linux

Во всех операционных системах Linux брандмауэр
всегда работает, обычно на основе iptables, но по умолчанию у нас есть
«разрешить все», поэтому вам не нужно создавать какие-либо
дополнительные правила для доступа к медиа-серверу DLNA. Если вы
настроили брандмауэр iptables в ограничительном режиме с «запретить
все», вам придется ввести два правила для его правильной работы.

iptables -A INPUT -p tcp --dport 8200 -j ACCEPT

iptables -A INPUT -p udp –dport 1900 -j ПРИНЯТЬ

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

Если вы хотите, чтобы эти правила в брандмауэре сохранялись, вам нужно будет выполнить следующую команду:

iptables-save > /etc/iptables/rules.v4

Теперь
мы можем проверить, все ли правильно работает с тем клиентом DLNA,
который нам нужен, например телевизор, смартфон или планшет.

Проверить статус сервера miniDLNA

Если
мы получим доступ к нашему локальному IP-адресу через Интернет или с
любого компьютера и поместим порт 8200, мы получим доступ к
веб-интерфейсу статуса miniDLNA. Здесь мы увидим только
медиа-библиотеку, количество аудио-, видео- и графических файлов. Мы
также сможем увидеть клиентов, которые в настоящее время подключены к
медиа-серверу DLNA, с их IP-адресом, MAC-адресом и количеством
подключений.

В нашем случае мы положили:

http://localhost:8200

Воспроизведение содержимого нашего сервера DLNA

Теперь,
когда мы все установили правильно, все, что нам нужно сделать, это
найти сервер DLNA в локальной сети. В зависимости от того, какой клиент
(устройство) вы используете, вам придется использовать ряд программ:

  • ТВ:
    Во всех телевизорах распознавание медиа-серверов DLNA полностью
    автоматическое, оно будет отображаться в верхней или нижней части, где
    появляются съемные устройства хранения.
  • ПК с Windows, Linux или MacOS: мы можем использовать KODI или VLC, два лучших варианта для всех платформ.
  • Android: VLC или BubbleUPnP — два приложения, которые позволят нам искать сервер DLNA в среде и воспроизводить его.
  • iOS: VLC

Во всех этих программах мы должны перейти к «Cеть”И
найдите такую ​​опцию, как UPnP или DLNA, и наш недавно настроенный
сервер DLNA появится автоматически. Если он не отображается ни на одном
устройстве, мы рекомендуем вам проверить брандмауэр iptables, а также,
если он активирован.

Как вы видели, установка и настройка сервера
DLNA на нашем NAS или сервере Linux очень проста, нам просто нужно
установить его и настроить текстовый файл, что не вызовет особых
трудностей.

Необходимость в DLNA возникает, когда надоедает таскать флешки и решаешь подключить телевизор к локальной сети.
Мой телевизор Samsung LE40C550 из сетевых возможностей умеет получать медиа-контент только посредством технологии DLNA. А учитывая дизайн помещения и расположение ТВ применять внешний медиа плеер не хотелось.

Minidlna это программа создающая dlna-сервер в локальной сети. Пакет не осуществляет транскодирование на лету, в связи с этим требования предъявляемые к ресурсам рабочей станции незаначительны.

В свое время я уже организовал небольшое сетевое хранилище на базе маршрутизатора NetGear WNR3500L. Установив в него прошивку от Энтузиастов и подключив жесткий диск.
По мере эксплуатации я перепробовал несколько DLNA серверов, которые с тем или иным успехом работали на моем маршрутизаторе. При этом конфигурационный файл Mediatomb пришлось специально «дотачивать», чтобы он работал с телевизорами Samsung. А xupnpd, к сожалению, не умеет (на момент написания статьи) сортировать список локальных файлов по алфавиту, хотя конечно его основное назначение — это просмотр IP-TV, а просмотр локальных файлов лишь дополнительная функция.
В результате многочисленных установок различных DLNA серверов я пришел к мнению, что по состоянию на сегодняшний день (ноябрь 2012) miniDLNA является лучшим выбором для просмотра фильмов на телевизорах Samsung в локальной сети. Такого же мнения и уважаемый мною ZyxMon. Который так же рекомендует использовать этот сервис, правда уже для ZyXEL Keenetic.

Преимущества miniDLNA

Судите сами:

  1. В процессе работы miniDLNA потребляет около 5% процессорного времени (в первый раз при создании новой базы может достигать 70-90%).
  2. Размер базы на 617 файлов не превышает 2 МегаБайт.
  3. Потребление памяти (а для маршрутизаторов это особенно важно, так как ее там совсем мало) много меньше, чем у uShare, так как последний держит все в памяти, а не на диске.
  4. Не портит базу при внезапной остановке, в отличие от mediatomb.

Установка miniDLNA на NetGear WNR3500L

На своем маршрутизаторе я использую репозитарий EntWare.
Установка программного обеспечения в котором сродни установки пакетов CentOS, и не вызывает сложностей.

opkg update
opkg install minidlna

После чего нам необходимо настроить файл конфигурации /opt/etc/minidlna.conf

port=8200 # Порт Web-интерфейса
network_interface=br0 # Ethernet + Wi-Fi
media_dir=/tmp/mnt/disca_1/data/downloads # Полный путь до файлов на диске
friendly_name=MiniDLNA Server # указание имени сервера на dlna-клиенте
notify_interval=900 # Интервал обновления базы, каждые 15 минут
db_dir=/opt/etc/minidlna # Полный путь до базы. Должен существовать. Обязательно на внешний диск!!

Проверяем наличие файла автозапуска /opt/etc/init.d/S90minidlna и его содержимое:

#!/bin/sh

ENABLED=yes
PROCS=minidlna
ARGS="-f /opt/etc/minidlna.conf"
PREARGS=""
DESC=$PROCS
PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/u

. /opt/etc/init.d/rc.func

Если все в порядке, то перегружаем маршрутизатор:

reboot

После этого заходим по адресу: http://my.router:8200/
И наблюдаем, примерно следующее

MiniDLNA status
Audio files: 448
Video files: 168
Image files: 0

Через несколько минут, в зависимости от количества файлов на Вашем диске, будет создана база данных для miniDLNA и можно приступить к просмотру. В лога minidlna.log можно увидеть следующее:

[2012/11/10 23:02:50] scanner.c:727: warn: Scanning /tmp/mnt/disca_1/data/downloads
[2012/11/10 23:07:55] scanner.c:798: warn: Scanning /tmp/mnt/disca_1/data/downloads finished (617 files)!

Как видите у меня информация о 617 файлах была добавлена в базу за 5 минут.

Использованные материалы и источники

  1. minidlna — новый UPnP/DLNA медиасервер
  2. Переход на новый репозиторий Entware с Optware
  3. Настройка DLNA-сервера для обращения к мультимедиа коллекции с телевизора
  4. Статья о программе создающий dlna медиа сервер Minidlna

Что это и кому это надо?
Начнем с того, что выясним что такое DLNA. Вот что написано в википедии:
DLNA (Digital Living Network Alliance) — стандарт, позволяющий совместимым устройствам передавать и принимать по домашней сети различный медиа-контент (изображения, музыку, видео), а также отображать его в режиме реального времени. Это технология для соединения домашних компьютеров, мобильных телефонов, ноутбуков и бытовой электроники в единую цифровую сеть.
Мудрёно? Да. Простыми словами — из своего компьютера (и не только) вы сможете сделать медиасервер, с которого можно будет смотреть и слушать видео, фотографии и музыку на любом телевизоре, музыкальном центре и прочей технике в своей квартире (причем независимо друг от друга) правда при одном условии — ваша техника должна поддерживать стандарт DLNA. Обычно об этом можно прочесть на коробке от этой самой техники или в ее документации. А еще можно заглянуть за телевизор (музыкальный плеер, DVD/Blue-ray плеер) и поискать разъем Ethernet. Конечно вы его можете и не найти, например если ваш телевизор поддерживает Wi-Fi.
Короче — изучайте матчасть ;)
Так вот, для того чтобы ваш компьютер стал-таки таким медиасервером на нем необходимо установить и настроить DLNA-сервер. Таких серверов существует множество. Из известных мне: MiniDLNA, MediaTomb, Rygel.

Почему MiniDLNA?
Всё очень просто — всё очень просто :)
MiniDLNA очень прост в настройке. Да у него нет всяких современных фич как транскодирование или трансляция видео с Youtube. Но мне это не нужно. Лично мне несложно найти видео сжатым нужным мне кодеком или перекодировать его самостоятельно. Более того у меня есть Blue-ray плеер, который знает больше кодеков чем мой телек. Так что если что-то не идет на телеке — идет на Blue-ray плеере.
Установка
Устанавливается MiniDLNA из репозиториев

sudo apt-get install minidlna

Кому хочется иметь последнюю версию может воспользоваться PPA

sudo add-apt-repository ppa:stedy6/stedy-minidna
sudo apt-get update
sudo apt-get install minidlna

Я рекомендую использовать именно PPA. Тот minidlna сервер, который идет из стандартного репозитория у меня почему-то не хотел запоминать предыдущее место воспроизведения в видео файлах. Приходилось использовать перемотку. Не критично, но когда знаешь, что это должно работать, то свербит ;)
Настройка
Файл с настройками MiniDLNA находится по пути /etc/minidlna.conf.
Открываем его своим любимым редактором (nano, vim, gedit и т.д.). У кого нет любимого редактора можно воспользоваться шпаргалкой

sudo gedit /etc/minidlna.conf

Далее смотрим, что там есть. Базовый файл с настройками имеет коментарии ко всем параметрам. Все довольно просто и понятно.
Если совсем ничего не понятно, то сделаем минимальные изменения в настройках.
Путь к медиабиблиотеке
Необходимо указать нашему серверу где же находится вся наша медиабиблиотека (директория или несколько директорий) с фильмами, мультиками, фотографиями и музыкой. Пути к библиотекам указываются ключом media_dir. Таких ключей можно указать сколько угодно. Примеры настройки лежат тут же.

media_dir=A,/home/jmaggard/Music
media_dir=V,/home/jmaggard/Videos
media_dir=P,/home/jmaggard/Pictures

Никто не запрещает указать две и более директории с (например) видео:

media_dir=V,/первый/путь/к_видео
media_dir=V,/второй/путь/к_видео

Я предлагаю другой подход — использовать в качестве медиабиблиотеки путь /opt, который указан в настройках по-умолчанию. И по этому пути собирать символические ссылки на все наши директории с медиаконтентом.
Стало быть приводим часть с описанием медиадиректорий в настройках к следующему виду:

media_dir=V,/opt/medialib/video
media_dir=A,/opt/medialib/audio
media_dir=P,/opt/medialib/pictures

Идем дальше…
Как будет называться наш сервер
Конечно же мы не оставим это на откуп компьютеру ;) Мы назовем свой сервер сами. Находим параметр friendly_name раскоментируем его если он закоментирован и пишем туда свое имя сервера

friendly_name=My super mediaserver

Директория с базой данных
MiniDLNA использует в качестве СУБД sqlite3. Соответственно вся база данных хранится в файле. Нам стоит позаботиться о том где этот файл будет лежать. Для этого просто раскоментируем (или добавим свой) параметр

db_dir=/var/cache/minidlna

Куда складывать логи
За это отвечает параметр log_dir по-умолчанию он равен /var/log. Оставим его без изменения. Разве что раскоментируем его, если он закоментирован. Файл с логами будет называться minidlna.log
Собственно настройка закончена. Сохраняем файл, закрываем его и переходим к организации файловой системы для правильной работы нашего сервера
Организация файловой системы
Звучит грозно? Не надо бояться. Здесь мы будем создавать директории и символические ссылки. Итак.
Создаем заготовку для нашей медиабиблиотеки.

sudo mkdir -p /opt/medialib/video
sudo mkdir -p /opt/medialib/audio
sudo mkdir -p /opt/medialib/pictures

Далее меняем владельца этих директорий

sudo chown -R minidlna:minidlna /opt/medialib

Создаем директорию для файла базы данных MiniDLNA

sudo mkdir /var/cache/minidlna

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

sudo chown minidlna:minidlna /var/cache/minidlna

Директорию для логов создавать не надо. Она уже есть.
Собственно осталась самая малость — добавить ссылки на директории с медиаконтентом в нашу медиабиблиотеку

sudo ln -s <путь_к_папке_с_видео_1> /opt/medialib/video/Films1
sudo ln -s <путь_к_папке_с_видео_2> /opt/medialib/video/Films2
sudo ln -s <путь_к_папке_с_аудио> /opt/medialib/audio/Music
sudo ln -s <путь_к_папке_с_фото> /opt/medialib/video/Photos

Ну и последний штрих — перезапускаем наш MiniDLNA сервер

sudo service minidlna restart

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

  1. Вы неправильно раздали права на папки с видео/музыкой/фотками (или на конечные файлы). В данном случае просто надо выдать правильные права. Для файлов подойдут 664. Для папок 775. Как правило с папками все нормально. Не хватает прав как раз на конечных файлах. Для этого можно воспользоваться командой:
    find <папка_с_видео> -type f | sed 's/ /\\ /g' | xargs chmod 664
  2. Ваше устройство просто не поддерживает данный тип фалов или кодек. В данном случае изучайте документацию на устройство — возможно его можно перепрошить и обновить кодеки в нем

Ну а если все-равно ничего не работет, то видимо это судьба. Махни рукой и не забивай себе голову всякой ерундой.

Другие наши интересноые статьи:

  • Что такое n300 в роутер
  • Что такое mesh система в роутере
  • Что такое mhz в роутере
  • Что такое multicast в роутере
  • Что такое mesh роутер ростелеком

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии