/** * Lecteur audio intégré universel pour Funkwhale et Castopod * Permet de lire les morceaux/épisodes directement dans la page */ (function() { 'use strict'; let currentlyPlayingItem = null; let currentAudioElement = null; /** * Arrête l'élément en cours de lecture */ function stopCurrentItem() { if (currentAudioElement) { currentAudioElement.pause(); currentAudioElement.currentTime = 0; } if (currentlyPlayingItem) { currentlyPlayingItem.classList.remove('playing'); currentlyPlayingItem = null; } } /** * Démarre la lecture d'un élément */ function playItem(item, audioElement) { // Arrêter l'élément actuel s'il y en a un if (currentlyPlayingItem && currentlyPlayingItem !== item) { stopCurrentItem(); } currentlyPlayingItem = item; currentAudioElement = audioElement; // Marquer comme en cours de lecture item.classList.add('playing'); // Démarrer la lecture audioElement.play().catch(function(error) { console.error('Erreur lors de la lecture:', error); stopCurrentItem(); }); } /** * Met en pause l'élément */ function pauseItem(item, audioElement) { audioElement.pause(); item.classList.remove('playing'); } /** * Initialise les contrôles du lecteur pour un type d'élément */ function initPlayerForType(itemSelector, buttonSelector) { const items = document.querySelectorAll(itemSelector); items.forEach(function(item) { const playButton = item.querySelector(buttonSelector); const audioElement = item.querySelector('audio'); if (!playButton || !audioElement) { return; } // Gestion du clic sur le bouton play/pause playButton.addEventListener('click', function(e) { e.preventDefault(); e.stopPropagation(); if (item.classList.contains('playing')) { pauseItem(item, audioElement); } else { playItem(item, audioElement); } }); // Gérer la fin de la lecture audioElement.addEventListener('ended', function() { item.classList.remove('playing'); // Passer automatiquement à l'élément suivant const nextItem = item.nextElementSibling; if (nextItem && (nextItem.classList.contains('funkwhale-track-item') || nextItem.classList.contains('castopod-episode-item'))) { const nextAudio = nextItem.querySelector('audio'); if (nextAudio) { playItem(nextItem, nextAudio); } } else { // Réinitialiser si c'était le dernier élément currentlyPlayingItem = null; currentAudioElement = null; } }); // Gérer les erreurs de chargement audioElement.addEventListener('error', function(e) { console.error('Erreur de chargement audio:', e); item.classList.remove('playing'); // Afficher un message d'erreur temporaire const titleSelector = item.classList.contains('funkwhale-track-item') ? '.funkwhale-track-title' : '.castopod-episode-title'; const title = item.querySelector(titleSelector); if (title) { const originalText = title.textContent; title.textContent = 'Erreur de lecture'; title.style.color = '#ff0000'; setTimeout(function() { title.textContent = originalText; title.style.color = ''; }, 3000); } }); }); } /** * Initialise tous les lecteurs */ function initPlayer() { // Initialiser le lecteur Funkwhale initPlayerForType('.funkwhale-track-item', '.funkwhale-play-btn'); // Initialiser le lecteur Castopod initPlayerForType('.castopod-episode-item', '.castopod-play-btn'); } // Initialiser le lecteur quand le DOM est prêt if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initPlayer); } else { initPlayer(); } // Nettoyer à la fermeture de la page window.addEventListener('beforeunload', function() { stopCurrentItem(); }); })();