API Questions

CursedToast

Member
Joined
Jul 27, 2023
Messages
8
I plan to build a desktop player for the WiiM as a side project. Let's say I have a queue in my app, and I want to make sure the WiiM is playing everything gapless (similar to how the WiiM Home app handles it). I'm guessing my queue would essentially need to be a m3u file that's streamed to the device with setPlayerCmd=playlist:url?

My original thought was to handle the queue myself via my application and when one song finishes, send the next song to the WiiM with setPlayerCmd=play:url -- but I'm guessing that won't work well for gapless.


Is there any other developers or someone from the @WiiM Team that can confirm, please? Or should I be streaming via upnp to achieve this? Thanks!

Or... should I just use upnp/dlna? What does the WiiM Home app use?
 
Last edited:
On your WiiM's IP, go here: http://<WiiM_IP>:49152/upnp/PlayQueueSCPD.xml

You'll see a bunch of methods, including one to populate an entire queue. None of them are documented anywhere that I know of, but some are easy enough to figure out. Use a good UPnP browser app to interact with your WiiM's UPnP interface to see how a queue is built. The name of the queue will match the album you're playing. You'll need to deal with DIDLite, which is XML embedded in XML, so things like <, >, ", & and a few others will need to be encoded.

I have a bunch of WiiM projects on GitHub for some (poor, but mostly working) sample code:


Example queue:
XML:
<?xml version="1.0"?> <PlayList> <ListName>A Joyful Holiday</ListName> <ListInfo> <SourceName>Deezer2</SourceName> <SearchUrl>https://5705754224.airable.io/deezer/album/502511061</SearchUrl> <MaxTrackNumber>6</MaxTrackNumber> <MarkSearch>0</MarkSearch> <TrackNumber>6</TrackNumber> <Quality>0</Quality> <requestQuality>LOSSLESS</requestQuality> <UpdateTime>101473</UpdateTime> <LastPlayIndex>1</LastPlayIndex> <AlarmPlayIndex>0</AlarmPlayIndex> <RealIndex>0</RealIndex> <SwitchPageMode>0</SwitchPageMode> <CurrentPage>0</CurrentPage> <TotalPages>0</TotalPages> <searching>0</searching> <PressType>0</PressType> <Volume>0</Volume> <FadeEnable>0</FadeEnable> <FadeInMS>0</FadeInMS> <FadeOutMS>0</FadeOutMS> </ListInfo> <Tracks> <Track1> <URL>http://cdnt-proxy-2.deezer.com/stream/flac/3/61d0492dd0f2ae7433030bec65e209bd0b1b725b3eb44db18736813824294aadeabdd7e5008c2fee0f9ad033929e6c492c9438b7a7c97f413200c11b6a2b5fdec8c691678eb59ea95e78e6ecb3d02c264483987c63f5db0dcafe86962583fd10.flac?hdnea=exp=1700121971~acl=/stream/flac/3/61d0492dd0f2ae7433030bec65e209bd0b1b725b3eb44db18736813824294aadeabdd7e5008c2fee0f9ad033929e6c492c9438b7a7c97f413200c11b6a2b5fdec8c691678eb59ea95e78e6ecb3d02c264483987c63f5db0dcafe86962583fd10.flac*~data=user_id=0,application_id=2008083646~hmac=9fda476b660273fd58490f8803182999945b5fc262047912c69a0dc930d7835f&amp;</URL> <Metadata>&lt;?xml version=&quot;1.0&quot;?&gt; &lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:song=&quot;www.wiimu.com/song/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt; &lt;upnp:class&gt;object.item.audioItem.musicTrack&lt;/upnp:class&gt; &lt;item id=&quot;&quot;&gt; &lt;song:subid&gt;&lt;/song:subid&gt; &lt;song:description&gt;&lt;/song:description&gt; &lt;song:skiplimit&gt;0&lt;/song:skiplimit&gt; &lt;song:id&gt;2506658741&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;112224542&lt;/song:singerid&gt; &lt;song:albumid&gt;502511061&lt;/song:albumid&gt; &lt;song:quality&gt;0&lt;/song:quality&gt; &lt;song:actualQuality&gt;LOSSLESS&lt;/song:actualQuality&gt; &lt;song:atmos&gt;0&lt;/song:atmos&gt; &lt;song:guibehavior&gt;&lt;/song:guibehavior&gt; &lt;song:soundScapeType&gt;&lt;/song:soundScapeType&gt; &lt;song:playCase&gt;&lt;/song:playCase&gt; &lt;song:originSource&gt;Deezer2&lt;/song:originSource&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;00:04:13.000&quot;&gt;&lt;/res&gt; &lt;dc:title&gt;Warm In December&lt;/dc:title&gt; &lt;upnp:artist&gt;Samara Joy&lt;/upnp:artist&gt; &lt;upnp:album&gt;A Joyful Holiday&lt;/upnp:album&gt; &lt;upnp:albumArtURI&gt;https://e-cdns-images.dzcdn.net/images/cover/a0f962ee78aaa65308f097e903d8dfa1/1000x1000-000000-80-0-0.jpg&lt;/upnp:albumArtURI&gt; &lt;song:rate_hz&gt;44100&lt;/song:rate_hz&gt; &lt;song:format_s&gt;16&lt;/song:format_s&gt; &lt;song:bitrate&gt;649&lt;/song:bitrate&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>2506658741</Id> <Source>Deezer2</Source> <Id>2506658741</Id> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track1> <Track2> <URL>wiimu_search://2506658751</URL> <Metadata>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:song=&quot;www.wiimu.com/song/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt; &lt;upnp:class&gt;object.item.audioItem.musicTrack&lt;/upnp:class&gt; &lt;item id=&quot;&quot;&gt; &lt;song:subid&gt;&lt;/song:subid&gt; &lt;song:description&gt;&lt;/song:description&gt; &lt;song:skiplimit&gt;0&lt;/song:skiplimit&gt; &lt;song:id&gt;2506658751&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;112224542&lt;/song:singerid&gt; &lt;song:albumid&gt;502511061&lt;/song:albumid&gt; &lt;song:quality&gt;0&lt;/song:quality&gt; &lt;song:actualQuality&gt;LOSSLESS&lt;/song:actualQuality&gt; &lt;song:atmos&gt;0&lt;/song:atmos&gt; &lt;song:rate_hz&gt;0&lt;/song:rate_hz&gt; &lt;song:format_s&gt;&lt;/song:format_s&gt; &lt;song:bitrate&gt;0&lt;/song:bitrate&gt; &lt;song:guibehavior&gt;&lt;/song:guibehavior&gt; &lt;song:soundScapeType&gt;&lt;/song:soundScapeType&gt; &lt;song:playCase&gt;&lt;/song:playCase&gt; &lt;song:originSource&gt;Deezer2&lt;/song:originSource&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;00:04:02.000&quot;&gt;&lt;/res&gt; &lt;dc:title&gt;Twinkle Twinkle Little Me&lt;/dc:title&gt; &lt;upnp:artist&gt;Samara Joy&lt;/upnp:artist&gt; &lt;upnp:album&gt;A Joyful Holiday&lt;/upnp:album&gt; &lt;upnp:albumArtURI&gt;https://e-cdns-images.dzcdn.net/images/cover/a0f962ee78aaa65308f097e903d8dfa1/1000x1000-000000-80-0-0.jpg&lt;/upnp:albumArtURI&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>2506658751</Id> <Source>Deezer2</Source> <Id>2506658751</Id> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track2> <Track3> <URL>wiimu_search://2506658761</URL> <Metadata>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:song=&quot;www.wiimu.com/song/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt; &lt;upnp:class&gt;object.item.audioItem.musicTrack&lt;/upnp:class&gt; &lt;item id=&quot;&quot;&gt; &lt;song:subid&gt;&lt;/song:subid&gt; &lt;song:description&gt;&lt;/song:description&gt; &lt;song:skiplimit&gt;0&lt;/song:skiplimit&gt; &lt;song:id&gt;2506658761&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;112224542&lt;/song:singerid&gt; &lt;song:albumid&gt;502511061&lt;/song:albumid&gt; &lt;song:quality&gt;0&lt;/song:quality&gt; &lt;song:actualQuality&gt;LOSSLESS&lt;/song:actualQuality&gt; &lt;song:atmos&gt;0&lt;/song:atmos&gt; &lt;song:rate_hz&gt;0&lt;/song:rate_hz&gt; &lt;song:format_s&gt;&lt;/song:format_s&gt; &lt;song:bitrate&gt;0&lt;/song:bitrate&gt; &lt;song:guibehavior&gt;&lt;/song:guibehavior&gt; &lt;song:soundScapeType&gt;&lt;/song:soundScapeType&gt; &lt;song:playCase&gt;&lt;/song:playCase&gt; &lt;song:originSource&gt;Deezer2&lt;/song:originSource&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;00:03:26.000&quot;&gt;&lt;/res&gt; &lt;dc:title&gt;The Christmas Song&lt;/dc:title&gt; &lt;upnp:artist&gt;Samara Joy&lt;/upnp:artist&gt; &lt;upnp:album&gt;A Joyful Holiday&lt;/upnp:album&gt; &lt;upnp:albumArtURI&gt;https://e-cdns-images.dzcdn.net/images/cover/a0f962ee78aaa65308f097e903d8dfa1/1000x1000-000000-80-0-0.jpg&lt;/upnp:albumArtURI&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>2506658761</Id> <Source>Deezer2</Source> <Id>2506658761</Id> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track3> <Track4> <URL>wiimu_search://2506658771</URL> <Metadata>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:song=&quot;www.wiimu.com/song/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt; &lt;upnp:class&gt;object.item.audioItem.musicTrack&lt;/upnp:class&gt; &lt;item id=&quot;&quot;&gt; &lt;song:subid&gt;&lt;/song:subid&gt; &lt;song:description&gt;&lt;/song:description&gt; &lt;song:skiplimit&gt;0&lt;/song:skiplimit&gt; &lt;song:id&gt;2506658771&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;112224542&lt;/song:singerid&gt; &lt;song:albumid&gt;502511061&lt;/song:albumid&gt; &lt;song:quality&gt;0&lt;/song:quality&gt; &lt;song:actualQuality&gt;LOSSLESS&lt;/song:actualQuality&gt; &lt;song:atmos&gt;0&lt;/song:atmos&gt; &lt;song:rate_hz&gt;0&lt;/song:rate_hz&gt; &lt;song:format_s&gt;&lt;/song:format_s&gt; &lt;song:bitrate&gt;0&lt;/song:bitrate&gt; &lt;song:guibehavior&gt;&lt;/song:guibehavior&gt; &lt;song:soundScapeType&gt;&lt;/song:soundScapeType&gt; &lt;song:playCase&gt;&lt;/song:playCase&gt; &lt;song:originSource&gt;Deezer2&lt;/song:originSource&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;00:03:45.000&quot;&gt;&lt;/res&gt; &lt;dc:title&gt;Have Yourself A Merry Little Christmas&lt;/dc:title&gt; &lt;upnp:artist&gt;Samara Joy&lt;/upnp:artist&gt; &lt;upnp:album&gt;A Joyful Holiday&lt;/upnp:album&gt; &lt;upnp:albumArtURI&gt;https://e-cdns-images.dzcdn.net/images/cover/a0f962ee78aaa65308f097e903d8dfa1/1000x1000-000000-80-0-0.jpg&lt;/upnp:albumArtURI&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>2506658771</Id> <Source>Deezer2</Source> <Id>2506658771</Id> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track4> <Track5> <URL>wiimu_search://2506658781</URL> <Metadata>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:song=&quot;www.wiimu.com/song/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt; &lt;upnp:class&gt;object.item.audioItem.musicTrack&lt;/upnp:class&gt; &lt;item id=&quot;&quot;&gt; &lt;song:subid&gt;&lt;/song:subid&gt; &lt;song:description&gt;&lt;/song:description&gt; &lt;song:skiplimit&gt;0&lt;/song:skiplimit&gt; &lt;song:id&gt;2506658781&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;112224542&lt;/song:singerid&gt; &lt;song:albumid&gt;502511061&lt;/song:albumid&gt; &lt;song:quality&gt;0&lt;/song:quality&gt; &lt;song:actualQuality&gt;LOSSLESS&lt;/song:actualQuality&gt; &lt;song:atmos&gt;0&lt;/song:atmos&gt; &lt;song:rate_hz&gt;0&lt;/song:rate_hz&gt; &lt;song:format_s&gt;&lt;/song:format_s&gt; &lt;song:bitrate&gt;0&lt;/song:bitrate&gt; &lt;song:guibehavior&gt;&lt;/song:guibehavior&gt; &lt;song:soundScapeType&gt;&lt;/song:soundScapeType&gt; &lt;song:playCase&gt;&lt;/song:playCase&gt; &lt;song:originSource&gt;Deezer2&lt;/song:originSource&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;00:05:07.000&quot;&gt;&lt;/res&gt; &lt;dc:title&gt;O Holy Night&lt;/dc:title&gt; &lt;upnp:artist&gt;Samara Joy&lt;/upnp:artist&gt; &lt;upnp:album&gt;A Joyful Holiday&lt;/upnp:album&gt; &lt;upnp:albumArtURI&gt;https://e-cdns-images.dzcdn.net/images/cover/a0f962ee78aaa65308f097e903d8dfa1/1000x1000-000000-80-0-0.jpg&lt;/upnp:albumArtURI&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>2506658781</Id> <Source>Deezer2</Source> <Id>2506658781</Id> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track5> <Track6> <URL>wiimu_search://2506658791</URL> <Metadata>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:song=&quot;www.wiimu.com/song/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt; &lt;upnp:class&gt;object.item.audioItem.musicTrack&lt;/upnp:class&gt; &lt;item id=&quot;&quot;&gt; &lt;song:subid&gt;&lt;/song:subid&gt; &lt;song:description&gt;&lt;/song:description&gt; &lt;song:skiplimit&gt;0&lt;/song:skiplimit&gt; &lt;song:id&gt;2506658791&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;112224542&lt;/song:singerid&gt; &lt;song:albumid&gt;502511061&lt;/song:albumid&gt; &lt;song:quality&gt;0&lt;/song:quality&gt; &lt;song:actualQuality&gt;LOSSLESS&lt;/song:actualQuality&gt; &lt;song:atmos&gt;0&lt;/song:atmos&gt; &lt;song:rate_hz&gt;0&lt;/song:rate_hz&gt; &lt;song:format_s&gt;&lt;/song:format_s&gt; &lt;song:bitrate&gt;0&lt;/song:bitrate&gt; &lt;song:guibehavior&gt;&lt;/song:guibehavior&gt; &lt;song:soundScapeType&gt;&lt;/song:soundScapeType&gt; &lt;song:playCase&gt;&lt;/song:playCase&gt; &lt;song:originSource&gt;Deezer2&lt;/song:originSource&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;00:03:52.000&quot;&gt;&lt;/res&gt; &lt;dc:title&gt;The Christmas Song&lt;/dc:title&gt; &lt;upnp:artist&gt;Samara Joy&lt;/upnp:artist&gt; &lt;upnp:album&gt;A Joyful Holiday&lt;/upnp:album&gt; &lt;upnp:albumArtURI&gt;https://e-cdns-images.dzcdn.net/images/cover/a0f962ee78aaa65308f097e903d8dfa1/1000x1000-000000-80-0-0.jpg&lt;/upnp:albumArtURI&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>2506658791</Id> <Source>Deezer2</Source> <Id>2506658791</Id> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track6> </Tracks> </PlayList>

PlayQueueSCPD.xml:

XML:
<scpd xmlns="urn:schemas-upnp-org:service-1-0">
<script/>
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<actionList>
<action>
<name>CreateQueue</name>
<argumentList>
<argument>
<name>QueueContext</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>ReplaceQueue</name>
<argumentList>
<argument>
<name>QueueContext</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>DeleteQueue</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>BackUpQueue</name>
<argumentList>
<argument>
<name>QueueContext</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>AppendQueue</name>
<argumentList>
<argument>
<name>QueueContext</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>BrowseQueue</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>QueueContext</name>
<direction>out</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetQueueLoopMode</name>
<argumentList>
<argument>
<name>LoopMode</name>
<direction>in</direction>
<relatedStateVariable>LoopMode</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetQueueLoopMode</name>
<argumentList>
<argument>
<name>LoopMode</name>
<direction>out</direction>
<relatedStateVariable>LoopMode</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetQueuePolicy</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>PlayQueueWithIndex</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>Index</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>AppendTracksInQueue</name>
<argumentList>
<argument>
<name>QueueContext</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>RemoveTracksInQueue</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
<argument>
<name>RangStart</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>RangEnd</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>AppendTracksInQueueEx</name>
<argumentList>
<argument>
<name>QueueContext</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
<argument>
<name>Direction</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>StartIndex</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>Play</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetKeyMapping</name>
<argumentList>
<argument>
<name>QueueContext</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetKeyMapping</name>
<argumentList>
<argument>
<name>QueueContext</name>
<direction>out</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetQueueOnline</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>QueueID</name>
<direction>in</direction>
<relatedStateVariable>QueueID</relatedStateVariable>
</argument>
<argument>
<name>QueueType</name>
<direction>in</direction>
<relatedStateVariable>QueueType</relatedStateVariable>
</argument>
<argument>
<name>Queuelimit</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>QueueAutoInsert</name>
<direction>in</direction>
<relatedStateVariable>QueueAutoInsert</relatedStateVariable>
</argument>
<argument>
<name>QueueContext</name>
<direction>out</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SearchQueueOnline</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>SearchKey</name>
<direction>in</direction>
<relatedStateVariable>QueueID</relatedStateVariable>
</argument>
<argument>
<name>Queuelimit</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>QueueContext</name>
<direction>out</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetQueueRecord</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>QueueID</name>
<direction>in</direction>
<relatedStateVariable>QueueID</relatedStateVariable>
</argument>
<argument>
<name>Action</name>
<direction>in</direction>
<relatedStateVariable>QueueType</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetSongsRecord</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>SongID</name>
<direction>in</direction>
<relatedStateVariable>QueueID</relatedStateVariable>
</argument>
<argument>
<name>Action</name>
<direction>in</direction>
<relatedStateVariable>QueueType</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>UserRegister</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>UserName</name>
<direction>in</direction>
<relatedStateVariable>QueueID</relatedStateVariable>
</argument>
<argument>
<name>PassWord</name>
<direction>in</direction>
<relatedStateVariable>QueueType</relatedStateVariable>
</argument>
<argument>
<name>Result</name>
<direction>out</direction>
<relatedStateVariable>Result</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>UserLogin</name>
<argumentList>
<argument>
<name>AccountSource</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>UserName</name>
<direction>in</direction>
<relatedStateVariable>QueueID</relatedStateVariable>
</argument>
<argument>
<name>PassWord</name>
<direction>in</direction>
<relatedStateVariable>QueueType</relatedStateVariable>
</argument>
<argument>
<name>SavePass</name>
<direction>in</direction>
<relatedStateVariable>QueuePolicy</relatedStateVariable>
</argument>
<argument>
<name>Code</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>Proxy</name>
<direction>in</direction>
<relatedStateVariable>Proxy</relatedStateVariable>
</argument>
<argument>
<name>Result</name>
<direction>out</direction>
<relatedStateVariable>Result</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>UserLogout</name>
<argumentList>
<argument>
<name>AccountSource</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>Result</name>
<direction>out</direction>
<relatedStateVariable>Result</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetUserInfo</name>
<argumentList>
<argument>
<name>AccountSource</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>Result</name>
<direction>out</direction>
<relatedStateVariable>Result</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetUserAccountHistory</name>
<argumentList>
<argument>
<name>AccountSource</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>Number</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>Result</name>
<direction>out</direction>
<relatedStateVariable>Result</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetUserFavorites</name>
<argumentList>
<argument>
<name>AccountSource</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>Action</name>
<direction>in</direction>
<relatedStateVariable>Code</relatedStateVariable>
</argument>
<argument>
<name>MediaType</name>
<direction>in</direction>
<relatedStateVariable>QueueType</relatedStateVariable>
</argument>
<argument>
<name>MediaID</name>
<direction>in</direction>
<relatedStateVariable>QueueID</relatedStateVariable>
</argument>
<argument>
<name>MediaContext</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
<argument>
<name>Result</name>
<direction>out</direction>
<relatedStateVariable>Result</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetUserFavorites</name>
<argumentList>
<argument>
<name>AccountSource</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>MediaType</name>
<direction>in</direction>
<relatedStateVariable>QueueType</relatedStateVariable>
</argument>
<argument>
<name>Filter</name>
<direction>in</direction>
<relatedStateVariable>QueueType</relatedStateVariable>
</argument>
<argument>
<name>Result</name>
<direction>out</direction>
<relatedStateVariable>Result</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetQueueIndex</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>CurrentIndex</name>
<direction>out</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>CurrentPage</name>
<direction>out</direction>
<relatedStateVariable>CurrentPage</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetSpotifyPreset</name>
<argumentList>
<argument>
<name>KeyIndex</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>Result</name>
<direction>out</direction>
<relatedStateVariable>Result</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>DeleteActionQueue</name>
<argumentList>
<argument>
<name>PressType</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
</argumentList>
</action>
</actionList>
<serviceStateTable>
<stateVariable sendEvents="yes">
<name>LastChange</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>QueueName</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>QueueContext</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>CurrentIndex</name>
<dataType>ui4</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>CurrentPage</name>
<dataType>ui4</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>QueuePolicy</name>
<dataType>ui4</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>LoopMode</name>
<dataType>ui4</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>QueueID</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>QueueType</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>QueueAutoInsert</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>Result</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>Code</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>Proxy</name>
<dataType>string</dataType>
</stateVariable>
</serviceStateTable>
</scpd>
 
On your WiiM's IP, go here: http://<WiiM_IP>:49152/upnp/PlayQueueSCPD.xml

You'll see a bunch of methods, including one to populate an entire queue. None of them are documented anywhere that I know of, but some are easy enough to figure out. Use a good UPnP browser app to interact with your WiiM's UPnP interface to see how a queue is built. The name of the queue will match the album you're playing. You'll need to deal with DIDLite, which is XML embedded in XML, so things like <, >, ", & and a few others will need to be encoded.

I have a bunch of WiiM projects on GitHub for some (poor, but mostly working) sample code:


Example queue:
XML:
<?xml version="1.0"?> <PlayList> <ListName>A Joyful Holiday</ListName> <ListInfo> <SourceName>Deezer2</SourceName> <SearchUrl>https://5705754224.airable.io/deezer/album/502511061</SearchUrl> <MaxTrackNumber>6</MaxTrackNumber> <MarkSearch>0</MarkSearch> <TrackNumber>6</TrackNumber> <Quality>0</Quality> <requestQuality>LOSSLESS</requestQuality> <UpdateTime>101473</UpdateTime> <LastPlayIndex>1</LastPlayIndex> <AlarmPlayIndex>0</AlarmPlayIndex> <RealIndex>0</RealIndex> <SwitchPageMode>0</SwitchPageMode> <CurrentPage>0</CurrentPage> <TotalPages>0</TotalPages> <searching>0</searching> <PressType>0</PressType> <Volume>0</Volume> <FadeEnable>0</FadeEnable> <FadeInMS>0</FadeInMS> <FadeOutMS>0</FadeOutMS> </ListInfo> <Tracks> <Track1> <URL>http://cdnt-proxy-2.deezer.com/stream/flac/3/61d0492dd0f2ae7433030bec65e209bd0b1b725b3eb44db18736813824294aadeabdd7e5008c2fee0f9ad033929e6c492c9438b7a7c97f413200c11b6a2b5fdec8c691678eb59ea95e78e6ecb3d02c264483987c63f5db0dcafe86962583fd10.flac?hdnea=exp=1700121971~acl=/stream/flac/3/61d0492dd0f2ae7433030bec65e209bd0b1b725b3eb44db18736813824294aadeabdd7e5008c2fee0f9ad033929e6c492c9438b7a7c97f413200c11b6a2b5fdec8c691678eb59ea95e78e6ecb3d02c264483987c63f5db0dcafe86962583fd10.flac*~data=user_id=0,application_id=2008083646~hmac=9fda476b660273fd58490f8803182999945b5fc262047912c69a0dc930d7835f&amp;</URL> <Metadata>&lt;?xml version=&quot;1.0&quot;?&gt; &lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:song=&quot;www.wiimu.com/song/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt; &lt;upnp:class&gt;object.item.audioItem.musicTrack&lt;/upnp:class&gt; &lt;item id=&quot;&quot;&gt; &lt;song:subid&gt;&lt;/song:subid&gt; &lt;song:description&gt;&lt;/song:description&gt; &lt;song:skiplimit&gt;0&lt;/song:skiplimit&gt; &lt;song:id&gt;2506658741&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;112224542&lt;/song:singerid&gt; &lt;song:albumid&gt;502511061&lt;/song:albumid&gt; &lt;song:quality&gt;0&lt;/song:quality&gt; &lt;song:actualQuality&gt;LOSSLESS&lt;/song:actualQuality&gt; &lt;song:atmos&gt;0&lt;/song:atmos&gt; &lt;song:guibehavior&gt;&lt;/song:guibehavior&gt; &lt;song:soundScapeType&gt;&lt;/song:soundScapeType&gt; &lt;song:playCase&gt;&lt;/song:playCase&gt; &lt;song:originSource&gt;Deezer2&lt;/song:originSource&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;00:04:13.000&quot;&gt;&lt;/res&gt; &lt;dc:title&gt;Warm In December&lt;/dc:title&gt; &lt;upnp:artist&gt;Samara Joy&lt;/upnp:artist&gt; &lt;upnp:album&gt;A Joyful Holiday&lt;/upnp:album&gt; &lt;upnp:albumArtURI&gt;https://e-cdns-images.dzcdn.net/images/cover/a0f962ee78aaa65308f097e903d8dfa1/1000x1000-000000-80-0-0.jpg&lt;/upnp:albumArtURI&gt; &lt;song:rate_hz&gt;44100&lt;/song:rate_hz&gt; &lt;song:format_s&gt;16&lt;/song:format_s&gt; &lt;song:bitrate&gt;649&lt;/song:bitrate&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>2506658741</Id> <Source>Deezer2</Source> <Id>2506658741</Id> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track1> <Track2> <URL>wiimu_search://2506658751</URL> <Metadata>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:song=&quot;www.wiimu.com/song/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt; &lt;upnp:class&gt;object.item.audioItem.musicTrack&lt;/upnp:class&gt; &lt;item id=&quot;&quot;&gt; &lt;song:subid&gt;&lt;/song:subid&gt; &lt;song:description&gt;&lt;/song:description&gt; &lt;song:skiplimit&gt;0&lt;/song:skiplimit&gt; &lt;song:id&gt;2506658751&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;112224542&lt;/song:singerid&gt; &lt;song:albumid&gt;502511061&lt;/song:albumid&gt; &lt;song:quality&gt;0&lt;/song:quality&gt; &lt;song:actualQuality&gt;LOSSLESS&lt;/song:actualQuality&gt; &lt;song:atmos&gt;0&lt;/song:atmos&gt; &lt;song:rate_hz&gt;0&lt;/song:rate_hz&gt; &lt;song:format_s&gt;&lt;/song:format_s&gt; &lt;song:bitrate&gt;0&lt;/song:bitrate&gt; &lt;song:guibehavior&gt;&lt;/song:guibehavior&gt; &lt;song:soundScapeType&gt;&lt;/song:soundScapeType&gt; &lt;song:playCase&gt;&lt;/song:playCase&gt; &lt;song:originSource&gt;Deezer2&lt;/song:originSource&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;00:04:02.000&quot;&gt;&lt;/res&gt; &lt;dc:title&gt;Twinkle Twinkle Little Me&lt;/dc:title&gt; &lt;upnp:artist&gt;Samara Joy&lt;/upnp:artist&gt; &lt;upnp:album&gt;A Joyful Holiday&lt;/upnp:album&gt; &lt;upnp:albumArtURI&gt;https://e-cdns-images.dzcdn.net/images/cover/a0f962ee78aaa65308f097e903d8dfa1/1000x1000-000000-80-0-0.jpg&lt;/upnp:albumArtURI&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>2506658751</Id> <Source>Deezer2</Source> <Id>2506658751</Id> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track2> <Track3> <URL>wiimu_search://2506658761</URL> <Metadata>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:song=&quot;www.wiimu.com/song/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt; &lt;upnp:class&gt;object.item.audioItem.musicTrack&lt;/upnp:class&gt; &lt;item id=&quot;&quot;&gt; &lt;song:subid&gt;&lt;/song:subid&gt; &lt;song:description&gt;&lt;/song:description&gt; &lt;song:skiplimit&gt;0&lt;/song:skiplimit&gt; &lt;song:id&gt;2506658761&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;112224542&lt;/song:singerid&gt; &lt;song:albumid&gt;502511061&lt;/song:albumid&gt; &lt;song:quality&gt;0&lt;/song:quality&gt; &lt;song:actualQuality&gt;LOSSLESS&lt;/song:actualQuality&gt; &lt;song:atmos&gt;0&lt;/song:atmos&gt; &lt;song:rate_hz&gt;0&lt;/song:rate_hz&gt; &lt;song:format_s&gt;&lt;/song:format_s&gt; &lt;song:bitrate&gt;0&lt;/song:bitrate&gt; &lt;song:guibehavior&gt;&lt;/song:guibehavior&gt; &lt;song:soundScapeType&gt;&lt;/song:soundScapeType&gt; &lt;song:playCase&gt;&lt;/song:playCase&gt; &lt;song:originSource&gt;Deezer2&lt;/song:originSource&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;00:03:26.000&quot;&gt;&lt;/res&gt; &lt;dc:title&gt;The Christmas Song&lt;/dc:title&gt; &lt;upnp:artist&gt;Samara Joy&lt;/upnp:artist&gt; &lt;upnp:album&gt;A Joyful Holiday&lt;/upnp:album&gt; &lt;upnp:albumArtURI&gt;https://e-cdns-images.dzcdn.net/images/cover/a0f962ee78aaa65308f097e903d8dfa1/1000x1000-000000-80-0-0.jpg&lt;/upnp:albumArtURI&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>2506658761</Id> <Source>Deezer2</Source> <Id>2506658761</Id> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track3> <Track4> <URL>wiimu_search://2506658771</URL> <Metadata>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:song=&quot;www.wiimu.com/song/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt; &lt;upnp:class&gt;object.item.audioItem.musicTrack&lt;/upnp:class&gt; &lt;item id=&quot;&quot;&gt; &lt;song:subid&gt;&lt;/song:subid&gt; &lt;song:description&gt;&lt;/song:description&gt; &lt;song:skiplimit&gt;0&lt;/song:skiplimit&gt; &lt;song:id&gt;2506658771&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;112224542&lt;/song:singerid&gt; &lt;song:albumid&gt;502511061&lt;/song:albumid&gt; &lt;song:quality&gt;0&lt;/song:quality&gt; &lt;song:actualQuality&gt;LOSSLESS&lt;/song:actualQuality&gt; &lt;song:atmos&gt;0&lt;/song:atmos&gt; &lt;song:rate_hz&gt;0&lt;/song:rate_hz&gt; &lt;song:format_s&gt;&lt;/song:format_s&gt; &lt;song:bitrate&gt;0&lt;/song:bitrate&gt; &lt;song:guibehavior&gt;&lt;/song:guibehavior&gt; &lt;song:soundScapeType&gt;&lt;/song:soundScapeType&gt; &lt;song:playCase&gt;&lt;/song:playCase&gt; &lt;song:originSource&gt;Deezer2&lt;/song:originSource&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;00:03:45.000&quot;&gt;&lt;/res&gt; &lt;dc:title&gt;Have Yourself A Merry Little Christmas&lt;/dc:title&gt; &lt;upnp:artist&gt;Samara Joy&lt;/upnp:artist&gt; &lt;upnp:album&gt;A Joyful Holiday&lt;/upnp:album&gt; &lt;upnp:albumArtURI&gt;https://e-cdns-images.dzcdn.net/images/cover/a0f962ee78aaa65308f097e903d8dfa1/1000x1000-000000-80-0-0.jpg&lt;/upnp:albumArtURI&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>2506658771</Id> <Source>Deezer2</Source> <Id>2506658771</Id> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track4> <Track5> <URL>wiimu_search://2506658781</URL> <Metadata>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:song=&quot;www.wiimu.com/song/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt; &lt;upnp:class&gt;object.item.audioItem.musicTrack&lt;/upnp:class&gt; &lt;item id=&quot;&quot;&gt; &lt;song:subid&gt;&lt;/song:subid&gt; &lt;song:description&gt;&lt;/song:description&gt; &lt;song:skiplimit&gt;0&lt;/song:skiplimit&gt; &lt;song:id&gt;2506658781&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;112224542&lt;/song:singerid&gt; &lt;song:albumid&gt;502511061&lt;/song:albumid&gt; &lt;song:quality&gt;0&lt;/song:quality&gt; &lt;song:actualQuality&gt;LOSSLESS&lt;/song:actualQuality&gt; &lt;song:atmos&gt;0&lt;/song:atmos&gt; &lt;song:rate_hz&gt;0&lt;/song:rate_hz&gt; &lt;song:format_s&gt;&lt;/song:format_s&gt; &lt;song:bitrate&gt;0&lt;/song:bitrate&gt; &lt;song:guibehavior&gt;&lt;/song:guibehavior&gt; &lt;song:soundScapeType&gt;&lt;/song:soundScapeType&gt; &lt;song:playCase&gt;&lt;/song:playCase&gt; &lt;song:originSource&gt;Deezer2&lt;/song:originSource&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;00:05:07.000&quot;&gt;&lt;/res&gt; &lt;dc:title&gt;O Holy Night&lt;/dc:title&gt; &lt;upnp:artist&gt;Samara Joy&lt;/upnp:artist&gt; &lt;upnp:album&gt;A Joyful Holiday&lt;/upnp:album&gt; &lt;upnp:albumArtURI&gt;https://e-cdns-images.dzcdn.net/images/cover/a0f962ee78aaa65308f097e903d8dfa1/1000x1000-000000-80-0-0.jpg&lt;/upnp:albumArtURI&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>2506658781</Id> <Source>Deezer2</Source> <Id>2506658781</Id> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track5> <Track6> <URL>wiimu_search://2506658791</URL> <Metadata>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:song=&quot;www.wiimu.com/song/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt; &lt;upnp:class&gt;object.item.audioItem.musicTrack&lt;/upnp:class&gt; &lt;item id=&quot;&quot;&gt; &lt;song:subid&gt;&lt;/song:subid&gt; &lt;song:description&gt;&lt;/song:description&gt; &lt;song:skiplimit&gt;0&lt;/song:skiplimit&gt; &lt;song:id&gt;2506658791&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;112224542&lt;/song:singerid&gt; &lt;song:albumid&gt;502511061&lt;/song:albumid&gt; &lt;song:quality&gt;0&lt;/song:quality&gt; &lt;song:actualQuality&gt;LOSSLESS&lt;/song:actualQuality&gt; &lt;song:atmos&gt;0&lt;/song:atmos&gt; &lt;song:rate_hz&gt;0&lt;/song:rate_hz&gt; &lt;song:format_s&gt;&lt;/song:format_s&gt; &lt;song:bitrate&gt;0&lt;/song:bitrate&gt; &lt;song:guibehavior&gt;&lt;/song:guibehavior&gt; &lt;song:soundScapeType&gt;&lt;/song:soundScapeType&gt; &lt;song:playCase&gt;&lt;/song:playCase&gt; &lt;song:originSource&gt;Deezer2&lt;/song:originSource&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;00:03:52.000&quot;&gt;&lt;/res&gt; &lt;dc:title&gt;The Christmas Song&lt;/dc:title&gt; &lt;upnp:artist&gt;Samara Joy&lt;/upnp:artist&gt; &lt;upnp:album&gt;A Joyful Holiday&lt;/upnp:album&gt; &lt;upnp:albumArtURI&gt;https://e-cdns-images.dzcdn.net/images/cover/a0f962ee78aaa65308f097e903d8dfa1/1000x1000-000000-80-0-0.jpg&lt;/upnp:albumArtURI&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>2506658791</Id> <Source>Deezer2</Source> <Id>2506658791</Id> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track6> </Tracks> </PlayList>

PlayQueueSCPD.xml:

XML:
<scpd xmlns="urn:schemas-upnp-org:service-1-0">
<script/>
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<actionList>
<action>
<name>CreateQueue</name>
<argumentList>
<argument>
<name>QueueContext</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>ReplaceQueue</name>
<argumentList>
<argument>
<name>QueueContext</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>DeleteQueue</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>BackUpQueue</name>
<argumentList>
<argument>
<name>QueueContext</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>AppendQueue</name>
<argumentList>
<argument>
<name>QueueContext</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>BrowseQueue</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>QueueContext</name>
<direction>out</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetQueueLoopMode</name>
<argumentList>
<argument>
<name>LoopMode</name>
<direction>in</direction>
<relatedStateVariable>LoopMode</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetQueueLoopMode</name>
<argumentList>
<argument>
<name>LoopMode</name>
<direction>out</direction>
<relatedStateVariable>LoopMode</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetQueuePolicy</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>PlayQueueWithIndex</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>Index</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>AppendTracksInQueue</name>
<argumentList>
<argument>
<name>QueueContext</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>RemoveTracksInQueue</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
<argument>
<name>RangStart</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>RangEnd</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>AppendTracksInQueueEx</name>
<argumentList>
<argument>
<name>QueueContext</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
<argument>
<name>Direction</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>StartIndex</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>Play</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetKeyMapping</name>
<argumentList>
<argument>
<name>QueueContext</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetKeyMapping</name>
<argumentList>
<argument>
<name>QueueContext</name>
<direction>out</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetQueueOnline</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>QueueID</name>
<direction>in</direction>
<relatedStateVariable>QueueID</relatedStateVariable>
</argument>
<argument>
<name>QueueType</name>
<direction>in</direction>
<relatedStateVariable>QueueType</relatedStateVariable>
</argument>
<argument>
<name>Queuelimit</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>QueueAutoInsert</name>
<direction>in</direction>
<relatedStateVariable>QueueAutoInsert</relatedStateVariable>
</argument>
<argument>
<name>QueueContext</name>
<direction>out</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SearchQueueOnline</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>SearchKey</name>
<direction>in</direction>
<relatedStateVariable>QueueID</relatedStateVariable>
</argument>
<argument>
<name>Queuelimit</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>QueueContext</name>
<direction>out</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetQueueRecord</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>QueueID</name>
<direction>in</direction>
<relatedStateVariable>QueueID</relatedStateVariable>
</argument>
<argument>
<name>Action</name>
<direction>in</direction>
<relatedStateVariable>QueueType</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetSongsRecord</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>SongID</name>
<direction>in</direction>
<relatedStateVariable>QueueID</relatedStateVariable>
</argument>
<argument>
<name>Action</name>
<direction>in</direction>
<relatedStateVariable>QueueType</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>UserRegister</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>UserName</name>
<direction>in</direction>
<relatedStateVariable>QueueID</relatedStateVariable>
</argument>
<argument>
<name>PassWord</name>
<direction>in</direction>
<relatedStateVariable>QueueType</relatedStateVariable>
</argument>
<argument>
<name>Result</name>
<direction>out</direction>
<relatedStateVariable>Result</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>UserLogin</name>
<argumentList>
<argument>
<name>AccountSource</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>UserName</name>
<direction>in</direction>
<relatedStateVariable>QueueID</relatedStateVariable>
</argument>
<argument>
<name>PassWord</name>
<direction>in</direction>
<relatedStateVariable>QueueType</relatedStateVariable>
</argument>
<argument>
<name>SavePass</name>
<direction>in</direction>
<relatedStateVariable>QueuePolicy</relatedStateVariable>
</argument>
<argument>
<name>Code</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>Proxy</name>
<direction>in</direction>
<relatedStateVariable>Proxy</relatedStateVariable>
</argument>
<argument>
<name>Result</name>
<direction>out</direction>
<relatedStateVariable>Result</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>UserLogout</name>
<argumentList>
<argument>
<name>AccountSource</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>Result</name>
<direction>out</direction>
<relatedStateVariable>Result</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetUserInfo</name>
<argumentList>
<argument>
<name>AccountSource</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>Result</name>
<direction>out</direction>
<relatedStateVariable>Result</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetUserAccountHistory</name>
<argumentList>
<argument>
<name>AccountSource</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>Number</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>Result</name>
<direction>out</direction>
<relatedStateVariable>Result</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetUserFavorites</name>
<argumentList>
<argument>
<name>AccountSource</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>Action</name>
<direction>in</direction>
<relatedStateVariable>Code</relatedStateVariable>
</argument>
<argument>
<name>MediaType</name>
<direction>in</direction>
<relatedStateVariable>QueueType</relatedStateVariable>
</argument>
<argument>
<name>MediaID</name>
<direction>in</direction>
<relatedStateVariable>QueueID</relatedStateVariable>
</argument>
<argument>
<name>MediaContext</name>
<direction>in</direction>
<relatedStateVariable>QueueContext</relatedStateVariable>
</argument>
<argument>
<name>Result</name>
<direction>out</direction>
<relatedStateVariable>Result</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetUserFavorites</name>
<argumentList>
<argument>
<name>AccountSource</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>MediaType</name>
<direction>in</direction>
<relatedStateVariable>QueueType</relatedStateVariable>
</argument>
<argument>
<name>Filter</name>
<direction>in</direction>
<relatedStateVariable>QueueType</relatedStateVariable>
</argument>
<argument>
<name>Result</name>
<direction>out</direction>
<relatedStateVariable>Result</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetQueueIndex</name>
<argumentList>
<argument>
<name>QueueName</name>
<direction>in</direction>
<relatedStateVariable>QueueName</relatedStateVariable>
</argument>
<argument>
<name>CurrentIndex</name>
<direction>out</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>CurrentPage</name>
<direction>out</direction>
<relatedStateVariable>CurrentPage</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetSpotifyPreset</name>
<argumentList>
<argument>
<name>KeyIndex</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
<argument>
<name>Result</name>
<direction>out</direction>
<relatedStateVariable>Result</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>DeleteActionQueue</name>
<argumentList>
<argument>
<name>PressType</name>
<direction>in</direction>
<relatedStateVariable>CurrentIndex</relatedStateVariable>
</argument>
</argumentList>
</action>
</actionList>
<serviceStateTable>
<stateVariable sendEvents="yes">
<name>LastChange</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>QueueName</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>QueueContext</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>CurrentIndex</name>
<dataType>ui4</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>CurrentPage</name>
<dataType>ui4</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>QueuePolicy</name>
<dataType>ui4</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>LoopMode</name>
<dataType>ui4</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>QueueID</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>QueueType</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>QueueAutoInsert</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>Result</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>Code</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>Proxy</name>
<dataType>string</dataType>
</stateVariable>
</serviceStateTable>
</scpd>
Thanks! Funny enough, I did stumble upon some of your projects and I've been tinkering the last few hours.
Am I understanding correctly that when a queue is created, it becomes CurrentQueue?

I've noticed sometimes, when I append a track to the queue, it doesn't get seen by the WiiM until the next "loop" through the queue. This particularly seems to happen if I'm on the last song. Have you run into that? Or perhaps there's something I'm missing.

I'm appending like this:
Code:
curl -X POST \
     -H 'Content-Type: text/xml; charset="utf-8"' \
     -H 'SOAPACTION: "urn:schemas-wiimu-com:service:PlayQueue:1#AppendTracksInQueue"' \
     -d '<?xml version="1.0" encoding="utf-8" standalone="yes"?>
     <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
       <s:Body>
         <u:AppendTracksInQueue xmlns:u="urn:schemas-wiimu-com:service:PlayQueue:1">
           <QueueContext>
             &lt;?xml version="1.0"?&gt;
             &lt;PlayList&gt;
               &lt;ListName&gt;CurrentQueue&lt;/ListName&gt;
               &lt;ListInfo&gt;
                 &lt;SourceName&gt;PC_RemoteLocal&lt;/SourceName&gt;
                 &lt;MarkSearch&gt;0&lt;/MarkSearch&gt;
                 &lt;TrackNumber&gt;1&lt;/TrackNumber&gt;
                 &lt;Quality&gt;0&lt;/Quality&gt;
                 &lt;UpdateTime&gt;123456&lt;/UpdateTime&gt;
                 &lt;LastPlayIndex&gt;1&lt;/LastPlayIndex&gt;
                 &lt;AlarmPlayIndex&gt;0&lt;/AlarmPlayIndex&gt;
                 &lt;RealIndex&gt;0&lt;/RealIndex&gt;
                 &lt;SwitchPageMode&gt;0&lt;/SwitchPageMode&gt;
                 &lt;CurrentPage&gt;0&lt;/CurrentPage&gt;
                 &lt;TotalPages&gt;0&lt;/TotalPages&gt;
                 &lt;searching&gt;0&lt;/searching&gt;
               &lt;/ListInfo&gt;
               &lt;Tracks&gt;
                 &lt;Track1&gt;
                   &lt;URL&gt;http://192.168.0.193:8073/10 My Last Breath.flac&lt;/URL&gt;
                   &lt;Metadata&gt;&amp;lt;?xml version="1.0"?&amp;gt;
                     &amp;lt;DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:song="www.linkplay.com/song/" xmlns:custom="www.linkplay.com/custom/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"&amp;gt;
                       &amp;lt;upnp:class&amp;gt;object.item.audioItem.musicTrack&amp;lt;/upnp:class&amp;gt;
                       &amp;lt;item&amp;gt;
                         &amp;lt;custom:uuid&amp;gt;137118543134398&amp;lt;/custom:uuid&amp;gt;
                         &amp;lt;song:id&amp;gt;803&amp;lt;/song:id&amp;gt;
                         &amp;lt;song:albumid&amp;gt;None&amp;lt;/song:albumid&amp;gt;
                         &amp;lt;song:singerid&amp;gt;None&amp;lt;/song:singerid&amp;gt;
                         &amp;lt;dc:title&amp;gt;My Last Breath&amp;lt;/dc:title&amp;gt;
                         &amp;lt;upnp:artist&amp;gt;ArtistNameHere&amp;lt;/upnp:artist&amp;gt;
                         &amp;lt;upnp:album&amp;gt;AlbumNameHere&amp;lt;/upnp:album&amp;gt;
                         &amp;lt;res protocolInfo="http-get:*:audio/flac:DLNA.ORG_PN=FLAC;DLNA.ORG_OP=01;" duration="98765432"&amp;gt;http://192.168.0.193:8073/10 My Last Breath.flac&amp;lt;/res&amp;gt;
                         &amp;lt;upnp:albumArtURI&amp;gt;http://album-art-link-for-track&amp;lt;/upnp:albumArtURI&amp;gt;
                         &amp;lt;song:rate_hz&amp;gt;44100&amp;lt;/song:rate_hz&amp;gt;
                         &amp;lt;song:format_s&amp;gt;16&amp;lt;/song:format_s&amp;gt;
                         &amp;lt;song:bitrate&amp;gt;832&amp;lt;/song:bitrate&amp;gt;
                       &amp;lt;/item&amp;gt;
                     &amp;lt;/DIDL-Lite&amp;gt;
                   &lt;/Metadata&gt;
                   &lt;Id&gt;803&lt;/Id&gt;
                   &lt;Source&gt;PC_RemoteLocal&lt;/Source&gt;
                   &lt;Id&gt;803&lt;/Id&gt;
                   &lt;ChapterNumber&gt;0&lt;/ChapterNumber&gt;
                   &lt;Chapters&gt;&lt;/Chapters&gt;
                 &lt;/Track1&gt;
               &lt;/Tracks&gt;
             &lt;/PlayList&gt;
           </QueueContext>
         </u:AppendTracksInQueue>
       </s:Body>
     </s:Envelope>' \
     http://192.168.0.246:49152/upnp/control/PlayQueue1

PS: Do you have any suggestions on a upnp browser?
 
I use UPnP Tool (Android on ChromeOS), which works great.
1699544126862.png

I mostly learned how to use the UPnP interface from a .zip file at the Arylic website, but I can't find it now. I've attached a rezipped version, though a few files have been updated, mostly the config file, which asks for an IP address. The examples use CURL. Arylic also documents the Linkplay http interface, though I don't know if it's 100% compatible with WiiM devices, as Arylic uses much older Linkplay modules.

Also search GitHub for "Linkplay".
 

Attachments

  • arylic.zip
    39.2 KB · Views: 12
Last edited:
I use UPnP Tool (Android on ChromeOS), which works great.
View attachment 3286

I mostly learned how to use the UPnP interface from a .zip file at the Arylic website, but I can't find it now. I've attached a rezipped version, though a few files have been updated, mostly the config file, which asks for an IP address. The examples use CURL. Arylic also documents the Linkplay http interface, though I don't know if it's 100% compatible with WiiM devices, as Arylic uses much older Linkplay modules.
Thank you, you've been a huge help. I appreciate you taking the time to respond and re-zip that for me. Getting a lot of good info with upnp tool, very invaluable. Thanks again!!
 
Hey @cc_rider have you gotten ReplaceQueue to work?
I figured the intention was to use that in situations, such as re-ordering a playlist. That way the WiiM player stays on it's plicurr, but you might swap out what comes next.

For example, I have a queue of two songs, and start playing it. Immediately, I replace the queue with a queue of two other songs, but song #2 is different. When song one finishes, the player just stops.

Was curious if you ever experimented with that and had similar results, and what you would use for "rearranging" tracks in a playlist.

It seems to work okay if I issue a command like command=setPlayerCmd:next though, oddly enough. It just doesn't like switching to the next song on its own.
 
Last edited:
Hey @cc_rider have you gotten ReplaceQueue to work?
I figured the intention was to use that in situations, such as re-ordering a playlist. That way the WiiM player stays on it's plicurr, but you might swap out what comes next.

For example, I have a queue of two songs, and start playing it. Immediately, I replace the queue with a queue of two other songs, but song #2 is different. When song one finishes, the player just stops.

Was curious if you ever experimented with that and had similar results, and what you would use for "rearranging" tracks in a playlist.
Haven't tried. Most of my projects just query the providers APIs (Tidal,Qobuz,Deezer), get an album ID, then pass that to the WiiM devices to do the actual search and queue build. I'm an old LP listener, so have always listened to entire albums, never really messed with playlists.
 
Haven't tried. Most of my projects just query the providers APIs (Tidal,Qobuz,Deezer), get an album ID, then pass that to the WiiM devices to do the actual search and queue build. I'm an old LP listener, so have always listened to entire albums, never really messed with playlists.
Fair enough. I doubt I'll ever use it anyway. But I'm just experimenting with curl commands to figure out how I'd implement my own Desktop player. Thanks for the quick reply! I learned a lot from you!
 
Perhaps this is a bug for the @WiiM Team, since I've been able to consistently reproduce.

For example:
1.) I CreateQueue with 3 songs and start playing the queue at song 1.
2.) I ReplaceQueue where songs #2 and #3 are different songs.
3.) When song 1 finishes, song #2 gets skipped, and song #3 (new one from ReplaceQueue) plays.
4.) If I then use
Code:
setPlayerCmd=prev
, then the new song #2 plays, it's literally just being skipped.
 
Last edited:
Index in PlayQueueWithIndex method, perhaps? 🙅‍♂️
 
Last edited:
Am I understanding correctly that when a queue is created, it becomes CurrentQueue?

I think once you play a named queue it becomes CurrentQueue. Browse "TotalQueue" for a complete list of all named queues.
 
I think once you play a named queue it becomes CurrentQueue. Browse "TotalQueue" for a complete list of all named queues.

Oh neat, I had no clue about that! Anything else not documented you think is useful to know? I think I've gathered everything I need to know on the WiiM side, so I started writing a basic music streaming server/library scanner to host on a pi. I just need to send a request to the endpoint and it'll handle communicating with the WiiM server-side. :D
 
Last edited:
Plenty of information to be gathered using GetUserInfo, should you want to interface with the Tidal, Deezer or Qobuz APIs directly, and have the WiiM play from them. AccountSource strings are Tidal, Deezer2, Qobuz, Prime, probably others I haven't used.
 
Plenty of information to be gathered using GetUserInfo, should you want to interface with the Tidal, Deezer or Qobuz APIs directly, and have the WiiM play from them. AccountSource strings are Tidal, Deezer2, Qobuz, Prime, probably others I haven't used.
Ohh, awesome. I see you interface a lot with Tidal, which will be a great reference point in the future. I'll inevitably run out of CD's to find at flea markets and inevitably get bored and want to expand my music server haha. I really do appreciate your help. I'll check in with anything I build, if you'd like to take a look some time. :)
 
Back
Top