select first element on down arrow press, cleanup

This commit is contained in:
Laura Hausmann 2021-05-27 16:48:24 +02:00
parent 75c86b5fd8
commit e09c2545a1
Signed by: zotan
GPG key ID: D044E84C5BE01605

View file

@ -1,261 +1,265 @@
'use strict'; 'use strict';
const audioPlayer = new Audio(); const audioPlayer = new Audio();
let selectedItem = 0; let selectedItem = 0;
let playingItem = 0; let playingItem = 0;
let playerState = 'idle'; let playerState = 'idle';
let continuous = true; let continuous = true;
let repeat = false; let repeat = false;
let total = 0; let total = 0;
let onlyDirs = true; let onlyDirs = true;
const handleKeyEvent = (event) => { const handleKeyEvent = (event) => {
if (event.ctrlKey === true || event.altKey === true || event.metaKey == true) return; if (event.ctrlKey === true || event.altKey === true || event.metaKey === true) return;
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
switch (event.key) { switch (event.key) {
case ' ': case ' ':
case 'p': case 'p':
if (onlyDirs !== false) return; if (onlyDirs !== false) return;
if (playerState == 'idle' && total !== 0) { if (playerState === 'idle' && total !== 0) {
if (document.getElementById(playingItem).classList.contains('dir')) { if (document.getElementById(playingItem).classList.contains('dir')) {
return nextTrack(); return nextTrack();
} }
playSong(playingItem) playSong(playingItem)
} else { } else {
togglePlayback(); togglePlayback();
} }
break; break;
case 'r': case 'r':
toggleRepeat(); toggleRepeat();
break; break;
case 'c': case 'c':
toggleContinue(); toggleContinue();
break; break;
case 'ArrowUp': case 'ArrowUp':
selectPreviousItem(); selectPreviousItem();
break; break;
case 'ArrowDown': case 'ArrowDown':
selectNextItem(); selectNextItem();
break; break;
case 'ArrowLeft': case 'ArrowLeft':
if (audioPlayer.currentTime < 10) { if (audioPlayer.currentTime < 10) {
audioPlayer.currentTime = 0; audioPlayer.currentTime = 0;
} else { } else {
audioPlayer.currentTime = audioPlayer.currentTime-10; audioPlayer.currentTime = audioPlayer.currentTime - 10;
} }
break; break;
case 'ArrowRight': case 'ArrowRight':
audioPlayer.currentTime = audioPlayer.currentTime+10; audioPlayer.currentTime = audioPlayer.currentTime + 10;
break; break;
case 'Enter': case 'Enter':
document.getElementById(selectedItem).click() document.getElementById(selectedItem).click()
break; break;
case 'Escape': case 'Escape':
document.getElementById('back').click(); document.getElementById('back').click();
break; break;
case '0': case '0':
case '1': case '1':
case '2': case '2':
case '3': case '3':
case '4': case '4':
case '5': case '5':
case '6': case '6':
case '7': case '7':
case '8': case '8':
case '9': case '9':
audioPlayer.currentTime = audioPlayer.duration / 100 * (event.key * 10); audioPlayer.currentTime = audioPlayer.duration / 100 * (event.key * 10);
break; break;
} }
}; };
const initState = () => { const initState = () => {
const dirElements = document.querySelectorAll('.dir'); const dirElements = document.querySelectorAll('.dir');
const fileElements = document.querySelectorAll('.file'); const fileElements = document.querySelectorAll('.file');
let id = 0; let id = 0;
document.getElementById('state').addEventListener('click', togglePlayback) document.getElementById('state').addEventListener('click', togglePlayback)
document.getElementById('repeatButton').addEventListener('click', toggleRepeat) document.getElementById('repeatButton').addEventListener('click', toggleRepeat)
document.getElementById('continuousButton').addEventListener('click', toggleContinue) document.getElementById('continuousButton').addEventListener('click', toggleContinue)
audioPlayer.addEventListener('canplay', () => { audioPlayer.addEventListener('canplay', () => {
audioPlayer.play(); audioPlayer.play();
}); });
audioPlayer.addEventListener('play', () => { audioPlayer.addEventListener('play', () => {
setPlayerState('playing'); setPlayerState('playing');
}); });
audioPlayer.addEventListener('pause', () => { audioPlayer.addEventListener('pause', () => {
setPlayerState('paused'); setPlayerState('paused');
}); });
audioPlayer.addEventListener('error', () => { audioPlayer.addEventListener('error', () => {
setPlayerState('error loading track'); setPlayerState('error loading track');
}); });
audioPlayer.addEventListener('ended', () => { audioPlayer.addEventListener('ended', () => {
setPlayerState('idle'); setPlayerState('idle');
nextTrack(); nextTrack();
}); });
audioPlayer.addEventListener('timeupdate', () => { audioPlayer.addEventListener('timeupdate', () => {
updatePlayerState(); updatePlayerState();
}); });
dirElements.forEach((element) => { dirElements.forEach((element) => {
element.id = id++; element.id = id++;
}); });
fileElements.forEach((element) => { fileElements.forEach((element) => {
element.id = id++; element.id = id++;
onlyDirs = false; onlyDirs = false;
element.addEventListener('click', (event) => { element.addEventListener('click', (event) => {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
playSong(event.target.id); playSong(event.target.id);
}); });
}); });
total = id; total = id;
updatePlayerState(); updatePlayerState();
updateButtonState(); updateButtonState();
} }
const setPlayerState = (state) => { const setPlayerState = (state) => {
playerState = state; playerState = state;
console.log('now in state: ' + state); console.log('now in state: ' + state);
updatePlayerState(); updatePlayerState();
} }
const updatePlayerState = () => { const updatePlayerState = () => {
let statestr = '[' + playerState; let statestr = '[' + playerState;
if (!audioPlayer.paused) { if (!audioPlayer.paused) {
statestr += ' ' + formatTime(audioPlayer.currentTime) + '/' + formatTime(audioPlayer.duration); statestr += ' ' + formatTime(audioPlayer.currentTime) + '/' + formatTime(audioPlayer.duration);
} }
statestr += ']'; statestr += ']';
document.getElementById('state').innerHTML = statestr; document.getElementById('state').innerHTML = statestr;
} }
const updateButtonState = () => { const updateButtonState = () => {
if (repeat !== false) { if (repeat !== false) {
document.getElementById('repeatButton').classList.add('active'); document.getElementById('repeatButton').classList.add('active');
} else { } else {
document.getElementById('repeatButton').classList.remove('active'); document.getElementById('repeatButton').classList.remove('active');
} }
if (continuous !== false) { if (continuous !== false) {
document.getElementById('continuousButton').classList.add('active'); document.getElementById('continuousButton').classList.add('active');
} else { } else {
document.getElementById('continuousButton').classList.remove('active'); document.getElementById('continuousButton').classList.remove('active');
} }
} }
const playSong = (id) => { const playSong = (id) => {
const element = document.getElementById(id); const element = document.getElementById(id);
if (element === null) return; if (element === null) return;
if (element.classList.contains('dir')) return; if (element.classList.contains('dir')) return;
if (document.getElementsByClassName('playing').length > 0) { if (document.getElementsByClassName('playing').length > 0) {
document.getElementsByClassName('playing')[0].classList.remove('playing'); document.getElementsByClassName('playing')[0].classList.remove('playing');
} }
if (document.getElementsByClassName('selected').length > 0) { if (document.getElementsByClassName('selected').length > 0) {
document.getElementsByClassName('selected')[0].classList.remove('selected'); document.getElementsByClassName('selected')[0].classList.remove('selected');
} }
audioPlayer.pause() audioPlayer.pause()
playingItem = element.id; playingItem = element.id;
element.classList.add('playing'); element.classList.add('playing');
audioPlayer.src = element.href; audioPlayer.src = element.href;
setPlayerState('loading'); setPlayerState('loading');
audioPlayer.load(); audioPlayer.load();
} }
const togglePlayback = () => { const togglePlayback = () => {
if (audioPlayer.paused) { if (audioPlayer.paused) {
audioPlayer.play(); audioPlayer.play();
} else { } else {
audioPlayer.pause(); audioPlayer.pause();
} }
} }
const toggleRepeat = () => { const toggleRepeat = () => {
repeat = !repeat; repeat = !repeat;
continuous = !repeat; continuous = !repeat;
audioPlayer.loop = repeat; audioPlayer.loop = repeat;
updateButtonState(); updateButtonState();
} }
const toggleContinue = () => { const toggleContinue = () => {
continuous = !continuous; continuous = !continuous;
updateButtonState(); updateButtonState();
} }
const previousTrack = () => { const previousTrack = () => {
if (!continuous) return; if (!continuous) return;
if (playingItem-- === 0) playingItem = total-1; if (playingItem-- === 0) playingItem = total - 1;
if (document.getElementById(playingItem).classList.contains('dir')) { if (document.getElementById(playingItem).classList.contains('dir')) {
return previousTrack(); return previousTrack();
} }
playSong(playingItem); playSong(playingItem);
} }
const nextTrack = () => { const nextTrack = () => {
if (!continuous) return; if (!continuous) return;
if (++playingItem === total) playingItem = 0; if (++playingItem === total) playingItem = 0;
if (document.getElementById(playingItem).classList.contains('dir')) { if (document.getElementById(playingItem).classList.contains('dir')) {
return nextTrack(); return nextTrack();
} }
playSong(playingItem); playSong(playingItem);
} }
const selectPreviousItem = () => { const selectPreviousItem = () => {
if (selectedItem-- === 0) selectedItem = total-1; if (selectedItem-- === 0) selectedItem = total - 1;
updateSelectedItem(); updateSelectedItem();
} }
const selectNextItem = () => { const selectNextItem = () => {
if (++selectedItem === total) selectedItem = 0; if (selectedItem === 0 && document.getElementsByClassName('selected').length === 0) {
updateSelectedItem(); document.getElementById(selectedItem).classList.add('selected');
} else {
if (++selectedItem === total) selectedItem = 0;
updateSelectedItem();
}
} }
const updateSelectedItem = () => { const updateSelectedItem = () => {
if (document.getElementsByClassName('selected').length > 0) { if (document.getElementsByClassName('selected').length > 0) {
document.getElementsByClassName('selected')[0].classList.remove('selected'); document.getElementsByClassName('selected')[0].classList.remove('selected');
} }
document.getElementById(selectedItem).classList.add('selected'); document.getElementById(selectedItem).classList.add('selected');
} }
const formatTime = (secs) => { const formatTime = (secs) => {
secs = Math.round(secs); secs = Math.round(secs);
const minutes = Math.floor(secs / 60) || 0; const minutes = Math.floor(secs / 60) || 0;
const seconds = (secs - minutes * 60) || 0; const seconds = (secs - minutes * 60) || 0;
return minutes + ':' + (seconds < 10 ? '0' : '') + seconds; return minutes + ':' + (seconds < 10 ? '0' : '') + seconds;
} }
document.addEventListener('DOMContentLoaded', initState); document.addEventListener('DOMContentLoaded', initState);