Files
anime/js/player.js
2025-10-02 13:36:03 +02:00

75 lines
2.2 KiB
JavaScript

$(async function()
{
const hash = location.hash.slice(1);
const file = atob(hash.replace(/-/g, '+').replace(/_/g, '/'));
$("title").text("Anime - "+file);
$("#title").text(file);
$("#status").text("Fetching media info...");
let res = await fetch(`api/info.php?file=${hash}`);
$("#status").text("Parsing response data...");
let media = await res.json();
$("#status").text("Constructing media player...");
const audio = [];
const text = [];
for (const stream of media.streams) switch (stream.codec_type)
{
case "audio":
audio.push({
label: stream.tags.title,
language: stream.tags.language,
});
break;
case "subtitle":
text.push({
label: stream.tags.title,
language: stream.tags.language,
});
break;
default:
break;
}
$("#vid").append($("<source>", {type: "video/mp4", src: `api/video.php?file=${hash}`}));
for (let i = 0; i < text.length; i++)
$("#vid").append($("<track>", {
kind: "captions",
label: text[i].label,
srclang: text[i].language,
src: `api/subtitles.php?file=${hash}&s=${i}`,
}));
$("#status").text("Building video.js player...");
const player = videojs("vid");
let audioTrackList = player.audioTracks();
for (let i = 0; i < audio.length; i++)
audioTrackList.addTrack(new videojs.AudioTrack({
kind: "translation",
label: audio[i].label,
language: audio[i].language,
}));
audioTrackList.addEventListener('change', function() {
for (var i = 0; i < audioTrackList.length; i++) {
var track = audioTrackList[i];
if (track.enabled) {
let time = player.currentTime()
player.src({type: "video/mp4", src: `api/video.php?file=${hash}&a=${i}`})
player.ready(function(){
player.currentTime(time);
player.play();
});
return;
}
}
});
$("#status").remove();
});