some work on media player interface, artists can be collapsed in the collection view again and single albums/songs can be played
This commit is contained in:
parent
043e62ffd9
commit
c9a11d0aab
|
@ -56,7 +56,6 @@ OC_MEDIA_COLLECTION::$uid=OC_User::getUser();
|
||||||
if($arguments['action']){
|
if($arguments['action']){
|
||||||
switch($arguments['action']){
|
switch($arguments['action']){
|
||||||
case 'delete':
|
case 'delete':
|
||||||
unset($_SESSION['collection']);
|
|
||||||
$path=$arguments['path'];
|
$path=$arguments['path'];
|
||||||
OC_MEDIA_COLLECTION::deleteSongByPath($path);
|
OC_MEDIA_COLLECTION::deleteSongByPath($path);
|
||||||
$paths=explode(PATH_SEPARATOR,OC_Preferences::getValue(OC_User::getUser(),'media','paths',''));
|
$paths=explode(PATH_SEPARATOR,OC_Preferences::getValue(OC_User::getUser(),'media','paths',''));
|
||||||
|
@ -65,21 +64,13 @@ if($arguments['action']){
|
||||||
OC_Preferences::setValue(OC_User::getUser(),'media','paths',implode(PATH_SEPARATOR,$paths));
|
OC_Preferences::setValue(OC_User::getUser(),'media','paths',implode(PATH_SEPARATOR,$paths));
|
||||||
}
|
}
|
||||||
case 'get_collection':
|
case 'get_collection':
|
||||||
if(!isset($_SESSION['collection'])){
|
$data=array();
|
||||||
$artists=OC_MEDIA_COLLECTION::getArtists();
|
$data['artists']=OC_MEDIA_COLLECTION::getArtists();
|
||||||
foreach($artists as &$artist){
|
$data['albums']=OC_MEDIA_COLLECTION::getAlbums();
|
||||||
$artist['albums']=OC_MEDIA_COLLECTION::getAlbums($artist['artist_id']);
|
$data['songs']=OC_MEDIA_COLLECTION::getSongs();
|
||||||
foreach($artist['albums'] as &$album){
|
echo json_encode($data);
|
||||||
$album['songs']=OC_MEDIA_COLLECTION::getSongs($artist['artist_id'],$album['album_id']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$_SESSION['collection']=json_encode($artists);
|
|
||||||
}
|
|
||||||
echo $_SESSION['collection'];
|
|
||||||
break;
|
break;
|
||||||
case 'scan':
|
case 'scan':
|
||||||
unset($_SESSION['collection']);
|
|
||||||
OC_DB::beginTransaction();
|
OC_DB::beginTransaction();
|
||||||
set_time_limit(0); //recursive scan can take a while
|
set_time_limit(0); //recursive scan can take a while
|
||||||
$path=$arguments['path'];
|
$path=$arguments['path'];
|
||||||
|
@ -88,7 +79,6 @@ if($arguments['action']){
|
||||||
flush();
|
flush();
|
||||||
break;
|
break;
|
||||||
case 'scanFile':
|
case 'scanFile':
|
||||||
unset($_SESSION['collection']);
|
|
||||||
echo (OC_MEDIA_SCANNER::scanFile($arguments['path']))?'true':'false';
|
echo (OC_MEDIA_SCANNER::scanFile($arguments['path']))?'true':'false';
|
||||||
break;
|
break;
|
||||||
case 'get_artists':
|
case 'get_artists':
|
||||||
|
|
|
@ -1,6 +1,21 @@
|
||||||
#folderlist li { margin-bottom:1em; }
|
#controls ul.jp-controls { padding:0; }
|
||||||
#folderlist button.prettybutton { font-size:1em; width:10em; }
|
#controls ul.jp-controls li { display:inline; }
|
||||||
li button.right.prettybutton { font-size:1em; }
|
#controls ul.jp-controls li a { position:absolute; padding:.8em 1em; }
|
||||||
|
a.jp-play, a.jp-pause { left:2.5em; }
|
||||||
|
a.jp-pause { display:none; }
|
||||||
|
a.jp-next { left:5em; }
|
||||||
|
|
||||||
|
div.jp-progress { position:absolute; overflow:hidden; top:.5em; left:8em; width:15em; height:1.2em; padding:0; }
|
||||||
|
div.jp-seek-bar { background:#eee; width:0; height:100%; cursor:pointer; }
|
||||||
|
div.jp-play-bar { background:#ccc; width:0; height:100%; }
|
||||||
|
div.jp-seeking-bg { background:url("../img/pbar-ani.gif"); }
|
||||||
|
div.jp-current-time,div.jp-duration { position:absolute; font-size:.64em; font-style:oblique; top:1em; left:13.5em; width:22em; }
|
||||||
|
div.jp-duration { text-align:right; }
|
||||||
|
|
||||||
|
a.jp-mute,a.jp-unmute { left:24em; }
|
||||||
|
div.jp-volume-bar { position:absolute; overflow:hidden; background:#eee; width:4em; height:0.4em; cursor:pointer; top:1.3em; left:27em; }
|
||||||
|
div.jp-volume-bar-value { background:#ccc; width:0; height:0.4em; }
|
||||||
|
|
||||||
#collection { padding-top:1em; position:relative; width:70em; float:left; }
|
#collection { padding-top:1em; position:relative; width:70em; float:left; }
|
||||||
#collection li.album,#collection li.song { margin-left:3em; }
|
#collection li.album,#collection li.song { margin-left:3em; }
|
||||||
#leftcontent img.remove { display:none; float:right; cursor:pointer; }
|
#leftcontent img.remove { display:none; float:right; cursor:pointer; }
|
||||||
|
|
|
@ -1,16 +1 @@
|
||||||
#controls ul.jp-controls { padding:0; }
|
|
||||||
#controls ul.jp-controls li { display:inline; }
|
|
||||||
#controls ul.jp-controls li a { position:absolute; padding:.8em 1em; }
|
|
||||||
a.jp-play, a.jp-pause { left:2.5em; }
|
|
||||||
a.jp-next { left:5em; }
|
|
||||||
|
|
||||||
div.jp-progress { position:absolute; overflow:hidden; top:.5em; left:8em; width:15em; height:1.2em; padding:0; }
|
|
||||||
div.jp-seek-bar { background:#eee; width:0; height:100%; cursor:pointer; }
|
|
||||||
div.jp-play-bar { background:#ccc; width:0; height:100%; }
|
|
||||||
div.jp-seeking-bg { background:url("../img/pbar-ani.gif"); }
|
|
||||||
div.jp-current-time,div.jp-duration { position:absolute; font-size:.64em; font-style:oblique; top:1em; left:13.5em; width:22em; }
|
|
||||||
div.jp-duration { text-align:right; }
|
|
||||||
|
|
||||||
a.jp-mute,a.jp-unmute { left:24em; }
|
|
||||||
div.jp-volume-bar { position:absolute; overflow:hidden; background:#eee; width:4em; height:0.4em; cursor:pointer; top:1.3em; left:27em; }
|
|
||||||
div.jp-volume-bar-value { background:#ccc; width:0; height:0.4em; }
|
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
Collection={
|
Collection={
|
||||||
artists:[],
|
artists:[],
|
||||||
|
albums:[],
|
||||||
|
songs:[],
|
||||||
|
artistsById:{},
|
||||||
|
albumsById:{},
|
||||||
loaded:false,
|
loaded:false,
|
||||||
loading:false,
|
loading:false,
|
||||||
loadedListeners:[],
|
loadedListeners:[],
|
||||||
|
@ -12,18 +16,37 @@ Collection={
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: OC.linkTo('media','ajax/api.php')+'?action=get_collection',
|
url: OC.linkTo('media','ajax/api.php')+'?action=get_collection',
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
success: function(collection){
|
success: function(data){
|
||||||
Collection.artists=collection;
|
//normalize the data
|
||||||
|
for(var i=0;i<data.artists.length;i++){
|
||||||
//set the album and artist fieds for the songs
|
var artist=data.artists[i];
|
||||||
for(var i=0;i<collection.length;i++){
|
var artistData={name:artist.artist_name,songs:[],albums:[]};
|
||||||
var artist=collection[i];
|
Collection.artistsById[artist.artist_id]=artistData;
|
||||||
for(var j=0;j<artist.albums.length;j++){
|
Collection.artists.push(artistData);
|
||||||
var album=artist.albums[j]
|
}
|
||||||
for(var w=0;w<album.songs.length;w++){
|
for(var i=0;i<data.albums.length;i++){
|
||||||
album.songs[w].album_name=album.album_name;
|
var album=data.albums[i];
|
||||||
album.songs[w].artist_name=artist.artist_name;
|
var artistName=Collection.artistsById[album.album_artist].name;
|
||||||
}
|
var albumData={name:album.album_name,artist:artistName,songs:[]};
|
||||||
|
Collection.albumsById[album.album_id]=albumData;
|
||||||
|
Collection.albums.push(albumData);
|
||||||
|
Collection.artistsById[album.album_artist].albums.push(albumData);
|
||||||
|
}
|
||||||
|
for(var i=0;i<data.songs.length;i++){
|
||||||
|
var song=data.songs[i];
|
||||||
|
if(Collection.artistsById[song.song_artist] && Collection.albumsById[song.song_album]){
|
||||||
|
var songData={
|
||||||
|
name:song.song_name,
|
||||||
|
artist:Collection.artistsById[song.song_artist].name,
|
||||||
|
album:Collection.albumsById[song.song_album].name,
|
||||||
|
lastPlayed:song.song_lastplayed,
|
||||||
|
length:song.song_length,
|
||||||
|
path:song.song_path,
|
||||||
|
playCount:song.song_playcount,
|
||||||
|
};
|
||||||
|
Collection.songs.push(songData);
|
||||||
|
Collection.artistsById[song.song_artist].songs.push(songData);
|
||||||
|
Collection.albumsById[song.song_album].songs.push(songData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,93 +76,101 @@ Collection={
|
||||||
var template=Collection.parent.find('tr.template');
|
var template=Collection.parent.find('tr.template');
|
||||||
var lastArtist='';
|
var lastArtist='';
|
||||||
var lastAlbum='';
|
var lastAlbum='';
|
||||||
$.each(Collection.artists,function(index,artist){
|
$.each(Collection.artists,function(i,artist){
|
||||||
$.each(artist.albums,function(index,album){
|
if(artist.name && artist.songs.length>0){
|
||||||
$.each(album.songs,function(index,song){
|
var tr=template.clone().removeClass('template');
|
||||||
var tr=template.clone().removeClass('template');
|
tr.find('td.title a').text(artist.songs.length+' '+t('media','songs'));
|
||||||
tr.find('td.title a').text(song.song_name);
|
tr.find('td.album a').text(artist.albums.length+' '+t('media','albums'));
|
||||||
tr.find('td.title a').click(function(event){
|
tr.find('td.artist a').text(artist.name);
|
||||||
event.preventDefault();
|
tr.data('artistData',artist);
|
||||||
PlayList.add(song,true);
|
tr.find('td.artist a').click(function(event){
|
||||||
PlayList.play(0);
|
event.preventDefault();
|
||||||
Collection.parent.find('tr').removeClass('active');
|
PlayList.add(artist,true);
|
||||||
tr.addClass('active');
|
PlayList.play(0);
|
||||||
});
|
Collection.parent.find('tr').removeClass('active');
|
||||||
if(artist.artist_name!=lastArtist){
|
$('tr[data-artist="'+artist.name+'"]').addClass('active');
|
||||||
tr.find('td.artist a').click(function(event){
|
|
||||||
event.preventDefault();
|
|
||||||
PlayList.add(artist,true);
|
|
||||||
PlayList.play(0);
|
|
||||||
Collection.parent.find('tr').removeClass('active');
|
|
||||||
$('tr[data-artist="'+artist.artist_name+'"]').addClass('active');
|
|
||||||
});
|
|
||||||
tr.find('td.artist a').text(artist.artist_name);
|
|
||||||
if(artist.albums.length>1){
|
|
||||||
var expander=$('<a class="expander">></a>');
|
|
||||||
expander.data('expanded',true);
|
|
||||||
expander.click(function(event){
|
|
||||||
var tr=$(this).parent().parent();
|
|
||||||
if(expander.data('expanded')){
|
|
||||||
Collection.hideArtist(tr.data('artist'));
|
|
||||||
}else{
|
|
||||||
Collection.showArtist(tr.data('artist'));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
tr.children('td.artist').append(expander);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(album.album_name!=lastAlbum){
|
|
||||||
tr.find('td.album a').click(function(event){
|
|
||||||
event.preventDefault();
|
|
||||||
PlayList.add(album,true);
|
|
||||||
PlayList.play(0);
|
|
||||||
Collection.parent.find('tr').removeClass('active');
|
|
||||||
$('tr[data-album="'+album.album_name+'"]').addClass('active');
|
|
||||||
});
|
|
||||||
tr.find('td.album a').text(album.album_name);
|
|
||||||
if(album.songs.length>1){
|
|
||||||
var expander=$('<a class="expander">></a>');
|
|
||||||
expander.data('expanded',true);
|
|
||||||
expander.click(function(event){
|
|
||||||
var tr=$(this).parent().parent();
|
|
||||||
if(expander.data('expanded')){
|
|
||||||
Collection.hideAlbum(tr.data('album'));
|
|
||||||
}else{
|
|
||||||
Collection.showAlbum(tr.data('album'));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
tr.children('td.album').append(expander);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tr.attr('data-artist',artist.artist_name);
|
|
||||||
tr.attr('data-album',album.album_name);
|
|
||||||
lastArtist=artist.artist_name;
|
|
||||||
lastAlbum=album.album_name;
|
|
||||||
|
|
||||||
Collection.parent.find('tbody').append(tr);
|
|
||||||
});
|
});
|
||||||
Collection.hideAlbum(artist.artist_name,album.album_name);
|
var expander=$('<a class="expander">></a>');
|
||||||
});
|
expander.data('expanded',false);
|
||||||
Collection.hideArtist(artist.artist_name);
|
expander.click(function(event){
|
||||||
|
var tr=$(this).parent().parent();
|
||||||
|
if(expander.data('expanded')){
|
||||||
|
Collection.hideArtist(tr.data('artist'));
|
||||||
|
}else{
|
||||||
|
Collection.showArtist(tr.data('artist'));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
tr.children('td.artist').append(expander);
|
||||||
|
tr.attr('data-artist',artist.name);
|
||||||
|
Collection.parent.find('tbody').append(tr);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
showArtist:function(artist){
|
showArtist:function(artist){
|
||||||
Collection.parent.find('tr[data-artist="'+artist+'"]').show();
|
var tr=Collection.parent.find('tr[data-artist="'+artist+'"]');
|
||||||
Collection.parent.find('tr[data-artist="'+artist+'"]').first().removeClass('collapsed');
|
var nextRow=tr.next();
|
||||||
Collection.parent.find('tr[data-artist="'+artist+'"] a.expander').data('expanded',true);
|
var artist=tr.data('artistData');
|
||||||
Collection.parent.find('tr[data-artist="'+artist+'"] a.expander').addClass('expanded');
|
var first=true;
|
||||||
Collection.parent.find('tr[data-artist="'+artist+'"] a.expander').text('v');
|
$.each(artist.albums,function(foo,album){
|
||||||
|
$.each(album.songs,function(i,song){
|
||||||
|
if(first){
|
||||||
|
newRow=tr;
|
||||||
|
}else{
|
||||||
|
var newRow=tr.clone();
|
||||||
|
}
|
||||||
|
if(i==0){
|
||||||
|
newRow.find('td.album a').text(album.name);
|
||||||
|
newRow.find('td.album a').click(function(event){
|
||||||
|
event.preventDefault();
|
||||||
|
PlayList.add(album,true);
|
||||||
|
PlayList.play(0);
|
||||||
|
Collection.parent.find('tr').removeClass('active');
|
||||||
|
$('tr[data-album="'+album.name+'"]').addClass('active');
|
||||||
|
});
|
||||||
|
}else{
|
||||||
|
newRow.find('.expander').remove();
|
||||||
|
newRow.find('td.album a').text('');
|
||||||
|
}
|
||||||
|
newRow.find('td.title a').text(song.name);
|
||||||
|
newRow.find('td.title a').click(function(event){
|
||||||
|
event.preventDefault();
|
||||||
|
PlayList.add(song,true);
|
||||||
|
PlayList.play(0);
|
||||||
|
Collection.parent.find('tr').removeClass('active');
|
||||||
|
$('tr[data-title="'+song.name+'"]').addClass('active');
|
||||||
|
});
|
||||||
|
newRow.attr('data-album',album.name);
|
||||||
|
newRow.attr('data-title',song.name);
|
||||||
|
newRow.attr('data-artist',artist.name);
|
||||||
|
if(!first){
|
||||||
|
nextRow.before(newRow);
|
||||||
|
}
|
||||||
|
first=false;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
tr.removeClass('collapsed');
|
||||||
|
tr.find('a.expander').data('expanded',true);
|
||||||
|
tr.find('a.expander').addClass('expanded');
|
||||||
|
tr.find('a.expander').text('v');
|
||||||
},
|
},
|
||||||
hideArtist:function(artist){
|
hideArtist:function(artist){
|
||||||
if(Collection.parent.find('tr[data-artist="'+artist+'"]').length>1){
|
var tr=Collection.parent.find('tr[data-artist="'+artist+'"]');
|
||||||
Collection.parent.find('tr[data-artist="'+artist+'"]').hide();
|
if(tr.length>1){
|
||||||
Collection.parent.find('tr[data-artist="'+artist+'"]').first().show();
|
var artist=tr.first().data('artistData');
|
||||||
Collection.parent.find('tr[data-artist="'+artist+'"]').first().addClass('collapsed');
|
tr.first().find('td.album a').text(artist.albums.length+' '+t('media','albums'));
|
||||||
Collection.parent.find('tr[data-artist="'+artist+'"] a.expander').data('expanded',false);
|
tr.first().find('td.title a').text(artist.songs.length+' '+t('media','songs'));
|
||||||
Collection.parent.find('tr[data-artist="'+artist+'"] a.expander').removeClass('expanded');
|
tr.first().find('td.album a').unbind('click');
|
||||||
Collection.parent.find('tr[data-artist="'+artist+'"] a.expander').text('>');
|
tr.first().find('td.title a').unbind('click');
|
||||||
|
tr.each(function(i,row){
|
||||||
|
if(i>0){
|
||||||
|
$(row).remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
tr.find('a.expander').data('expanded',false);
|
||||||
|
tr.find('a.expander').removeClass('expanded');
|
||||||
|
tr.find('a.expander').text('>');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
showAlbum:function(artist,album){
|
showAlbum:function(artist,album){
|
||||||
|
|
|
@ -122,10 +122,10 @@ var PlayList={
|
||||||
PlayList.add(song,temp,true);
|
PlayList.add(song,temp,true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if(song.song_name){
|
if(song.path){
|
||||||
var type=musicTypeFromFile(song.song_path);
|
var type=musicTypeFromFile(song.path);
|
||||||
var item={name:song.song_name,type:type,artist:song.artist_name,album:song.album_name,length:song.song_length,playcount:song.song_playcount};
|
var item={name:song.name,type:type,artist:song.artist,album:song.album,length:song.length,playcount:song.playCount};
|
||||||
item[type]=PlayList.urlBase+encodeURIComponent(song.song_path);
|
item[type]=PlayList.urlBase+encodeURIComponent(song.path);
|
||||||
if(PlayList.isTemp){
|
if(PlayList.isTemp){
|
||||||
PlayList.tempPlaylist.push(item);
|
PlayList.tempPlaylist.push(item);
|
||||||
}else{
|
}else{
|
||||||
|
|
Loading…
Reference in New Issue