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.

    DIY Module Displays Nothing

    Scheduled Pinned Locked Moved Solved Troubleshooting
    14 Posts 3 Posters 1.2k Views 2 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.
    • H Offline
      hokie-bird
      last edited by

      @sdetweil cant thank you enough for taking the time to do that, WOW!

      Here’s what I’ve learned. I subbed your LyrionNowPlaying.js in for mine, and results were exactly the same: “No song currently playing” at startup for a second or two, vanishes and never returns despite music starting/stopping. Then I subbed your node_helper.js for mine (with your module.js file and .png) and BOOM! your data and image appeared! Granted, it would appear for 4 seconds or so, disappear for 1-2, then re-appear but progress! So, safe to assume its somehow something in my node_helper? Here’s the latest, and again wildly grateful for your help.

      node_helper.js

      const NodeHelper = require('node_helper');
      const request = require('request');
      
      module.exports = NodeHelper.create({
      
          start: function() {
              console.log("Starting node_helper for: " + this.name);
              this.nowPlaying = { 
                  artist: "", 
                  song: "",
                  timeRemaining: "",
                  duration: 0, 
                  position: 0,
                  coverArt: "" 
              }; 
              this.sendSocketNotification('LYRION_NOW_PLAYING_RESULT', this.nowPlaying); // Send initial empty state
          },
      
          socketNotificationReceived: function(notification, payload) {
              if (notification === 'GET_LYRION_NOW_PLAYING') {
                  this.getLyrionNowPlaying(payload);
              }
          },
      
          getLyrionNowPlaying: function(payload) {
              const { lyrionServer, playerName } = payload;
              const options = {
                  url: `${lyrionServer}/jsonrpc.js`,
                  method: 'POST',
                  headers: {
                      'Content-Type': 'application/json'
                  },
                  body: JSON.stringify({
                      "id": 1,
                      "method": "slim.request",
                      "params": [playerName, ["status", "-", 1, "tags:artist"]] 
                  })
              };
      
              request(options, (error, response, body) => {
                  if (error) {
                      console.error(`MMM-LyrionNowPlaying: Error connecting to Lyrion server: ${error}`);
                      this.sendSocketNotification('LYRION_NOW_PLAYING_RESULT', { error: `Error connecting to Lyrion server: ${error}` });
                      return;
                  }
      
                  if (response.statusCode !== 200) {
                      console.error(`MMM-LyrionNowPlaying: Received unexpected status code from Lyrion server: ${response.statusCode}`);
                      this.sendSocketNotification('LYRION_NOW_PLAYING_RESULT', { error: `Received unexpected status code from Lyrion server: ${response.statusCode}` });
                      return;
                  }
      
                  try {
                      const data = JSON.parse(body);
                      console.log("Raw Data:", data); 
      
                      if (!data.result) {
                          console.error(`MMM-LyrionNowPlaying: Invalid response from Lyrion server: Missing 'result' in response`);
                          this.sendSocketNotification('LYRION_NOW_PLAYING_RESULT', { error: `Invalid response from Lyrion server: Missing 'result' in response` });
                          return;
                      }
      
                      if (!data.result.mode || data.result.mode !== 'play') { 
                          this.nowPlaying = { 
                              artist: "", 
                              song: "",
                              timeRemaining: "",
                              duration: 0, 
                              position: 0,
                              coverArt: "" 
                          }; 
                          this.sendSocketNotification('LYRION_NOW_PLAYING_RESULT', this.nowPlaying); // Send "no song" notification immediately
                          return; 
                      }
      
                      // Handle cases where playlist_loop might be missing or empty
                      let artist = "Unknown Artist";
                      let song = "Unknown Song";
      
                      if (data.result.playlist_loop && data.result.playlist_loop[0]) {
                          artist = data.result.playlist_loop[0].artist || "Unknown Artist";
                          song = data.result.playlist_loop[0].title || "Unknown Song"; 
                      }
      
                      this.nowPlaying = {
                          artist: artist,
                          song: song,
                          duration: data.result.duration || 0, 
                          position: data.result.time || 0,
                          coverArt: `${lyrionServer}/music/current/cover.jpg?player=${playerName}` 
                      }; 
      
                      this.nowPlaying.timeRemaining = this.formatTime(this.nowPlaying.duration - this.nowPlaying.position);
      
                      this.sendSocketNotification('LYRION_NOW_PLAYING_RESULT', this.nowPlaying); 
      
                  } catch (err) {
                      console.error(`MMM-LyrionNowPlaying: Error parsing Lyrion API response: ${err}`);
                      this.sendSocketNotification('LYRION_NOW_PLAYING_RESULT', { error: `Error parsing Lyrion API response: ${err}` });
                  }
              });
          },
      
          formatTime: function(seconds) {
              const minutes = Math.floor(seconds / 60);
              const remainingSeconds = seconds % 60;
              return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`;
          }
      });
      
      
      S 1 Reply Last reply Reply Quote 0
      • S Offline
        sdetweil @hokie-bird
        last edited by sdetweil

        @hokie-bird not sure, but two things

        1. the sendSocketNotification() in start should be removed , the browser side is not up yet.

        2. you are sending requests for playing info 1/second,
          can the server handle multiple concurrently?
          how long is the response time ?

        i would change that to 5 seconds to test,
        you can change it in config.js

        Sam

        How to add modules

        learning how to use browser developers window for css changes

        1 Reply Last reply Reply Quote 0
        • H Offline
          hokie-bird
          last edited by

          Thank you again @sdetweil

          I implemented both of your changes (removing sendSocketNotification() in start and 5 second refresh interval) and it seems the refresh interval is what is impacting the display. At 1 second, basically nothing, but at 5 seconds I get a 5 second display, then maybe a 2 second disappearance and then a 5 second display repeating pattern. (Which is somewhat interesting as the browser console is reporting accurate data every 1 second, despite nothing being displayed.) Not sure how to get a constant/non-disappearing display (when music is playing) while still getting an accurate reflection/countdown of the time remain, but I’ll experiment with that.

          Of course, suggestions welcome. And thanks again.

          S 1 Reply Last reply Reply Quote 0
          • S Offline
            sdetweil @hokie-bird
            last edited by sdetweil

            @hokie-bird you are also asking for a 4 second transition on the changes w updateDom(…)

            so 2 seconds fade out and 2 seconds fade in

            this.updateDom(this.config.fadeSpeed);
            and you are interrupting the fade with another updateDom

            Sam

            How to add modules

            learning how to use browser developers window for css changes

            1 Reply Last reply Reply Quote 0
            • H Offline
              hokie-bird
              last edited by

              It was the fade! when I switch the fade to 0, even the refresh of 1 seconds works and displays perfectly. @sdetweil you are brilliant!

              Thank you!

              1 Reply Last reply Reply Quote 0
              • S sdetweil has marked this topic as solved on
              • 1
              • 2
              • 2 / 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