2011-02-03 27 views
7

Estoy usando la impresionante biblioteca Cling para escanear mi red en busca de dispositivos UPnP. Mi objetivo es armar un pequeño explorador de la biblioteca DLNA para que pueda aprender la tecnología. Hasta ahora he podido 1. escanear la red y conectar dispositivos UPnP, 2. escanear cada dispositivo remoto y determinar si tiene un servicio DLNA en ejecución, y 3. explorar los elementos secundarios inmediatos de los nodos conocidos. En resumen, este es mi método que es capaz de ejecutar todo esto:¿Buscar todos los directorios de almacenamiento raíz DLNA en Cling?

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) { }; 
        }); 
       } 
      } 
     } 
    } 

lo sé, es probable que se parece a un desastre horrible y lo es, pero funciona :) Cuando me cae en un depurador, me puedo ver lo que tengo Sin embargo, a diferencia de las instrucciones de la guía here, no recibo ningún elemento multimedia real, solo directorios de almacenamiento en el resultado de búsqueda. Este tipo de DLNA tiene sentido ya que organiza las cosas en una jerarquía de este modo:

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

Mi pregunta es, ¿cuál es la forma más fácil de navegar por estas carpetas y subir a través de la jerarquía? Ya estoy en un punto en el que estoy conectado al servidor UPnP DLNA que estaba buscando, ¿cómo puedo obtener estos directorios de almacenamiento raíz? En el comando de navegación dado anteriormente, tengo que pasar una representación de cadena de algún índice para obtener "Música" o "Video" o similar. ¿Cómo obtengo el nivel más alto de directorios de almacenamiento? ¿Cómo puedo navegar en cada uno de esos directorios? Mi objetivo es al menos construir un navegador simple.

Respuesta

8

Ok, resulta que puedo responder mi propia pregunta como resultado de un poco de ayuda en la lista de correo de Cling.

Aparentemente, todos los elementos en DLNA tienen un número de identificación único con el que puede hacer referencia a ellos en Cling. Para buscar /, se debe solicitar el nodo "0". Para acceder al /../ (¡un paso más arriba que arriba !?), puede solicitar el nodo "-1". Dado que la especificación DLNA es inexistente no tiene valor en este asunto, esto es solo por convención. Entonces, solicitando el nodo "0" realmente debería conseguirte el nodo más alto, pero ¿quién sabe? Puede ser una arenga roja o un alce rabioso o el fin del mundo. Los riesgos son para lo que vivimos, ¿verdad?

En cualquier caso, el DLNA "sistema de archivos" tipo de trabajos como éste:

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

Por lo tanto, si quería secuencialmente navegar por mi camino en "Toda la música", que es el nodo '5', I' d primero solicite '0', muestre los contenedores secundarios, luego busque el nodo '2' en la interacción del usuario, luego busque el nodo '5' en la interacción del usuario, luego seleccione el nodo '6' que es el archivo real que estoy buscando y realiza alguna acción en él.

Entender cómo funciona DLNA es clave para facilitar todo esto. Todo lo importante se sirve a través de HTTP, la detección de pares se facilita a través de UPnP. Primero, encuentre todos los clientes de UPnP en su red, luego ordene a través de todos los clientes y determine cuáles están ejecutando DLNA, luego inicie la navegación. Encuentra lo que estás buscando, luego transmítelo a través de HTTP para reproducirlo. Teoría de la victoria.

+1

¿Cómo se las arregló para obtener la lista de archivos una vez que obtiene el artículo? Tengo el contenedor, pero getItems() siempre está vacío. – Nifhel

+0

didl.getContainers(). Get (0) .getItems() siempre está vacío – Nifhel

Cuestiones relacionadas