Сервер DLNA для Linux Debian или Ubuntu на базе MiniDLNA

Статья последний раз была обновлена 23.07.2023

Настраиваем домашний DLNA-сервер на базе MiniDLNA, он же ReadyMedia в Linux Debian или Ubuntu Server. Вот ссылка на сам MiniDLNA.

Установка MiniDLNA

Простейшим способом установки является, установка пакета из репозитория вашего дистрибутива:

sudo apt-get update
sudo apt-get install minidlna

Установка Sudo

Если в вашей системе отсутствует команда sudo, желательно ее установить. Sudo нам потребуется в процессе настройки, для тестирования прав доступа к папкам с медиа-файлами.

Устанавливаем sudo:

apt-get install sudo

Добавляем пользователя в группу sudo:

usermod -aG sudo пользователь

Выходим из системы и входим заново, чтобы изменение группы вступило в силу.

Настройка MiniDLNA

Правим файл конфигурации:

sudo nano /etc/minidlna.conf

Как минимум, потребуется задать путь к папке с медиа-файлами, параметр: «media_dir». Также можно задать имя сервера, отображаемое клиентом, параметр: «friendly_name».

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

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

# Порт сервера
port=8200
# Сетевой интерфейс
# Можно задать несколько интерфейсов
# в формате network_interface=eth0,eth1
#network_interface=eth0
# Имя пользователя или UID, под которым будет работать служба
# Добавлен в версии 1.1.0
# В Debian задается в параметрах init-скрипта
#user=jmaggard
# Путь к папке с медиа-файлами
# Для сканирования нескольких папок, укажите несколько параметров media_dir
# Чтобы сканировать файлы определенного типа, укажите соответствующий префикс:
#   A - аудио: media_dir=A,/home/jmaggard/Music
#   V - видео: media_dir=V,/home/jmaggard/Videos
#   P - изображения: media_dir=P,/home/jmaggard/Pictures
# Начиная с версии 1.1.0, можно задать несколько типов:
#   PV - изображения и видео: media_dir=AV,/var/lib/minidlna/digital_camera
#
# При изменении параметра, потребуется повторное сканирование файлов.
# Необходимо выполнить команду "service minidlna force-reload" от имени root [подробнее].
# Начиная с версии 1.1.0, при изменении параметра, сканирование выполняется автоматически.
media_dir=/var/lib/minidlna
# Объединять корневые папки
# Параметр добавлен в версии 1.1.3
# Включаем, чтобы избавиться от лишнего уровня вложенности
# Расположение видео файлов при значении "no": Video/Folders/Video, при значении "yes": Video/Folders
# При изменении параметра, потребуется повторное сканирование файлов.
merge_media_dirs=yes
# Имя DLNA-сервера, отображаемое клиентом
# По умолчанию: "$HOSTNAME:$USER"
#friendly_name=
# Путь к папке для хранения базы данных и кэша обложек альбомов
db_dir=/var/lib/minidlna
# Путь к папке с лог-файлами
log_dir=/var/log
# Уровень детальности лога
# В формате log_level=источник1,источник2=значение1,источник3,источник4=значение2 ...
# Доступные источники: "general", "artwork", "database", "inotify", "scanner", "metadata", "http", "ssdp", "tivo"
# Возможные значения: "off", "fatal", "error", "warn", "info" or "debug"
#log_level=general,artwork,database,inotify,scanner,metadata,info,ssdp,tivo=warn
# Перечень имен файлов-обложек альбомов, разделитель: "/"
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
# Автообнаружение новых файлов
# Включено по умолчанию
#inotify=yes
# Поддержка устройств TiVo
#enable_tivo=no
# Строго следовать DLNA-стандарту
# Использовать серверное масштабирование для очень больших JPEG-изображений
# Что может снизить скорость их обработки.
#strict_dlna=no
# Адрес веб-страницы устройства
# По умолчанию IP-адрес и заданный порт сервера
#presentation_url=http://www.mylan/index.php
# Интервал отправки SSDP-уведомлений, в секундах
#notify_interval=895
# Серийный номер и номер модели DLNA-сервера, сообщаемый клиенту
serial=12345678
model_number=1
# Путь к сокету MiniSSDPd, если установлен
# Требуется для обеспечения работы нескольких DLNA/UPnP служб на одном сервере
#minissdpdsocket=/run/minissdpd.sock
# Контейнер, используемый в качестве корневой папки для клиентов
#   * "." - стандартный контейнер
#   * "B" - "Обзор папки"
#   * "M" - "Музыка"
#   * "V" - "Видео"
#   * "P" - "Изображения"
# Если задано "B" и клиент представится как аудиоплеер, в качестве корня будет использована папка "Music/Folders"
#root_container=.
# Всегда использовать заданный критерий сортировки, вместо значения, запрошенного клиентом
#force_sort_criteria=+upnp:class,+upnp:originalTrackNumber,+dc:title
# Максимальное число одновременных подключений
# Учтите: многие клиенты открывают несколько подключений одновременно
#max_connections=50

Проверяем параметры init-скрипта /etc/default/minidlna:

sudo nano /etc/default/minidlna

Обычно корректировка не требуется. Если файл отсутствует, при первичной установке из исходников, копируем листинг:

# Запускать демон, если задано "yes"
START_DAEMON="yes"
# Путь к файлу конфигурации
#CONFIGFILE="/etc/minidlna.conf"
# Путь к лог-файлу
#LOGFILE="/var/log/minidlna.log"
# Запуск от имени заданного пользователя и группы
# По умолчанию: minidlna
#USER="minidlna"
#GROUP="minidlna"
# Дополнительные ключи запуска
DAEMON_OPTS=""

Поскольку служба работает под пользователем с ограниченными правами, публикуемые папки и файлы должны быть доступны на чтение для всех пользователей, следовательно, иметь разрешения 644: «rw- r— r—«, для файлов и 755: «rwx r-x r-x», для папок.

Проверяем доступность для каждой папки, заданной в minidlna.conf, командой:

sudo -u minidlna ls -l папка

Если папка недоступна, задаем права доступа:

sudo chmod -R 755 папка

Вышестоящие папки также должны быть доступны на чтение всем пользователям. Проверяем доступность на чтение каждой папки, указанной в пути. Для вышестоящих папок используем chmod без ключа -R, если не требуется сброс разрешений для всех дочерних файлов и папок.

В качестве альтернативы смене разрешений, можно запустить MiniDLNA от имени пользователя или группы-владельца файлов. Для этого необходимо задать параметры USER и GROUP в /etc/default/minidlna, и сменить владельца папки /var/lib/minidlna командой:

sudo chown -R пользователь:группа /var/lib/minidlna

Запуск MiniDLNA

Перезапускаем службу:

sudo systemctl restart minidlna

Проверяем, работает ли служба, также смотрим параметры запуска:

systemctl status minidlna

Проверяем, слушается ли порт:

sudo ss -4lnp | grep minidlna

Проверяем лог:

cat /var/log/minidlna.log

В случае успешного старта, лог должен быть примерно следующим:

[2014/04/07 22:00:48] minidlna.c:1000: warn: Starting MiniDLNA version 1.1.2.
[2014/04/07 22:00:48] minidlna.c:354: warn: Creating new database at /var/lib/minidlna/files.db
[2014/04/07 22:00:48] minidlna.c:1039: warn: HTTP listening on port 8200
[2014/04/07 22:00:48] scanner.c:702: warn: Scanning /var/lib/minidlna
[2014/04/07 22:00:55] scanner.c:789: warn: Scanning /var/lib/minidlna finished (25 files)!
[2014/04/07 22:00:55] playlist.c:125: warn: Parsing playlists...
[2014/04/07 22:00:55] playlist.c:256: warn: Finished parsing playlists.
[2014/04/07 22:00:55] inotify.c:198: warn: WARNING: Inotify max_user_watches [8192] is low or close to the number of used watches [14] and I do not have permission to increase this limit.  Please do so manually by writing a higher value into /proc/sys/fs/inotify/max_user_watches.

Если видим: «WARNING: Inotify max_user_watches [8192] is low.», необходимо увеличить число дескрипторов слежения inotify до 100 000. Для этого в файл /etc/sysctl.conf добавим строки:

#MiniDLNA warning fix
fs.inotify.max_user_watches = 100000

Вручную редактором:

sudo nano /etc/sysctl.conf

Или копипастом команды:

sudo sh -c 'printf "\n\n#MiniDLNA warning fix\nfs.inotify.max_user_watches = 100000\n" >> /etc/sysctl.conf && cat /etc/sysctl.conf'

Изменение параметра вступит в силу после перезагрузки системы.

Открываем в браузере http://адрес.сервера:8200, видим количество файлов в библиотеке, начиная с версии 1.1.2, также отображается список подключенных клиентов.

Настройка DLNA/UPnP-AV сервера завершена.

Если вместо сообщений и папок-контейнеров MiniDLNA отображаются знаки вопроса, отключаем локализацию.

Если был установлен пакет:

sudo mv /usr/share/locale/ru/LC_MESSAGES/minidlna.mo minidlna.mo.del

При установке из исходников:

sudo mv /usr/local/share/locale/ru/LC_MESSAGES/minidlna.mo minidlna.mo.del

Перезапускаем MiniDLNA с повторным сканированием библиотеки.

Сканирование медиа-библиотеки MiniDLNA

При появлении ошибок в каталоге, необходимо выполнить повторное сканирование файлов.

Для этого удалим базу Minidlna и перезапустим службу:

sudo rm /var/lib/minidlna/files.db
sudo systemctl restart minidlna

Для сканирования медиа-библиотеки при каждом старте системы можно задать ключ запуска: «-R» в параметре DAEMON_OPTS в файле /etc/default/minidlna. Сканирование большой медиа-библиотеки существенно нагружает диск, что может замедлить загрузку системы.

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

Установка MiniDLNA из исходников

Дальнейший материал был написан во времена Debian 7 и не тестировался на современных версиях. Как минимум, инит-скрипты и юнит-файлы берем из deb-пакета.

Устанавливаем сборочные зависимости:

sudo apt-get update
sudo apt-get build-dep minidlna

Если при установке зависимостей возникает ошибка: «Невозможно найти пакет с исходным кодом для minidlna». Значит, пакет MiniDLNA отсутствует в вашей версии дистрибутива. В этом случае придется установить зависимости вручную:

sudo apt-get install gcc debhelper libavcodec-dev libavformat-dev libavutil-dev libexif-dev libflac-dev libid3tag0-dev libjpeg-dev libogg-dev libsqlite3-dev libvorbis-dev

Создаем папку для исходников в профиле пользователя и переходим в нее:

mkdir -p ~/src/minidlna
cd ~/src/minidlna

Сборка стабильной версии MiniDLNA

Загружаем исходники последней стабильной версии:

wget --trust-server-names http://sourceforge.net/projects/minidlna/files/latest/download

С ключом —trust-server-name, будет сохранено исходное имя файла: «minidlna-1.1.4.tar.gz», номер версии может отличаться. Если ключ не указан, файл будет сохранен под именем: «download».

Распаковываем архив:

tar -xf minidlna-1.1.4.tar.gz

Переходим в папку с исходниками:

cd minidlna-1.1.4

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

./configure

Компилируем:

make

Сборка текущей разрабатываемой версии MiniDLNA из Git-репозитория

Для сборки из Git-репозитория, потребуются дополнительные пакеты:

sudo apt-get install git autoconf automake autopoint

Получаем исходники:

git clone git://git.code.sf.net/p/minidlna/git minidlna-git

Переходим в папку с исходниками:

cd minidlna-git

Создаем скрипт автоконфигурации:

./autogen.sh

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

./configure

Компилируем:

make

Установка

Удаляем пакет, если он был установлен ранее:

sudo apt-get remove minidlna

Устанавливаем собранную версию:

sudo make install

При первичной установке, копируем minidlna.conf в папку /etc:

sudo cp -i minidlna.conf /etc

Создаем init-скрипт:

sudo nano /etc/init.d/minidlna

Если скрипт остался от оригинального пакета Debian, достаточно исправить путь к исполняемому файлу, выделенный красным. Если файл отсутствует, копируем следующий листинг:

#!/bin/sh
#
# MiniDLNA initscript
#
# Based on the mediatomb debian package.
# Original authors: Tor Krill <tor@excito.com>
#                   Leonhard Wimmer <leo@mediatomb.cc>
#                   Andres Mejia <mcitadel@gmail.com>
#
# Modified by: Benoit Knecht <benoit.knecht@fsfe.org>
#
### BEGIN INIT INFO
# Provides:          minidlna
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop::    $network $local_fs $remote_fs
# Should-Start:      $all
# Should-Stop:       $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start minidlna at boot time
# Description:       Manage the minidlna daemon, a DLNA/UPnP-AV media server.
### END INIT INFO
unset USER
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="DLNA/UPnP-AV media server"
NAME=minidlna
DAEMON=/usr/local/sbin/minidlnad
PIDDIR=/run/$NAME
PIDFILE=$PIDDIR/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
DEFAULT=/etc/default/$NAME
# Exit if the package is not installed
[ -x $DAEMON ] || exit 0
# Read configuration variable file if it is present
[ -r $DEFAULT ] && . $DEFAULT
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions
# Do not start the daemon if NO_START is enabled in DEFAULT
if [ "$START_DAEMON" != "yes" ] && [ "$1" != "stop" ]; then
log_warning_msg "$NAME: Not starting $DESC."
log_warning_msg "$NAME: Disabled in $DEFAULT."
exit 0
fi
# Set the default configuration file
if [ -z $CONFIGFILE ]; then
CONFIGFILE=/etc/minidlna.conf
fi
# Set the default log file
if [ -z $LOGFILE ]; then
LOGFILE=/var/log/minidlna.log
fi
# Run as `minidlna' if USER is not specified or is `root'
if [ -z $USER ]; then
USER=minidlna
fi
# If no group is specified, use USER
if [ -z $GROUP ]; then
GROUP=$USER
fi
DAEMON_ARGS="-f $CONFIGFILE -P $PIDFILE $DAEMON_OPTS"
#
# Function that starts the daemon/service
#
do_start()
{
# Return
#   0 if daemon has been started
#   1 if daemon was already running
#   2 if daemon could not be started
touch $LOGFILE && chown $USER:$GROUP $LOGFILE || return 2
if [ ! -d $PIDDIR ]; then
mkdir $PIDDIR || return 2
fi
chown $USER:$GROUP $PIDDIR || return 2
start-stop-daemon --start --quiet --pidfile $PIDFILE \
--chuid $USER:$GROUP --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --pidfile $PIDFILE \
--chuid $USER:$GROUP --exec $DAEMON -- \
$DAEMON_ARGS \
|| return 2
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
#   0 if daemon has been stopped
#   1 if daemon was already stopped
#   2 if daemon could not be stopped
#   other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -rf $PIDDIR
return "$RETVAL"
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc -p "$PIDFILE" "$DAEMON" "$NAME" && exit 0 || exit $?
;;
restart|force-reload)
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
if [ "$1" = "force-reload" ]; then
# Rescan the collection
DAEMON_ARGS="$DAEMON_ARGS -R"
fi
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
exit 3
;;
esac
:

Для дистрибутивов на базе Debian 6 в init-скрипте необходимо скорректировать параметр PIDDIR, для современных дистрибутивов корректировка не требуется.

PIDDIR=/var/run/$NAME

Разрешаем запуск скрипта:

sudo chmod 755 /etc/init.d/minidlna

Активируем запуск init-скрипта в rc.d:

sudo update-rc.d minidlna defaults

По умолчанию служба запускается под пользователем minidlna, создаем учетную запись:

sudo adduser --system --home /var/lib/minidlna --group --gecos "MiniDLNA server" minidlna

Также, при первичной установке, потребуется создать файл параметров init-скрипта (/etc/default/minidlna), рассмотренный далее, в процессе настройки.

При установке из исходников, minidlna.conf требует дополнительной корректировки. В пакете Debian пути по умолчанию были изменены, теперь их необходимо прописать явно.

Открываем редактор:

sudo nano /etc/minidlna.conf

Задаем путь для хранения базы данных, используем домашнюю папку пользователя minidlna, созданного на предыдущем шаге:

db_dir=/var/lib/minidlna

Задаем путь к лог-файлу:

log_dir=/var/log

Отключение запроса способа отображения файлов: All Files, Folders

Настраиваем отображение содержимого папок Music, Pictures, Video без промежуточного запроса способа их отображения.

Частично вопрос можно решить установкой параметра: «root_container=B» в minidlna.conf. При этом сам запрос не отключается, но содержимое папок отображается непосредственно в корневом контейнере.

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

Отключение виртуальных папок в MiniDLNA версии 1.1.4 и выше

Для версии 1.1.4 применяем патч, и добавляем параметр disable_extended_directories=yes в minidlna.conf. Данный патч войдет в состав следующей версии MiniDLNA, для более поздних версий достаточно задать параметр в файле конфигурации.

Получаем и устанавливаем пакет с исходниками, как описано в разделе: «Установка или обновление MiniDLNA из исходников«.

Переходим в папку с исходниками:

cd ~/src/minidlna/minidlna-1.1.4

Загружаем и применяем патч:

wget http://sourceforge.net/p/minidlna/feature-requests/101/attachment/diff.dif
patch < diff.diff

Собираем и устанавливаем исправленную версию:

sudo make install

Редактируем файл конфигурации:

sudo nano /etc/minidlna.conf

Добавляем параметр:

# Отключить виртуальные папки
disable_extended_directories=yes

Перезапускаем службу с повторным сканированием медиа-библиотеки:

sudo service minidlna force-reload

В системах на базе systemd для повторного сканирования потребуется удалить базу данных вручную:

sudo rm /var/lib/minidlna/files.db
sudo systemctl restart minidlna

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

Отключение виртуальных папок в MiniDLNA версии 1.1.3 и ниже

Получаем и устанавливаем пакет с исходниками, как описано в разделе: «Установка или обновление MiniDLNA из исходников«.

Переходим в папку с исходниками:

cd ~/src/minidlna/minidlna-1.1.3

Необходимые константы идентификаторов папок объявлены в scanner.h

#define MUSIC_ID                "1"
#define MUSIC_ALL_ID            "1$4"
#define MUSIC_GENRE_ID          "1$5"
#define MUSIC_ARTIST_ID         "1$6"
#define MUSIC_ALBUM_ID          "1$7"
#define MUSIC_PLIST_ID          "1$F"
#define MUSIC_DIR_ID            "1$14"
#define MUSIC_CONTRIB_ARTIST_ID "1$100"
#define MUSIC_ALBUM_ARTIST_ID   "1$107"
#define MUSIC_COMPOSER_ID       "1$108"
#define MUSIC_RATING_ID         "1$101"
#define VIDEO_ID                "2"
#define VIDEO_ALL_ID            "2$8"
#define VIDEO_GENRE_ID          "2$9"
#define VIDEO_ACTOR_ID          "2$A"
#define VIDEO_SERIES_ID         "2$E"
#define VIDEO_PLIST_ID          "2$10"
#define VIDEO_DIR_ID            "2$15"
#define VIDEO_RATING_ID         "2$200"
#define IMAGE_ID                "3"
#define IMAGE_ALL_ID            "3$B"
#define IMAGE_DATE_ID           "3$C"
#define IMAGE_ALBUM_ID          "3$D"
#define IMAGE_CAMERA_ID         "3$D2" // PlaysForSure == Keyword
#define IMAGE_PLIST_ID          "3$11"
#define IMAGE_DIR_ID            "3$16"
#define IMAGE_RATING_ID         "3$300"

Нам необходимо при запросе папок MUSIC_ID, VIDEO_ID и IMAGE_ID, перенаправить клиента в MUSIC_DIR_ID, VIDEO_DIR_ID и IMAGE_DIR_ID соответственно.

Обработка запросов клиента реализована в файле upnpsoap.c.

Сохраняем резервную копию файла:

cp upnpsoap.c upnpsoap.c.old

Запускаем редактор:

nano upnpsoap.c

Активируем поиск (F6), ищем процедуру: «BrowseContentDirectory».

static void
BrowseContentDirectory(struct upnphttp * h, const char * action)
{

В начале процедуры выполняется разбор SOAP/XML-запроса, затем его обработка и возврат результата.

Разбор запроса завершается формированием отладочного сообщения:

DPRINTF(E_DEBUG, L_HTTP, "Browsing ContentDirectory:\n"
" * ObjectID: %s\n"
" * Count: %d\n"
" * StartingIndex: %d\n"
" * BrowseFlag: %s\n"
" * Filter: %s\n"
" * SortCriteria: %s\n",
ObjectID, RequestedCount, StartingIndex,
BrowseFlag, Filter, SortCriteria);

Далее реализован выбор корневого контейнера в зависимости от конфигурационного параметра root_container:

// Если запрошен корневой контейнер
if( strcmp(ObjectID, "0") == 0 )
{
// Выставляем флаг корневого контейнера
args.flags |= FLAG_ROOT_CONTAINER;
// Если в конфиге задан корневой контейнер
if( runtime_vars.root_container )
{
// Если клиентом является аудио плейер и в конфиге задан обзор папок
// Отправляем его в папку с музыкой
if( (args.flags & FLAG_AUDIO_ONLY) && (strcmp(runtime_vars.root_container, BROWSEDIR_ID) == 0) )
ObjectID = MUSIC_DIR_ID;
else // Иначе выставляем контейнер, заданный в конфиге
ObjectID = runtime_vars.root_container;
}
else // Если контейнер в конфиге не задан
{
// Если клиентом является аудио плейер
// Отправляем его в папку с музыкой
if( args.flags & FLAG_AUDIO_ONLY )
ObjectID = MUSIC_ID;
}
}

Сразу после этого блока и перед блоком с запросами к БД добавляем код перенаправления папок для видео, музыки и изображений:

//Redirect video to folder
if( strcmp(ObjectID, VIDEO_ID) == 0 )
{
ObjectID = VIDEO_DIR_ID;
}
//Redirect music to folder
if( strcmp(ObjectID, MUSIC_ID) == 0 )
{
ObjectID = MUSIC_DIR_ID;
}
//Redirect images to folder
if( strcmp(ObjectID, IMAGE_ID) == 0 )
{
ObjectID = IMAGE_DIR_ID;
}

В итоге правленный фрагмент должен выглядеть следующим образом:

if( strcmp(ObjectID, "0") == 0 )
{
args.flags |= FLAG_ROOT_CONTAINER;
if( runtime_vars.root_container )
{
if( (args.flags & FLAG_AUDIO_ONLY) && (strcmp(runtime_vars.root_containe$
ObjectID = MUSIC_DIR_ID;
else
ObjectID = runtime_vars.root_container;
}
else
{
if( args.flags & FLAG_AUDIO_ONLY )
ObjectID = MUSIC_ID;
}
}
//Redirect video to folder
if( strcmp(ObjectID, VIDEO_ID) == 0 )
{
ObjectID = VIDEO_DIR_ID;
}
//Redirect music to folder
if( strcmp(ObjectID, MUSIC_ID) == 0 )
{
ObjectID = MUSIC_DIR_ID;
}
//Redirect images to folder
if( strcmp(ObjectID, IMAGE_ID) == 0 )
{
ObjectID = IMAGE_DIR_ID;
}
if( strcmp(BrowseFlag+6, "Metadata") == 0 )
{
args.requested = 1;
sql = sqlite3_mprintf("SELECT %s, " COLUMNS
"from OBJECTS o left join DETAILS d on (d.ID = o.DETAIL_ID$
" where OBJECT_ID = '%q';",
(args.flags & FLAG_ROOT_CONTAINER) ? "0, -1" : "o.OBJECT_I$
ObjectID);
ret = sqlite3_exec(db, sql, callback, (void *) &args, &zErrMsg);
totalMatches = args.returned;
}

Собираем и устанавливаем исправленную версию:

sudo make install

Перезапускаем службу:

sudo service minidlna restart

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *