我正在使用很棒的 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/
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el