By
palswim
I discovered that my LG SmartShare app could not play FLAC or M4A audio files natively from my DLNA server, so I decided to enable transcoding on the server to present MP3/WAV resources in addition to the native stream. However, the SmartShare app still doesn't display those files when browsing for audio, and I am trying to determine why.
And now, the extreme technical detail:
I have a shell utility, upnp-browse.sh to make HTTP calls to my DLNA server, emulating the types of calls that LG SmartShare would make:
#!/bin/sh
curl -s -d @- -H 'Content-Type: text/xml; charset="utf-8"' -H 'SOAPAction: #Browse' http://host/path/to/DLNA \
| xmllint --xpath '////Result/text()' - \
| recode html..utf8 \
| xml_pp
The curl call makes a HTTP POST request with the data from stdin, which would have similar content to the following:
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:Browse xmlns:u="urn:schemas-upnp-org:service:serviceType:v">
<ObjectID>ID_PARENT</ObjectID>
<BrowseFlag>BrowseDirectChildren</BrowseFlag>
</u:Browse>
</s:Body>
</s:Envelope>
The call to curl then yields an XML Response similar to the following:
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:BrowseResponse xmlns:u="urn:schemas-upnp-org:service:ContentDirectory:1"><Result><DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:dlna="urn:schemas-dlna-org:metadata-1-0/">
<item id="ID_FILE" parentID="ID_PARENT" restricted="1"><dc:title>Title</dc:title><upnp:class>object.item.audioItem.musicTrack</upnp:class><dc:creator>Creator</dc:creator><upnp:artist>Artist</upnp:artist><res size="######" duration="H:MM:SS.###" bitrate="1022868" sampleFrequency="44100" nrAudioChannels="2" protocolInfo="http-get:*:audio/x-flac:*">http://IP:port/MediaItems/####.ext</res><res duration="H:MM:SS.###" bitrate="176400" sampleFrequency="44100" nrAudioChannels="2" protocolInfo="http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=10;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01500000000000000000000000000000">http://IP:port/MediaItems/TranscodeAudio/LPCM/####.ext</res><res duration="H:MM:SS.###" nrAudioChannels="2" protocolInfo="http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=10;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01500000000000000000000000000000">http://IP:port/MediaItems/TranscodeAudio/MP3/####.ext</res></item><container id="ID_FOLDER" parentID="ID_PARENT" restricted="1" searchable="1" childCount="#"><dc:title>folder name</dc:title><upnp:class>object.container.storageFolder</upnp:class><upnp:storageUsed>-1</upnp:storageUsed></container></DIDL-Lite></Result>
<NumberReturned>2</NumberReturned>
<TotalMatches>2</TotalMatches>
<UpdateID>3</UpdateID></u:BrowseResponse></s:Body></s:Envelope>
Then the calls to xmllint, recode, and xml_pp take this data and extract the data from the Result node and format it for readability, yielding an output similar to:
<DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dlna="urn:schemas-dlna-org:metadata-1-0/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/">
<item id="ID_FILE" parentID="ID_PARENT" restricted="1">
<dc:title>Title</dc:title>
<upnp:class>object.item.audioItem.musicTrack</upnp:class>
<dc:creator>Creator</dc:creator>
<upnp:artist>Artist</upnp:artist>
<res bitrate="1022868" duration="H:MM:SS.###" nrAudioChannels="2" protocolInfo="http-get:*:audio/x-flac:*" sampleFrequency="44100" size="######">http://IP:port/MediaItems/####.ext</res>
<res bitrate="176400" duration="H:MM:SS.###" nrAudioChannels="2" protocolInfo="http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=10;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01500000000000000000000000000000" sampleFrequency="44100">http://IP:port/MediaItems/TranscodeAudio/LPCM/####.ext</res>
<res duration="H:MM:SS.###" nrAudioChannels="2" protocolInfo="http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=10;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01500000000000000000000000000000">http://IP:port/MediaItems/TranscodeAudio/MP3/####.ext</res>
</item>
<container childCount="#" id="ID_FOLDER" parentID="ID_PARENT" restricted="1" searchable="1">
<dc:title>folder name</dc:title>
<upnp:class>object.container.storageFolder</upnp:class>
<upnp:storageUsed>-1</upnp:storageUsed>
</container>
</DIDL-Lite>
Note with the sample file (item node), it contains three res nodes. The DLNA client (LG SmartShare) should select the data from the res node for the format it supports, and allow for selection of the item, but when I browse in the container which contains the item, LG SmartShare doesn't show it.
For native MP3 files, SmartShare will show and play those items. I can provide output for native MP3 items, as well as OGG or MP4/M4A files if those would help, though they all look fairly similar. However, for native MP3 files, the first res node has a slightly different set of DLNA flags:
<res bitrate="128000" duration="H:MM:SS.###" nrAudioChannels="2" protocolInfo="http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000" sampleFrequency="44100" size="######">http://IP:port/MediaItems/####.mp3</res>
Is my server serving something incorrectly, does SmartShare just not support multiple res nodes, or have I overlooked something?
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.