421 lines
16 KiB
JavaScript
421 lines
16 KiB
JavaScript
JamStash.service('player', function($rootScope, $window, utils, globals, model, notifications) {
|
|
var player1 = '#playdeck_1';
|
|
var player2 = '#playdeck_2';
|
|
var scrobbled = false;
|
|
var timerid = 0;
|
|
|
|
$rootScope.defaultPlay = function(data, event) {
|
|
if (typeof $(player1).data("jPlayer") == 'undefined') {
|
|
$rootScope.nextTrack();
|
|
}
|
|
};
|
|
|
|
$rootScope.nextTrack = function() {
|
|
var next = getNextSong();
|
|
if (next) {
|
|
$rootScope.playSong(false, next);
|
|
}
|
|
//$(player1).jPlayer("stop");
|
|
//$(player2).jPlayer("play");
|
|
};
|
|
|
|
$rootScope.previousTrack = function() {
|
|
var next = getNextSong(true);
|
|
if (next) {
|
|
$rootScope.playSong(false, next);
|
|
}
|
|
};
|
|
|
|
getNextSong = function(previous) {
|
|
var song;
|
|
if (globals.settings.Debug) {
|
|
console.log('Getting Next Song > ' + 'Queue length: ' + $rootScope.queue.length);
|
|
}
|
|
if ($rootScope.queue.length > 0) {
|
|
angular.forEach($rootScope.queue, function(item, key) {
|
|
if (item.playing === true) {
|
|
song = item;
|
|
}
|
|
});
|
|
var index = $rootScope.queue.indexOf(song);
|
|
var next;
|
|
if (previous) {
|
|
next = $rootScope.queue[index - 1];
|
|
} else {
|
|
next = $rootScope.queue[index + 1];
|
|
}
|
|
if (typeof next != 'undefined') {
|
|
if (globals.settings.Debug) {
|
|
console.log('Next Song: ' + next.id);
|
|
}
|
|
return next;
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
this.startSaveTrackPosition = function() {
|
|
if (globals.settings.SaveTrackPosition) {
|
|
if (timerid !== 0) {
|
|
clearInterval(timerid);
|
|
}
|
|
timerid = $window.setInterval(function() {
|
|
if (globals.settings.SaveTrackPosition) {
|
|
saveTrackPosition();
|
|
}
|
|
}, 30000);
|
|
}
|
|
};
|
|
|
|
saveTrackPosition = function() {
|
|
//var audio = typeof $(player1).data("jPlayer") != 'undefined' ? true : false;
|
|
var audio = $(player1).data("jPlayer");
|
|
if (typeof audio != 'undefined') {
|
|
if (audio.status.currentTime > 0 && audio.status.paused === false) {
|
|
var song;
|
|
angular.forEach($rootScope.queue, function(item, key) {
|
|
if (item.playing === true) {
|
|
song = item;
|
|
}
|
|
});
|
|
if (song) {
|
|
var position = audio.status.currentTime;
|
|
if (position !== null) {
|
|
$('#action_SaveProgress').fadeTo("slow", 0).delay(500).fadeTo("slow", 1).delay(500).fadeTo("slow", 0).delay(500).fadeTo("slow", 1);
|
|
song.position = position;
|
|
// Save Queue
|
|
if (utils.browserStorageCheck()) {
|
|
try {
|
|
var songStr = angular.toJson(song);
|
|
localStorage.setItem('CurrentSong', songStr);
|
|
if (globals.settings.Debug) {
|
|
console.log('Saving Current Position: ' + songStr);
|
|
}
|
|
var html = localStorage.getItem('CurrentQueue');
|
|
if ($rootScope.queue.length > 0) {
|
|
var current = $rootScope.queue;
|
|
if (current != html) {
|
|
localStorage.setItem('CurrentQueue', angular.toJson(current));
|
|
if (globals.settings.Debug) {
|
|
console.log('Saving Queue: ' + current.length + ' characters');
|
|
}
|
|
}
|
|
}
|
|
} catch (e) {
|
|
if (e == QUOTA_EXCEEDED_ERR) {
|
|
alert('Quota exceeded!');
|
|
}
|
|
}
|
|
} else {
|
|
if (globals.settings.Debug) {
|
|
console.log('HTML5::loadStorage not supported on your browser');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
this.loadTrackPosition = function() {
|
|
if (utils.browserStorageCheck()) {
|
|
// Load Saved Song
|
|
var song = angular.fromJson(localStorage.getItem('CurrentSong'));
|
|
if (song) {
|
|
$rootScope.playSong(true, song);
|
|
// Load Saved Queue
|
|
var items = angular.fromJson(localStorage.getItem('CurrentQueue'));
|
|
if (items) {
|
|
//$rootScope.queue = [];
|
|
$rootScope.queue = items;
|
|
if ($rootScope.queue.length > 0) {
|
|
notifications.updateMessage($rootScope.queue.length + ' Saved Song(s)', true);
|
|
}
|
|
if (globals.settings.Debug) {
|
|
console.log('Play Queue Loaded From localStorage: ' + $rootScope.queue.length + ' song(s)');
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (globals.settings.Debug) {
|
|
console.log('HTML5::loadStorage not supported on your browser');
|
|
}
|
|
}
|
|
};
|
|
|
|
deleteCurrentQueue = function(data) {
|
|
if (utils.browserStorageCheck()) {
|
|
localStorage.removeItem('CurrentQueue');
|
|
utils.setValue('CurrentSong', null, false);
|
|
if (globals.settings.Debug) {
|
|
console.log('Removing Play Queue');
|
|
}
|
|
} else {
|
|
if (globals.settings.Debug) {
|
|
console.log('HTML5::loadStorage not supported on your browser, ' + html.length + ' characters');
|
|
}
|
|
}
|
|
};
|
|
|
|
$rootScope.playSong = function(loadonly, data) {
|
|
if (globals.settings.Debug) {
|
|
console.log('Play: ' + JSON.stringify(data, null, 2));
|
|
}
|
|
angular.forEach($rootScope.queue, function(item, key) {
|
|
item.playing = false;
|
|
});
|
|
data.playing = true;
|
|
data.selected = false;
|
|
$rootScope.playingSong = data;
|
|
|
|
var id = data.id;
|
|
var url = data.url;
|
|
var position = data.position;
|
|
var title = data.name;
|
|
var album = data.album;
|
|
var artist = data.artist;
|
|
var suffix = data.suffix;
|
|
var specs = data.specs;
|
|
var coverartthumb = data.coverartthumb;
|
|
var coverartfull = data.coverartfull;
|
|
var starred = data.starred;
|
|
$('#playermiddle').css('visibility', 'visible');
|
|
$('#songdetails').css('visibility', 'visible');
|
|
|
|
$rootScope.loadjPlayer(player1, url, suffix, loadonly, position);
|
|
if (!loadonly) {
|
|
// Sway.fm UnityShim
|
|
var playerState = {
|
|
playing: true,
|
|
title: title,
|
|
artist: artist,
|
|
favorite: false,
|
|
albumArt: coverartfull
|
|
};
|
|
|
|
if ($rootScope.unity) {
|
|
$rootScope.unity.sendState(playerState);
|
|
}
|
|
// End UnityShim
|
|
}
|
|
if ($rootScope.queue.length > 0) {
|
|
$('#QueuePreview').stop().scrollTo('#' + id, 400);
|
|
$rootScope.showQueue();
|
|
}
|
|
var spechtml = '';
|
|
data = $(player1).data().jPlayer;
|
|
for (i = 0; i < data.solutions.length; i++) {
|
|
var solution = data.solutions[i];
|
|
if (data[solution].used) {
|
|
spechtml += "<strong class=\"codesyntax\">" + solution + "</strong> is";
|
|
spechtml += " currently being used with<strong>";
|
|
for (var format in data[solution].support) {
|
|
if (data[solution].support[format]) {
|
|
spechtml += " <strong class=\"codesyntax\">" + format + "</strong>";
|
|
}
|
|
}
|
|
spechtml += "</strong> support";
|
|
}
|
|
}
|
|
$('#SMStats').html(spechtml);
|
|
scrobbled = false;
|
|
|
|
if (globals.settings.NotificationSong && !loadonly) {
|
|
notifications.showNotification(coverartthumb, utils.toHTML.un(title), utils.toHTML.un(artist + ' - ' + album), 'text', '#NextTrack');
|
|
}
|
|
if (globals.settings.ScrollTitle) {
|
|
title = utils.toHTML.un(artist) + ' - ' + utils.toHTML.un(title);
|
|
utils.scrollTitle(title);
|
|
} else {
|
|
utils.setTitle(utils.toHTML.un(artist) + ' - ' + utils.toHTML.un(title));
|
|
}
|
|
//utils.safeApply();
|
|
if (!$rootScope.$root.$$phase) {
|
|
$rootScope.$apply();
|
|
}
|
|
};
|
|
|
|
$rootScope.loadjPlayer = function(el, url, suffix, loadonly, position) {
|
|
// jPlayer Setup
|
|
var volume = 1;
|
|
if (utils.getValue('Volume')) {
|
|
volume = parseFloat(utils.getValue('Volume'));
|
|
}
|
|
var audioSolution = "html,flash";
|
|
if (globals.settings.ForceFlash) {
|
|
audioSolution = "flash,html";
|
|
}
|
|
//var salt = Math.floor(Math.random() * 100000);
|
|
//url += '&salt=' + salt;
|
|
$(el).jPlayer("destroy");
|
|
$.jPlayer.timeFormat.showHour = true;
|
|
$(el).jPlayer({
|
|
swfPath: "js/plugins/jplayer",
|
|
wmode: "window",
|
|
solution: audioSolution,
|
|
supplied: suffix,
|
|
volume: volume,
|
|
errorAlerts: false,
|
|
warningAlerts: false,
|
|
cssSelectorAncestor: "#player",
|
|
cssSelector: {
|
|
play: "#PlayTrack",
|
|
pause: "#PauseTrack",
|
|
seekBar: "#audiocontainer .scrubber",
|
|
playBar: "#audiocontainer .progress",
|
|
mute: "#action_Mute",
|
|
unmute: "#action_UnMute",
|
|
volumeMax: "#action_VolumeMax",
|
|
currentTime: "#played",
|
|
duration: "#duration"
|
|
},
|
|
ready: function() {
|
|
console.log("File Suffix: " + suffix);
|
|
if (suffix == 'oga') {
|
|
$(this).jPlayer("setMedia", {
|
|
oga: url,
|
|
});
|
|
} else if (suffix == 'mp3') {
|
|
$(this).jPlayer("setMedia", {
|
|
mp3: url,
|
|
});
|
|
}
|
|
if (!loadonly) { // Start playing
|
|
$(this).jPlayer("play");
|
|
} else { // Loadonly
|
|
//$('#' + songid).addClass('playing');
|
|
$(this).jPlayer("pause", position);
|
|
}
|
|
if (globals.settings.Debug) {
|
|
console.log('[jPlayer Version Info]');
|
|
utils.logObjectProperties($(el).data("jPlayer").version);
|
|
console.log('[HTML5 Debug Info]');
|
|
utils.logObjectProperties($(el).data("jPlayer").html);
|
|
console.log('[Flash Debug Info]');
|
|
utils.logObjectProperties($(el).data("jPlayer").flash);
|
|
console.log('[jPlayer Options Info]');
|
|
utils.logObjectProperties($(el).data("jPlayer").options);
|
|
}
|
|
},
|
|
timeupdate: function(event) {
|
|
// Scrobble song once percentage is reached
|
|
var p = event.jPlayer.status.currentPercentAbsolute;
|
|
if (!scrobbled && p > 30) {
|
|
if (globals.settings.Debug) {
|
|
console.log('LAST.FM SCROBBLE - Percent Played: ' + p);
|
|
}
|
|
scrobbleSong(true);
|
|
}
|
|
},
|
|
volumechange: function(event) {
|
|
utils.setValue('Volume', event.jPlayer.options.volume, true);
|
|
},
|
|
ended: function(event) {
|
|
if (globals.settings.Repeat) { // Repeat current track if enabled
|
|
$(this).jPlayer("play");
|
|
} else {
|
|
if (!getNextSong()) { // Action if we are at the last song in queue
|
|
if (globals.settings.LoopQueue) { // Loop to first track in queue if enabled
|
|
var next = $rootScope.queue[0];
|
|
$rootScope.playSong(false, next);
|
|
} else if (globals.settings.AutoPlay) { // Load more tracks if enabled
|
|
$rootScope.getRandomSongs('play', '', '');
|
|
notifications.updateMessage('Auto Play Activated...', true);
|
|
}
|
|
} else {
|
|
$rootScope.nextTrack();
|
|
}
|
|
}
|
|
},
|
|
error: function(event) {
|
|
var time = $(player1).data("jPlayer").status.currentTime;
|
|
$(player1).jPlayer("play", time);
|
|
if (globals.settings.Debug) {
|
|
console.log("Error Type: " + event.jPlayer.error.type);
|
|
console.log("Error Context: " + event.jPlayer.error.context);
|
|
console.log("Error Message: " + event.jPlayer.error.message);
|
|
console.log("Stream interrupted, retrying from position: " + time);
|
|
}
|
|
}
|
|
});
|
|
return;
|
|
};
|
|
|
|
this.playPauseSong = function() {
|
|
if (typeof $(player1).data("jPlayer") != 'undefined') {
|
|
if ($(player1).data("jPlayer").status.paused) {
|
|
$(player1).jPlayer("play");
|
|
} else {
|
|
$(player1).jPlayer("pause");
|
|
}
|
|
}
|
|
};
|
|
|
|
playVideo = function(id, bitrate) {
|
|
var w, h;
|
|
bitrate = parseInt(bitrate);
|
|
if (bitrate <= 600) {
|
|
w = 320;
|
|
h = 240;
|
|
} else if (bitrate <= 1000) {
|
|
w = 480;
|
|
h = 360;
|
|
} else {
|
|
w = 640;
|
|
h = 480;
|
|
}
|
|
//$("#jPlayerSelector").jPlayer("option", "fullScreen", true);
|
|
$("#videodeck").jPlayer({
|
|
ready: function() {
|
|
/*
|
|
$.fancybox({
|
|
autoSize: false,
|
|
width: w + 10,
|
|
height: h + 10,
|
|
content: $('#videodeck')
|
|
});
|
|
*/
|
|
$(this).jPlayer("setMedia", {
|
|
m4v: 'https://&id=' + id + '&salt=83132'
|
|
}).jPlayer("play");
|
|
$('#videooverlay').show();
|
|
},
|
|
swfPath: "js/jplayer",
|
|
solution: "html, flash",
|
|
supplied: "m4v"
|
|
});
|
|
};
|
|
|
|
scrobbleSong = function(submission) {
|
|
if ($rootScope.loggedIn && submission) {
|
|
var id = $rootScope.playingSong.id;
|
|
if (globals.settings.Debug) {
|
|
console.log('Scrobble Song: ' + id);
|
|
}
|
|
$.ajax({
|
|
url: globals.BaseURL() + '/scrobble.view?' + globals.BaseParams() + '&id=' + id + "&submission=" + submission,
|
|
method: 'GET',
|
|
dataType: globals.settings.Protocol,
|
|
timeout: 10000,
|
|
success: function() {
|
|
scrobbled = true;
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
rateSong = function(songid, rating) {
|
|
$.ajax({
|
|
url: baseURL + '/setRating.view?' + baseParams + '&id=' + songid + "&rating=" + rating,
|
|
method: 'GET',
|
|
dataType: protocol,
|
|
timeout: 10000,
|
|
success: function() {
|
|
updateMessage('Rating Updated!', true);
|
|
}
|
|
});
|
|
};
|
|
});
|