Access to metadata

I’m using RoPieee with a variety of sources; Roon, Airplay and PlexAmp primarily. I’d like to add a little screen to my streamer showing the currently playing track and include play/pause/skip commands also.

Of couse, RoPieee doesn’t offer this out of the box. I am willing to get my hands dirty, but I’m wondering how feasible this is. Has anyone accomplished something like this?

One approach I am considering:

  • install RoPieee on the pi as a VM using ProxMox
  • additionally add another VM which will be my own application
  • in my own application, monitor what source is currently playing
  • For Roon, I can use the Roon API to fetch what’s playing
  • For Plexamp, I can access the local PlexAmp Headless API to fetch what’s playing
  • For Airplay, I am stuck unless @spockfish is willing to enable MQTT publishing of metadata
  • Given all that metadata, I can create a websocket that will pick the active source and publish metadata
  • And I can send commands over the websocket which will be translated to commands for the active source
  • And finally a small client application showing a UI and connecting to the websocket for updates and to send commands

I am really hoping I can avoid manually doing what RoPieee does for me, cause it’s such a great piece of kit. Rock solid. Being able to compose my ‘UI’ layer on top of it would be so nice.

Anyone who has tried similar things, I’d love to hear your experiences! Especially around Airplay, 'cos I’m stuck there with getting metadata!

Thanks!
Bastiaan

PS
I realise RoPieee offers way more sources than the three I mentioned – I don’t use those so I’ve skipped over them.

Have you looked at:

Er, yes it does… RoPieee | Display

If you mean that you want to use the screen with Plexamp and Airplay, then you’re probably better looking at a Linux distribution, e.g. DietPi that you can build stuff on top of…

1 Like

Yeah so this is just for Roon, using vanilla RoPieee. I’m wanting a screen that will display what’s playing across all three services I use.

Also, I don’t want a 7" screen. I am looking for a much smaller high-res screen as this is for desktop use primarily.

Yes that’s what I mean. I don’t only use Roon. It would be silly to have a screen that is blank half of the time, IMHO.

I haven’t tested this, but I doubt that ropieee’s driver support will cope with running inside a VM (even if it’s running on an ARM processor). I suspect it’ll just fail to boot.

IIRC Harry has been looking at options to display Plexamp (and possibly other sources), but obviously this would be a big change and I have no idea if there’s any ETA.

I spent some time going down this rabbit hole, and my initial conclusion is that doing what Ropieee does is pretty damn hard if you want reliable switching between sources. Hats off to Spockfish :slight_smile:

So then my fallback option is to run a system next to Ropieee and use whatever means possible to fetch what is currently playing. I think for Roon and Plexamp this will be doable, but Airplay will be hard without changes to Ropieee itself.

So I have this working :slight_smile:
Now playing metadata for Roon, PlexAmp and Last.fm (as a fallback).
I even managed to reverse engineer waveform data from Roon and Plexamp. The public Roon API doesn’t expose waveform data, so this took some spelunking.

Using the waveform data to show it as a progress bar, but also to drive a small 8x8 LED music visualization.

2 Likes

That might be interesting for RoPieee to show on the display…

1 Like

I’d be happy to share the code with you, although based on what I’ve read from you, you might not approve of my methods :rofl:

Waveform data is not part of the public API, but it IS visible on Roon’s own display endpoint. So first I tried pretending to be a display, but that went nowhere because the API the display talks to only accepts requests coming from the same origin. So what I do now is load up a lightweight headless Chromium instance with Playwright, and listen in on the websocket. So my Roon monitor app shows up as a connected display in Roon. And then you have access to all the goodies; metadata, waveform data, lyrics, etc.

Again, happy to share the code, but my assumption is running a headless chromium in Ropieee just to get waveform/lyrics data might be a bit extreme.

That’s correct :slight_smile: But still creative and clever.

To close this off: I have just finished my custom ropieee display. This box bundles a ropieee instance with a separate display system. It currently works with Roon, Plexamp and last.fm (which I use as a fallback to monitoring airplay, by letting Apple Music scrobble plays). The monitors are all separate mini applications with a shared data store (memcached). So I hope at some point I’ll be able to add a service for AirPlay metadata by reading directly from ropieee.

The case was milled out of a solid block of walnut. The little aluminum block on the front is a play/pause button. The touch sensor has an issue with phantom touches at the moment, that’s why in the video the track randomly pauses/plays. I still need to fix that :slight_smile:

Video: Link

1 Like