miru/app/playerHandler.js
2020-08-28 05:00:12 +02:00

253 lines
No EOL
6.1 KiB
JavaScript

const controls = document.getElementsByClassName('ctrl'),
video = document.querySelector('#video'),
player = document.querySelector('#player'),
volume = document.querySelector('#vol'),
progress = document.querySelector('#prog'),
peers = document.querySelector('#peers'),
downSpeed = document.querySelector('#down'),
upSpeed = document.querySelector('#up'),
playPause = document.querySelector('#ptoggle'),
btnpp = document.querySelector('#bpp'),
btnm = document.querySelector("#bmute"),
btnfull = document.querySelector('#bfull'),
elapsed = document.querySelector("#elapsed"),
remaining = document.querySelector("#remaining")
volume.addEventListener("input", function () {
updatevolume()
});
progress.addEventListener("input", setprogress);
video.addEventListener("playing", playcheck);
video.addEventListener("canplay", updateDisplay);
video.addEventListener("loadedmetadata", setduration);
playPause.addEventListener("click", bpp);
immerse();
for (let i = 0; i < controls.length; i++) {
controls[i].addEventListener("click", function () {
let func = this.id;
window[func]()
})
}
//immerse timeout
let immersetime;
function immerse() {
document.onmousemove = resetTimer;
document.onkeypress = resetTimer;
function immerseplayer() {
player.classList.add('immersed')
}
function resetTimer() {
clearTimeout(immersetime);
player.classList.remove('immersed')
immersetime = setTimeout(immerseplayer, 3000)
}
}
//set duration
let duration;
function setduration() {
duration = video.duration;
}
//progress
function setprogress() {
video.currentTime = progress.value / 1000 * duration;
updateDisplay();
}
let progresspercent,
bufferpercent,
remainingTime
function updateDisplay() {
progresspercent = (video.currentTime / duration * 100).toFixed(4)
bufferpercent = (video.buffered.length == 0 ? 0 : video.buffered.end(video.buffered.length - 1) / duration * 100).toFixed(4)
remainingTime = duration - video.currentTime
document.documentElement.style.setProperty("--progress", progresspercent + "%");
document.documentElement.style.setProperty("--buffer", bufferpercent + "%");
elapsed.innerHTML = toTS(video.currentTime);
remaining.innerHTML = toTS(remainingTime);
progress.value = Math.floor(progresspercent * 10)
}
function toTS(sec) {
let hours = Math.floor(sec / 3600),
minutes = Math.floor((sec - (hours * 3600)) / 60),
seconds = Math.floor(sec - (hours * 3600) - (minutes * 60));
if (minutes < 10) {
minutes = `0${minutes}`;
}
if (seconds < 10) {
seconds = `0${seconds}`;
}
if (hours > 0) {
return `${hours}:${minutes}:${seconds}`;
} else {
return `${minutes}:${seconds}`;
}
}
let islooped;
function playcheck() {
if (!islooped && !video.paused) {
islooped = true;
updateDisplay();
setTimeout(function () {
islooped = false;
playcheck();
}, 50)
}
}
//play/pause button
async function playVideo() {
try {
await video.play();
btnpp.innerHTML = "pause";
} catch (err) {
btnpp.innerHTML = "play_arrow";
}
}
function bpp() {
if (video.paused) {
playVideo();
} else {
btnpp.innerHTML = "play_arrow";
video.pause();
}
}
function bnext() {
console.log("todo")
// TODO: get magnet link of next current next episode [using search]
}
//volume shit
let oldlevel;
function bmute() {
if (video.volume == 0) {
updatevolume(oldlevel)
} else {
oldlevel = video.volume * 100
updatevolume(0)
}
}
let level;
function updatevolume(a) {
if (a == null) {
level = volume.value;
} else {
level = a;
volume.value = a;
}
document.documentElement.style.setProperty("--volume-level", level + "%");
btnm.innerHTML = (level == 0) ? "volume_off" : "volume_up";
video.volume = level / 100
}
//PiP
function bpip() {
if (!document.pictureInPictureElement) {
video.requestPictureInPicture();
} else if (document.pictureInPictureElement) {
document.exitPictureInPicture();
}
}
//theathe mode
function btheatre() {
halfmoon.toggleSidebar();
}
//fullscreen
function bfull() {
if (!document.fullscreenElement) {
player.requestFullscreen();
btnfull.innerHTML = "fullscreen_exit"
} else if (document.exitFullscreen) {
document.exitFullscreen();
btnfull.innerHTML = "fullscreen"
}
}
function seek(a) {
video.currentTime += a;
updateDisplay()
}
//keybinds
document.onkeydown = function (a) {
if (document.location.href.endsWith("#player")){
switch (a.key) {
case " ":
bpp();
break;
case "n":
bnext();
break;
case "m":
bmute();
break;
case "p":
bpip();
break;
case "t":
btheatre();
break;
case "f":
bfull();
break;
case "s":
seek(89);
break;
case "ArrowLeft":
seek(-2);
break;
case "ArrowRight":
seek(2);
}
}
}
//media session
if ('mediaSession' in navigator) {
navigator.mediaSession.metadata = new MediaMetadata({
title: 'THE GOD OF HIGH SCHOOL',
artist: 'Miru',
artwork: [
{
src: 'https://s4.anilist.co/file/anilistcdn/media/anime/cover/small/bx116006-XasdW0bB4n18.png',
sizes: '128x128',
type: 'image/png'
}
]
});
navigator.mediaSession.setActionHandler('play', bpp);
navigator.mediaSession.setActionHandler('pause', bpp);
navigator.mediaSession.setActionHandler('seekbackward', function () {
seek(-2);
});
navigator.mediaSession.setActionHandler('seekforward', function () {
seek(2);
});
navigator.mediaSession.setActionHandler('nexttrack', bnext);
}