From 62304d40b13e153e6625e0a2f5b9eb00c569aba1 Mon Sep 17 00:00:00 2001 From: Knah Tsaeb Date: Fri, 25 Sep 2015 11:50:02 +0200 Subject: [PATCH] [add] id3 parser in JS --- id3-minimiezd.js | 25 +++ index.html | 65 ++++--- player.css | 3 +- player.js | 463 ++++++++++++++++++++++++++--------------------- 4 files changed, 323 insertions(+), 233 deletions(-) create mode 100644 id3-minimiezd.js diff --git a/id3-minimiezd.js b/id3-minimiezd.js new file mode 100644 index 0000000..5fbe891 --- /dev/null +++ b/id3-minimiezd.js @@ -0,0 +1,25 @@ +function y(h,g,b){var c=g||0,d=0;"string"==typeof h?(d=b||h.length,this.a=function(a){return h.charCodeAt(a+c)&255}):"unknown"==typeof h&&(d=b||IEBinary_getLength(h),this.a=function(a){return IEBinary_getByteAt(h,a+c)});this.l=function(a,f){for(var v=Array(f),b=0;ba&&(a+=65536);return a};this.i=function(a){var f=this.a(a),b=this.a(a+1),d= +this.a(a+2);a=this.a(a+3);f=(((f<<8)+b<<8)+d<<8)+a;0>f&&(f+=4294967296);return f};this.o=function(a){var f=this.a(a),b=this.a(a+1);a=this.a(a+2);f=((f<<8)+b<<8)+a;0>f&&(f+=16777216);return f};this.c=function(a,f){for(var b=[],d=a,e=0;dg||224<=g?b[m]=String.fromCharCode(k):(g=(a[e+c]<<8)+a[e+d],e+=2,b[m]=String.fromCharCode(k,g))}a=new String(b.join(""));a.g=e;break;case "utf-8":l=0;e=Math.min(e||a.length,a.length);239==a[0]&&187==a[1]&&191==a[2]&&(l=3);c=[];for(d=0;lb?c[d]=String.fromCharCode(b):194<=b&&224>b?(m=a[l++],c[d]=String.fromCharCode(((b&31)<<6)+(m&63))):224<=b&&240> +b?(m=a[l++],k=a[l++],c[d]=String.fromCharCode(((b&255)<<12)+((m&63)<<6)+(k&63))):240<=b&&245>b&&(m=a[l++],k=a[l++],g=a[l++],b=((b&7)<<18)+((m&63)<<12)+((k&63)<<6)+(g&63)-65536,c[d]=String.fromCharCode((b>>10)+55296,(b&1023)+56320));a=new String(c.join(""));a.g=l;break;default:e=[];c=c||a.length;for(l=0;lb&&(b=0);a>=blockTotal&&(a=blockTotal-1);return[b,a]}function h(f,g){for(;n[f[0]];)if(f[0]++,f[0]> +f[1]){g&&g();return}for(;n[f[1]];)if(f[1]--,f[0]>f[1]){g&&g();return}var m=[f[0]*e,(f[1]+1)*e-1];c(a,function(a){parseInt(a.getResponseHeader("Content-Length"),10)==d&&(f[0]=0,f[1]=blockTotal-1,m[0]=0,m[1]=d-1);a={data:a.N||a.responseText,offset:m[0]};for(var b=f[0];b<=f[1];b++)n[b]=a;g&&g()},b,m,k,!!g)}var k,r=new y("",0,d),n=[];e=e||2048;f="undefined"===typeof f?0:f;blockTotal=~~((d-1)/e)+1;for(var q in r)r.hasOwnProperty(q)&&"function"===typeof r[q]&&(this[q]=r[q]);this.a=function(a){var b;h(g([a, +a]));b=n[~~(a/e)];if("string"==typeof b.data)return b.data.charCodeAt(a-b.offset)&255;if("unknown"==typeof b.data)return IEBinary_getByteAt(b.data,a-b.offset)};this.f=function(a,b){h(g(a),b)}}(function(){a(h,function(a){a=parseInt(a.getResponseHeader("Content-Length"),10)||-1;g(new f(h,a))},b)})()};(function(h){h.FileAPIReader=function(g,b){return function(c,d){var a=b||new FileReader;a.onload=function(a){d(new y(a.target.result))};a.readAsBinaryString(g)}}})(this);(function(h){var g=h.p={},b={},c=[0,7];g.t=function(d){delete b[d]};g.s=function(){b={}};g.B=function(d,a,f){f=f||{};(f.dataReader||C)(d,function(g){g.f(c,function(){var c="ftypM4A"==g.c(4,7)?ID4:"ID3"==g.c(0,3)?ID3v2:ID3v1;c.m(g,function(){var e=f.tags,h=c.n(g,e),e=b[d]||{},m;for(m in h)h.hasOwnProperty(m)&&(e[m]=h[m]);b[d]=e;a&&a()})})},f.onError)};g.v=function(d){if(!b[d])return null;var a={},c;for(c in b[d])b[d].hasOwnProperty(c)&&(a[c]=b[d][c]);return a};g.A=function(d,a){return b[d]?b[d][a]: +null};h.ID3=h.p;g.loadTags=g.B;g.getAllTags=g.v;g.getTag=g.A;g.clearTags=g.t;g.clearAll=g.s})(this);(function(h){var g=h.q={},b="Blues;Classic Rock;Country;Dance;Disco;Funk;Grunge;Hip-Hop;Jazz;Metal;New Age;Oldies;Other;Pop;R&B;Rap;Reggae;Rock;Techno;Industrial;Alternative;Ska;Death Metal;Pranks;Soundtrack;Euro-Techno;Ambient;Trip-Hop;Vocal;Jazz+Funk;Fusion;Trance;Classical;Instrumental;Acid;House;Game;Sound Clip;Gospel;Noise;AlternRock;Bass;Soul;Punk;Space;Meditative;Instrumental Pop;Instrumental Rock;Ethnic;Gothic;Darkwave;Techno-Industrial;Electronic;Pop-Folk;Eurodance;Dream;Southern Rock;Comedy;Cult;Gangsta;Top 40;Christian Rap;Pop/Funk;Jungle;Native American;Cabaret;New Wave;Psychadelic;Rave;Showtunes;Trailer;Lo-Fi;Tribal;Acid Punk;Acid Jazz;Polka;Retro;Musical;Rock & Roll;Hard Rock;Folk;Folk-Rock;National Folk;Swing;Fast Fusion;Bebob;Latin;Revival;Celtic;Bluegrass;Avantgarde;Gothic Rock;Progressive Rock;Psychedelic Rock;Symphonic Rock;Slow Rock;Big Band;Chorus;Easy Listening;Acoustic;Humour;Speech;Chanson;Opera;Chamber Music;Sonata;Symphony;Booty Bass;Primus;Porn Groove;Satire;Slow Jam;Club;Tango;Samba;Folklore;Ballad;Power Ballad;Rhythmic Soul;Freestyle;Duet;Punk Rock;Drum Solo;Acapella;Euro-House;Dance Hall".split(";"); +g.m=function(b,d){var a=b.h();b.f([a-128-1,a],d)};g.n=function(c){var d=c.h()-128;if("TAG"==c.c(d,3)){var a=c.c(d+3,30).replace(/\0/g,""),f=c.c(d+33,30).replace(/\0/g,""),g=c.c(d+63,30).replace(/\0/g,""),l=c.c(d+93,4).replace(/\0/g,"");if(0==c.a(d+97+28))var e=c.c(d+97,28).replace(/\0/g,""),h=c.a(d+97+29);else e="",h=0;c=c.a(d+97+30);return{version:"1.1",title:a,artist:f,album:g,year:l,comment:e,track:h,genre:255>c?b[c]:""}}return{}};h.ID3v1=h.q})(this);(function(h){function g(a,b){var d=b.a(a),c=b.a(a+1),e=b.a(a+2);return b.a(a+3)&127|(e&127)<<7|(c&127)<<14|(d&127)<<21}var b=h.D={};b.b={};b.frames={BUF:"Recommended buffer size",CNT:"Play counter",COM:"Comments",CRA:"Audio encryption",CRM:"Encrypted meta frame",ETC:"Event timing codes",EQU:"Equalization",GEO:"General encapsulated object",IPL:"Involved people list",LNK:"Linked information",MCI:"Music CD Identifier",MLL:"MPEG location lookup table",PIC:"Attached picture",POP:"Popularimeter",REV:"Reverb", +RVA:"Relative volume adjustment",SLT:"Synchronized lyric/text",STC:"Synced tempo codes",TAL:"Album/Movie/Show title",TBP:"BPM (Beats Per Minute)",TCM:"Composer",TCO:"Content type",TCR:"Copyright message",TDA:"Date",TDY:"Playlist delay",TEN:"Encoded by",TFT:"File type",TIM:"Time",TKE:"Initial key",TLA:"Language(s)",TLE:"Length",TMT:"Media type",TOA:"Original artist(s)/performer(s)",TOF:"Original filename",TOL:"Original Lyricist(s)/text writer(s)",TOR:"Original release year",TOT:"Original album/Movie/Show title", +TP1:"Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group",TP2:"Band/Orchestra/Accompaniment",TP3:"Conductor/Performer refinement",TP4:"Interpreted, remixed, or otherwise modified by",TPA:"Part of a set",TPB:"Publisher",TRC:"ISRC (International Standard Recording Code)",TRD:"Recording dates",TRK:"Track number/Position in set",TSI:"Size",TSS:"Software/hardware and settings used for encoding",TT1:"Content group description",TT2:"Title/Songname/Content description",TT3:"Subtitle/Description refinement", +TXT:"Lyricist/text writer",TXX:"User defined text information frame",TYE:"Year",UFI:"Unique file identifier",ULT:"Unsychronized lyric/text transcription",WAF:"Official audio file webpage",WAR:"Official artist/performer webpage",WAS:"Official audio source webpage",WCM:"Commercial information",WCP:"Copyright/Legal information",WPB:"Publishers official webpage",WXX:"User defined URL link frame",AENC:"Audio encryption",APIC:"Attached picture",COMM:"Comments",COMR:"Commercial frame",ENCR:"Encryption method registration", +EQUA:"Equalization",ETCO:"Event timing codes",GEOB:"General encapsulated object",GRID:"Group identification registration",IPLS:"Involved people list",LINK:"Linked information",MCDI:"Music CD identifier",MLLT:"MPEG location lookup table",OWNE:"Ownership frame",PRIV:"Private frame",PCNT:"Play counter",POPM:"Popularimeter",POSS:"Position synchronisation frame",RBUF:"Recommended buffer size",RVAD:"Relative volume adjustment",RVRB:"Reverb",SYLT:"Synchronized lyric/text",SYTC:"Synchronized tempo codes", +TALB:"Album/Movie/Show title",TBPM:"BPM (beats per minute)",TCOM:"Composer",TCON:"Content type",TCOP:"Copyright message",TDAT:"Date",TDLY:"Playlist delay",TENC:"Encoded by",TEXT:"Lyricist/Text writer",TFLT:"File type",TIME:"Time",TIT1:"Content group description",TIT2:"Title/songname/content description",TIT3:"Subtitle/Description refinement",TKEY:"Initial key",TLAN:"Language(s)",TLEN:"Length",TMED:"Media type",TOAL:"Original album/movie/show title",TOFN:"Original filename",TOLY:"Original lyricist(s)/text writer(s)", +TOPE:"Original artist(s)/performer(s)",TORY:"Original release year",TOWN:"File owner/licensee",TPE1:"Lead performer(s)/Soloist(s)",TPE2:"Band/orchestra/accompaniment",TPE3:"Conductor/performer refinement",TPE4:"Interpreted, remixed, or otherwise modified by",TPOS:"Part of a set",TPUB:"Publisher",TRCK:"Track number/Position in set",TRDA:"Recording dates",TRSN:"Internet radio station name",TRSO:"Internet radio station owner",TSIZ:"Size",TSRC:"ISRC (international standard recording code)",TSSE:"Software/Hardware and settings used for encoding", +TYER:"Year",TXXX:"User defined text information frame",UFID:"Unique file identifier",USER:"Terms of use",USLT:"Unsychronized lyric/text transcription",WCOM:"Commercial information",WCOP:"Copyright/Legal information",WOAF:"Official audio file webpage",WOAR:"Official artist/performer webpage",WOAS:"Official audio source webpage",WORS:"Official internet radio station homepage",WPAY:"Payment",WPUB:"Publishers official webpage",WXXX:"User defined URL link frame"};var c={title:["TIT2","TT2"],artist:["TPE1", +"TP1"],album:["TALB","TAL"],year:["TYER","TYE"],comment:["COMM","COM"],track:["TRCK","TRK"],genre:["TCON","TCO"],picture:["APIC","PIC"],lyrics:["USLT","ULT"]},d=["title","artist","album","track"];b.m=function(a,b){a.f([0,g(6,a)],b)};b.n=function(a,f){var h=0,l=a.a(h+3);if(42.4"};var e=a.a(h+4),t=a.d(h+5,7),m=a.d(h+5,6),u=a.d(h+5,5),k=g(h+6,a),h=h+10;if(m)var r=a.i(h),h=h+(r+4);var l={version:"2."+l+"."+e,major:l,revision:e,flags:{unsynchronisation:t,extended_header:m,experimental_indicator:u}, +size:k},n;if(t)n={};else{for(var k=k-10,t=a,e=f,m={},u=l.major,r=[],q=0,p;p=(e||d)[q];q++)r=r.concat(c[p]||[p]);for(e=r;he.indexOf(n)||(2 - - - - Music Player - - - - - - -
- -
-

-
- -
- - -
-

-
- -

-
- + + + + Music Player + + + + + + + +
+ +
+

+

+ +

+

+ +

+
+ + +
+ + + + +
+

+
+ +
+
+
+ diff --git a/player.css b/player.css index eed3aa1..f706255 100644 --- a/player.css +++ b/player.css @@ -12,6 +12,7 @@ body { font-style: normal; text-align: center; } + body > div { border: 1px solid white; border-radius: 5px; @@ -44,7 +45,7 @@ body > div { } #player #infos { align-self: auto; - flex: 1 1 auto; + flex: 1 1 0; order: 0; } #player #title { diff --git a/player.js b/player.js index 0e35442..a614eac 100644 --- a/player.js +++ b/player.js @@ -1,215 +1,266 @@ "use strict"; -var music=Array(), - track,audio,pic,title,shuffle,repeat,err,playlist,offset; -function getId(id){ - return document.getElementById(id); +var music = Array(), + track, + audio, + pic, + title, + shuffle, + repeat, + err, + playlist, + offset; +function getId(id) { + return document.getElementById(id); } -function randInt(min,max){ - var rand=Math.round(Math.random()*(max-min+1)+min); - if(rand==max+1){ - return min; - } - return rand; + +function randInt(min, max) { + var rand = Math.round(Math.random() * (max - min + 1) + min); + if (rand == max + 1) { + return min; + } + return rand; } -function sendEvt(element,event){ - var evt = document.createEvent("HTMLEvents"); - evt.initEvent(event, true, true ); - return !element.dispatchEvent(evt); + +function sendEvt(element, event) { + var evt = document.createEvent("HTMLEvents"); + evt.initEvent(event, true, true); + return !element.dispatchEvent(evt); } -function extToMime(ext){ - switch(ext){ - case "mp3":return "audio/mpeg"; - case "ogg":return "audio/ogg"; - case "aac":return "audio/aac"; - case "wav":return "audio/wave"; - case "webm":return "audio/webm"; - default: "audio/"+ext; - } + +function extToMime(ext) { + switch(ext) { + case "mp3": + return "audio/mpeg"; + case "ogg": + return "audio/ogg"; + case "aac": + return "audio/aac"; + case "wav": + return "audio/wave"; + case "webm": + return "audio/webm"; + default: + "audio/" + ext; + } } -function wait4It(fn){// Dirty trick - try{ - fn(); - } - catch(e){ - setTimeout(function(){ - wait4It(fn); - },7); - } + +function wait4It(fn) {// Dirty trick + try { + fn(); + } catch(e) { + setTimeout(function() { + wait4It(fn); + }, 7); + } } -function populateList(arr,e,dir){ - var li,i,x,cover; - for(i in arr){ - if(i!="/"){ - li=document.createElement('li'); - li.className="folder"; - li.textContent=i; - e.appendChild(li); - li.addEventListener('click',function(event){ - event.stopPropagation(); - if(this.className.indexOf("open")==-1){ - this.className="open "+this.className; - } - else{ - this.className=this.className.substr(5); - } - },false); - li.appendChild(document.createElement('ul')) - populateList(arr[i],li.childNodes[1],dir+i+'/'); - } - else{ - cover=false; - for(x in arr[i]){ - if(arr[i][x].slice(0,arr[i][x].lastIndexOf('.')).toLowerCase()=="cover"){ - cover=arr[i][x]; - arr[i].splice(x,1); - break; - } - } - for(x in arr[i]){ - li=document.createElement('li'); - li.id=music.length; - li.className="song"; - li.textContent=arr[i][x].substr(0,arr[i][x].lastIndexOf('.')); - li.setAttribute('file',dir+arr[i][x]); - li.setAttribute('cover',cover?dir+cover:'/icons/sound2.png'); - li.addEventListener('click',function(event){ - event.stopPropagation(); - var file=this.getAttribute('file'), - cover=this.getAttribute('cover'), - s=document.createElement('source'), - mime=extToMime(file.substr(-3)), - last=music[track]; - if(last.className.indexOf('playing')>-1){ - while(last.id!='playlist'){ - last.className=last.className.slice(0,-8); - last=last.parentNode.parentNode; - } - } - pic.src=cover; - title.textContent=this.textContent; - if(!audio.canPlayType(mime)){ - err.textContent="This browser does not support "+mime.substr(mime.indexOf('/')+1).toUpperCase()+" audio." - err.className='open'; - } - else{ - err.removeAttribute('class'); - } - s.type=mime; - s.src=file; - audio.appendChild(s); - if(audio.childNodes.length>1){ - audio.removeChild(audio.childNodes[0]); - } - audio.load(); - audio.play(); - track=parseInt(this.id); - last=music[track]; - while(last.id!='playlist'){ - last.className+=' playing'; - last=last.parentNode.parentNode; - } - },false); - e.appendChild(li); - music.push(li); - } - } - } + +function populateList(arr, e, dir) { + var li, + i, + x, + cover; + for (i in arr) { + if (i != "/") { + li = document.createElement('li'); + li.className = "folder"; + li.textContent = i; + e.appendChild(li); + li.addEventListener('click', function(event) { + event.stopPropagation(); + if (this.className.indexOf("open") == -1) { + this.className = "open " + this.className; + } else { + this.className = this.className.substr(5); + } + }, false); + li.appendChild(document.createElement('ul')) + populateList(arr[i], li.childNodes[1], dir + i + '/'); + } else { + cover = false; + for (x in arr[i]) { + if (arr[i][x].slice(0, arr[i][x].lastIndexOf('.')).toLowerCase() == "cover") { + cover = arr[i][x]; + arr[i].splice(x, 1); + break; + } + } + for (x in arr[i]) { + li = document.createElement('li'); + li.id = music.length; + li.className = "song"; + li.textContent = arr[i][x].substr(0, arr[i][x].lastIndexOf('.')); + li.setAttribute('file', dir + arr[i][x]); + li.setAttribute('cover', cover ? dir + cover : '/icons/sound2.png'); + li.addEventListener('click', function(event) { + event.stopPropagation(); + var file = this.getAttribute('file'), + cover = this.getAttribute('cover'), + s = document.createElement('source'), + mime = extToMime(file.substr(-3)), + last = music[track]; + if (last.className.indexOf('playing') > -1) { + while (last.id != 'playlist') { + last.className = last.className.slice(0, -8); + last = last.parentNode.parentNode; + } + } + pic.src = cover; + title.textContent = this.textContent; + if (!audio.canPlayType(mime)) { + err.textContent = "This browser does not support " + mime.substr(mime.indexOf('/') + 1).toUpperCase() + " audio." + err.className = 'open'; + } else { + err.removeAttribute('class'); + } + s.type = mime; + s.src = file; + audio.appendChild(s); + if (audio.childNodes.length > 1) { + audio.removeChild(audio.childNodes[0]); + } + audio.load(); + audio.play(); + track = parseInt(this.id); + if (mime == 'audio/mpeg' || mime == 'audio/aac') { + ID3.loadTags(file, function() { + var tags = ID3.getAllTags(file); + document.getElementById("artist").textContent = "Artist : " + tags.artist || ""; + document.getElementById("album").textContent = "Album : " + tags.album || ""; + }); + } + last = music[track]; + while (last.id != 'playlist') { + last.className += ' playing'; + last = last.parentNode.parentNode; + } + }, false); + e.appendChild(li); + music.push(li); + } + } + } } -function init(){ - var ul=document.createElement('ul'), - config=localStorage.getItem("config"); - audio=getId('audio'); - title=getId('title'); - pic=getId('cover'); - shuffle=getId('shuffle'); - repeat=getId('repeat'); - err=getId('error'); - offset=getId('player').offsetHeight+32; - playlist=getId('playlist'); - playlist.appendChild(ul); - sendEvt(window,'resize'); - populateList(library['music'],ul,library['path']); - config=config!=null?JSON.parse(config):{// Default player settings - "volume":.25, - "track":0, - "state":false, - "time":0, - "shuffle":true, - "repeat":false - }; - audio.addEventListener("ended",function(){ - if(repeat.checked){ - audio.currentTime=0; - return audio.play(); - } - var next=track; - if(shuffle.checked){ - next=randInt(0,music.length-1); - } - else if(track+1 < music.length){ - next++; - } - else{ - next=0; - } - sendEvt(music[next],'click'); - },false); - getId('next').addEventListener("click",function(){ - if(track==music.length-1){ - track=-1; - } - sendEvt(music[track+1],'click'); - },false); - getId('back').addEventListener("click",function(){ - if(track==0){ - track=music.length; - } - sendEvt(music[track-1],'click'); - },false); - shuffle.checked=config["shuffle"]; - repeat.checked=config["repeat"]; - track=config["track"]; - if(config['time']==0&&track==0){ - sendEvt(audio,'ended'); - } - else{ - sendEvt(music[track],'click'); - audio.pause(); - wait4It(function(){ - audio.currentTime=config["time"]; - if(config["state"]===false){ - audio.play(); - } - }); - } - audio.volume=config["volume"]; - window.onunload=function(){ - if( isNaN(track) || isNaN(audio.currentTime) || isNaN(audio.volume) ){ - return; - } - localStorage.setItem("config",JSON.stringify({ - "volume":audio.volume, - "track":track, - "state":audio.paused===true, - "time":audio.currentTime, - "shuffle":shuffle.checked===true, - "repeat":repeat.checked===true - })); - } - document.addEventListener('keyup',function(event){// keyboard shortcuts - switch(event.which){ - case 32:audio[audio.paused?'play':'pause']();return;// spacebar - case 107:audio.volume=audio.volume+.1>1?1:audio.volume+.1;return;// + (num pad) - case 109:audio.volume=audio.volume-.1<0?0:audio.volume-.1;return;// - (num pad) - case 37:getId('back').click();return;// left arrow - case 39:getId('next').click();return;// right arrow - case 38:audio.currentTime+=5;return;// up arrow - case 40:audio.currentTime-=5;return;// down arrow - case 83:shuffle.checked=!shuffle.checked;return;// s - case 82:repeat.checked=!repeat.checked;return;// r - } - },false); + +function init() { + var ul = document.createElement('ul'), + config = localStorage.getItem("config"); + audio = getId('audio'); + title = getId('title'); + pic = getId('cover'); + shuffle = getId('shuffle'); + repeat = getId('repeat'); + err = getId('error'); + offset = getId('player').offsetHeight + 32; + playlist = getId('playlist'); + playlist.appendChild(ul); + sendEvt(window, 'resize'); + populateList(library['music'], ul, library['path']); + config = config != null ? JSON.parse(config) : {// Default player settings + "volume" : .25, + "track" : 0, + "state" : false, + "time" : 0, + "shuffle" : true, + "repeat" : false + }; + audio.addEventListener("ended", function() { + if (repeat.checked) { + audio.currentTime = 0; + return audio.play(); + } + var next = track; + if (shuffle.checked) { + next = randInt(0, music.length - 1); + } else if (track + 1 < music.length) { + next++; + } else { + next = 0; + } + sendEvt(music[next], 'click'); + }, false); + getId('next').addEventListener("click", function() { + if (track == music.length - 1) { + track = -1; + } + sendEvt(music[track + 1], 'click'); + }, false); + getId('back').addEventListener("click", function() { + if (track == 0) { + track = music.length; + } + sendEvt(music[track - 1], 'click'); + }, false); + shuffle.checked = config["shuffle"]; + repeat.checked = config["repeat"]; + track = config["track"]; + if (config['time'] == 0 && track == 0) { + sendEvt(audio, 'ended'); + } else { + sendEvt(music[track], 'click'); + audio.pause(); + wait4It(function() { + audio.currentTime = config["time"]; + if (config["state"] === false) { + audio.play(); + } + }); + } + audio.volume = config["volume"]; + window.onunload = function() { + if (isNaN(track) || isNaN(audio.currentTime) || isNaN(audio.volume)) { + return; + } + localStorage.setItem("config", JSON.stringify({ + "volume" : audio.volume, + "track" : track, + "state" : audio.paused === true, + "time" : audio.currentTime, + "shuffle" : shuffle.checked === true, + "repeat" : repeat.checked === true + })); + } + document.addEventListener('keyup', function(event) {// keyboard shortcuts + switch(event.which) { + case 32: + audio[audio.paused?'play':'pause'](); + return; + // spacebar + case 107: + audio.volume = audio.volume + .1 > 1 ? 1 : audio.volume + .1; + return; + // + (num pad) + case 109: + audio.volume = audio.volume - .1 < 0 ? 0 : audio.volume - .1; + return; + // - (num pad) + case 37: + getId('back').click(); + return; + // left arrow + case 39: + getId('next').click(); + return; + // right arrow + case 38: + audio.currentTime += 5; + return; + // up arrow + case 40: + audio.currentTime -= 5; + return; + // down arrow + case 83: + shuffle.checked = !shuffle.checked; + return; + // s + case 82: + repeat.checked = !repeat.checked; + return; + // r + } + }, false); } -window.onresize=function(){ - playlist.style.maxHeight=window.innerHeight-offset+'px'; + +window.onresize = function() { + playlist.style.maxHeight = window.innerHeight - offset + 'px'; }