java - 在 Cling 中获取所有 DLNA 根存储目录?

标签 java upnp dlna

我正在使用很棒的 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 服务器,现在我如何获得这些根存储目录?在上面给出的浏览命令中,我实际上必须传递一些索引的字符串表示形式才能获得“音乐”或“视频”等。如何获得顶级存储目录,然后如何浏览这些目录中的每一个?我的目标是至少构建一个简单的浏览器。

最佳答案

好的,由于 Cling 邮件列表上的一些帮助,我得到了自己的问题的答案。

显然,DLNA 中的所有元素都有一个唯一的 ID 号,您可以通过它在 Cling 中引用它们。为了获取/,必须请求节点“0”。为了访问/../(比top高一级!?),可以请求节点“-1”。由于 DLNA 规范不存在在这件事上毫无值(value),这只是约定俗成。所以,请求节点“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/

相关文章:

Java - 未单独指定实例化的类范围泛型类型

java - 房间数据库错误

Python UPnP/IGD 客户端实现?

java - UPNP/DLNA 控制点

java - 将 Collection<SomeClass> 转换为 Collection<SomeSuperClass>

java - 我的 Android 应用无法上网

upnp - 当我们有 UPnP 时为什么要拨号(发现和启动)?

java - 用于 Java 的 UPnP 库

upnp - 浏览排序标准

dlna - 为什么 minidlna 数据库没有刷新?