Для отключения запроса способа отображения файлов нужно в папке с исходниками (minidlna-1.1.3, мы в нее уже должны были перейти) подправить файл upnpsoap.c, но сначала сделаем его резервную копию:
sudo cp upnpsoap.c upnpsoap.c.old
и откроем в редакторе
sudo 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;
}
}
Сразу после этого блока и перед блоком с запросами к БД добавляем код перенаправления папок для видео, музыки и изображений:
if( strcmp(ObjectID, VIDEO_ID) == 0 )
{
ObjectID = VIDEO_DIR_ID;
}
if( strcmp(ObjectID, MUSIC_ID) == 0 )
{
ObjectID = MUSIC_DIR_ID;
}
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;
}
}
if( strcmp(ObjectID, VIDEO_ID) == 0 )
{
ObjectID = VIDEO_DIR_ID;
}
if( strcmp(ObjectID, MUSIC_ID) == 0 )
{
ObjectID = MUSIC_DIR_ID;
}
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;
}
Чтобы упростить процедуру последующего обновления, сохраним патч с внесенными изменениями:
diff -u upnpsoap.c.old upnpsoap.c > ../minidlna-folders.patch
Теперь вместо редактирования файла, достаточно применить патч:
cd ~/src/minidlna/minidlna-НоваяВерсия
patch < ../minidlna-folders.patch
Теперь можно переходить к конфигурированию.