• WANTED: Happy members who like to discuss audio and other topics related to our interest. Desire to learn and share knowledge of science required as is 20 years of participation in forums (not all true). There are daily reviews of audio hardware and expert members to help answer your questions. Click here to have your audio equipment measured for free!

Waveshare 7" Display For Your WiiM Mini

Ralph_Cramden

Major Contributor
Joined
Dec 6, 2020
Messages
1,916
Likes
2,538
I've posted the Python script, with a complete set of instructions for installation on a Raspberry Pi Zero, here.

539FCFD7-EF67-4F0F-B7C9-437BFA1B5EA2.jpeg
 

somebodyelse

Major Contributor
Joined
Dec 5, 2018
Messages
2,904
Likes
2,197
Nicely done. A couple of suggestions to make it easier for people to install/upgrade:
  1. Add a requirements file so people can just 'pip install -r requirements.txt' or similar for the python dependencies
  2. move any config options to a separate file or command line option so people don't have to edit the script on every upgrade. It looks like it's limited to 'device' so far, but I can imagine future options for fonts, layout etc.
 
OP
Ralph_Cramden

Ralph_Cramden

Major Contributor
Joined
Dec 6, 2020
Messages
1,916
Likes
2,538
For those who might be interested in building a browser interface to the WiiM Mini, I'll add some notes in this thread at random.

The current queue is, oddly enough, named "CurrentQueue". Its contents can be seen by invoking BrowseQueue in the PlayQueue:1 service.

The PlayQueue SCPD for your device can be viewed here: http://192.168.68.112:49152/upnp/PlayQueueSCPD.xml (Your Mini's ip address will differ, of course)

XML:
<scpd xmlns="urn:schemas-upnp-org:service-1-0">
<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>
</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>

Sample CurrentQueue contents:

XML:
<?xml version="1.0"?> <PlayList> <ListName>Stan Getz/Cal Tjader Sextet [Original Jazz Classics Remasters]</ListName> <ListInfo> <SourceName>Prime</SourceName> <SearchUrl>https://music-api.amazon.com/search/../catalog/albums/B01LYDCU2P/</SearchUrl> <MaxTrackNumber>6</MaxTrackNumber> <MarkSearch>0</MarkSearch> <TrackNumber>7</TrackNumber> <Quality>0</Quality> <UpdateTime>41348</UpdateTime> <LastPlayIndex>3</LastPlayIndex> <AlarmPlayIndex>0</AlarmPlayIndex> <RealIndex>0</RealIndex> <SwitchPageMode>0</SwitchPageMode> <CurrentPage>1</CurrentPage> <TotalPages>1</TotalPages> <searching>0</searching> <PressType>0</PressType> <Volume>0</Volume> </ListInfo> <Tracks> <Track1> <URL>wiimu_search://../../tracks/B01M001ILG/</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;0&quot;&gt; &lt;song:subid&gt;0&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;B01M001ILG&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;0&lt;/song:singerid&gt; &lt;song:albumid&gt;1&lt;/song:albumid&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;183:36:40.000&quot;&gt;wiimu_search://../../tracks/B01M001ILG/&lt;/res&gt; &lt;dc:title&gt;Ginza Samba&lt;/dc:title&gt; &lt;dc:creator&gt;Stan Getz &amp;amp; Cal Tjader&lt;/dc:creator&gt; &lt;upnp:artist&gt;Stan Getz &amp;amp; Cal Tjader&lt;/upnp:artist&gt; &lt;upnp:album&gt;Stan Getz/Cal Tjader Sextet [Original Jazz Classics Remasters]&lt;/upnp:album&gt; &lt;upnp:thumbRating&gt;unknown&lt;/upnp:thumbRating&gt; &lt;upnp:ratingURI&gt;unknown&lt;/upnp:ratingURI&gt; &lt;upnp:albumArtURI&gt;https://m.media-amazon.com/images/I/517R7IIjEsL.jpg&lt;/upnp:albumArtURI&gt; &lt;song:rate_hz&gt;44100&lt;/song:rate_hz&gt; &lt;song:format_s&gt;32&lt;/song:format_s&gt; &lt;song:actualQuality&gt;HD&lt;/song:actualQuality&gt; &lt;song:bitrate&gt;960583&lt;/song:bitrate&gt; &lt;song:rate_hz&gt;44100&lt;/song:rate_hz&gt; &lt;song:format_s&gt;32&lt;/song:format_s&gt; &lt;song:actualQuality&gt;HD&lt;/song:actualQuality&gt; &lt;song:bitrate&gt;960583&lt;/song:bitrate&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>../../tracks/B01M001ILG/</Id> <Source>Prime</Source> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track1> <Track2> <URL>wiimu_search://../../tracks/B01LZ0UG04/</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;0&quot;&gt; &lt;song:subid&gt;1&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;B01LZ0UG04&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;0&lt;/song:singerid&gt; &lt;song:albumid&gt;2&lt;/song:albumid&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;66:40:00.000&quot;&gt;wiimu_search://../../tracks/B01LZ0UG04/&lt;/res&gt; &lt;dc:title&gt;I&amp;apos;ve Grown Accustomed to Her Face&lt;/dc:title&gt; &lt;dc:creator&gt;Stan Getz &amp;amp; Cal Tjader&lt;/dc:creator&gt; &lt;upnp:artist&gt;Stan Getz &amp;amp; Cal Tjader&lt;/upnp:artist&gt; &lt;upnp:album&gt;Stan Getz/Cal Tjader Sextet [Original Jazz Classics Remasters]&lt;/upnp:album&gt; &lt;upnp:thumbRating&gt;unknown&lt;/upnp:thumbRating&gt; &lt;upnp:ratingURI&gt;unknown&lt;/upnp:ratingURI&gt; &lt;upnp:albumArtURI&gt;https://m.media-amazon.com/images/I/517R7IIjEsL.jpg&lt;/upnp:albumArtURI&gt; &lt;song:rate_hz&gt;44100&lt;/song:rate_hz&gt; &lt;song:format_s&gt;32&lt;/song:format_s&gt; &lt;song:actualQuality&gt;HD&lt;/song:actualQuality&gt; &lt;song:bitrate&gt;855045&lt;/song:bitrate&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>../../tracks/B01LZ0UG04/</Id> <Source>Prime</Source> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track2> <Track3> <URL>wiimu_search://../../tracks/B01LYDCS1A/</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;0&quot;&gt; &lt;song:subid&gt;2&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;B01LYDCS1A&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;0&lt;/song:singerid&gt; &lt;song:albumid&gt;3&lt;/song:albumid&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;95:50:00.000&quot;&gt;wiimu_search://../../tracks/B01LYDCS1A/&lt;/res&gt; &lt;dc:title&gt;For All We Know&lt;/dc:title&gt; &lt;dc:creator&gt;Stan Getz &amp;amp; Cal Tjader&lt;/dc:creator&gt; &lt;upnp:artist&gt;Stan Getz &amp;amp; Cal Tjader&lt;/upnp:artist&gt; &lt;upnp:album&gt;Stan Getz/Cal Tjader Sextet [Original Jazz Classics Remasters]&lt;/upnp:album&gt; &lt;upnp:thumbRating&gt;unknown&lt;/upnp:thumbRating&gt; &lt;upnp:ratingURI&gt;unknown&lt;/upnp:ratingURI&gt; &lt;upnp:albumArtURI&gt;https://m.media-amazon.com/images/I/517R7IIjEsL.jpg&lt;/upnp:albumArtURI&gt; &lt;song:rate_hz&gt;44100&lt;/song:rate_hz&gt; &lt;song:format_s&gt;32&lt;/song:format_s&gt; &lt;song:actualQuality&gt;HD&lt;/song:actualQuality&gt; &lt;song:bitrate&gt;870019&lt;/song:bitrate&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>../../tracks/B01LYDCS1A/</Id> <Source>Prime</Source> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track3> <Track4> <URL>wiimu_search://../../tracks/B01LY1Q6JY/</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;0&quot;&gt; &lt;song:subid&gt;3&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;B01LY1Q6JY&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;0&lt;/song:singerid&gt; &lt;song:albumid&gt;4&lt;/song:albumid&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;139:26:40.000&quot;&gt;wiimu_search://../../tracks/B01LY1Q6JY/&lt;/res&gt; &lt;dc:title&gt;Crow&apos;s Nest&lt;/dc:title&gt; &lt;dc:creator&gt;Stan Getz &amp;amp; Cal Tjader&lt;/dc:creator&gt; &lt;upnp:artist&gt;Stan Getz &amp;amp; Cal Tjader&lt;/upnp:artist&gt; &lt;upnp:album&gt;Stan Getz/Cal Tjader Sextet [Original Jazz Classics Remasters]&lt;/upnp:album&gt; &lt;upnp:thumbRating&gt;unknown&lt;/upnp:thumbRating&gt; &lt;upnp:ratingURI&gt;unknown&lt;/upnp:ratingURI&gt; &lt;upnp:albumArtURI&gt;https://m.media-amazon.com/images/I/517R7IIjEsL.jpg&lt;/upnp:albumArtURI&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>../../tracks/B01LY1Q6JY/</Id> <Source>Prime</Source> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track4> <Track5> <URL>wiimu_search://../../tracks/B01LYDCV48/</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;0&quot;&gt; &lt;song:subid&gt;4&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;B01LYDCV48&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;0&lt;/song:singerid&gt; &lt;song:albumid&gt;5&lt;/song:albumid&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;63:36:40.000&quot;&gt;wiimu_search://../../tracks/B01LYDCV48/&lt;/res&gt; &lt;dc:title&gt;Liz-Anne&lt;/dc:title&gt; &lt;dc:creator&gt;Stan Getz &amp;amp; Cal Tjader&lt;/dc:creator&gt; &lt;upnp:artist&gt;Stan Getz &amp;amp; Cal Tjader&lt;/upnp:artist&gt; &lt;upnp:album&gt;Stan Getz/Cal Tjader Sextet [Original Jazz Classics Remasters]&lt;/upnp:album&gt; &lt;upnp:thumbRating&gt;unknown&lt;/upnp:thumbRating&gt; &lt;upnp:ratingURI&gt;unknown&lt;/upnp:ratingURI&gt; &lt;upnp:albumArtURI&gt;https://m.media-amazon.com/images/I/517R7IIjEsL.jpg&lt;/upnp:albumArtURI&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>../../tracks/B01LYDCV48/</Id> <Source>Prime</Source> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track5> <Track6> <URL>wiimu_search://../../tracks/B01M0NE8FM/</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;0&quot;&gt; &lt;song:subid&gt;5&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;B01M0NE8FM&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;0&lt;/song:singerid&gt; &lt;song:albumid&gt;6&lt;/song:albumid&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;76:23:20.000&quot;&gt;wiimu_search://../../tracks/B01M0NE8FM/&lt;/res&gt; &lt;dc:title&gt;Big Bear&lt;/dc:title&gt; &lt;dc:creator&gt;Stan Getz &amp;amp; Cal Tjader&lt;/dc:creator&gt; &lt;upnp:artist&gt;Stan Getz &amp;amp; Cal Tjader&lt;/upnp:artist&gt; &lt;upnp:album&gt;Stan Getz/Cal Tjader Sextet [Original Jazz Classics Remasters]&lt;/upnp:album&gt; &lt;upnp:thumbRating&gt;unknown&lt;/upnp:thumbRating&gt; &lt;upnp:ratingURI&gt;unknown&lt;/upnp:ratingURI&gt; &lt;upnp:albumArtURI&gt;https://m.media-amazon.com/images/I/517R7IIjEsL.jpg&lt;/upnp:albumArtURI&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>../../tracks/B01M0NE8FM/</Id> <Source>Prime</Source> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track6> <Track7> <URL>wiimu_search://../../tracks/B01M1AIV1F/</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;0&quot;&gt; &lt;song:subid&gt;6&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;B01M1AIV1F&lt;/song:id&gt; &lt;song:like&gt;0&lt;/song:like&gt; &lt;song:singerid&gt;0&lt;/song:singerid&gt; &lt;song:albumid&gt;7&lt;/song:albumid&gt; &lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;87:30:00.000&quot;&gt;wiimu_search://../../tracks/B01M1AIV1F/&lt;/res&gt; &lt;dc:title&gt;My Buddy&lt;/dc:title&gt; &lt;dc:creator&gt;Stan Getz &amp;amp; Cal Tjader&lt;/dc:creator&gt; &lt;upnp:artist&gt;Stan Getz &amp;amp; Cal Tjader&lt;/upnp:artist&gt; &lt;upnp:album&gt;Stan Getz/Cal Tjader Sextet [Original Jazz Classics Remasters]&lt;/upnp:album&gt; &lt;upnp:thumbRating&gt;unknown&lt;/upnp:thumbRating&gt; &lt;upnp:ratingURI&gt;unknown&lt;/upnp:ratingURI&gt; &lt;upnp:albumArtURI&gt;https://m.media-amazon.com/images/I/517R7IIjEsL.jpg&lt;/upnp:albumArtURI&gt; &lt;song:rate_hz&gt;44100&lt;/song:rate_hz&gt; &lt;song:format_s&gt;32&lt;/song:format_s&gt; &lt;song:actualQuality&gt;HD&lt;/song:actualQuality&gt; &lt;song:bitrate&gt;953052&lt;/song:bitrate&gt; &lt;/item&gt; &lt;/DIDL-Lite&gt; </Metadata> <Id>../../tracks/B01M1AIV1F/</Id> <Source>Prime</Source> <ChapterNumber>0</ChapterNumber> <Chapters></Chapters> </Track7> </Tracks> </PlayList>
 
Last edited:

Music1969

Major Contributor
Joined
Feb 19, 2018
Messages
3,685
Likes
2,167
Hi @Ralph_Cramden

Is the clock time display supposed to also work, if WiiM Mini is powered off? Or only work when WiiM Mini is powered on ?

Any chance it could function as a clock even if WiiM Mini is powered off. ?
 

Music1969

Major Contributor
Joined
Feb 19, 2018
Messages
3,685
Likes
2,167
glad to be of help coz my current project involves working with python and I had to manage getting them running with such services
If you or anyone could help @Ralph_Cramden get this great solution to work with Bullseye that would be great !

It's running fine on Buster which is officially supported to 2024 , which is a long way away

But on Ralphs github I saw a comment that he couldn't get it to work on Bullseye so maybe some assistance could get that working

Obviously not urgent though
 

Katji

Major Contributor
Joined
Sep 26, 2017
Messages
3,001
Likes
2,245
Ohh, cool. It's a nice-looking setup, I like the pics in the What are we listening to thread.
.....Maybe you get it to generate text with a copy-to-clipboard link/button so you can just paste it into the thread.....although then it would just be the screen image, no RME. lol Just a sudden idea.
 

raif71

Major Contributor
Joined
Sep 7, 2019
Messages
1,971
Likes
1,986
If you or anyone could help @Ralph_Cramden get this great solution to work with Bullseye that would be great !

It's running fine on Buster which is officially supported to 2024 , which is a long way away

But on Ralphs github I saw a comment that he couldn't get it to work on Bullseye so maybe some assistance could get that working

Obviously not urgent though
Yes, I got your message on the other thread. It's obviously great what Ralph has done for the community but I haven't seen that github site. Honestly, I'm busy at the moment but not busy enough to miss reading some of the threads here at ASR and posting messages :)
 

Music1969

Major Contributor
Joined
Feb 19, 2018
Messages
3,685
Likes
2,167
Yes, I got your message on the other thread. It's obviously great what Ralph has done for the community but I haven't seen that github site. Honestly, I'm busy at the moment but not busy enough to miss reading some of the threads here at ASR and posting messages :)
No worries at all

If anyone is interested or could help with Bullseye here's the github:

 
OP
Ralph_Cramden

Ralph_Cramden

Major Contributor
Joined
Dec 6, 2020
Messages
1,916
Likes
2,538
It's polling the WiiM in a loop, so probably timing out in the UPnP library. Would need to either change from async lib to one that can be used in a thread, or try subscribing to the WiiM's UPnP services, which I tried in the 3.5" WiiM version. But, I just leave my WiiM on 24/7, so I don't have a use case to pursue this. If it ain't broke...
 
OP
Ralph_Cramden

Ralph_Cramden

Major Contributor
Joined
Dec 6, 2020
Messages
1,916
Likes
2,538
Poking around the WiiM's UPnP interface, RenderingControl service, GetControlDeviceInfo yields a couple of interesting ports:

"uart_pass_port": "8899", "communication_port": "8819"

netcat to port 8899 connects, but no response no matter what I type in.

netcat to port 8819 responds like this every 3 or 4 seconds, until I ^C out:

?�? �{"action":1003}?�? �{"action":1003}?�? �{"action":1003}?�? �{"action":1003}^C

Not terribly useful...
 
OP
Ralph_Cramden

Ralph_Cramden

Major Contributor
Joined
Dec 6, 2020
Messages
1,916
Likes
2,538
Finally found an album that needed the "max_lines" attribute. Works! ;)

F18E9D16-3FCC-423D-A03D-0A9A81E90269.jpeg
 

Music1969

Major Contributor
Joined
Feb 19, 2018
Messages
3,685
Likes
2,167
@Ralph_Cramden

This is working just as nicely with Tidal Connect as Amazon UHD casting.

Except one thing - bitrate not showing on the Waveshare screen for some reason.

It is showing in the WiiM Home app though, so the info is there.

Any clue what could fix it?

I know you don't use Tidal Connect much but just thought I'd ask if anything comes to mind

Thanks!
 
OP
Ralph_Cramden

Ralph_Cramden

Major Contributor
Joined
Dec 6, 2020
Messages
1,916
Likes
2,538
@Ralph_Cramden

This is working just as nicely with Tidal Connect as Amazon UHD casting.

Except one thing - bitrate not showing on the Waveshare screen for some reason.

It is showing in the WiiM Home app though, so the info is there.

Any clue what could fix it?

I know you don't use Tidal Connect much but just thought I'd ask if anything comes to mind

Thanks!
I'm not seeing it on the WiiM Home app, or in the XML. Can you provide an example track where it's showing up with Tidal Connect?
 

Music1969

Major Contributor
Joined
Feb 19, 2018
Messages
3,685
Likes
2,167
I'm not seeing it on the WiiM Home app, or in the XML. Can you provide an example track where it's showing up with Tidal Connect?
Example track below showing 960 kbps in WiiM Home app , using Tidal Connect

So other than bitrate, Tidal Connect works just as well to WiiM Mini as Amazon Casting, with your wiim.py for Waveshare. So thats cool

Also for bitrate with Amazon Music UHD I noticed WiiM have made a change to bitrate format and the "/1000" is no longer required with this:

br= int(data['song:bitrate']) / 1000.0

I'm on a fresh new x953 firmware, that just came today. I think it's still beta but not sure.

1659445600266.png
 
OP
Ralph_Cramden

Ralph_Cramden

Major Contributor
Joined
Dec 6, 2020
Messages
1,916
Likes
2,538
Ah. I don't see the bitrate with that track, so it must have been added with your new firmware. Odd it doesn't show up on the Waveshare, though, if it's in the XML. Maybe they've added a new tag? Dunno. I'll have to wait until the firmware push.

If you have UPnP Tool installed, you can look at AVTransport:1/GetMediaInfo to see where it shows up in the XML.
 

direwolf08

Member
Joined
Aug 31, 2020
Messages
11
Likes
3
@Ralph_Cramden - really cool what you are doing with adding Now Playing UI to the Wiim. Thank you for adding to the ecosystem! You (or someone who is a fan of you) recently responded to my feature request on the Wiim Support website ... I admit I have been lurking on this and the Simple Python Web App thread, trying to figure out if I can build either! I have a Raspberry Pi 4 and the Official RPi 7" touchscreen that is currently running Volumio, but since the Wiim has essentially replaced it, I am more than willing to install Raspberry Pi OS or something else. I assume I could at least set up the web app? I am not a great programmer, so advice on how to get up and running here would be great, I would love to give this a shot!
 
OP
Ralph_Cramden

Ralph_Cramden

Major Contributor
Joined
Dec 6, 2020
Messages
1,916
Likes
2,538
@Ralph_Cramden - really cool what you are doing with adding Now Playing UI to the Wiim. Thank you for adding to the ecosystem! You (or someone who is a fan of you) recently responded to my feature request on the Wiim Support website ... I admit I have been lurking on this and the Simple Python Web App thread, trying to figure out if I can build either! I have a Raspberry Pi 4 and the Official RPi 7" touchscreen that is currently running Volumio, but since the Wiim has essentially replaced it, I am more than willing to install Raspberry Pi OS or something else. I assume I could at least set up the web app? I am not a great programmer, so advice on how to get up and running here would be great, I would love to give this a shot!
The Web app is much simpler to install, and doesn't require a specific screen. I've just installed it on a $29 Inovato Quadra, which I can access locally (with keyboard and HDMI monitor attached to the Quadra) or from my PC.

Download the wiim-web zip, and extract to a directory.
Open a terminal
sudo apt update
sudo apt upgrade
sudo apt install python3-pip
sudo pip3 install xmltodict
sudo pip3 install upnpclient

cd ~/WiiM-Web-main
nano server.py
(edit the ip address of your WiiM at the bottom)
save file

./server.py

Then, open browser, navigate to http://localhost:8080


1664575947197.png
 
Last edited:
OP
Ralph_Cramden

Ralph_Cramden

Major Contributor
Joined
Dec 6, 2020
Messages
1,916
Likes
2,538
I'd never used tkinter before; it's pretty simple (thanks to lots of google searches). This might be the best way to build this for the little Inovato with a small HDMI display, running full screen without a keyboard or mouse. Need to figure out screen blanking when nothing is playing, looks like maybe a call to xdg-screensaver can handle that...

Advantage of the Inovato vs a Raspberry Pi is (currently) price, availability, and simplicity (OS pre-installed).

1664666738533.png
 
Top Bottom