YAMBY 的 DLNA 请求对 URL 的编码有些问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
工单节点使用指南
请用平和的语言准确描述你所遇到的问题
厂商的技术支持和你一样也是有喜怒哀乐的普通人类,尊重是相互的
如果是关于 V2EX 本身的问题反馈,请使用 反馈 节点
ihipop
V2EX    全球工单系统

YAMBY 的 DLNA 请求对 URL 的编码有些问题

  •  
  •   ihipop 137 天前 633 次点击
    这是一个创建于 137 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不知道怎么联系作者就发这里吧. @Kivy

    最近有机会接触三星的 Tizen TV 系统,发现 Yamby 的 DLNA 投屏功能对三星设备上某些功能不可用(无法播放),但是可以在 KODI 上正常使用,经过各种抓包测试,并且查阅了一些 DLNA 的上古文档,发现问题出在媒体文件的 metadata 上

    YAMBY 的 DLNA 报文是这样的

    <?xml version="1.0" encoding="utf-8" standalOne="yes"?> <s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"> <InstanceID>0</InstanceID> <CurrentURI>http://192.168.0.214:9091/original.mp4?x=y&amp;z=z</CurrentURI> <CurrentURIMetaData>&lt;?xml version="1.0"?>&lt;DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/">&lt;item id="original.mp4" parentID="-1" restricted="1">&lt;dc:title>original.mp4&lt;/dc:title>&lt;upnp:class>object.item.videoItem&lt;/upnp:class>&lt;res protocolInfo="http-get:*:video/mp4:*;DLNA.ORG_OP=01;">http://192.168.0.214:9091/original.mp4?x=y&amp;z=z&lt;/res>&lt;/item>&lt;/DIDL-Lite></CurrentURIMetaData> </u:SetAVTransportURI> </s:Body> </s:Envelope> 

    对于现代的 DLNA 设备来说 重点需要关注 CurrentURIMetaData

    把他解码 是这样的内容

    <?xml version="1.0"?> <DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/"> <item id="original.mp4" parentID="-1" restricted="1"> <dc:title>original.mp4</dc:title> <upnp:class>object.item.videoItem</upnp:class> <res protocolInfo="http-get:*:video/mp4:*;DLNA.ORG_OP=01;">http://192.168.0.214:9091/original.mp4?x=y&z=z</res> </item> </DIDL-Lite> 

    然后就会得到三丧电视答复如下内容

    <?xml version="1.0" encoding="utf-8"?> <s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <s:Fault> <faultcode>s:Client</faultcode> <faultstring>UPnPError</faultstring> <detail> <UPnPError xmlns="urn:schemas-upnp-org:control-1-0"> <errorCode>402</errorCode> <errorDescription>Invalid Args</errorDescription> </UPnPError> </detail> </s:Fault> </s:Body> </s:Envelope> 

    其根本原因是因为, 在 XML 节点内的 URL 是需要进行 html 实体转义的, 也就是

    CurrentURIMetaData 本身就是一个 html 实体转义后的 XML

    其内的 URL 也必须是经过 html 实体转义的, 因为 XML 对某些字符(如 <, >, &, " 等)有严格的限制, 我们使用 YAMBY 主要的场景就是 EMBY 的 stream 拉流播放, 这个接口会通过 Query String 里面传递很多查询参数, 使用了大量的 &, 如果不进行实体转义, 就会对设备的解析造成问题

    所以其实是 URL 转义以后的写入 DIDL-Lite ,然后 DIDL-Lite 再转义一次变成上面的样子, 其实就是 URL 被转义了两次.

    所以如果一开始报文改成这样, 三星设备就会正确响应

    <?xml version="1.0" encoding="utf-8" standalOne="yes"?> <s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"> <InstanceID>0</InstanceID> <CurrentURI>http://192.168.0.214:9091/original.mp4?x=y&amp;z=z</CurrentURI> <CurrentURIMetaData>&lt;?xml version="1.0"?>&lt;DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/">&lt;item id="original.mp4" parentID="-1" restricted="1">&lt;dc:title>original.mp4&lt;/dc:title>&lt;upnp:class>object.item.videoItem&lt;/upnp:class>&lt;res protocolInfo="http-get:*:video/mp4:*;DLNA.ORG_OP=01;">http://192.168.0.214:9091/original.mkv?x=y&amp;amp;z=z&lt;/res>&lt;/item>&lt;/DIDL-Lite></CurrentURIMetaData> </u:SetAVTransportURI> </s:Body> </s:Envelope> 

    另外这版的 Tizen 还有一个问题, 就是如果是 https 的 URL 不可以带端口号, 也就是, 报文里面写 https://example.com:443/example.mp4 是不可以的, 服务器会收到消息和完整的请求, 但是电视会显示错误信息, 并且拒绝播放.

    很不幸, YAMBY 就是会带上端口号,哪怕是默认的(比如 https 的 默认端口是 443), 导致无法投屏

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     844 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 20:12 PVG 04:12 LAX 12:12 JFK 15:12
    Do have faith in what you're doing.
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-11940834-2', 'v2ex.com'); ga('send', 'pageview'); ga('send', 'event', 'Node', 'topic', 'gts'); ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86