keygenmusic.tk-mirror/js/main.js

26 lines
15 KiB
JavaScript

var urls={lib:'./kgm/lib.txt',lib_version:'./kgm/ver.txt',music_dir:'/kgm/',origin:window.location.origin},tabs=new Tabs('#tabs'),t_o,table=document.querySelector('#playlist table'),$scroller=$('.scroller'),player_container=document.getElementById('player'),play_btn=document.querySelector('#button'),prev_btn=document.querySelector('#button_prev'),next_btn=document.querySelector('#button_next'),song_info_container=document.getElementById('song_info'),song_info={track_number:song_info_container.querySelector('.track_number'),rg:song_info_container.querySelector('.rg'),dash:song_info_container.querySelector('.dash'),soft:song_info_container.querySelector('.soft'),heart:song_info_container.querySelector('.heart span'),direct_link:song_info_container.querySelector('.direct_link'),share_fb:song_info_container.querySelector('.share_fb a'),share_twitter:song_info_container.querySelector('.share_twitter a')},metadata_container=document.getElementById('metadata_info'),metadata={artist:metadata_container.querySelector('.rg'),title:metadata_container.querySelector('.soft'),message:metadata_container.querySelector('#message'),time:metadata_container.querySelector('.time')},info_bar_container=document.getElementById('info_bar'),info_bar={total_played:info_bar_container.querySelector('#total_played'),tracks_played:info_bar_container.querySelector('#tracks_played')},shuffle=document.getElementById('shuffle'),search_input=document.getElementById('search'),player=new ChiptuneJsPlayer(new ChiptuneJsConfig(1)),playList={song_lib:[],selected:[],current_playlist:[],current_playlist_name:'',track_num_in_cur_pl:0,favorites_playlist:[],xhrVersion:function(callback){var xhr=new XMLHttpRequest();xhr.open('GET',urls.lib_version,true);xhr.onload=function(e){callback(xhr.status===200&&xhr.responseText?xhr.responseText:null);};xhr.onerror=function(e){callback(null);};xhr.send();},xhrLib:function(callback){var xhr=new XMLHttpRequest();xhr.open('GET',urls.lib,true);xhr.onload=function(e){callback(xhr.status===200&&xhr.responseText?xhr.responseText:null);};xhr.onerror=function(e){callback(null);};xhr.send();},setLibPlayList:function(spl){playList.song_lib=spl;},shufflePlaylist:function(pl){for(var j,x,i=pl.length;i;j=Math.floor(Math.random()*i),x=pl[--i],pl[i]=pl[j],pl[j]=x);return pl;},setCurrentPlayList:function(shuffle){if(shuffle==='on'){playList.current_playlist=playList.shufflePlaylist(playList.selected.slice());}else{playList.current_playlist=playList.selected.slice();}},getCurrentSongPath:function(){return playList.current_playlist[playList.track_num_in_cur_pl].path;},nextSong:function(){if(playList.track_num_in_cur_pl>=playList.current_playlist.length-1){playList.track_num_in_cur_pl=0;}else{playList.track_num_in_cur_pl++;}
return playList.current_playlist[playList.track_num_in_cur_pl].path;},prevSong:function(){if(playList.track_num_in_cur_pl<=0){playList.track_num_in_cur_pl=playList.current_playlist.length-1;}else{playList.track_num_in_cur_pl--;}
return playList.current_playlist[playList.track_num_in_cur_pl].path;},getSongInfoByPath:function(path){var i,len=playList.song_lib.length;for(i=0;i<len;i++){if(playList.song_lib[i].path===path){return playList.song_lib[i];}}},isSongInCurrentPlaylist:function(path){var i,len=playList.current_playlist.length;for(i=0;i<len;i++){if(playList.current_playlist[i].path===path){return true;}}
return false;},moveToSongInCurrentPlayList:function(path){var i,len=playList.current_playlist.length;for(i=0;i<len;i++){if(playList.current_playlist[i].path===path){playList.track_num_in_cur_pl=i;break;}}},setSelected:function(val){var track_number=0,song_to_list;val=val.toLowerCase();function pushThis(song){song_to_list=$.extend({},song);song_to_list.n=++track_number;playList.selected.push(song_to_list);}
playList.selected=[];if(val===''){playList.selected=playList.song_lib.slice();}else{playList.song_lib.forEach(function(song){if(val==='my-fav'){if(playList.favorites_playlist.indexOf(song.path)!==-1){pushThis(song);}}else{if(song.path.toLowerCase().indexOf(val)!==-1||song.mdt.toLowerCase().indexOf(val)!==-1){pushThis(song);}}})}
return playList.selected;},getCurrentPlayListName:function(){return playList.current_playlist_name;},setCurrentPlayListName:function(name){playList.current_playlist_name=name;},setFavorites:function(favorites){playList.favorites_playlist=favorites;},toggleSongInFavorites:function(path){var is_fav=false,filtered=(function(){return playList.favorites_playlist.filter(function(fav_song){if(fav_song.toLowerCase()===path.toLowerCase()){is_fav=true;return false;}else{return true;}})})();if(!is_fav){filtered.push(path);}
playList.favorites_playlist=filtered;return playList.favorites_playlist;},isFavoriteSong:function(song_path){var is=false;playList.favorites_playlist.forEach(function(fav_song){if(fav_song.toLowerCase()===song_path.toLowerCase()){is=true;return true;}});return is;}},UI={track_html:null,removeSpinner:function(){document.querySelector('#loader').remove();},applyScrollBars:function(){$scroller.baron({scroller:'.scroller',bar:'.scroller__bar'});},renderPlaylist:function(playlist,list_name){var playlist_html='';playlist.forEach(function(song_info){playlist_html+='<tr data-path="'+song_info.path+'"><td class="track_number">'+song_info.n+'</td>'+
'<td class="track"><span class="rg"> '+song_info.rg+'</span>'+'<span class="dash"> </span>'+
'<span class="soft"> '+song_info.sn+'</span>'+
'<br><span class="mdt time">'+song_info.mdt+'</span>'+
'</td>'+
'<td title="Favorite" class="heart '+(playList.isFavoriteSong(song_info.path)?'favorite':'')+'"><span>&#10084;</span></td></tr>';});table.innerHTML=playlist_html;table.setAttribute('data-selected',list_name)},renderSongName:function(info){var heart_classes=song_info.heart.parentNode.classList,song_url=urls.origin+'/#track='+encodeURI(info.path.match(new RegExp(urls.music_dir+'(.+)'))[1]),s_soc=encodeURIComponent(urls.origin+'/#track='+encodeURI(info.path.match(new RegExp(urls.music_dir+'(.+)'))[1]));song_info_container.querySelector('tr').setAttribute('data-path',info.path);song_info.track_number.textContent=info.n+'. ';song_info.rg.textContent=info.rg;song_info.soft.textContent=info.sn;playList.isFavoriteSong(info.path)?heart_classes.add('favorite'):heart_classes.remove('favorite');song_info.direct_link.setAttribute('data-clipboard-text',song_url);song_info.share_twitter.setAttribute('href','http://twitter.com/intent/tweet?status='+s_soc);},renderMetadata:function(md){metadata.artist.textContent=md.artist?md.artist.replace(/\n+/gm,''):'';metadata.title.textContent=md.title?md.title.replace(/\n+/gm,''):'';metadata.message.setAttribute('title',md.message?md.message.replace(/"+/gm,'\''):'no message');metadata.time.textContent=md.duration?utils.durationToHuman(md.duration):'';},scrollToSongInPlaylist:function(path){var song_tr=table.querySelector('tr[data-path="'+path+'"]'),row_pos;if(song_tr){row_pos=$(song_tr).position();$scroller.scrollTop($scroller.scrollTop()+row_pos.top);}},highlightSongInPlaylist:function(path){var song_tr=table.querySelector('tr[data-path="'+path+'"]'),prev_song=table.querySelector('tr.now_playing');prev_song&&prev_song.classList.remove('now_playing');song_tr&&song_tr.classList.add('now_playing');},playPlayBtn:function(){play_btn.classList.add('playing');player_container.classList.add('playing');},togglePlayBtn:function(){play_btn.classList.toggle('playing');player_container.classList.toggle('playing');},getPlayBtnStatus:function(){return play_btn.classList.contains('playing')?'playing':'';},getShuffleBtnStatus:function(){return shuffle.checked?'on':'off';},getRenderedPlaylistName:function(){return table.getAttribute('data-selected');},renderTracksPlayed:function(num){info_bar.tracks_played.textContent=''+num;},renderTotalPlayed:function(time){info_bar.total_played.textContent=utils.msToHuman(time);},getPathForFavorite:function(fav_td_node){return fav_td_node.parentNode.getAttribute('data-path');},toggleFavorite:function(fav_td_node){var tr_node=fav_td_node.parentNode,path=tr_node.getAttribute('data-path');function toggleFavoriteInPlaylist(path){var song_tr=table.querySelector('tr[data-path="'+path+'"]');if(song_tr){if(UI.getRenderedPlaylistName()==='my-fav'){song_tr.remove();}else{song_tr.querySelector('.heart').classList.toggle('favorite');}}}
function toggleFavoriteInSongInfo(path){if(song_info_container.querySelector('tr').getAttribute('data-path')===path){song_info.heart.parentNode.classList.toggle('favorite');}}
if(tr_node.parentNode.parentNode.getAttribute('id')==='song_info'){fav_td_node.classList.toggle('favorite');toggleFavoriteInPlaylist(path);}else{if(UI.getRenderedPlaylistName()==='my-fav'){fav_td_node.parentNode.remove();}else{fav_td_node.classList.toggle('favorite');}
toggleFavoriteInSongInfo(path);}},},jsPlayer={playing:undefined,init:function(){if(player===undefined){player=new ChiptuneJsPlayer(new ChiptuneJsConfig(1));}
else{player.stop();}},loadFile:function(path,callback){jsPlayer.init();player.load('.'+path,function(buffer){var meta;player.play(buffer);jsPlayer.playing=path;meta=player.metadata();meta.duration=player.duration();callback(meta);});},togglePause:function(){player.togglePause();}},user={getFavorites:function(callback){model.read('favorites',function(favorites){callback(favorites);});},setFavorites:function(favorites){model.write('favorites',favorites);},getLibVersion:function(callback){model.read('lib_version',function(ver){callback(ver);});},setLibVersion:function(ver){model.write('lib_version',ver);},getLibList:function(callback){model.read('lib_list',function(lib_list){callback(lib_list);});},setLibList:function(lib_list){model.write('lib_list',lib_list);},getTotalPlayed:function(callback){model.read('total_played',function(played){callback(played);})},addToTotalPlayed:function(time,callback){user.getTotalPlayed(function(total_played){var new_total_played=parseInt(total_played,10)+time;model.write('total_played',new_total_played);callback&&callback(new_total_played);});},getTracksPlayed:function(callback){model.read('tracks_played',function(played){callback(played);});},addToTracksPlayed:function(callback){user.getTracksPlayed(function(num){var new_count=parseInt(num,10)+1;model.write('tracks_played',new_count);callback&&callback(new_count)})}},watcher={tick_start:undefined,client:undefined,updateSongInfo:function(song_path){UI.renderSongName(playList.getSongInfoByPath(song_path));},handleTotalPlayed:function(){var now=Date.now(),played;if(watcher.tick_start!==undefined){played=now-watcher.tick_start;user.addToTotalPlayed(played,function(time){UI.renderTotalPlayed(time);watcher.tick_start=UI.getPlayBtnStatus()!=='playing'?undefined:now;});}else{user.getTotalPlayed(function(time){UI.renderTotalPlayed(time);watcher.tick_start=UI.getPlayBtnStatus()!=='playing'?undefined:now;});}},toggleFavorite:function(fav_td_node){UI.toggleFavorite(fav_td_node);user.setFavorites(playList.toggleSongInFavorites(UI.getPathForFavorite(fav_td_node)));},loadSong:function(song){if(t_o){clearTimeout(t_o);}
t_o=window.setTimeout(function(){jsPlayer.loadFile(song,function(metadata){clearTimeout(t_o);watcher.handleTotalPlayed();UI.renderMetadata(metadata);});},200);},play:function(song){UI.playPlayBtn();UI.highlightSongInPlaylist(song);UI.scrollToSongInPlaylist(song);watcher.updateSongInfo(song);watcher.loadSong(song);},search:function(val){UI.renderPlaylist(playList.setSelected(val),val);},setHandlers:function(){song_info.direct_link.addEventListener('click',function(){utils.copyTextToClipboard(song_info.direct_link.getAttribute('data-clipboard-text'));var div=document.createElement('div'),rec=song_info.direct_link.getBoundingClientRect();div.className='copied_to_cb';div.style.top=(40+parseInt(rec.top,10))+'px';div.style.left=(parseInt(rec.left,10)-90)+'px';div.innerHTML='Link copied to clipboard';document.body.appendChild(div);setTimeout(function(){div.style.opacity=0;},50);setTimeout(function(){div.remove();},3000);});table.addEventListener('click',function(event){var target=event.target,path,rendered_pl_name=UI.getRenderedPlaylistName();function favorite(){if(target.classList.contains('heart')){event.stopPropagation();watcher.toggleFavorite(target);return true;}
return false;}
while(target!=this){if(favorite()){return false;}
if(target.tagName==='TR'){path=target.getAttribute('data-path');UI.highlightSongInPlaylist(path);watcher.updateSongInfo(path);watcher.handleTotalPlayed();jsPlayer.loadFile(path,function(metadata){if(playList.getCurrentPlayListName()!==rendered_pl_name){playList.setCurrentPlayListName(rendered_pl_name);playList.setCurrentPlayList(UI.getShuffleBtnStatus());}
playList.moveToSongInCurrentPlayList(path);UI.playPlayBtn();UI.renderMetadata(metadata);});}
target=target.parentNode;}});song_info.heart.addEventListener('click',function(e){watcher.toggleFavorite(e.target.parentNode);});document.querySelector('#playlist_bar select').addEventListener('change',function(e){watcher.search(this.options[this.selectedIndex].value);search_input.value='';});shuffle.addEventListener('change',function(){playList.setCurrentPlayList(UI.getShuffleBtnStatus());playList.moveToSongInCurrentPlayList(jsPlayer.playing);});search_input.addEventListener('keyup',function(e){if(e.keyCode===13||e.target.value===''){watcher.search(e.target.value);}});play_btn.addEventListener('click',function(){UI.togglePlayBtn();if(player.currentPlayingNode){watcher.handleTotalPlayed();jsPlayer.togglePause();}else{watcher.play(playList.getCurrentSongPath());}});prev_btn.addEventListener('click',function(){watcher.play(playList.prevSong());});next_btn.addEventListener('click',function(){watcher.play(playList.nextSong());});player.onEnded(function(){user.addToTracksPlayed(function(num){UI.renderTracksPlayed(num);});watcher.play(playList.nextSong());});player.onError(function(e){watcher.play(playList.nextSong());});},go:function(){function start(){var song_on_start;function getSongToPlay(){var hash=window.location.hash,path;if(hash&&hash.indexOf('#track=')===0){path=urls.music_dir+decodeURI(hash.match(/#track=([\s\S]*)$/)[1]);}
if(path&&playList.isSongInCurrentPlaylist(path)){playList.moveToSongInCurrentPlayList(path);watcher.play(path);window.location.hash='';return path;}else{window.location.hash='';return playList.getCurrentSongPath();}}
user.getFavorites(function(favorites){playList.setFavorites(favorites);UI.renderPlaylist(playList.song_lib,'');UI.applyScrollBars();playList.setSelected('');});playList.setCurrentPlayList(UI.getShuffleBtnStatus());song_on_start=getSongToPlay();UI.renderSongName(playList.getSongInfoByPath(song_on_start));jsPlayer.playing=song_on_start;UI.removeSpinner();watcher.handleTotalPlayed();user.getTracksPlayed(function(num){UI.renderTracksPlayed(num);});}
playList.xhrVersion(function(ver){user.getLibVersion(function(stored_ver){if(stored_ver==ver){user.getLibList(function(lib_list){playList.setLibPlayList(lib_list);start();})}else{playList.xhrLib(function(lib_list){if(lib_list){user.setLibVersion(ver);user.setLibList(lib_list);playList.setLibPlayList(JSON.parse(lib_list));start();}})}});});this.setHandlers();}};var gfx=new Graphix(player);updateGUI();watcher.go();