player now supports multiple audio tracks

This commit is contained in:
2025-12-31 15:38:14 +01:00
parent d801a65602
commit 776079d5c6
4 changed files with 160 additions and 55 deletions

View File

@@ -386,26 +386,13 @@ const AnimePlayer = (function() {
});
hlsInstance.on(Hls.Events.MANIFEST_PARSED, () => {
subtitles.forEach((sub, i) => {
const track = document.createElement('track');
track.kind = 'subtitles';
track.label = sub.label;
track.srclang = sub.srclang;
track.src = sub.src;
track.default = i === 0;
video.appendChild(track);
});
els.video.addEventListener('loadedmetadata', () => {
applyAniSkip(_malId, _currentEpisode);
}, { once: true });
attachSubtitles(subtitles);
initPlyr();
video.addEventListener('canplay', () => {
video.play().catch(() => {});
}, { once: true });
if (els.loader) els.loader.style.display = 'none';
els.video.play().catch(() => {});
els.loader.style.display = 'none';
});
hlsInstance.on(Hls.Events.ERROR, function (event, data) {
console.error("HLS Error:", data);
if (data.fatal) {
@@ -413,33 +400,65 @@ const AnimePlayer = (function() {
}
});
} else {
console.log("Using Native Player (MP4/WebM)");
video.src = url;
subtitles.forEach((sub, i) => {
const track = document.createElement('track');
track.kind = 'subtitles';
track.label = sub.label;
track.srclang = sub.srclang;
track.src = sub.src;
track.default = i === 0;
video.appendChild(track);
});
els.video.src = url;
attachSubtitles(subtitles);
initPlyr();
video.play().catch(e => console.log("Autoplay blocked", e));
els.video.play().catch(e => console.log("Autoplay blocked", e));
els.video.addEventListener('loadedmetadata', () => {
applyAniSkip(_malId, _currentEpisode);
}, { once: true });
if(els.loader) els.loader.style.display = 'none';
}
}
function initPlyr() {
function attachSubtitles(subtitles) {
subtitles.forEach((sub, i) => {
const track = document.createElement('track');
track.kind = 'subtitles';
track.label = sub.label;
track.srclang = sub.srclang;
track.src = sub.src;
track.default = i === 0;
els.video.appendChild(track);
});
}
function createAudioSelector(hls) {
if (!hls.audioTracks || hls.audioTracks.length < 2) return;
const plyrEl = els.video.closest('.plyr');
const controls = plyrEl.querySelector('.plyr__controls');
if (!controls) return;
if (controls.querySelector('#audio-select')) return;
const wrapper = document.createElement('div');
wrapper.className = 'plyr__control';
const select = document.createElement('select');
select.id = 'audio-select';
hls.audioTracks.forEach((t, i) => {
const opt = document.createElement('option');
opt.value = i;
opt.textContent = t.name || t.lang || `Audio ${i + 1}`;
select.appendChild(opt);
});
select.value = hls.audioTrack;
select.onchange = () => {
hls.audioTrack = Number(select.value);
};
wrapper.appendChild(select);
controls.insertBefore(wrapper, controls.children[4]); // antes del volumen
}
function initPlyr(enableAudio = false) {
if (plyrInstance) return;
const settings = ['captions', 'quality', 'speed'];
if (enableAudio) settings.unshift('audio');
plyrInstance = new Plyr(els.video, {
captions: {
@@ -451,26 +470,26 @@ const AnimePlayer = (function() {
enabled: true,
fallback: true,
iosNative: true,
container: '.player-container' // IMPORTANTE: El contenedor padre entra en fullscreen
container: '.player-container'
},
controls: [
'play-large', 'play', 'progress', 'current-time',
'mute', 'volume', 'captions', 'settings',
'fullscreen', 'airplay'
],
settings: ['captions', 'quality', 'speed']
settings
});
// --- MAGIA NUEVA AQUÍ ---
// Sincronizar la UI personalizada con los eventos de Plyr
const container = document.querySelector('.player-container');
// Cuando Plyr esconde sus controles (inactividad)
plyrInstance.on('controlshidden', () => {
container.classList.add('ui-hidden');
});
// Cuando Plyr muestra sus controles (movimiento de mouse)
plyrInstance.on('ready', () => {
if (hlsInstance) createAudioSelector(hlsInstance);
});
plyrInstance.on('controlsshown', () => {
container.classList.remove('ui-hidden');
});