Воспроизведение аудиофайла на основе идентификатора из базы данных mysql

#javascript #php #html #jquery #html5-audio

Вопрос:

У меня есть этот сценарий аудиоплеера, который воспроизводит аудиофайлы, но я не знаю, как воспроизводить файлы по отдельности на основе идентификатора из базы данных mysql. У меня есть таблица данных и все файлы, перечисленные там, с кнопкой воспроизведения, чтобы составить представление. Спасибо

Сценарий аудиоплеера Codepen: https://codepen.io/abxlfazl/pen/YzGEVRP

Вот звуковой сценарий:

PHP:

 <?php
    $qnm = $db->query("SELECT * FROM `".RDCP_PREFIX."muzica` WHERE uid = ".$uid." ");
    while ($row = $db->fetch($qnm)) {
    $id = $row['mid']; // music id
    $locatiem = $row['locatie'];
    $numeclubs = $row['numeclub'];
    $numecoregrafiem = $row['numecoregrafie'];
    $piesa = str_replace("muzica/", "", $locatiem); // music file track
    ?>
 

HTML:

 <div class="modal plyer fade delmusic<?php echo $id;?>" tabindex="-1" id="delmusic<?php echo $id; ?>"
       track="<?php echo $id;?>" aria-labelledby="myDefaultModalLabel">
       <div class="container" style="margin-top: 332px;display: flex;">
         <div class="player">

           <div class="player__header">

             <div class="player__img player__img--absolute slider">

               <button class="player__button player__button--absolute--nw playlist">

                 <img src="../../../dt/app-assets/images/elements/musicplayer/playlist.svg" alt="playlist-icon">

               </button>

               <button class="player__button player__button--absolute--center play">

                 <img src="../../../dt/app-assets/images/elements/musicplayer/play.svg" alt="play-icon">
                 <img src="../../../dt/app-assets/images/elements/musicplayer/pause.svg" alt="pause-icon">

               </button>

               <div class="slider__content">

                 <img class="img slider__img" src="http://physical-authority.surge.sh/imgs/1.jpg" alt="cover">

               </div>

             </div>

             <div class="player__controls">

               <button class="player__button back">

                 <img class="img" src="../../../dt/app-assets/images/elements/musicplayer/back.svg" alt="back-icon">

               </button>

               <p class="player__context slider__context">

                 <strong class="slider__name"></strong>
                 <span class="player__title slider__title"></span>

               </p>

               <button class="player__button next">

                 <img class="img" src="../../../dt/app-assets/images/elements/musicplayer/next.svg" alt="next-icon">

               </button>

               <div class="progres">

                 <div class="progres__filled"></div>

               </div>

             </div>

           </div>

           <ul class="player__playlist list">
             <li class="player__song s<?php echo $id;?>">
               <img class="player__img img" src="http://physical-authority.surge.sh/imgs/1.jpg" alt="cover">
               <p class="player__context">
                 <b class="player__song-name"><?php echo $numecoregrafiem; ?></b>
                 <span class="flex">
                   <span class="player__title"><?php echo $numeclubs; ?></span>
                 </span>
               </p>
               <audio class="audio" src="<?php echo "dt/pagini/momente/momente/".$locatiem; ?>"></audio>
             </li>
           </ul>

         </div>
       </div>
     </div>
 

Язык JavaScript:

 const bgBody = ["#e5e7e9", "#ff4545", "#f8ded3", "#ffc382", "#f5eda6", "#ffcbdc", "#dcf3f3"];
const body = document.body;
const player = document.querySelector(".player");
const playerHeader = player.querySelector(".player__header");
const playerControls = player.querySelector(".player__controls");
const playerPlayList = player.querySelectorAll(".player__song");
const playerSongs = player.querySelectorAll(".audio");
const playButton = player.querySelector(".play");
const nextButton = player.querySelector(".next");
const backButton = player.querySelector(".back");
const playlistButton = player.querySelector(".playlist");
const slider = player.querySelector(".slider");
const sliderContext = player.querySelector(".slider__context");
const sliderName = sliderContext.querySelector(".slider__name");
const sliderTitle = sliderContext.querySelector(".slider__title");
const sliderContent = slider.querySelector(".slider__content");
const sliderContentLength = playerPlayList.length - 1;
const sliderWidth = 100;
let left = 0;
let count = 0;
let song = playerSongs[count];
let isPlay = false;
const pauseIcon = playButton.querySelector("img[alt = 'pause-icon']");
const playIcon = playButton.querySelector("img[alt = 'play-icon']");
const progres = player.querySelector(".progres");
const progresFilled = progres.querySelector(".progres__filled");
let isMove = false;
  
function closePlayer() {

    playerHeader.classList.remove("open-header");
    playerControls.classList.remove("move");
    slider.classList.remove("open-slider");
    
}

function next(index) {
    
    count = index || count;

    if (count == sliderContentLength) {
        count = count;
        return;
    }

    left = (count   1) * sliderWidth;
    left = Math.min(left, (sliderContentLength) * sliderWidth);
    sliderContent.style.transform = `translate3d(-${left}%, 0, 0)`;
    count  ;
    run();

}

function back(index) {
    
    count = index || count;

    if (count == 0) {
        count = count;
        return;
    }
    
    left = (count - 1) * sliderWidth;
    left = Math.max(0, left);
    sliderContent.style.transform = `translate3d(-${left}%, 0, 0)`;
    count--;
    run();

}

function changeSliderContext() {

    sliderContext.style.animationName = "opacity";
    
    sliderName.textContent = playerPlayList[count].querySelector(".player__title").textContent;
    sliderTitle.textContent = playerPlayList[count].querySelector(".player__song-name").textContent;
    
    if (sliderName.textContent.length > 16) {
        const textWrap = document.createElement("span");
        textWrap.className = "text-wrap";
        textWrap.innerHTML = sliderName.textContent   "   "   sliderName.textContent;  
        sliderName.innerHTML = "";
        sliderName.append(textWrap);
        
    }

    if (sliderTitle.textContent.length >= 18) {
        const textWrap = document.createElement("span");
        textWrap.className = "text-wrap";
        textWrap.innerHTML = sliderTitle.textContent   "    "   sliderTitle.textContent;  
        sliderTitle.innerHTML = "";
        sliderTitle.append(textWrap);
    }

}
 
function selectSong() {

    song = playerSongs[count];

    for (const item of playerSongs) {

        if (item != song) {
            item.pause();
            item.currentTime = 0;
        }

    }

    if (isPlay) song.play();
    
    
}

function run() {
  
    changeSliderContext(); 
    selectSong();
  
}

function playSong() {

    if (song.paused) {
        song.play();
        playIcon.style.display = "none";
        pauseIcon.style.display = "block";  
    }else{
        song.pause();
        isPlay = false;
        playIcon.style.display = "";
        pauseIcon.style.display = "";
    }


}

function progresUpdate() {

    const progresFilledWidth = (this.currentTime / this.duration) * 100   "%";
    progresFilled.style.width = progresFilledWidth;

    if (isPlay amp;amp; this.duration == this.currentTime) {
        next();
    }
    if (count == sliderContentLength amp;amp; song.currentTime == song.duration) {
        playIcon.style.display = "block";
        pauseIcon.style.display = "";
        isPlay = false;
    }
}

function scurb(e) {

    // If we use e.offsetX, we have trouble setting the song time, when the mousemove is running
    const currentTime = ( (e.clientX - progres.getBoundingClientRect().left) / progres.offsetWidth ) * song.duration;
    song.currentTime = currentTime;

}

function durationSongs() {

    let min = parseInt(this.duration / 60);
    if (min < 10) min = "0"   min;

    let sec = parseInt(this.duration % 60);
    if (sec < 10) sec = "0"   sec;
    
    const playerSongTime = `${min}:${sec}`; 

}


changeSliderContext();

// add events 
sliderContext.addEventListener("animationend", () => sliderContext.style.animationName ='');
playlistButton.addEventListener("click", closePlayer);

nextButton.addEventListener("click", () => {
    next(0)
});

backButton.addEventListener("click", () => {
    back(0)
});

playButton.addEventListener("click", () => {
    isPlay = true;
    playSong();
});

playerSongs.forEach(song => {
    song.addEventListener("loadeddata" , durationSongs);
    song.addEventListener("timeupdate" , progresUpdate);
    
});

progres.addEventListener("pointerdown", (e) => {
    scurb(e);
    isMove = true;
});

document.addEventListener("pointermove", (e) => {
    if (isMove) {
        scurb(e); 
        song.muted = true;
    }
});

document.addEventListener("pointerup", () => {
    isMove = false;
    song.muted = false;
});

playerPlayList.forEach((item, index) => {

    item.addEventListener("click", function() {

        if (index > count) {
            next(index - 1);
            return;
        }
        
        if (index < count) {
            back(index   1);
            return;
        }

    });
    
});
 

Комментарии:

1. Предполагая, что вы хотите изменить песни без перезагрузки страницы, вы можете либо создать ассоциативный массив песен на странице (идентификатор загрузки->имя файла), либо написать php-страницу, которая возвращает имя файла в запрос ajax. Я думаю, это зависит от размера вашего списка песен. Несколько сотен или даже тысяч песен не было бы проблемой встроить в массив.

2. Спасибо за ответ @Phaelaxz, ну, у меня есть таблица с некоторой информацией о пользователе и песней, которая была загружена пользователем с помощью кнопки воспроизведения, и мне нужно воспроизвести песни для определенного загруженного идентификатора трека, плеер открывается в модальном окне

Ответ №1:

Вы можете поместить идентификатор дорожки в атрибут, такой как «дорожка данных», затем извлечь его и отправить запрос ajax на страницу php, которая выполнит ваш запрос в БД и вернет нужную вам информацию.

     // User selects track to play
    $(".track").on('click', function(e){
        
        track = $(this).data("track");
        
        var data = {
            trackId: track
        };
        
        
        $.ajax({
            url: 'getTrack.php',
            type: 'post',
            data: data,
        }).done(function(result){
            
            // parse data from response and load your player's modal
            
        }).fail(function(data){
            // Uh-oh!
        }).always(function(){
            // Do something
        });
        
    });