Boutons previous et next dans un script audio

Résolu
chabinot Messages postés 321 Date d'inscription mardi 10 novembre 2015 Statut Membre Dernière intervention 22 mars 2024 - 12 mai 2023 à 15:40
chabinot Messages postés 321 Date d'inscription mardi 10 novembre 2015 Statut Membre Dernière intervention 22 mars 2024 - 12 mai 2023 à 19:19

Bonjour,

Je vous soumets mes sources html et javasript audio.

1 -HTML

<!DOCTYPE html>
<html lang="fr">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Martinique - Fleur des Caraïbes</title>
  <!-- Favicon -->
  <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="css/bootstrap.min.css">
  <!-- Icônes -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
  <!-- Styles CSS -->
  <link rel="stylesheet" href="css/styles.css">
  <!-- Scripts -->
  <script src="./js/popper.min.js" defer></script>
  <script src="./js/bootstrap.min.js" defer></script>
  <script src="js/date.prototype.js" defer></script>
  <script src="js/date.time.js" defer></script>
  <script src="./js/audio.js" defer></script>
</head>

<body>
  <header>
    <div class="top">
      <div class="datetime">
        <span class="date"></span><br>
        <span class="day"></span>
        <span class="week"></span><br>
        <span class="reste"></span>
      </div>
      <h1><a href="/">Martinique ~ Fleur des Caraïbes</a></h1>
      <div class="time"></div>
    </div>
  </header>
  <nav class="navbar navbar-expand-lg navbar-dark mb-0">
    <div class="container-fluid">
      <div class="collapse navbar-collapse" id="navbarNavDropdown">
        <ul class="navbar-nav mx-auto">
          <li class="nav-item dropdown">
            <a class="nav-link active dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button"
              data-bs-toggle="dropdown" aria-expanded="false">
              Jeux de mots
            </a>
            <ul class="dropdown-menu bg-perso" aria-labelledby="navbarDropdownMenuLink">
              <li><a class="dropdown-item" href="//www.cnews.fr/jeux/mots-fleches" target="_blank">Cnews -
                  Fléchés</a></li>
              <div class="dropdown-divider"></div>
              <li><a class="dropdown-item" href="//www.cnews.fr/jeux/mots-croises" target="_blank">Cnews -
                  Croisés</a></li>
              <div class="dropdown-divider"></div>
              <li><a class="dropdown-item" href="//www.20minutes.fr/services/mots-fleches" target="_blank">20 Min
                  - Fléchés</a></li>
              <div class="dropdown-divider"></div>
              <li><a class="dropdown-item" href="//www.20minutes.fr/services/mots-croises" target="_blank">20 Min
                  - Croisés</a></li>
              <div class="dropdown-divider"></div>
              <li><a class="dropdown-item" href="//www.20minutes.fr/services/ifleches" target="_blank">20 Min -
                  iFléchés</a></li>
              <div class="dropdown-divider"></div>
              <li><a class="dropdown-item" href="//www.20minutes.fr/services/ironde-des-mots" target="_blank">20
                  Min - iRonde</a></li>
              <div class="dropdown-divider"></div>
              <li><a class="dropdown-item" href="//www.20minutes.fr/services/puzzle" target="_blank">20 Min -
                  Puzzle</a></li>
              <div class="dropdown-divider"></div>
              <li><a class="dropdown-item" href="//www.20minutes.fr/services/mots-coupes" target="_blank">20 Min -
                  Coupés</a></li>
              <div class="dropdown-divider"></div>
              <li><a class="dropdown-item" href="//www.mathster.com/games/solitaire/" target="_blank">Solitaire</a></li>
            </ul>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="https://www.programme-tv.net/programme/toutes-les-chaines/"
              target="_blank">Programmes Tv</a>
          </li>
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button"
              data-bs-toggle="dropdown" aria-expanded="false">
              Administrations
            </a>
            <ul class="dropdown-menu bg-perso" aria-labelledby="navbarDropdownMenuLink">
              <li><a class="dropdown-item" href="https://www.creditmutuel.fr/fr/particuliers.html?amcrefdec=1"
                  target="_blank">Crédit mutuel</a></li>
              <div class="dropdown-divider"></div>
              <li><a class="dropdown-item" href="https://www.bouyguestelecom.fr/" target="_blank">Bouygues - mon
                  compte</a></li>
              <div class="dropdown-divider"></div>
              <li><a class="dropdown-item"
                  href="https://assure.ameli.fr/PortailAS/appmanager/PortailAS/assure?_nfpb=true&_pageLabel=as_accueil_page&_somtc=true"
                  target="_blank">Ameli</a></li>
              <div class="dropdown-divider"></div>
              <li><a class="dropdown-item" href="https://www.lassuranceretraite.fr/portail-info/home.html"
                  target="_blank">Retraite</a></li>
              <div class="dropdown-divider"></div>
              <li><a class="dropdown-item" href="//www.caf.fr/allocataires/caf-de-loire-atlantique/accueil"
                  target="_blank">CAF</a></li>
          </li>
        </ul>
        </li>
        </ul>
      </div>
    </div>
  </nav>
  <div id="myCarousel" class="carousel slide carousel-fade mt-3" data-bs-ride="carousel" data-bs-interval="2000">
    <ol class="carousel-indicators">
      <li data-bs-target="#myCarousel" data-bs-slide-to="0" class="active"></li>
      <li data-bs-target="#myCarousel" data-bs-slide-to="1"></li>
      <li data-bs-target="#myCarousel" data-bs-slide-to="2"></li>
      <li data-bs-target="#myCarousel" data-bs-slide-to="3"></li>
      <li data-bs-target="#myCarousel" data-bs-slide-to="4"></li>
      <li data-bs-target="#myCarousel" data-bs-slide-to="5"></li>
    </ol>
    <div class="carousel-inner">
      <div class="carousel-item active">
        <img class="d-block w-75 img" src="img/mart-01.jpg">
        <div class="caption">
          <p>Ville de Saint-Pierre</p>
        </div>
      </div>
      <div class="carousel-item">
        <img class="d-block w-75 img" src="img/mart-02.jpg">
        <div class="caption">
          <p>Plage du Carbet</p>
        </div>
      </div>
      <div class="carousel-item">
        <img class="d-block w-75 img" src="img/mart-03.jpg">
        <div class="caption">
          <p>Anse Couleuvre</p>
        </div>
      </div>
      <div class="carousel-item">
        <img class="d-block w-75 img" src="img/mart-04.jpg">
        <div class="caption">
          <p>Balade à moto</p>
        </div>
      </div>
      <div class="carousel-item">
        <img class="d-block w-75 img" src="img/mart-05.jpg">
        <div class="caption">
          <p>Habitation Clément</p>
        </div>
      </div>
      <div class="carousel-item">
        <img class="d-block w-75 img" src="img/mart001.jpg">
        <div class="caption">
          <p>Anse d'Arlet</p>
        </div>
      </div>
    </div>
  </div>
  <section>
    <div class="container mt-4">
      <div class="lecteur-audio">
        <audio src=""></audio>
        <div class="progress-bar">
          <input type="range" class="form-range" id="progress" value="0">
        </div>
        <div class="times">
          <span class="curr-time">0:00</span>
          <span class="durs">0:00</span>
        </div>
        <div class="volume">
          <span class="volume-high">
            <i class="fas fa-volume-high"></i>
          </span>
          <span class="volume-mute">
            <i class="fas fa-volume-mute"></i>
          </span>
          <input type="range" class="form-range vol" id="volume" min="0" max="1" step="0.1" value="1">
          <span id="volume-value">100%</span>
        </div>
        <div class="controller">
          <div class="prev">
            <i class="fas fa-backward btn"></i>
          </div>
          <div class="play-pause">
            <i class="fas fa-play btn play"></i>
          </div>
          <div class="next">
            <i class="fas fa-forward btn"></i>
          </div>
          <div class="stop">
            <i class="fas fa-stop btn"></i>
          </div>
        </div>
        <div class="marquee mt-3">
          <p class="artist"></p>
        </div>

      </div>
    </div>
  </section>
  <footer class="fixed-bottom">
    <p class="text-center">
      Copyright &copy Martinique - Fleur des Caraïbes (2023 - <span class="cpy"></span>). Tous droits réservés
    </p>
  </footer>
</body>
  
</html>

2 - Javascript audio.js

const audio = document.querySelector("audio"),
progressBar = document.querySelector(".progress-bar"),
progress    = document.querySelector("#progress"),
currTime    = document.querySelector(".curr-time"),
duration    = document.querySelector(".durs"),
volume      = document.querySelector("#volume"),
volumeValue = document.querySelector("#volume-value"),
volumeUp    = document.querySelector(".volume-high"),
volumeMute  = document.querySelector(".volume-mute"),
marquee     = document.querySelector(".marquee p"),
prev        = document.querySelector(".prev"),
next        = document.querySelector(".next"),
stop        = document.querySelector(".stop"),
playBtn     = document.querySelector('play'),
playPause   = document.querySelector(".play-pause i");

// Création de la liste des mp3
songList = [
  {
    num     : 1,
    path    : "audio/maguy.mp3",
    artist  : "Puissance 8",
    songName: "Maguy",
  },
  {
    num     : 2,
    path    : "audio/case.mp3",
    artist  : "Malavoi",
    songName: "Cae à Lucie",
  },
  {
    num     : 3,
    path    : "audio/Les deux écoles.mp3",
    artist  : "Michel Sardou",
    songName: "Les deux écoles",
  },
  {
    num     : 4,
    path    : "audio/patineur.mp3",
    artist  : "Julien Clerc",
    songName: "Le patineur",
  },
  {
    num     : 5,
    path    : "audio/whiterShade.mp3",
    artist  : "Emily Linge",
    songName: "A whiter shade of pale",
  },
  {
    num     : 6,
    path    : "audio/belafonte.mp3",
    artist  : "Harry Belafonte",
    songName: "Banana boat song",
  },
  {
    num     : 7,
    path    : "audio/sardou.mp3",
    artist  : "Michel Sardou",
    songName: "Le Connemara",
  },
  {
    num     : 8,
    path    : "audio/nougaro.mp3",
    artist  : "Claude Nougaro",
    songName: "Le jazz et la java",
  },
  {
    num     : 9,
    path    : "audio/brassens.mp3",
    artist  : "Georges Brassens",
    songName: "Mourir pour des idées",
  },
  {
    num     : 10,
    path    : "audio/reggiani.mp3",
    artist  : "Serge Reggiani",
    songName: "L'italien",
  },
  {
    num     : 11,
    path    : "audio/nantes.mp3",
    artist  : "Barbara",
    songName: "Nantes",
  },
  {
    num     : 12,
    path    : "audio/Le-petit-bal-perdu.mp3",
    artist  : "Bourvil",
    songName: "Le petit bal perdu",
  },
  {
    num     : 13,
    path    : "audio/rosesblanches.mp3",
    artist  : "Berthe Sylva",
    songName: "Les roses blanches",
  },
  {
    num     : 14,
    path    : "audio/monvieux.mp3",
    artist  : "Daniel Guichard",
    songName: "Mon vieux",
  },
];

let i = 0,
    isPlaying = false,
    saveVolume

// Play ou Pause
playPause.addEventListener('click', () => {
  if (!isPlaying) {
    isPlaying = true
    loadSong(songList[i])
  }
  audio.paused ? audio.play() : audio.pause()
})
  
audio.addEventListener('play', () => {
  playPause.classList.replace('fa-play', 'fa-pause')
  marquee.style.animationPlayState = "running"
})

audio.addEventListener('pause', () => {
  playPause.classList.replace('fa-pause', 'fa-play')
  marquee.style.animationPlayState = "paused"
})

// Charger la chanson
const loadSong = (songList) => {
  marquee.textContent =
    "♬ ~ " +
    songList.num +
    " ~ " +
    songList.artist +
    " ~ " +
    songList.songName +
    " ~ " +
    " ♬";
  audio.src = songList.path;
};


// Chanson précédente
prev.addEventListener("click", () => {
  i--;
  if (i < 0) {
    i = songList.length - 1;
  }
  loadSong(songList[i]);
  audio.play();
});


// Chanson suivante
next.addEventListener("click", () => {
  i++;
  if (i > songList.length) {
    i = 0;
  }
  loadSong(songList[i]);
  audio.play();
})

// stop
stop.addEventListener("click", () => {
  audio.pause()
  isPlaying =false
  audio.currentTime = 0
  marquee.style.animationPlayState = "paused"
  playPause.classList.replace('fa-pause', 'fa-play')
});

 // Charger le fichier audio
audio.addEventListener("loadedmetadata", () => {
// Mettre à jour la valeur maximale du seek-slider avec la durée du fichier audio
   duration.textContent = rtvDurs(audio.duration)
   progress.max = audio.duration;
})

// Mettre à jour la position de lecture de l'audio en fonction de la position du seek-slider
progress.addEventListener("input", function () {
audio.currentTime = progress.value
})

 // Mettre à jour la position du seek-slider en fonction de la progression de lecture de l'audio
 audio.addEventListener("timeupdate", () => {
 progress.value = audio.currentTime;
 currTime.textContent = rtvDurs(audio.currentTime)
 if (audio.currentTime === audio.duration) {
  i++;
  if (i > songList.length) {
    i = 0;
  }
  loadSong(songList[i]);
  audio.play();
 }
})

// On gère le volume
volume.addEventListener("input", () => {
  audio.volume = volume.value
  if (audio.volume > 0) {
    volumeUp.style.display = "block"
    volumeMute.style.display = "none"
  } else {
    volumeMute.style.display = "block"
    volumeUp.style.display = "none"
  }
  volumeValue.textContent = volume.value * 100 + "%";
});
volumeUp.addEventListener("click", () => {
  saveVolume = volume.value;
  volumeMute.style.display = "block";
  volumeUp.style.display = "none";
  audio.volume = 0;
  volume.value = 0;
  volumeValue.textContent = "";
});
volumeMute.addEventListener("click", () => {
  audio.volume = saveVolume
  volume.value = audio.volume
  volumeUp.style.display = "block"
  volumeMute.style.display = "none"
  volumeValue.textContent = volume.value * 100 + "%"
});

// On transforme la durée du mp3 en heures, minutes, secondes
const rtvDurs = (value) => {
  if (value < 3600) {
    let minutes = Math.floor(value / 60),
      seconds = Math.floor(value % 60)
        .toString()
        .padStart(2, "0")
    return `${minutes}:${seconds}`
  } else {
    let hours = Math.floor(value / 3600)
    minutes = Math.floor((value % 3600) / 60)
      .toString()
      .padStart(2, "0")
    seconds = Math.floor((value % 3600) % 60)
      .toString()
      .padStart(2, "0");
    return `${hours}:${minutes}:${seconds}`
  }
};

J'ai un petit souci au niveau des boutons prev et next.

Quand je clique sur prev par exemple, j'ai bien le morceau précédant qui joue, quand je clique sur pause, il ne se met pas en apuse. Je suis obligé de cliquer à nouveau, il repart à zéro et pause marche.

Je vous saurai très reconnaissant si vous avez une idée.

Très cordialement
Windows / Chrome 113.0.0.0

A voir également:

2 réponses

Bonjour,

Puisque tu lances la lecture après avoir changer de morceau, essaye de définir le booléen isPlaying à la valeur true dans les listerners de prev et next.

0
chabinot Messages postés 321 Date d'inscription mardi 10 novembre 2015 Statut Membre Dernière intervention 22 mars 2024 15
12 mai 2023 à 19:19

Merci beaucoup, cela semble marcher.

0