summaryrefslogtreecommitdiffstats
path: root/apps/media/js
diff options
context:
space:
mode:
Diffstat (limited to 'apps/media/js')
-rw-r--r--apps/media/js/collection.js126
-rw-r--r--apps/media/js/music.js91
-rw-r--r--apps/media/js/player.js39
-rw-r--r--apps/media/js/playlist.js142
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