MagicMirror Forum
    • Recent
    • Tags
    • Unsolved
    • Solved
    • MagicMirror² Repository
    • Documentation
    • 3rd-Party-Modules
    • Donate
    • Discord
    • Register
    • Login
    A New Chapter for MagicMirror: The Community Takes the Lead
    Read the statement by Michael Teeuw here.

    Airplay 'Now Playing' module - help badly needed

    Scheduled Pinned Locked Moved Development
    16 Posts 8 Posters 13.0k Views 9 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • D Offline
      darrene @alexyak
      last edited by

      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?

      1 Reply Last reply Reply Quote 0
      • D Offline
        darrene
        last edited by darrene

        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

        strawberry 3.141S 1 Reply Last reply Reply Quote 0
        • strawberry 3.141S Offline
          strawberry 3.141 Project Sponsor Module Developer @darrene
          last edited by

          @darrene checkout the file watcher of the nodejs filesystem https://nodejs.org/docs/latest/api/fs.html#fs_class_fs_fswatcher

          Please create a github issue if you need help, so I can keep track

          1 Reply Last reply Reply Quote 1
          • D Offline
            darrene
            last edited by

            Luckily there is a fifo-js package available, which makes things super-easy!
            npm install fifo-js

            const 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!

            1 Reply Last reply Reply Quote 0
            • D Offline
              darrene
              last edited by darrene

              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?

              1 Reply Last reply Reply Quote 0
              • D Offline
                darrene
                last edited by

                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.

                jdfraserJ 1 Reply Last reply Reply Quote 0
                • jdfraserJ Offline
                  jdfraser @darrene
                  last edited by

                  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.

                  1 Reply Last reply Reply Quote 1
                  • V Offline
                    vogelboy
                    last edited by

                    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 :)

                    1 Reply Last reply Reply Quote 1
                    • ? Offline
                      A Former User
                      last edited by

                      Are there any updates to this module?

                      1 Reply Last reply Reply Quote 1
                      • B Offline
                        Brice
                        last edited by

                        I’m also interested in the development of this module.
                        I’ve started to recompile Shairport-sync so it can write a plain .TXT file with the metadata each time a new song is detected, now I have to read the last line of this TXT file through a MM-module. But I don’t know if this is the right direction, editing the core of Shairport-sync seems like a bad idea (no updates, etc). I wish I could read metadatas via the pipe in a less complex way. Anyone has worked on this ? Thanks !

                        1 Reply Last reply Reply Quote 0
                        • 1
                        • 2
                        • 1 / 2
                        • First post
                          Last post
                        Enjoying MagicMirror? Please consider a donation!
                        MagicMirror created by Michael Teeuw.
                        Forum managed by Sam, technical setup by Karsten.
                        This forum is using NodeBB as its core | Contributors
                        Contact | Privacy Policy