astrXbian/www/jukebox/ui/coverscraper.js

249 lines
8.1 KiB
JavaScript

function coverScraper(size, useLocalStorage, sendUpdates, enabled) {
var self = this;
var timer_running = false;
var formObjects = [];
var numAlbums = 0;
var albums_without_cover = 0;
var infotext = $('#infotext');
var statusobj = $('#status');
var imgparams = null;
var covertimer = null;
var scrolling = false;
var ignorelocal = false;
// I need to try and limit the number of lookups per second I do to last.fm
// Otherwise they will set the lions on me - hence the use of setTimeout
// Pass the img name to this function
this.GetNewAlbumArt = function(params) {
if (enabled) {
formObjects.push(params);
numAlbums = (formObjects.length)-1;
if (timer_running == false) {
doNextImage(1);
}
} else {
imgparams = self.getImageSearchParams(params);
setDefaultImage(imgparams);
}
}
this.toggle = function(o) {
enabled = o;
}
this.reset = function(awc) {
numAlbums = 0;
if (awc > -1) {
albums_without_cover = awc;
}
formObjects = [];
timer_running = false;
self.updateInfo(0);
if (typeof aADownloadFinished == 'function') {
aADownloadFinished();
}
}
this.updateInfo = function(n) {
if (sendUpdates) {
albums_without_cover = albums_without_cover - n;
infotext.html(albums_without_cover+" "+language.gettext("albumart_nocovercount"));
}
}
this.toggleScrolling = function(s) {
scrolling = s;
}
this.toggleLocal = function(s) {
ignorelocal = s;
}
this.getImageSearchParams = function(imgobj) {
if (imgobj.hasOwnProperty('cb')) {
// pre-populated data from the playlist
return imgobj;
} else {
var key = imgobj.attr('name');
var artist = imgobj.parent().find('input[name="artist"]').val();
var album = imgobj.parent().find('input[name="album"]').val();
if (artist) {
return {key: '', artist: decodeURIComponent(artist), album: decodeURIComponent(album), imgkey: imgobj.attr('name')};
} else {
return {key: key, artist: '', album: '', imgkey: imgobj.attr('name')};
}
}
}
// Is there something else I could be doing?
function doNextImage(time) {
clearTimeout(covertimer);
if (formObjects.length > 0) {
debug.log("COVERSCRAPER","Next Image, delay time is",time);
timer_running = true;
covertimer = setTimeout(processForm, time);
} else {
$(statusobj).empty();
timer_running = false;
if (typeof aADownloadFinished == 'function') {
aADownloadFinished();
}
}
}
function processForm() {
if (formObjects.length == 0) {
return 0;
}
image = formObjects.shift();
if (image.hasOwnProperty('cb') && image.cb === null) {
// Callbacks are nullified when the playlist repopulates, which means we don't need to
// look for these any more, as if they are still in the playlist they'll have been re-added to formObjects.
// Rather than do some horrid splicing of formObjects in clearCallbacks, just skip them here.
debug.trace("COVERSCRAPER","Skipping cleared playlist image");
doNextImage(500);
return false;
}
imgparams = self.getImageSearchParams(image);
imgparams.ignorelocal = ignorelocal;
debug.log("COVERSCRAPER","Getting Cover for", imgparams.imgkey);
if (sendUpdates) {
var x = image.prev('input').val();
statusobj.empty().html(language.gettext("albumart_getting")+" "+decodeURIComponent(x));
var percent = ((numAlbums - formObjects.length)/numAlbums)*100;
progress.rangechooser('setProgress', percent.toFixed(2));
if (scrolling) {
$('#coverslist').mCustomScrollbar("scrollTo",$('img[name="'+imgparams.imgkey+'"]'));
}
}
animateWaiting();
// Munge params here as we can't pass the 'callback' (cb) parameter to $.post
var postparams = cloneObject(imgparams);
delete postparams.cb;
$.post("getalbumcover.php", postparams)
.done( gotImage )
.fail( revertCover );
}
function animateWaiting() {
$('img.notexist[name="'+imgparams.imgkey+'"]').removeClass('nospin').addClass('spinner').removeAttr('src');
}
function stopAnimation() {
$('img[name="'+imgparams.imgkey+'"]').removeClass('spinner').addClass('nospin').removeAttr('src');
}
// Hello
function gotImage(data) {
debug.trace("COVERSCRAPER","Result Is", data);
stopAnimation();
if (data.small) {
self.updateInfo(1);
if (useLocalStorage) {
sendLocalStorageEvent(imgparams.imgkey, data);
}
finaliseImage(data);
doNextImage(data.delaytime);
} else {
if (setDefaultImage(imgparams)) {
doNextImage(data.delaytime);
} else {
revertCover(data.delaytime);
}
}
}
function finaliseImage(data) {
update_ui_images(imgparams.imgkey, data);
if (typeof (imgparams.cb) == 'function') {
debug.trace("COVERSCRAPER","calling back for",imgparams.imgkey,data);
imgparams.cb(data);
}
}
function revertCover(delaytime) {
if (!delaytime) {
delaytime = 800;
}
debug.log("COVERSCRAPER","No Cover Found. Reverting to the blank icon");
update_failed_ui_images(imgparams.imagekey);
if (useLocalStorage) {
sendLocalStorageEvent("!"+imgparams.imgkey);
}
doNextImage(delaytime);
}
function setDefaultImage(imgparams) {
if (sendUpdates) {
// Dont' do this if we're using the album art manager
return false;
}
// Although getalbumcover does return a default for streams, this is here
// mainly for the case where auto art download is disabled - this will set a
// sensible default for streams
var def = null;
if (imgparams.type) {
switch (imgparams.type) {
case 'stream':
def = 'newimages/broadcast.svg';
break;
case 'podcast':
def = 'newimages/podcast-logo.svg';
break;
}
} else {
switch (imgparams.artist) {
case 'STREAM':
def = 'newimages/broadcast.svg';
break;
case 'PODCAST':
def = 'newimages/podcast-logo.svg';
break;
}
}
if (def) {
debug.log("COVERSCRAPER", "Returning default image of",def);
var images = {
small: def,
medium: def,
asdownloaded: def
}
finaliseImage(images);
return true;
} else {
return false;
}
}
this.clearCallbacks = function() {
for (var j in formObjects) {
if (formObjects[j].hasOwnProperty('cb')) {
formObjects[j].cb = null;
}
}
}
}
function sendLocalStorageEvent(key, data) {
if (data && data.small) {
localStorage.setItem("albumimg_"+key, JSON.stringify(data));
}
debug.trace("COVERSCRAPER","Sending local storage event",key);
// Event only fires when the key value actually CHANGES
localStorage.setItem("key", "Blerugh");
localStorage.setItem("key", key);
}