diff options
Diffstat (limited to 'apps/media/js')
-rw-r--r-- | apps/media/js/collection.js | 126 | ||||
-rw-r--r-- | apps/media/js/music.js | 91 | ||||
-rw-r--r-- | apps/media/js/player.js | 39 | ||||
-rw-r--r-- | apps/media/js/playlist.js | 142 |
4 files changed, 292 insertions, 106 deletions
diff --git a/apps/media/js/collection.js b/apps/media/js/collection.js new file mode 100644 index 00000000000..0a6e0e4eb3f --- /dev/null +++ b/apps/media/js/collection.js @@ -0,0 +1,126 @@ +Collection={ + artists:[], + loaded:false, + loading:false, + loadedListeners:[], + load:function(ready){ + if(ready){ + Collection.loadedListeners.push(ready); + } + if(!Collection.loading){ + Collection.loading=true; + $.ajax({ + url: OC.linkTo('media','ajax/api.php')+'?action=get_collection', + dataType: 'json', + success: function(collection){ + Collection.artists=collection; + + //set the album and artist fieds for the songs + for(var i=0;i<collection.length;i++){ + var artist=collection[i]; + for(var j=0;j<artist.albums.length;j++){ + var album=artist.albums[j] + for(var w=0;w<album.songs.length;w++){ + album.songs[w].album_name=album.album_name; + album.songs[w].artist_name=artist.artist_name; + album.songs[w].artist_name=artist.artist_name; + } + } + } + + Collection.loaded=true; + Collection.loading=false; + for(var i=0;i<Collection.loadedListeners.length;i++){ + Collection.loadedListeners[i](); + } + + } + }); + } + }, + display:function(){ + if(Collection.parent){ + Collection.parent.show(); + } + if(!Collection.loaded){ + Collection.load(Collection.display) + }else{ + if(Collection.parent){ + Collection.parent.children('li.artist').remove(); + var template=Collection.parent.children('li.template'); + for(var i=0;i<Collection.artists.length;i++){ + var artist=Collection.artists[i]; + var li=template.clone(); + li.data('artist',artist); + li.removeClass('template'); + li.addClass('artist'); + li.children('span').text(artist.artist_name); + li.children('button').click(function(){ + PlayList.add($(this).parent().data('artist')); + }) + Collection.parent.append(li); + } + } + } + }, + parent:null, + hide:function(){ + if(Collection.parent){ + Collection.parent.hide(); + } + }, + showAlbums:function(artistLi){ + $('ul.albums').parent().removeClass('active'); + $('ul.albums').remove(); + var artist=artistLi.data('artist'); + if(artist){ + var template=Collection.parent.children('li.template'); + var ul=$('<ul class="albums"></ul>'); + for(var i=0;i<artist.albums.length;i++){ + var li=template.clone(); + var album=artist.albums[i]; + li.removeClass('template'); + li.addClass('album'); + li.data('album',album); + li.children('span').text(album.album_name); + li.children('button').click(function(){ + PlayList.add($(this).parent().data('album')); + }) + ul.append(li); + } + artistLi.append(ul); + } + }, + showSongs:function(albumLi){ + $('ul.songs').parent().removeClass('active'); + $('ul.songs').remove(); + var album=albumLi.data('album'); + var template=Collection.parent.children('li.template'); + var ul=$('<ul class="songs"></ul>'); + for(var i=0;i<album.songs.length;i++){ + var li=template.clone(); + var song=album.songs[i]; + li.removeClass('template'); + li.addClass('song',song); + li.children('span').text(song.song_name); + li.children('button').click(function(){ + PlayList.add($(this).parent().data('span')); + }) + ul.append(li); + } + albumLi.append(ul); + } +} + +$(document).ready(function(){ + Collection.parent=$('#collection'); + Collection.load(); + $('#collection li.artist>span').live('click',function(){ + $(this).parent().toggleClass('active'); + Collection.showAlbums($(this).parent()); + }); + $('#collection li.album>span').live('click',function(){ + $(this).parent().toggleClass('active'); + Collection.showSongs($(this).parent()); + }); +}); diff --git a/apps/media/js/music.js b/apps/media/js/music.js index ba34e66c3ba..d43b260d1eb 100644 --- a/apps/media/js/music.js +++ b/apps/media/js/music.js @@ -1,85 +1,20 @@ $(document).ready(function(){ //load the collection - $.ajax({ - url: OC.linkTo('media','ajax/api.php')+'?action=get_collection', - dataType: 'json', - success: function(collection){ - displayCollection(collection); - } + $('#plugins a[href="#collection"]').click(function(){ + $('#plugins li.subentry a.active').removeClass('active'); + $(this).addClass('active'); + PlayList.hide(); + Collection.display(); + }); + $('#plugins a[href="#playlist"]').click(function(){ + $('#plugins li.subentry a.active').removeClass('active'); + $(this).addClass('active'); + PlayList.render(); + Collection.hide(); }); }); -function displayCollection(collection){ - $('#collection').data('collection',collection); - $.each(collection,function(index,artist){ - var artistNode=$('<li class="artist">'+artist.artist_name+'<button class="add">Add</button><ul/></li>'); - artistNode.data('name',artist.artist_name); - artistNode.data('stuff',artist); - $('#collection>ul').append(artistNode); - $.each(artist.albums,function(index,album){ - var albumNode=$('<li class="album">'+album.album_name+'<button class="add">Add</button><ul/></li>'); - albumNode.data('name',album.album_name); - albumNode.data('stuff',album); - artistNode.children('ul').append(albumNode); - $.each(album.songs,function(index,song){ - var songNode=$('<li class="song">'+song.song_name+'<button class="add">Add</button></li>'); - song.artist_name=artist.artist_name; - song.album_name=album.album_name; - songNode.data('name',song.song_name); - songNode.data('stuff',song); - albumNode.children('ul').append(songNode); - }); - }); - }); - $('li.album').hide(); - $('li.song').hide(); - $('li.artist').click(function(){ - $(this).children().children().slideToggle(); - return false; - }); - $('li.album').click(function(){ - $(this).children().children().slideToggle(); - return false; - }); - $('li.song').click(function(){ - return false; - }); - $('li>button.add').click(function(){ - PlayList.add($(this).parent().data('stuff')); - PlayList.render($('#playlist')); - return false; - }); - if(window.location.href.indexOf('#')>-1){//autoplay passed arist/album/song - var vars=getUrlVars(); - var play; - if(vars['artist']){ - $.each(collection,function(index,artist){ - if(artist.artist_name==vars['artist']){ - play=artist; - if(vars['album']){ - $.each(artist.albums,function(index,album){ - if(album.album_name==vars['album']){ - play=album; - if(vars['song']){ - $.each(album.songs,function(index,song){ - if(song.song_name==vars['song']){ - play=song; - } - }); - } - } - }); - } - } - }); - } - PlayList.add(play); - PlayList.play(); - }else{ - PlayList.init(); - } - -} + function getUrlVars(){ var vars = [], hash; @@ -94,7 +29,7 @@ function getUrlVars(){ } function musicTypeFromFile(file){ - var extention=file.substr(file.indexOf('.')+1); + var extention=file.split('.').pop(); if(extention=='ogg'){ return 'oga' } diff --git a/apps/media/js/player.js b/apps/media/js/player.js index f76628110a8..7beb01b6013 100644 --- a/apps/media/js/player.js +++ b/apps/media/js/player.js @@ -3,13 +3,13 @@ var PlayList={ current:-1, items:[], player:null, - parent:null, next:function(){ var next=PlayList.current+1; if(next>=PlayList.items.length){ next=0; } PlayList.play(next); + PlayList.render(); }, previous:function(){ var next=PlayList.current-1; @@ -17,6 +17,7 @@ var PlayList={ next=PlayList.items.length-1; } PlayList.play(next); + PlayList.render(); }, play:function(index){ if(index==null){ @@ -66,6 +67,9 @@ var PlayList={ }); }, add:function(song){ + if(!song){ + return; + } if(song.substr){//we are passed a string, asume it's a url to a song PlayList.addFile(song); } @@ -81,7 +85,7 @@ var PlayList={ } if(song.song_name){ var type=musicTypeFromFile(song.song_path); - var item={name:song.song_name,type:type,artist:song.artist_name,album:song.album_name}; + var item={name:song.song_name,type:type,artist:song.artist_name,album:song.album_name,length:song.song_length,playcount:song.song_playcount}; item[type]=PlayList.urlBase+encodeURIComponent(song.song_path); PlayList.items.push(item); } @@ -92,30 +96,9 @@ var PlayList={ item[type]=PlayList.urlBase+encodeURIComponent(path); PlayList.items.push(item); }, - render:function(parent){//parent should be an ul element - if(parent){ - PlayList.parent=parent; - }else{ - parent=PlayList.parent; - } - if(parent){ - parent.empty(); - for(var i=0;i<PlayList.items.length;i++){ - var song=PlayList.items[i]; - var item=$('<li>'+song.artist+' - '+song.album+' - '+song.name+'</li>'); - item.data('artist',song.artist); - item.data('album',song.album); - item.data('name',song.name); - item.data('index',i); - item.click(function(){ - PlayList.play($(this).data('index')); - PlayList.render(); - }); - if(i==PlayList.current){ - item.addClass('current'); - } - parent.append(item); - } - } - } + remove:function(index){ + PlayList.items.splice(index,1); + PlayList.render(); + }, + render:function(){} } diff --git a/apps/media/js/playlist.js b/apps/media/js/playlist.js new file mode 100644 index 00000000000..570e725b57e --- /dev/null +++ b/apps/media/js/playlist.js @@ -0,0 +1,142 @@ +PlayList.render=function(){ + $('#playlist').show(); + PlayList.parent.empty(); + for(var i=0;i<PlayList.items.length;i++){ + var tr=PlayList.template.clone(); + var item=PlayList.items[i]; + if(i==PlayList.current){ + tr.addClass('current'); + } + tr.removeClass('template'); + tr.data('name',item.name); + tr.data('artist',item.artist); + tr.data('album',item.album); + tr.data('time',item.length); + tr.data('plays',item.playcount); + tr.children('td.name').children('span').text(item.name); + tr.children('td.artist').text(item.artist); + tr.children('td.album').text(item.album); + var secconds=(item.length%60); + if(secconds<10){ + secconds='0'+secconds; + } + var length=Math.floor(item.length/60)+':'+secconds; + tr.children('td.time').text(length); + tr.children('td.plays').text(item.playcount); + tr.data('index',i); + tr.click(function(){ + PlayList.play($(this).data('index')); + PlayList.parent.children('tr').removeClass('current'); + $(this).addClass('current'); + }); + tr.hover(function(){ + var button=$('<img class="remove" title="Remove"/>'); + button.attr('src',OC.imagePath('core','actions/delete')); + $(this).children().last().append(button); + button.click(function(event){ + event.stopPropagation(); + event.preventDefault(); + var index=$(this).parent().parent().data('index'); + PlayList.remove(index); + }); + },function(){ + $(this).children().last().children('img.remove').remove(); + }); + tr.children('td.name').children('input').click(function(event){ + event.stopPropagation(); + if($(this).attr('checked')){ + $(this).parent().parent().addClass('selected'); + if($('td.name input:checkbox').length==$('td.name input:checkbox:checked').length){ + $('#selectAll').attr('checked',true); + } + }else{ + $(this).parent().parent().removeClass('selected'); + $('#selectAll').attr('checked',false); + } + procesSelection(); + }); + PlayList.parent.append(tr); + } +} +PlayList.getSelected=function(){ + return $('td.name input:checkbox:checked').parent().parent(); +} +PlayList.hide=function(){ + $('#playlist').hide(); +} + +$(document).ready(function(){ + PlayList.parent=$('#playlist tbody'); + PlayList.template=$('#playlist tr.template'); + $('#selectAll').click(function(){ + if($(this).attr('checked')){ + // Check all + $('td.name input:checkbox').attr('checked', true); + $('td.name input:checkbox').parent().parent().addClass('selected'); + }else{ + // Uncheck all + $('td.name input:checkbox').attr('checked', false); + $('td.name input:checkbox').parent().parent().removeClass('selected'); + } + procesSelection(); + }); +}); + +function procesSelection(){ + var selected=PlayList.getSelected(); + if(selected.length==0){ + $('th.name span').text('Name'); + $('th.artist').text('Artist'); + $('th.album').text('Album'); + $('th.time').text('Time'); + $('th.plays').empty(); + $('th.plays').text('Plays'); + }else{ + var name=selected.length+' selected'; + var artist=$(selected[0]).data('artist'); + var album=$(selected[0]).data('album'); + var time=$(selected[0]).data('time'); + var plays=$(selected[0]).data('plays'); + for(var i=1;i<selected.length;i++){ + var item=$(selected[i]); + if(artist!='mixed' && item.data('artist')!==artist){ + artist='mixed' + } + if(album!='mixed' && item.data('album')!==album){ + album='mixed' + } + if(time!='mixed' && item.data('time')!==time){ + time='mixed' + } + if(plays!='mixed' && item.data('plays')!==plays){ + plays='mixed' + } + } + $('th.name span').text(name); + $('th.artist').text(artist); + $('th.album').text(album); + if(time!='mixed'){ + var secconds=(time%60); + if(secconds<10){ + secconds='0'+secconds; + } + var time=Math.floor(time/60)+':'+secconds; + } + $('th.time').text(time); + $('th.plays').text(plays); + var button=$('<img class="remove" title="Remove"/>'); + button.attr('src',OC.imagePath('core','actions/delete')); + $('th.plays').append(button); + button.click(function(event){ + event.stopPropagation(); + event.preventDefault(); + PlayList.getSelected().each(function(index,element){ + var index=$(element).data('index'); + PlayList.items[index]=null; + }); + PlayList.items=PlayList.items.filter(function(item){return item!==null}); + PlayList.render(); + procesSelection(); + }); + } +}
\ No newline at end of file |