webmusic/webmusic.js

216 lines
4.5 KiB
JavaScript

let audioPlayer = new Audio();
let playerState = "idle";
let continuous = true;
let repeat = false;
let total = 0;
let index = 0;
const handleKeyEvent = (event) => {
switch (event.key) {
case " ":
case "p":
if (playerState == "idle" && total !== 0) {
if (document.getElementById(index).classList.contains('dir')) {
return nextTrack();
}
playSong(index)
} else {
togglePlayback();
}
break;
case "r":
toggleRepeat();
break;
case "c":
toggleContinue();
break;
case "ArrowUp":
previousTrack();
break;
case "ArrowDown":
nextTrack();
break;
case "ArrowLeft":
if (audioPlayer.currentTime < 10) {
audioPlayer.currentTime = 0;
} else {
audioPlayer.currentTime = audioPlayer.currentTime-10;
}
break;
case "ArrowRight":
audioPlayer.currentTime = audioPlayer.currentTime+10;
break;
case "Escape":
document.getElementById("back").click();
break;
}
};
const initState = () => {
const dirElements = document.querySelectorAll(".dir");
const fileElements = document.querySelectorAll(".file");
let id = 0;
document.getElementById("state").addEventListener("click", togglePlayback)
document.getElementById("repeatButton").addEventListener("click", toggleRepeat)
document.getElementById("continuousButton").addEventListener("click", toggleContinue)
audioPlayer.addEventListener("canplay", function () {
audioPlayer.play();
});
audioPlayer.addEventListener("play", function () {
setPlayerState("playing");
});
audioPlayer.addEventListener("pause", function () {
setPlayerState("paused");
});
audioPlayer.addEventListener("error", function () {
setPlayerState("error loading track");
});
audioPlayer.addEventListener("ended", function () {
setPlayerState("idle");
nextTrack();
});
audioPlayer.addEventListener("timeupdate", function () {
updatePlayerState();
});
dirElements.forEach(function(element){
element.id = id++;
});
fileElements.forEach(function(element){
element.id = id++;
element.addEventListener("click", function(event) {
event.preventDefault();
event.stopPropagation();
playSong(event.target.id);
});
});
total = id;
updatePlayerState();
updateButtonState();
}
const setPlayerState = (state) => {
playerState = state;
console.log("now in state: " + state);
updatePlayerState();
}
const updatePlayerState = () => {
let statestr = "[" + playerState;
if (!audioPlayer.paused) {
statestr += " " + formatTime(audioPlayer.currentTime) + "/" + formatTime(audioPlayer.duration);
}
statestr += "]";
document.getElementById("state").innerHTML = statestr;
}
const updateButtonState = () => {
if (repeat !== false) {
document.getElementById('repeatButton').style.color = '#6b9969';
} else {
document.getElementById('repeatButton').style.color = null;
}
if (continuous !== false) {
document.getElementById('continuousButton').style.color = '#6b9969';
} else {
document.getElementById('continuousButton').style.color = null;
}
}
const playSong = (id) => {
let element = document.getElementById(id);
if (element === null) return;
if (element.classList.contains('dir')) return;
if (document.getElementsByClassName("playing").length > 0) {
document.getElementsByClassName("playing")[0].classList.remove("playing");
}
index = element.id;
audioPlayer.pause()
audioPlayer.src = element.href;
setPlayerState("loading");
audioPlayer.load();
element.classList.add("playing");
}
const togglePlayback = () => {
if (audioPlayer.paused) {
audioPlayer.play();
} else {
audioPlayer.pause();
}
}
const toggleRepeat = () => {
repeat = !repeat;
continuous = !repeat;
audioPlayer.loop = repeat;
updateButtonState();
}
const toggleContinue = () => {
continuous = !continuous;
updateButtonState();
}
const previousTrack = () => {
if (!continuous) return;
if (index-- === 0) index = total-1;
if (document.getElementById(index).classList.contains('dir')) {
return previousTrack();
}
playSong(index);
}
const nextTrack = () => {
if (!continuous) return;
if (++index === total) index = 0;
if (document.getElementById(index).classList.contains('dir')) {
return nextTrack();
}
playSong(index);
}
const formatTime = (secs) => {
secs = Math.round(secs);
const minutes = Math.floor(secs / 60) || 0;
const seconds = (secs - minutes * 60) || 0;
return minutes + ':' + (seconds < 10 ? '0' : '') + seconds;
}
document.addEventListener('DOMContentLoaded', initState);
document.addEventListener('keydown', handleKeyEvent);