- Joined
- Dec 17, 2021
- Messages
- 680
- Likes
- 1,511
I just finished building a project that some others here might enjoy trying! It's free and reusable under the MIT license.
NowPlayingDisplay on GitHub: https://github.com/anotherhobby/NowPlayingDisplay
Tell Me About It!
NowPlayingDisplay shows full screen album art and information on an HDMI screen for your currently playing music. It is universal (player agnostic), API driven, and written in python. It requires a client to push data and keep the display updated, but the display does a lot of the driving, including tracking down the album data and art. Out of the gate I have 4 client integrations available: Home Assistant, WiiM, and TIDAL desktop on the Mac. Additional clients are easy to write and can be done in any language or even something like NodeRed. The Home Assistant integration also means it works with any music player that works with Home Assistant as long as you are running it, which is a very large number of players.
Below are pictures of NowPlayingDisplay running on a 6" HDMI screen. The ablum art fills the full left square, while the remaining space to the right contains organized information and a progress bar for the currently playing title. The album art and metadata is all sourced from the iTunes music service API.
When the player is paused, the album information and progress bar dim:
After a few minutes of being idle and not playing music, NowPlayingDisplay runs a built-in screen saver I wrote that's a grid of album covers sourced from the music you've played. The grid updates a small percentage of the covers randomly every few seconds. A 16x9 display will have 16 albums across by 9 albums high (144 albums). Until you have listened to 144 albums, covers will be repeated in the screensaver. Once that threshold is crossed, the screensaver keeps the artwork well randomized and unique.
Why did I build this?
A year ago I bought a small 6" HDMI monitor to suspend under my main computer monitor for the purpose of have a "now playing" display. At the time I was using Roon which had this feature. I dropped Roon and was sad about losing the display. I tried several other things, but just wasn't happy. Three weeks ago, I finally decided I wanted my own small stand-alone now playing display server, with the specific ability to integrate any player I wanted over time. In my research for inspiration, I stumbled across this post by @Ralph_Cramden that really got me started, introduced me to the python tkinter library, and served as an excellent starting point and lit a fire under me.
How does it work?
NowPlayingDisplay doesn't do anything on it's own until there is a client sending it data. The client is a process that commincates with an actual music player, and then regularily posts the track title, album title, artist(s), track duration, elapsed time, and active/stopped/paused status to the NowPlayingDisplay server, which is then used to drive the state of the display. For the album art and metadata, NowPlayingDisplay uses the data provided by the client using several methods to achieve a very high and fast hit rate from the iTunes database, way above 99% accurate (except for classical, the brief testing there did not go well). It then pulls data from there to minimize the work for the client and to have access to extra data like release date, track count, and album duration. NowPlayingDisplay also syncs the elapsed time provided by the client to an internal counter to drive the progress bar and update elapsed time on the display every second, so the client doesn't need to constantly send updates.
Hardware?
NowPlayingDisplay uses very little CPU and is platform independant (it even runs on my Mac running Sonoma). A Raspberry pi zero would be more than enough. I run it on a pi4 (overkill) with a 6 inch HDMI display:
How do I run it?
Details are all provded on the GitHub page: https://github.com/anotherhobby/NowPlayingDisplay
NowPlayingDisplay on GitHub: https://github.com/anotherhobby/NowPlayingDisplay
Tell Me About It!
NowPlayingDisplay shows full screen album art and information on an HDMI screen for your currently playing music. It is universal (player agnostic), API driven, and written in python. It requires a client to push data and keep the display updated, but the display does a lot of the driving, including tracking down the album data and art. Out of the gate I have 4 client integrations available: Home Assistant, WiiM, and TIDAL desktop on the Mac. Additional clients are easy to write and can be done in any language or even something like NodeRed. The Home Assistant integration also means it works with any music player that works with Home Assistant as long as you are running it, which is a very large number of players.
Below are pictures of NowPlayingDisplay running on a 6" HDMI screen. The ablum art fills the full left square, while the remaining space to the right contains organized information and a progress bar for the currently playing title. The album art and metadata is all sourced from the iTunes music service API.
When the player is paused, the album information and progress bar dim:
After a few minutes of being idle and not playing music, NowPlayingDisplay runs a built-in screen saver I wrote that's a grid of album covers sourced from the music you've played. The grid updates a small percentage of the covers randomly every few seconds. A 16x9 display will have 16 albums across by 9 albums high (144 albums). Until you have listened to 144 albums, covers will be repeated in the screensaver. Once that threshold is crossed, the screensaver keeps the artwork well randomized and unique.
Why did I build this?
A year ago I bought a small 6" HDMI monitor to suspend under my main computer monitor for the purpose of have a "now playing" display. At the time I was using Roon which had this feature. I dropped Roon and was sad about losing the display. I tried several other things, but just wasn't happy. Three weeks ago, I finally decided I wanted my own small stand-alone now playing display server, with the specific ability to integrate any player I wanted over time. In my research for inspiration, I stumbled across this post by @Ralph_Cramden that really got me started, introduced me to the python tkinter library, and served as an excellent starting point and lit a fire under me.
How does it work?
NowPlayingDisplay doesn't do anything on it's own until there is a client sending it data. The client is a process that commincates with an actual music player, and then regularily posts the track title, album title, artist(s), track duration, elapsed time, and active/stopped/paused status to the NowPlayingDisplay server, which is then used to drive the state of the display. For the album art and metadata, NowPlayingDisplay uses the data provided by the client using several methods to achieve a very high and fast hit rate from the iTunes database, way above 99% accurate (except for classical, the brief testing there did not go well). It then pulls data from there to minimize the work for the client and to have access to extra data like release date, track count, and album duration. NowPlayingDisplay also syncs the elapsed time provided by the client to an internal counter to drive the progress bar and update elapsed time on the display every second, so the client doesn't need to constantly send updates.
Hardware?
NowPlayingDisplay uses very little CPU and is platform independant (it even runs on my Mac running Sonoma). A Raspberry pi zero would be more than enough. I run it on a pi4 (overkill) with a 6 inch HDMI display:
How do I run it?
Details are all provded on the GitHub page: https://github.com/anotherhobby/NowPlayingDisplay
Last edited: