Получить все корневые каталоги хранилища DLNA в Cling? - PullRequest
7 голосов
/ 03 февраля 2011

Я использую потрясающую библиотеку Cling для сканирования сети на наличие устройств UPnP. Моя цель - собрать небольшой браузер библиотеки DLNA, чтобы я мог изучить технологию. До сих пор я был в состоянии 1. сканировать сеть и подключать устройства UPnP, 2. сканировать каждое удаленное устройство и определять, работает ли на нем служба DLNA, и 3. просматривать непосредственные дочерние узлы известных узлов. Короче говоря, это мой метод, который может запустить все это:

    public void remoteDeviceAdded(Registry registry, RemoteDevice device) {
        logger.debug("remote device added: {}[{}]", device.getDetails().getFriendlyName(),
            device.getType().getType());

        if (device.getType().getType().equals("MediaServer")) {         
            for (RemoteService service : device.getServices()) {
                if (service.getServiceType().getType().equals("ContentDirectory")) {
//              '1' is Music, '2' is Video, '3' is Pictures
                    this.service.getControlPoint().execute(new Browse(service, "3", BrowseFlag.DIRECT_CHILDREN) {
                        @Override public void received(ActionInvocation arg0,
                                DIDLContent didl) {
                            logger.debug("found {} items.", didl.getItems().size());
                        }

                        @Override public void updateStatus(Status arg0) { };

                        @Override public void failure(ActionInvocation arg0, UpnpResponse arg1, String arg2) { };
                    });
                }
            }
        }
    }

Я знаю, это похоже на ужасный беспорядок, и это так, но это работает :) Когда я захожу в отладчик, я вижу, что у меня есть. Однако, в отличие от инструкций из руководства здесь , я не возвращаю никаких реальных элементов мультимедиа, только каталоги хранения в результате просмотра. Этот вид имеет смысл, поскольку DLNA организует вещи в иерархию следующим образом:

Music
    All Music
    Artists
        Fleetwood Mac
        ...
    Albums
    ...
Video
    All Video
    Folders
...

У меня вопрос такой, какой самый простой способ просмотреть эти папки и пролистать иерархию? Я уже нахожусь в точке, где я подключен к серверу UPnP DLNA, который я искал, теперь, как мне получить эти корневые каталоги хранилища? В приведенной выше команде обзора мне нужно передать строковое представление некоторого индекса, чтобы получить «Music», «Video» или тому подобное. Как я могу получить верхний уровень каталогов хранилища, тогда как я могу просмотреть каждый из этих каталогов? Моя цель - создать хотя бы простой браузер.

1 Ответ

8 голосов
/ 04 февраля 2011

Хорошо, оказывается, что я могу ответить на свой вопрос в результате некоторой помощи в списке рассылки Cling.

Очевидно, все элементы в DLNA имеют уникальный идентификационный номер , по которому вы можете ссылаться на них в Cling.Чтобы получить /, необходимо запросить узел «0».Чтобы получить доступ к /../ (на один шаг выше вершины !?), вы можете запросить узел «-1».Поскольку спецификация DLNA не существует ничего не стоит в этом вопросе, это только условно.Таким образом, запрос узла "0" действительно должен получить вас самый верхний узел, но кто знает?Это может принести вам красную сельдь или бешеного лося или конец света.Риски - это то, ради чего мы живем, верно?

В любом случае, «файловая система» DLNA работает следующим образом:

/[0]
    Browse Folders/[1]
    Music/[2]
        All Music/[5]
            Heart Is Hard To Find[6]
            ...
        ...
    Pictures/[3]
    Video/[4]

Таким образом, если бы я хотел последовательно просмотреть свой путь во «Всю музыку», которая является узлом '5', Я сначала запросил бы' 0 ', отобразил дочерние контейнеры, затем перешел на узел' 2 'при взаимодействии с пользователем, затем проследовал на узел' 5 'при взаимодействии с пользователем, затем выбрал узел' 6 ', который является фактическим файлом Iищу и выполняю какие-то действия на нем.

Понимание того, как работает DLNA, является ключом к облегчению всего этого.Все важные вещи передаются через HTTP, обнаружение пиров облегчается через UPnP.Итак, сначала найдите все клиенты UPnP в вашей сети, затем переберите всех клиентов и определите, какие из них работают с DLNA, а затем перейдите к просмотру.Найдите то, что вы ищете, а затем передайте его по HTTP, чтобы воспроизвести.Теория для победы.

...