diff options
Diffstat (limited to 'apps/media/js/music.js')
-rw-r--r-- | apps/media/js/music.js | 379 |
1 files changed, 52 insertions, 327 deletions
diff --git a/apps/media/js/music.js b/apps/media/js/music.js index 19b23b87794..ba34e66c3ba 100644 --- a/apps/media/js/music.js +++ b/apps/media/js/music.js @@ -1,330 +1,13 @@ -var audioPlaylist; -var URLBASE='ajax/api.php?action=play&path='; - -$(document).ready(function() { - if(typeof FileActions!=='undefined'){ - URLBASE='../apps/media/ajax/api.php?action=play&path='; - var playerLoaded=false; - function playFile(filename){ - audioPlaylist.playlist=[]; - audioPlaylist.addToPlaylist({ - song_name:filename, - song_path:$('#dir').val()+'/'+filename - },true); - audioPlaylist.playlistChange(audioPlaylist.playlist.length-1); - } - function playAudio(filename){ - if(!playerLoaded){ - var parent=$('body').append('<div id="media_container"/>'); - $('#media_container').load('../apps/media/templates/music.php',function(){ - playerLoaded=true; - //remove playlist and collection view - $('#jp_playlist_1').remove(); - $('collection').remove(); - //init the audio player - audioPlaylist =initPlayList(false,false,function(){ - //play the file - playFile(filename); - }); - }); - }else{ - playFile(filename); - } - } - FileActions.register('audio','Play',playAudio); - FileActions.register('application/ogg','Play',playAudio); - FileActions.setDefault('audio','Play'); - FileActions.setDefault('application/ogg','Play'); - } - Playlist = function(instance, playlist, options) { - var self = this; - - this.instance = instance; // String: To associate specific HTML with this playlist - this.playlist = playlist; // Array of Objects: The playlist - this.options = options; // Object: The jPlayer constructor options for this playlist - - this.current = -1; - - this.cssId = { - jPlayer: "jplayer_", - interface: "jp_interface_", - playlist: "jp_playlist_" - }; - this.cssSelector = {}; - - $.each(this.cssId, function(entity, id) { - self.cssSelector[entity] = "#" + id + self.instance; - }); - - if(!this.options.cssSelectorAncestor) { - this.options.cssSelectorAncestor = this.cssSelector.interface; - } - - $(this.cssSelector.jPlayer).jPlayer(this.options); - - $(this.cssSelector.interface + " .jp-previous").click(function() { - self.playlistPrev(); - $(this).blur(); - return false; - }); - - $(this.cssSelector.interface + " .jp-next").click(function() { - self.playlistNext(); - $(this).blur(); - return false; - }); - }; - - Playlist.prototype = { - displayPlaylist: function() { - var self = this; - $(this.cssSelector.playlist + " ul").empty(); - for (i=0; i < this.playlist.length; i++) { - var listItem = (i === this.playlist.length-1) ? "<li class='jp-playlist-last'>" : "<li>"; - listItem += "<a href='#' id='" + this.cssId.playlist + this.instance + "_item_" + i +"' tabindex='1'>"+ this.playlist[i].name +"</a>"; - - // Create links to free media - if(this.playlist[i].free) { - var first = true; - listItem += "<div class='jp-free-media'>("; - $.each(this.playlist[i], function(property,value) { - if($.jPlayer.prototype.format[property]) { // Check property is a media format. - if(first) { - first = false; - } else { - listItem += " | "; - } - listItem += "<a id='" + self.cssId.playlist + self.instance + "_item_" + i + "_" + property + "' href='" + value + "' tabindex='1'>" + property + "</a>"; - } - }); - listItem += ")</span>"; - } - listItem += "<button class='right prettybutton remove'>Remove</button>"; - - listItem += "</li>"; - - // Associate playlist items with their media - $(this.cssSelector.playlist + " ul").append(listItem); - $(this.cssSelector.playlist + "_item_" + i).data("index", i).click(function() { - var index = $(this).data("index"); - if(self.current !== index) { - self.playlistChange(index); - } else { - $(self.cssSelector.jPlayer).jPlayer("play"); - } - $(this).blur(); - return false; - }); - $(this.cssSelector.playlist + "_item_" + i).parent().children('button').data("index", i).click(function() { - var index = $(this).data("index"); - self.removeFromPlaylist(index); - }); - - // Disable free media links to force access via right click - if(this.playlist[i].free) { - $.each(this.playlist[i], function(property,value) { - if($.jPlayer.prototype.format[property]) { // Check property is a media format. - $(self.cssSelector.playlist + "_item_" + i + "_" + property).data("index", i).click(function() { - var index = $(this).data("index"); - $(self.cssSelector.playlist + "_item_" + index).click(); - $(this).blur(); - return false; - }); - } - }); - } - } - }, - playlistInit: function(autoplay) { - if(autoplay) { - this.playlistChange(this.current); - } else { - this.playlistConfig(this.current); - } - }, - playlistConfig: function(index,play) { - $(this.cssSelector.playlist + "_item_" + this.current).removeClass("jp-playlist-current").parent().removeClass("jp-playlist-current"); - $(this.cssSelector.playlist + "_item_" + index).addClass("jp-playlist-current").parent().addClass("jp-playlist-current"); - this.current = index; - var that=this; - if(this.playlist[this.current]){ - if($(this.cssSelector.jPlayer).data('jPlayer').options.supplied!=this.playlist[this.current].type){//the the audio type changes we need to reinitialize jplayer - $(this.cssSelector.jPlayer).jPlayer("destroy"); - $(this.cssSelector.jPlayer).jPlayer({ - ended:this.options.ended, - play:this.options.play, - supplied:this.playlist[this.current].type, - ready:function(){ - that.playlistConfig(index); - if(play){ - $(that.cssSelector.jPlayer).jPlayer("play"); - } - } - }); - }else{ - $(this.cssSelector.jPlayer).jPlayer("setMedia", this.playlist[this.current]); - } - } - }, - playlistChange: function(index) { - this.playlistConfig(index,true); - $(this.cssSelector.jPlayer).jPlayer("play"); - }, - playlistNext: function() { - var index = (this.current + 1 < this.playlist.length) ? this.current + 1 : 0; - this.playlistChange(index); - }, - playlistPrev: function() { - var index = (this.current - 1 >= 0) ? this.current - 1 : this.playlist.length - 1; - this.playlistChange(index); - }, - removeFromPlaylist: function(index){ - this.playlist.splice(index,1); - this.displayPlaylist(); - if(index==this.current){ - this.playlistConfig((index<this.playlist.length)?index:0); - }else{ - $(this.cssSelector.playlist + "_item_" + this.current).addClass("jp-playlist-current").parent().addClass("jp-playlist-current"); - } - }, - addToPlaylist : function(stuff,dontRedraw){ - var self=this; - if(!stuff){ - return; - } - if(stuff.artist_name){ - $.each(stuff.albums,function(index,album){ - self.addToPlaylist(album,true); - }); - } - if(stuff.album_name){ - $.each(stuff.songs,function(index,song){ - self.addToPlaylist(song,true); - }); - } - if(stuff.song_name){ - var extention=stuff.song_path.split('.').pop(); - var type=musicTypeFromExtention(extention); - var item={name:stuff.song_name,type:type}; - item[type]=URLBASE+stuff.song_path; - this.playlist.push(item); - } - if(!dontRedraw){ - this.displayPlaylist(); - } +$(document).ready(function(){ + //load the collection + $.ajax({ + url: OC.linkTo('media','ajax/api.php')+'?action=get_collection', + dataType: 'json', + success: function(collection){ + displayCollection(collection); } - }; - - if($('#jp-audio')){//only do this when we're actually in the media player - //load the collection - $.ajax({ - url: 'ajax/api.php?action=get_collection', - dataType: 'json', - success: function(collection){ - var playlist=[]; - var types=[]; - 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 n=0;n<album.songs.length;n++){ - var song=album.songs[n]; - var extention=song.song_path.split('.').pop(); - var type=musicTypeFromExtention(extention); - if(types.indexOf(type)==-1){ - types.push(type); - } - } - } - } - displayCollection(collection); - audioPlaylist =initPlayList(true,true); - } - }); - } -}); - -function initPlayList(display,enableAutoPlay,ready){ - return new Playlist('1', [],{ - ready: function() { - if(display){ - audioPlaylist.displayPlaylist(); - } - if(enableAutoPlay){ - 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; - } - }); - } - } - }); - } - } - }); - } - audioPlaylist.addToPlaylist(play); - audioPlaylist.playlistInit(true); - }else{ - audioPlaylist.playlistInit(false); // Parameter is a boolean for autoplay. - } - }else{ - audioPlaylist.playlistInit(false); - } - if(ready){ - ready(); - } - }, - ended: function() { - audioPlaylist.playlistNext(); - }, - play: function() { - $(this).jPlayer("pauseOthers"); - }, }); -} - -function musicTypeFromExtention(extention){ - if(extention=='ogg'){ - return 'oga' - } - //TODO check for more specific cases - return extention; -} - -// indexOf implemententation for browsers that don't support it -if (!Array.prototype.indexOf){ - Array.prototype.indexOf = function(elt /*, from*/) { - var len = this.length; - - var from = Number(arguments[1]) || 0; - from = (from < 0) - ? Math.ceil(from) - : Math.floor(from); - if (from < 0) - from += len; - - for (; from < len; from++) - { - if (from in this && - this[from] === elt) - return from; - } - return -1; - }; -} +}); function displayCollection(collection){ $('#collection').data('collection',collection); @@ -340,6 +23,8 @@ function displayCollection(collection){ 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); @@ -360,9 +45,40 @@ function displayCollection(collection){ return false; }); $('li>button.add').click(function(){ - audioPlaylist.addToPlaylist($(this).parent().data('stuff')); + 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(){ @@ -375,4 +91,13 @@ function getUrlVars(){ vars[hash[0]] = decodeURIComponent(hash[1]).replace(/\+/g,' '); } return vars; +} + +function musicTypeFromFile(file){ + var extention=file.substr(file.indexOf('.')+1); + if(extention=='ogg'){ + return 'oga' + } + //TODO check for more specific cases + return extention; }
\ No newline at end of file |