summaryrefslogtreecommitdiffstats
path: root/apps/media/js/music.js
diff options
context:
space:
mode:
Diffstat (limited to 'apps/media/js/music.js')
-rw-r--r--apps/media/js/music.js379
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