Hello Twonky! This is Europe calling.

I’m still looking at getting the album order correct on multi-disc albums. Only now, I’m running Twonky on my T12-423 rather than the WD NAS so I can pretty much do what I want to now.

So, first things first. The Twonky calls.

I’m using HTTPie but Postman would be equally good. First, we need to construct a post to read the available albums:

POST http://192.168.3.16:9000/dev0/srv1/control

<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:Browse xmlns:u="urn:schemas-upnp-org:service:ContentDirectory:1">
<ObjectID>0$1$12</ObjectID>
<BrowseFlag>BrowseDirectChildren</BrowseFlag>
<Filter>*</Filter>
<StartingIndex>233</StartingIndex>
<RequestedCount>300</RequestedCount>
<SortCriteria/>
</u:Browse>
</s:Body>
</s:Envelope>

I can’t remember where the original object ID comes from (a thing for another day) but the StartingIndex and the RequestedCount are where you want to start in your list of albums and how many albums you’d like returned. Twonky only seemed to return 232 which is why I started at 233. I deliberately kept the RequestCount High because Twonky will tell me how many entries its retuned so I’m not too fussed about being accurate.

Twonky returns coded XML which looks like this:

<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:dlna="urn:schemas-dlna-org:metadata-1-0/" xmlns:arib="urn:schemas-arib-or-jp:elements-1-0/" xmlns:dtcp="urn:schemas-dtcp-com:metadata-1-0/" xmlns:pv="http://www.pv.com/pvns/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><container id="0$1$12$4282" parentID="0$1$12" restricted="1" childCount="38" searchable="1"><dc:title>Eurovision Song Contest 2014: Copenhagen - Join Us</dc:title><upnp:genre>Pop</upnp:genre><upnp:album>Eurovision Song Contest 2014: Copenhagen - Join Us</upnp:album><dc:creator>Various Artists</dc:creator><upnp:albumArtURI dlna:profileID="JPEG_TN" >http://192.168.3.16:9000/disk/DLNA-PNJPEG_TN-OP01-CI1-FLAGS00d00000/defaa/C/O0$1$12$4282.jpg?scale=org</upnp:albumArtURI><pv:childCountContaine

Copy the body into SublimeText and find / replace the &lt; and &gt; with < and > respectively, then indent the XML to get a nicely formatted page. From this I can easily see that the object for Eurovision 2024 is:

<container childCount="37" dc:date="2024-01-01T12:00:00" id="0$1$12$5307" parentID="0$1$12" restricted="1" searchable="1">
<dc:title>Eurovision Song Contest 2024: Malmö - United By Music</dc:title>
<dc:date>2024-01-01</dc:date>
<upnp:genre>Pop</upnp:genre>
<upnp:album>Eurovision Song Contest 2024: Malmö - United By Music</upnp:album>
<dc:creator>Various Artists</dc:creator>
<upnp:albumArtURI dlna:profileID="JPEG_TN">http://192.168.3.16:9000/disk/DLNA-PNJPEG_TN-OP01-CI1-FLAGS00d00000/defaa/C/O0$1$12$5307.jpg?scale=org</upnp:albumArtURI
<pv:childCountContainer>0</pv:childCountContainer>
<upnp:artist>Various Artists</upnp:artis>
<pv:modificationTime>421989616</pv:modificationTime><pv:containerContent>object.item.audioItem.musicTrack</pv:containerContent>
<upnp:class>object.container.album.musicAlbum</upnp:class>
</container>

Now, make a call to Twonky using the same parameters as the CXN makes:

POST http://192.168.3.16:9000/dev0/srv1/control
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:Browse xmlns:u="urn:schemas-upnp-org:service:ContentDirectory:1">
<ObjectID>0$1$12$5307</ObjectID>
<BrowseFlag>BrowseDirectChildren</BrowseFlag>
<Filter>dc:title,upnp:class,upnp:album,upnp:originalTrackNumber,id,res,res@protection,res@duration,upnp:searchClass,upnp:artist,upnp:genre,upnp:albumArtURI</Filter>
<StartingIndex>0</StartingIndex>
<RequestedCount>100</RequestedCount>
<SortCriteria>+upnp:originalTrackNumber,+dc:title</SortCriteria>
</u:Browse>
</s:Body>
</s:Envelope>

This returns:

<?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:dlna="urn:schemas-dlna-org:metadata-1-0/" xmlns:arib="urn:schemas-arib-or-jp:elements-1-0/" xmlns:dtcp="urn:schemas-dtcp-com:metadata-1-0/" xmlns:pv="http://www.pv.com/pvns/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/">
<item id="0$1$12$5307R891915" parentID="0$1$12$5307" restricted="1">
<dc:title>Hurricane [Israel]</dc:title>
<upnp:genre>Pop</upnp:genre>
<upnp:album>Eurovision Song Contest 2024: Malmö - United By Music</upnp:album>
<upnp:originalTrackNumber>1</upnp:originalTrackNumber>
<upnp:albumArtURI dlna:profileID="JPEG_TN" >http://192.168.3.16:9000/disk/DLNA-PNJPEG_TN-OP01-CI1-FLAGS00d00000/defaa/A/O0$1$8I891915.jpg?scale=org</upnp:albumArtURI>
<upnp:artist>Eden Golan</upnp:artist>
<res duration="0:03:01.440" protocolInfo="http-get:*:audio/x-aiff:*" >http://192.168.3.16:9000/disk/NON-DLNA-OP01-FLAGS01700000/O0$1$8I891915.aif</res>
<upnp:class>object.item.audioItem.musicTrack</upnp:class>
</item>
<item id="0$1$12$5307R887307" parentID="0$1$12$5307" restricted="1">
<dc:title>Titan [Albania]</dc:title>
<upnp:genre>Pop</upnp:genre>
<upnp:album>Eurovision Song Contest 2024: Malmö - United By Music</upnp:album>
<upnp:originalTrackNumber>1</upnp:originalTrackNumber>
<upnp:albumArtURI dlna:profileID="JPEG_TN" >http://192.168.3.16:9000/disk/DLNA-PNJPEG_TN-OP01-CI1-FLAGS00d00000/defaa/A/O0$1$8I887307.jpg?scale=org</upnp:albumArtURI>
<upnp:artist>BESA</upnp:artist>
<res duration="0:02:58.226" protocolInfo="http-get:*:audio/x-aiff:*" >http://192.168.3.16:9000/disk/NON-DLNA-OP01-FLAGS01700000/O0$1$8I887307.aif</res>
<upnp:class>object.item.audioItem.musicTrack</upnp:class>
</item>

Hurricane is not the first track for the album so this is obviously wrong.

As I can’t change what the CXN is asking for, I need to change the response the CXN is receiving (if that is even possible?)

What I think I need to do is to have the “upnp:originalTrackNumber” be a combination of the disc number and the actual track number so it becomes something like 101 and 201 for the first track on the first and second disks… I think I’m out of luck there.