Files
FEDIVERSE-OKI/js/audio-player.js
T

148 lines
4.7 KiB
JavaScript
Raw Normal View History

2025-10-17 21:28:14 +04:00
/**
* 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();
});
})();