Оглавление:
Статья последний раз была обновлена 19.12.2024
Настраиваем домашний 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
Проверяем результат. Папки должны открываться без запроса способа отображения.
- Поднимаем веб-сервер на Ubuntu - 16.09.2024
- Переадресация домена на другой домен - 08.08.2023
- Как установить и удалить GNOME? - 31.07.2023