我正在使用很棒的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) { };
});
}
}
}
}
我知道,这看起来很糟,但是确实有效:)当我进入调试器时,我可以看到我得到了什么。但是,与指南here中的说明不同,我没有获取任何实际的媒体项目,只是在浏览结果中存储了目录。当DLNA将事物组织成一个层次结构时,这种方式很有意义:
Music
All Music
Artists
Fleetwood Mac
...
Albums
...
Video
All Video
Folders
...
我的问题是,浏览这些文件夹并遍历层次结构的最简单方法是什么?我已经连接到想要的UPnP DLNA服务器,现在该如何获取这些根存储目录?在上面给出的浏览命令中,我实际上必须传递某个索引的字符串表示形式以获得“Music”或“Video”等。如何获得顶级的存储目录,然后如何浏览这些目录中的每个目录?我的目标是至少构建一个简单的浏览器。
最佳答案
好的,事实证明,由于对Cling邮件列表有所帮助,我可以回答自己的问题。
显然,DLNA中的所有元素都有一个唯一的ID号,您可以通过其在Cling中引用它们。为了获取/
,必须请求节点“0”。为了访问/../
(比顶部高1步!?),您可以请求节点“-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”(这是我要查找的实际文件),并对其执行一些操作。
了解DLNA的工作方式是促进所有这些工作的关键。所有重要的东西都通过HTTP提供,通过UPnP方便了对等节点的检测。因此,首先,找到网络上的所有UPnP客户端,然后对所有客户端进行排序并确定哪些客户端正在运行DLNA,然后进行浏览。找到您要查找的内容,然后通过HTTP对其进行流式播放。理论为赢。
关于java - 提取Cling中的所有DLNA根存储目录?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4891653/