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.

    MP3 Player

    Scheduled Pinned Locked Moved Development
    59 Posts 5 Posters 15.2k Views 4 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.
    • B Offline
      bachoo786 @bachoo786
      last edited by bachoo786

      @bachoo786

      I changed from this:

      if (MP3.config.musicData) {
              const musicList = MP3.createElement("ul", "musicList", "musicList");
      
              MP3.config.musicData.forEach(folderData => {
                  // Folder item
                  const folderItem = MP3.createElement("li", "folderItem", `folderItem-${folderData.folderName}`);
                  folderItem.innerHTML = `
                      <span class="folderName">${folderData.folderName}</span>
                      <i class="fa fa-chevron-down"></i> 
                  `; 
      
                  // Songs list within the folder
                  const songsList = MP3.createElement("ul", "songsList", `songsList-${folderData.folderName}`);
                  songsList.style.display = 'none'; // Initially hide the songs list
      
                  folderData.songs.forEach(song => {
                      const songItem = MP3.createElement("li", "songItem", `songItem-${song}`);
                      songItem.innerHTML = song.substr(0, song.length - 4); 
                      songsList.appendChild(songItem);
                  });
      
                  // Click event listeners
                  folderItem.addEventListener('click', () => {
                      songsList.style.display = songsList.style.display === 'none' ? 'block' : 'none'; // Toggle display
                      folderItem.querySelector('.fa').classList.toggle('fa-chevron-down');
                      folderItem.querySelector('.fa').classList.toggle('fa-chevron-up');
                  });
      
                  songsList.addEventListener('click', (event) => {
                      const clickedSongItem = event.target;
                      if (clickedSongItem.classList.contains('songItem')) {
                          const songName = clickedSongItem.innerText;
                          const folderName = folderData.folderName;
                          MP3.playSong(folderName, songName);
                      }
                  });
      
                  folderItem.appendChild(songsList);
                  musicList.appendChild(folderItem);
              });
      

      to this:

      if (MP3.config.musicData) {
         const fs = require('fs');
         const path = require('path');
      
         const musicFolder = path.resolve(MP3.config.musicData.musicPath);
         const supportedExtensions = this.defaults.extensions; // Use module's default extensions
      
         fs.readdir(musicFolder, (err, files) => {
          if (err) {
           console.error("Error reading music directory:", err);
           // Handle the error - display message to user, etc. 
          } else {
           const musicFiles = files.filter(file => supportedExtensions.includes(path.extname(file).toLowerCase()));
      
           if (musicFiles.length > 0) {
            const musicList = MP3.createElement("ul", "musicList");
      
            musicFiles.forEach(musicFile => {
             const songItem = MP3.createElement('li', 'songItem');
             songItem.innerHTML = musicFile.substr(0, musicFile.length - 4); 
             songItem.addEventListener('click', () => {
              MP3.playSong(musicFile); // Assuming you want to play the song directly
             });
             musicList.appendChild(songItem);
            });
      
      S 2 Replies Last reply Reply Quote 0
      • S Offline
        sdetweil @bachoo786
        last edited by

        @bachoo786 you could say, I have updated the repo, git pull to get the changes…

        you need to
        git add,
        git commit -m and
        git push
        to update the repo

        Sam

        How to add modules

        learning how to use browser developers window for css changes

        1 Reply Last reply Reply Quote 0
        • S Offline
          sdetweil @bachoo786
          last edited by

          @bachoo786 said in MP3 Player:

          fs.readdir(musicFolder, (err, files) => {

          the modulename.js that runs in the browser cannot read files directly, due to security restrictions ( any script could read ALL your files without you knowing)

          this is why the node_helper exists…

          Sam

          How to add modules

          learning how to use browser developers window for css changes

          B 1 Reply Last reply Reply Quote 0
          • B Offline
            bachoo786 @sdetweil
            last edited by

            @sdetweil said in MP3 Player:

            @bachoo786 said in MP3 Player:

            fs.readdir(musicFolder, (err, files) => {

            the modulename.js that runs in the browser cannot read files directly, due to security restrictions ( any script could read ALL your files without you knowing)

            this is why the node_helper exists…

            so whats the alternative? I had this MMM-QuranPlayer module that was able to read mp3 files from the folders in the “public” directory which was located in the root folder of the module.

            S 1 Reply Last reply Reply Quote 0
            • S Offline
              sdetweil @bachoo786
              last edited by sdetweil

              @bachoo786 I’m pretty sure the module used a node_helper

              now if you make it a url, then you can fetch it thru the browser… but the server side is actually reading the file

              but you could make it a file url

              file:///server/path to file

              in MagicMirror the server home folder is the MagicMirror folder

              Sam

              How to add modules

              learning how to use browser developers window for css changes

              1 Reply Last reply Reply Quote 0
              • B Offline
                BiaGen @sdetweil
                last edited by

                Hey @bachoo786, I’ve been following your progress with the folder nesting—it’s a tricky bit of logic to get right in the node_helper, but it’ll be worth it for the cleaner UI!
                One thing I noticed while setting up my own music module is that the player looks a lot better if the MP3 metadata (ID3 tags) is actually clean. If the tags are messy, the ‘Artist’ and ‘Title’ fields on the mirror usually end up looking like a jumble of underscores and file extensions.
                Since you’re organizing a big library right now, I’ve been using https://editmp3tags.com/ to quickly fix the tags in the browser before dropping them into the music folder. It’s way faster than using a heavy desktop app and helps the module display everything correctly once you get that ‘better method’ logic sorted out.

                1 Reply Last reply Reply Quote 0
                • 1
                • 2
                • 3
                • 4
                • 5
                • 6
                • 6 / 6
                • 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