diff --git a/Pages/Index.cshtml b/Pages/Index.cshtml index f57e79e..8ab2249 100644 --- a/Pages/Index.cshtml +++ b/Pages/Index.cshtml @@ -13,7 +13,7 @@ } else {

- @Model.Displaypath + @Model.Displaypath [RC]

[..] Go back @@ -25,7 +25,7 @@ else { @foreach (var dir in Model.Dirs) {
  • [--] - @dir + @dir
  • } @foreach (var file in Model.Files) { @@ -36,7 +36,6 @@ else { var lrcpath = System.IO.Path.Combine(Model.Fullpath, lrcfile);
  • - [DL] @if (System.IO.File.Exists(lrcpath)) { [LRC] @@ -44,7 +43,7 @@ else { else if(Directory.GetFiles(@Model.Fullpath, "*.lrc").Length != 0) { [---] } - @file + @file
  • } } diff --git a/Pages/Shared/_Layout.cshtml b/Pages/Shared/_Layout.cshtml index 46eadea..e8d7507 100644 --- a/Pages/Shared/_Layout.cshtml +++ b/Pages/Shared/_Layout.cshtml @@ -8,7 +8,6 @@ @ViewData["Title"] - diff --git a/howler.core.js b/howler.core.js deleted file mode 100644 index 1b78473..0000000 --- a/howler.core.js +++ /dev/null @@ -1,162 +0,0 @@ -/*! -* howler.js v2.1.2 -* howlerjs.com -* -* (c) 2013-2019, James Simpson of GoldFire Studios -* goldfirestudios.com -* -* MIT License -*/(function(){'use strict';var HowlerGlobal=function(){this.init();};HowlerGlobal.prototype={init:function(){var self=this||Howler;self._counter=1000;self._html5AudioPool=[];self.html5PoolSize=10;self._codecs={};self._howls=[];self._muted=false;self._volume=1;self._canPlayEvent='canplaythrough';self._navigator=(typeof window!=='undefined'&&window.navigator)?window.navigator:null;self.masterGain=null;self.noAudio=false;self.usingWebAudio=true;self.autoSuspend=true;self.ctx=null;self.autoUnlock=true;self._setup();return self;},volume:function(vol){var self=this||Howler;vol=parseFloat(vol);if(!self.ctx){setupAudioContext();} -if(typeof vol!=='undefined'&&vol>=0&&vol<=1){self._volume=vol;if(self._muted){return self;} -if(self.usingWebAudio){self.masterGain.gain.setValueAtTime(vol,Howler.ctx.currentTime);} -for(var i=0;i=0;i--){self._howls[i].unload();} -if(self.usingWebAudio&&self.ctx&&typeof self.ctx.close!=='undefined'){self.ctx.close();self.ctx=null;setupAudioContext();} -return self;},codecs:function(ext){return(this||Howler)._codecs[ext.replace(/^x-/,'')];},_setup:function(){var self=this||Howler;self.state=self.ctx?self.ctx.state||'suspended':'suspended';self._autoSuspend();if(!self.usingWebAudio){if(typeof Audio!=='undefined'){try{var test=new Audio();if(typeof test.oncanplaythrough==='undefined'){self._canPlayEvent='canplay';}}catch(e){self.noAudio=true;}}else{self.noAudio=true;}} -try{var test=new Audio();if(test.muted){self.noAudio=true;}}catch(e){} -if(!self.noAudio){self._setupCodecs();} -return self;},_setupCodecs:function(){var self=this||Howler;var audioTest=null;try{audioTest=(typeof Audio!=='undefined')?new Audio():null;}catch(err){return self;} -if(!audioTest||typeof audioTest.canPlayType!=='function'){return self;} -var mpegTest=audioTest.canPlayType('audio/mpeg;').replace(/^no$/,'');var checkOpera=self._navigator&&self._navigator.userAgent.match(/OPR\/([0-6].)/g);var isOldOpera=(checkOpera&&parseInt(checkOpera[0].split('/')[1],10)<33);self._codecs={mp3:!!(!isOldOpera&&(mpegTest||audioTest.canPlayType('audio/mp3;').replace(/^no$/,''))),mpeg:!!mpegTest,opus:!!audioTest.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/,''),ogg:!!audioTest.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,''),oga:!!audioTest.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,''),wav:!!audioTest.canPlayType('audio/wav; codecs="1"').replace(/^no$/,''),aac:!!audioTest.canPlayType('audio/aac;').replace(/^no$/,''),caf:!!audioTest.canPlayType('audio/x-caf;').replace(/^no$/,''),m4a:!!(audioTest.canPlayType('audio/x-m4a;')||audioTest.canPlayType('audio/m4a;')||audioTest.canPlayType('audio/aac;')).replace(/^no$/,''),mp4:!!(audioTest.canPlayType('audio/x-mp4;')||audioTest.canPlayType('audio/mp4;')||audioTest.canPlayType('audio/aac;')).replace(/^no$/,''),weba:!!audioTest.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,''),webm:!!audioTest.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,''),dolby:!!audioTest.canPlayType('audio/mp4; codecs="ec-3"').replace(/^no$/,''),flac:!!(audioTest.canPlayType('audio/x-flac;')||audioTest.canPlayType('audio/flac;')).replace(/^no$/,'')};return self;},_unlockAudio:function(){var self=this||Howler;if(self._audioUnlocked||!self.ctx){return;} -self._audioUnlocked=false;self.autoUnlock=false;if(!self._mobileUnloaded&&self.ctx.sampleRate!==44100){self._mobileUnloaded=true;self.unload();} -self._scratchBuffer=self.ctx.createBuffer(1,1,22050);var unlock=function(e){for(var i=0;i0?sound._seek:self._sprite[sprite][0]/1000);var duration=Math.max(0,((self._sprite[sprite][0]+self._sprite[sprite][1])/1000)-seek);var timeout=(duration*1000)/Math.abs(sound._rate);var start=self._sprite[sprite][0]/1000;var stop=(self._sprite[sprite][0]+self._sprite[sprite][1])/1000;var loop=!!(sound._loop||self._sprite[sprite][2]);sound._sprite=sprite;sound._ended=false;var setParams=function(){sound._paused=false;sound._seek=seek;sound._start=start;sound._stop=stop;sound._loop=loop;};if(seek>=stop){self._ended(sound);return;} -var node=sound._node;if(self._webAudio){var playWebAudio=function(){self._playLock=false;setParams();self._refreshBuffer(sound);var vol=(sound._muted||self._muted)?0:sound._volume;node.gain.setValueAtTime(vol,Howler.ctx.currentTime);sound._playStart=Howler.ctx.currentTime;if(typeof node.bufferSource.start==='undefined'){sound._loop?node.bufferSource.noteGrainOn(0,seek,86400):node.bufferSource.noteGrainOn(0,seek,duration);}else{sound._loop?node.bufferSource.start(0,seek,86400):node.bufferSource.start(0,seek,duration);} -if(timeout!==Infinity){self._endTimers[sound._id]=setTimeout(self._ended.bind(self,sound),timeout);} -if(!internal){setTimeout(function(){self._emit('play',sound._id);self._loadQueue();},0);}};if(Howler.state==='running'){playWebAudio();}else{self._playLock=true;self.once('resume',playWebAudio);self._clearTimer(sound._id);}}else{var playHtml5=function(){node.currentTime=seek;node.muted=sound._muted||self._muted||Howler._muted||node.muted;node.volume=sound._volume*Howler.volume();node.playbackRate=sound._rate;try{var play=node.play();if(play&&typeof Promise!=='undefined'&&(play instanceof Promise||typeof play.then==='function')){self._playLock=true;setParams();play.then(function(){self._playLock=false;node._unlocked=true;if(!internal){self._emit('play',sound._id);self._loadQueue();}}).catch(function(){self._playLock=false;self._emit('playerror',sound._id,'Playback was unable to start. This is most commonly an issue '+ -'on mobile devices and Chrome where playback was not within a user interaction.');sound._ended=true;sound._paused=true;});}else if(!internal){self._playLock=false;setParams();self._emit('play',sound._id);self._loadQueue();} -node.playbackRate=sound._rate;if(node.paused){self._emit('playerror',sound._id,'Playback was unable to start. This is most commonly an issue '+ -'on mobile devices and Chrome where playback was not within a user interaction.');return;} -if(sprite!=='__default'||sound._loop){self._endTimers[sound._id]=setTimeout(self._ended.bind(self,sound),timeout);}else{self._endTimers[sound._id]=function(){self._ended(sound);node.removeEventListener('ended',self._endTimers[sound._id],false);};node.addEventListener('ended',self._endTimers[sound._id],false);}}catch(err){self._emit('playerror',sound._id,err);}};if(node.src==='data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA'){node.src=self._src;node.load();} -var loadedNoReadyState=(window&&window.ejecta)||(!node.readyState&&Howler._navigator.isCocoonJS);if(node.readyState>=3||loadedNoReadyState){playHtml5();}else{self._playLock=true;var listener=function(){playHtml5();node.removeEventListener(Howler._canPlayEvent,listener,false);};node.addEventListener(Howler._canPlayEvent,listener,false);self._clearTimer(sound._id);}} -return sound._id;},pause:function(id){var self=this;if(self._state!=='loaded'||self._playLock){self._queue.push({event:'pause',action:function(){self.pause(id);}});return self;} -var ids=self._getSoundIds(id);for(var i=0;i=0){id=parseInt(args[0],10);}else{vol=parseFloat(args[0]);}}else if(args.length>=2){vol=parseFloat(args[0]);id=parseInt(args[1],10);} -var sound;if(typeof vol!=='undefined'&&vol>=0&&vol<=1){if(self._state!=='loaded'||self._playLock){self._queue.push({event:'volume',action:function(){self.volume.apply(self,args);}});return self;} -if(typeof id==='undefined'){self._volume=vol;} -id=self._getSoundIds(id);for(var i=0;i0)?len/steps:len);var lastTick=Date.now();sound._fadeTo=to;sound._interval=setInterval(function(){var tick=(Date.now()-lastTick)/len;lastTick=Date.now();vol+=diff*tick;vol=Math.max(0,vol);vol=Math.min(1,vol);vol=Math.round(vol*100)/100;if(self._webAudio){sound._volume=vol;}else{self.volume(vol,sound._id,true);} -if(isGroup){self._volume=vol;} -if((tofrom&&vol>=to)){clearInterval(sound._interval);sound._interval=null;sound._fadeTo=null;self.volume(to,sound._id);self._emit('fade',sound._id);}},stepLen);},_stopFade:function(id){var self=this;var sound=self._soundById(id);if(sound&&sound._interval){if(self._webAudio){sound._node.gain.cancelScheduledValues(Howler.ctx.currentTime);} -clearInterval(sound._interval);sound._interval=null;self.volume(sound._fadeTo,id);sound._fadeTo=null;self._emit('fade',id);} -return self;},loop:function(){var self=this;var args=arguments;var loop,id,sound;if(args.length===0){return self._loop;}else if(args.length===1){if(typeof args[0]==='boolean'){loop=args[0];self._loop=loop;}else{sound=self._soundById(parseInt(args[0],10));return sound?sound._loop:false;}}else if(args.length===2){loop=args[0];id=parseInt(args[1],10);} -var ids=self._getSoundIds(id);for(var i=0;i=0){id=parseInt(args[0],10);}else{rate=parseFloat(args[0]);}}else if(args.length===2){rate=parseFloat(args[0]);id=parseInt(args[1],10);} -var sound;if(typeof rate==='number'){if(self._state!=='loaded'||self._playLock){self._queue.push({event:'rate',action:function(){self.rate.apply(self,args);}});return self;} -if(typeof id==='undefined'){self._rate=rate;} -id=self._getSoundIds(id);for(var i=0;i=0){id=parseInt(args[0],10);}else if(self._sounds.length){id=self._sounds[0]._id;seek=parseFloat(args[0]);}}else if(args.length===2){seek=parseFloat(args[0]);id=parseInt(args[1],10);} -if(typeof id==='undefined'){return self;} -if(self._state!=='loaded'||self._playLock){self._queue.push({event:'seek',action:function(){self.seek.apply(self,args);}});return self;} -var sound=self._soundById(id);if(sound){if(typeof seek==='number'&&seek>=0){var playing=self.playing(id);if(playing){self.pause(id,true);} -sound._seek=seek;sound._ended=false;self._clearTimer(id);if(!self._webAudio&&sound._node&&!isNaN(sound._node.duration)){sound._node.currentTime=seek;} -var seekAndEmit=function(){self._emit('seek',id);if(playing){self.play(id,true);}};if(playing&&!self._webAudio){var emitSeek=function(){if(!self._playLock){seekAndEmit();}else{setTimeout(emitSeek,0);}};setTimeout(emitSeek,0);}else{seekAndEmit();}}else{if(self._webAudio){var realTime=self.playing(id)?Howler.ctx.currentTime-sound._playStart:0;var rateSeek=sound._rateSeek?sound._rateSeek-sound._seek:0;return sound._seek+(rateSeek+realTime*Math.abs(sound._rate));}else{return sound._node.currentTime;}}} -return self;},playing:function(id){var self=this;if(typeof id==='number'){var sound=self._soundById(id);return sound?!sound._paused:false;} -for(var i=0;i=0){Howler._howls.splice(index,1);} -var remCache=true;for(i=0;i=0){remCache=false;break;}} -if(cache&&remCache){delete cache[self._src];} -Howler.noAudio=false;self._state='unloaded';self._sounds=[];self=null;return null;},on:function(event,fn,id,once){var self=this;var events=self['_on'+event];if(typeof fn==='function'){events.push(once?{id:id,fn:fn,once:once}:{id:id,fn:fn});} -return self;},off:function(event,fn,id){var self=this;var events=self['_on'+event];var i=0;if(typeof fn==='number'){id=fn;fn=null;} -if(fn||id){for(i=0;i=0;i--){if(!events[i].id||events[i].id===id||event==='load'){setTimeout(function(fn){fn.call(this,id,msg);}.bind(self,events[i].fn),0);if(events[i].once){self.off(event,events[i].fn,events[i].id);}}} -self._loadQueue(event);return self;},_loadQueue:function(event){var self=this;if(self._queue.length>0){var task=self._queue[0];if(task.event===event){self._queue.shift();self._loadQueue();} -if(!event){task.action();}} -return self;},_ended:function(sound){var self=this;var sprite=sound._sprite;if(!self._webAudio&&sound._node&&!sound._node.paused&&!sound._node.ended&&sound._node.currentTime=0;i--){if(cnt<=limit){return;} -if(self._sounds[i]._ended){if(self._webAudio&&self._sounds[i]._node){self._sounds[i]._node.disconnect(0);} -self._sounds.splice(i,1);cnt--;}}},_getSoundIds:function(id){var self=this;if(typeof id==='undefined'){var ids=[];for(var i=0;i=0;if(Howler._scratchBuffer&&node.bufferSource){node.bufferSource.onended=null;node.bufferSource.disconnect(0);if(isIOS){try{node.bufferSource.buffer=Howler._scratchBuffer;}catch(e){}}} -node.bufferSource=null;return self;},_clearSound:function(node){var checkIE=/MSIE |Trident\//.test(Howler._navigator&&Howler._navigator.userAgent);if(!checkIE){node.src='data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA';}}};var Sound=function(howl){this._parent=howl;this.init();};Sound.prototype={init:function(){var self=this;var parent=self._parent;self._muted=parent._muted;self._loop=parent._loop;self._volume=parent._volume;self._rate=parent._rate;self._seek=0;self._paused=true;self._ended=true;self._sprite='__default';self._id=++Howler._counter;parent._sounds.push(self);self.create();return self;},create:function(){var self=this;var parent=self._parent;var volume=(Howler._muted||self._muted||self._parent._muted)?0:self._volume;if(parent._webAudio){self._node=(typeof Howler.ctx.createGain==='undefined')?Howler.ctx.createGainNode():Howler.ctx.createGain();self._node.gain.setValueAtTime(volume,Howler.ctx.currentTime);self._node.paused=true;self._node.connect(Howler.masterGain);}else{self._node=Howler._obtainHtml5Audio();self._errorFn=self._errorListener.bind(self);self._node.addEventListener('error',self._errorFn,false);self._loadFn=self._loadListener.bind(self);self._node.addEventListener(Howler._canPlayEvent,self._loadFn,false);self._node.src=parent._src;self._node.preload='auto';self._node.volume=volume*Howler.volume();self._node.load();} -return self;},reset:function(){var self=this;var parent=self._parent;self._muted=parent._muted;self._loop=parent._loop;self._volume=parent._volume;self._rate=parent._rate;self._seek=0;self._rateSeek=0;self._paused=true;self._ended=true;self._sprite='__default';self._id=++Howler._counter;return self;},_errorListener:function(){var self=this;self._parent._emit('loaderror',self._id,self._node.error?self._node.error.code:0);self._node.removeEventListener('error',self._errorFn,false);},_loadListener:function(){var self=this;var parent=self._parent;parent._duration=Math.ceil(self._node.duration*10)/10;if(Object.keys(parent._sprite).length===0){parent._sprite={__default:[0,parent._duration*1000]};} -if(parent._state!=='loaded'){parent._state='loaded';parent._emit('load');parent._loadQueue();} -self._node.removeEventListener(Howler._canPlayEvent,self._loadFn,false);}};var cache={};var loadBuffer=function(self){var url=self._src;if(cache[url]){self._duration=cache[url].duration;loadSound(self);return;} -if(/^data:[^;]+;base64,/.test(url)){var data=atob(url.split(',')[1]);var dataView=new Uint8Array(data.length);for(var i=0;i0){cache[self._src]=buffer;loadSound(self,buffer);}else{error();}};if(typeof Promise!=='undefined'&&Howler.ctx.decodeAudioData.length===1){Howler.ctx.decodeAudioData(arraybuffer).then(success).catch(error);}else{Howler.ctx.decodeAudioData(arraybuffer,success,error);}} -var loadSound=function(self,buffer){if(buffer&&!self._duration){self._duration=buffer.duration;} -if(Object.keys(self._sprite).length===0){self._sprite={__default:[0,self._duration*1000]};} -if(self._state!=='loaded'){self._state='loaded';self._emit('load');self._loadQueue();}};var setupAudioContext=function(){if(!Howler.usingWebAudio){return;} -try{if(typeof AudioContext!=='undefined'){Howler.ctx=new AudioContext();}else if(typeof webkitAudioContext!=='undefined'){Howler.ctx=new webkitAudioContext();}else{Howler.usingWebAudio=false;}}catch(e){Howler.usingWebAudio=false;} -if(!Howler.ctx){Howler.usingWebAudio=false;} -var iOS=(/iP(hone|od|ad)/.test(Howler._navigator&&Howler._navigator.platform));var appVersion=Howler._navigator&&Howler._navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/);var version=appVersion?parseInt(appVersion[1],10):null;if(iOS&&version&&version<9){var safari=/safari/.test(Howler._navigator&&Howler._navigator.userAgent.toLowerCase());if(Howler._navigator&&Howler._navigator.standalone&&!safari||Howler._navigator&&!Howler._navigator.standalone&&!safari){Howler.usingWebAudio=false;}} -if(Howler.usingWebAudio){Howler.masterGain=(typeof Howler.ctx.createGain==='undefined')?Howler.ctx.createGainNode():Howler.ctx.createGain();Howler.masterGain.gain.setValueAtTime(Howler._muted?0:1,Howler.ctx.currentTime);Howler.masterGain.connect(Howler.ctx.destination);} -Howler._setup();};if(typeof define==='function'&&define.amd){define([],function(){return{Howler:Howler,Howl:Howl};});} -if(typeof exports!=='undefined'){exports.Howler=Howler;exports.Howl=Howl;} -if(typeof window!=='undefined'){window.HowlerGlobal=HowlerGlobal;window.Howler=Howler;window.Howl=Howl;window.Sound=Sound;}else if(typeof global!=='undefined'){global.HowlerGlobal=HowlerGlobal;global.Howler=Howler;global.Howl=Howl;global.Sound=Sound;}})(); \ No newline at end of file diff --git a/webmusic.css b/webmusic.css index 4b63880..652b821 100644 --- a/webmusic.css +++ b/webmusic.css @@ -1,47 +1,55 @@ body { - background-color: #161616; + background-color: #161616; } h2, h2 a { - font-family: 'Inconsolata', 'monospace'; - font-size: 11pt; - color: #afafaf; - margin-top: 6px; - margin-bottom: 2px; + font-family: 'Inconsolata', 'monospace'; + font-size: 11pt; + color: #afafaf; + margin-top: 6px; + margin-bottom: 2px; } #container, a { - font-family: 'Ubuntu Mono', 'monospace'; - font-size: 11pt; - color: #d8c18c; - text-decoration: none; - margin-top: 3px; - margin-bottom: 3px; + font-family: 'Ubuntu Mono', 'monospace'; + font-size: 11pt; + color: #d8c18c; + text-decoration: none; + margin-top: 3px; + margin-bottom: 3px; } -.playing { - color: #6b9969; +.playing, .active { + color: #6b9969; } .entry-muted { - color: #d88777; + color: #d88777; } .action { - font-size: 10pt; - color: #cc7851; + font-size: 10pt; + color: #cc7851; } .action-muted { - font-size: 10pt; - color: #e5e5e5; + font-size: 10pt; + color: #e5e5e5; } #container { - margin-left: 10%; - margin-right: 10%; + margin-left: 10%; + margin-right: 10%; } li { - list-style: none; + list-style: none; +} + +#state, #repeatButton, #continuousButton { + cursor: pointer; +} + +.selected { + color: #8cd8cd; } diff --git a/webmusic.js b/webmusic.js index 2864bcd..2d8a203 100644 --- a/webmusic.js +++ b/webmusic.js @@ -1,169 +1,262 @@ -let gstate = "idle"; -let repeat = false; -let continuelist = true; -let queue = []; -let total = 0; -let index = 0; +'use strict'; -let sound = new Howl({ - src: [''], - format: "mp3", - html5: true -}); +const audioPlayer = new Audio(); +let selectedItem = 0; +let playingItem = 0; +let playerState = 'idle'; +let continuous = true; +let repeat = false; +let total = 0; +let onlyDirs = true; -setInterval(function () { - updateState(); -}, 1000); +const handleKeyEvent = (event) => { + if (event.ctrlKey === true || event.altKey === true) return; + event.preventDefault(); + event.stopPropagation(); -window.onload = function () { - initState(); - updateState() + switch (event.key) { + case ' ': + case 'p': + if (onlyDirs !== false) return; + if (playerState == 'idle' && total !== 0) { + if (document.getElementById(playingItem).classList.contains('dir')) { + return nextTrack(); + } + + playSong(playingItem) + } else { + togglePlayback(); + } + break; + + case 'r': + toggleRepeat(); + break; + + case 'c': + toggleContinue(); + break; + + case 'ArrowUp': + selectPreviousItem(); + break; + + case 'ArrowDown': + selectNextItem(); + 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 'Enter': + document.getElementById(selectedItem).click() + break; + + case 'Escape': + document.getElementById('back').click(); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + audioPlayer.currentTime = audioPlayer.duration / 100 * (event.key * 10); + break; + } }; -window.onkeyup = function (event) { - if (event.key === " " || event.key === "p") { - if (gstate !== "idle") { - togglePlayback(); - } else { - playSong(queue[0]) - } - } - else if (event.key === "r") { - toggleRepeat(); - } - else if (event.key === "c") { - toggleContinue(); - } - else if (event.key === "ArrowUp") { - previousTrack(); - } - else if (event.key === "ArrowDown") { - nextTrack(); - } - else if (event.key === "ArrowLeft") { - if (sound.seek() < 10) { - sound.seek(0); - } else { - sound.seek(sound.seek()-10); - } - } - else if (event.key === "ArrowRight") { - sound.seek(sound.seek()+10); - } - else if (event.key === "Escape") { - document.getElementById("back").click(); - } -}; +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) -function togglePlayback() { - if (sound.playing()) - sound.pause(); - else - sound.play(); + audioPlayer.addEventListener('canplay', () => { + audioPlayer.play(); + }); + + audioPlayer.addEventListener('play', () => { + setPlayerState('playing'); + }); + + audioPlayer.addEventListener('pause', () => { + setPlayerState('paused'); + }); + + audioPlayer.addEventListener('error', () => { + setPlayerState('error loading track'); + }); + + audioPlayer.addEventListener('ended', () => { + setPlayerState('idle'); + nextTrack(); + }); + + audioPlayer.addEventListener('timeupdate', () => { + updatePlayerState(); + }); + + dirElements.forEach((element) => { + element.id = id++; + }); + + fileElements.forEach((element) => { + element.id = id++; + onlyDirs = false; + + element.addEventListener('click', (event) => { + event.preventDefault(); + event.stopPropagation(); + playSong(event.target.id); + }); + }); + + total = id; + updatePlayerState(); + updateButtonState(); } -function setState(state) { - gstate = state; - console.log("now in state: " + state); - updateState(); +const setPlayerState = (state) => { + playerState = state; + + console.log('now in state: ' + state); + updatePlayerState(); } +const updatePlayerState = () => { + let statestr = '[' + playerState; -function playSong(url) { - if (document.getElementsByClassName("playing").length > 0) - document.getElementsByClassName("playing")[0].classList.remove("playing"); - index = queue.indexOf(url); - sound.stop(); - sound.unload(); - sound = null; - delete sound; + if (!audioPlayer.paused) { + statestr += ' ' + formatTime(audioPlayer.currentTime) + '/' + formatTime(audioPlayer.duration); + } - sound = new Howl({ - src: [url], - html5: true - }); - - setState("loading"); - sound.play(); - sound.loop(repeat); - - document.querySelectorAll('[onclick="playSong(\''+url+'\')"]')[0].classList.add("playing"); - - sound.on("play", function () { - setState("playing"); - }); - sound.on("loaderror", function () { - setState("error loading track") - }); - sound.on("playerror", function () { - setState("error opening audio device") - }); - sound.on("end", function () { - setState("idle"); - nextTrack() - }); - sound.on("pause", function () { - setState("paused") - }); + statestr += ']'; + document.getElementById('state').innerHTML = statestr; } -function toggleRepeat() { - repeat = !repeat; - continuelist = !repeat; - sound.loop(repeat); - updateState(); +const updateButtonState = () => { + if (repeat !== false) { + document.getElementById('repeatButton').classList.add('active'); + } else { + document.getElementById('repeatButton').classList.remove('active'); + } + + if (continuous !== false) { + document.getElementById('continuousButton').classList.add('active'); + } else { + document.getElementById('continuousButton').classList.remove('active'); + } } -function toggleContinue() { - continuelist = !continuelist; - updateState(); +const playSong = (id) => { + const 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'); + } + + if (document.getElementsByClassName('selected').length > 0) { + document.getElementsByClassName('selected')[0].classList.remove('selected'); + } + + audioPlayer.pause() + + playingItem = element.id; + element.classList.add('playing'); + + audioPlayer.src = element.href; + + setPlayerState('loading'); + audioPlayer.load(); } -function updateState() { - document.getElementById("state").setAttribute('onclick', 'togglePlayback()'); - let statestr = "["; - statestr += gstate; - if (sound.playing()) - statestr += " " + formatTime(Math.round(sound.seek())) + "/" + formatTime(Math.round(sound.duration())); - - statestr += "]"; - document.getElementById("state").innerHTML = statestr; - let flags = "["; - if (repeat) - flags += 'R'; - else - flags += 'R'; - if (continuelist) - flags += 'C'; - else - flags += 'C'; - - document.getElementById("flags").innerHTML = flags + "]"; +const togglePlayback = () => { + if (audioPlayer.paused) { + audioPlayer.play(); + } else { + audioPlayer.pause(); + } } -function initState() { - total = queue.length; +const toggleRepeat = () => { + repeat = !repeat; + continuous = !repeat; + audioPlayer.loop = repeat; + updateButtonState(); } -function previousTrack() { - if (index-- === 0) - index = total-1; - if (continuelist) { - playSong(queue[index]) - } +const toggleContinue = () => { + continuous = !continuous; + updateButtonState(); } -function nextTrack() { - if (++index === total) - index = 0; - if (continuelist) { - playSong(queue[index]) - } +const previousTrack = () => { + if (!continuous) return; + if (playingItem-- === 0) playingItem = total-1; + + if (document.getElementById(playingItem).classList.contains('dir')) { + return previousTrack(); + } + + playSong(playingItem); } -function formatTime(secs) { - const minutes = Math.floor(secs / 60) || 0; - const seconds = (secs - minutes * 60) || 0; - return minutes + ':' + (seconds < 10 ? '0' : '') + seconds; +const nextTrack = () => { + if (!continuous) return; + if (++playingItem === total) playingItem = 0; + + if (document.getElementById(playingItem).classList.contains('dir')) { + return nextTrack(); + } + + playSong(playingItem); } + +const selectPreviousItem = () => { + if (selectedItem-- === 0) selectedItem = total-1; + updateSelectedItem(); +} + +const selectNextItem = () => { + if (++selectedItem === total) selectedItem = 0; + updateSelectedItem(); +} + +const updateSelectedItem = () => { + if (document.getElementsByClassName('selected').length > 0) { + document.getElementsByClassName('selected')[0].classList.remove('selected'); + } + + document.getElementById(selectedItem).classList.add('selected'); +} + +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);