Read the statement by Michael Teeuw here.
Airplay 'Now Playing' module - help badly needed
-
The first step of my module, which simply displays a base64-decoded string in the mirror reads like this.
/* global Module */ /* Magic Mirror * Module: base64 * * By Michael Teeuw http://michaelteeuw.nl * MIT Licensed. */ Module.register("base64",{ // Default module config. defaults: { text: "Hello World!" }, frombase64: function() { var string = 'RGFycmVu'; var decodedString = atob(string); return decodedString; }, // Override dom generator. getDom: function() { var wrapper = document.createElement("div"); var decstr = this.frombase64 var msgstr = document.createTextNode(decstr); wrapper.appendChild(msgstr); return wrapper; } });
It seems like it should work, but I get a literal string rather than a value returned…
-
@darrene You’re missing parenthesis in your call to frombase64:
this.frombase64();
-
Ah! Thanks so much @alexyak - that’s fantastic. I can now move forwards :)
So parenthesis are needed to call the function and explicitly not pass it a parameter. Is that right?
-
So step 2, I have made a short javascript file that will read a fifo file and decode what it sees in the buffer.
var fs = require('fs') var fifo = fs.createReadStream('shairport-sync-metadata') fifo.on('data', function(fifoHexBuffer) { fifoHexBuffer = fifoHexBuffer.toString(); console.log(fifoHexBuffer) })
At the moment, the code runs once and stops once it reads. My next task is to have it continue, then I’ll have to make it into a node-helper script, to interact with my base64 decoder/display
-
@darrene checkout the file watcher of the nodejs filesystem https://nodejs.org/docs/latest/api/fs.html#fs_class_fs_fswatcher
-
Luckily there is a fifo-js package available, which makes things super-easy!
npm install fifo-jsconst FIFO = require('fifo-js') let fifo = new FIFO('fifo-testfile') var count = 1 while (count == 1) { let text = fifo.readSync(fifo) console.log(text) } fifo.close()
I’m getting there. I have an IN and I have an OUT in javascript. Now the hard work of joining the two together - interpreting and the decoding the appropriate metadata begins!
-
So a bit more testing and things aren’t looking as rosy as I’d first thought. Before trying fifo-js, I’d experimented with the filesystem readStream - If i try looping that I end up with a java out of memory condition.
The fifo-js approach works with a fifo file that I echo things into to test, but doesn’t return anything while the Shairport service has it open for some reason?
There is a metadata reader script which I could use to read the metadata and parse it. I’ve compiled the executable and it runs fine. I should be able to call that from my javascript module through child process, right?
-
Hmm, using a child process doesn’t return anything either :(
The shairport metadata reader is a compiled C program which uses printf to return the metadata to the console:
pi@raspberrypi:~/fifo-js $ ~/shairport-sync-metadata-reader/shairport-sync-metadata-reader < /tmp/shairport-sync-metadata Artist: "Sohn". Title: "Tremors". ^C pi@raspberrypi:~/fifo-js $
But I dont’ seem to be able to parse what’s being sent to stdout from my javascript
If anyone has any examples that work, I’d be grateful.
-
Hi @darrene ,
How did you ever make out with your module? I’ve started down the same path, I’m also using shairport-sync but in conjunction with forked-daapd (an airplay server for Raspbian).
As forked-daapd can also use mpd commands I’ve been trying to use komponist, which I’ve managed to make return the playing song, album, etc. print out to the console but as I’ve never really done any javascript before am trying to piece together building a module for MM.
If you’ve made any progress on your module, I’d love to see it as it may help me finish mine.
-
I’m just dropping by to express my encouragement for this effort! I would love to have a now-playing module that used the shairport-sync metadata :)