var info_soundcloud = function() {
var me = "soundcloud";
var tempcanvas = document.createElement('canvas');
var scImg = new Image();
function getTrackHTML(data) {
debug.trace("SOUNDCLOUD PLUGIN","Creating track HTML from",data);
var html = '
';
html += '
';
if (data.artwork_url) {
html += '
';
}
html += '
'+language.gettext("soundcloud_trackinfo")+':
';
html += '- '+language.gettext("soundcloud_plays")+': '+formatSCMessyBits(data.playback_count)+'
';
html += '- '+language.gettext("soundcloud_downloads")+': '+formatSCMessyBits(data.download_count)+'
';
html += '- '+language.gettext("soundcloud_faves")+': '+formatSCMessyBits(data.favoritings_count)+'
';
html += '- '+language.gettext("soundcloud_state")+' '+formatSCMessyBits(data.state)+'
';
html += '- '+language.gettext("info_genre")+' '+formatSCMessyBits(data.genre)+'
';
html += '- '+language.gettext("info_label")+' '+formatSCMessyBits(data.label_name)+'
';
html += '- '+language.gettext("soundcloud_license")+': '+formatSCMessyBits(data.license)+'
';
if (data.purchase_url) {
html += '- '+language.gettext("soundcloud_buy")+'
';
}
html += '- '+language.gettext("soundcloud_view")+'
';
html += '
';
html += '
';
html += '
';
html += '
'+
'
'+
'
'+
'
';
var d = formatSCMessyBits(data.description);
d = d.replace(/\n/g, "
");
html += '
'+d+'
';
html += '
';
html += '
';
return html;
}
function getArtistHTML(data) {
debug.trace("SOUNDCLOUD PLUGIN","Creating artist HTML from",data);
var html = '';
html += '
';
if (data.avatar_url) {
html += '
';
}
html += '
'+language.gettext("soundcloud_user")+':
';
html += '- '+language.gettext("soundcloud_fullname")+': '+formatSCMessyBits(data.full_name)+'
';
html += '- '+language.gettext("soundcloud_Country")+': '+formatSCMessyBits(data.country)+'
';
html += '- '+language.gettext("soundcloud_city")+': '+formatSCMessyBits(data.city)+'
';
if (data.website) {
html += '- '+language.gettext("soundcloud_website")+'
';
}
html += '
';
html += '
';
html += '
';
var f = formatSCMessyBits(data.description)
f = f.replace(/\n/g, "
");
html += '
'+ f +'
';
html += '
';
html += '
';
return html;
}
function formatSCMessyBits(bits) {
try {
if (bits) {
return bits.fixDodgyLinks();
} else {
return "";
}
} catch(err) {
return "";
}
}
return {
getRequirements: function(parent) {
return [];
},
collection: function(parent, artistmeta, albummeta, trackmeta) {
debug.log("SOUNDCLOUD PLUGIN", "Creating data collection");
var self = this;
var wi = 0;
var displaying = false;
this.populate = function() {
self.track.populate();
}
this.displayData = function(waitingon) {
displaying = true;
self.artist.doBrowserUpdate();
self.album.doBrowserUpdate();
self.track.doBrowserUpdate();
}
this.stopDisplaying = function(waitingon) {
displaying = false;
}
this.progressUpdate = function(percent) {
self.track.updateProgress(percent);
}
this.artist = function() {
return {
populate: function() {
if (trackmeta.soundcloud.track.error) {
browser.Update(null, 'artist', me, parent.nowplayingindex, { name: "",
link: "",
data: null
}
);
} else {
if (artistmeta.soundcloud.artist === undefined) {
debug.log("SOUNDCLOUD PLUGIN","Artist is populating");
soundcloud.getUserInfo(artistmeta.soundcloud.id, self.artist.scResponseHandler);
}
}
},
scResponseHandler: function(data) {
artistmeta.soundcloud.artist = data;
self.artist.doBrowserUpdate();
},
doBrowserUpdate: function() {
if (displaying && trackmeta.soundcloud.track !== undefined) {
if (trackmeta.soundcloud.track.error) {
browser.Update(null, 'artist', me, parent.nowplayingindex, { name: "",
link: "",
data: null
}
);
} else if (artistmeta.soundcloud !== undefined &&
artistmeta.soundcloud.artist !== undefined) {
if (artistmeta.soundcloud.artist.error) {
browser.Update(null, 'artist', me, parent.nowplayingindex, {name: artistmeta.name,
link: "",
data: ''+artistmeta.soundcloud.artist.error+'
'
}
);
} else {
var accepted = browser.Update(null, 'artist', me, parent.nowplayingindex, { name: artistmeta.soundcloud.artist.username,
link: artistmeta.soundcloud.artist.permalink_url,
data: getArtistHTML(artistmeta.soundcloud.artist)
}
);
}
}
}
}
}
}();
this.album = function() {
return {
doBrowserUpdate: function() {
if (displaying) {
browser.Update(null, 'album', me, parent.nowplayingindex, { name: "",
link: "",
data: null
}
);
}
}
}
}();
// I do not have a pet alligator
this.track = function() {
return {
populate: function() {
if (artistmeta.soundcloud === undefined) {
artistmeta.soundcloud = {};
}
if (trackmeta.soundcloud === undefined) {
trackmeta.soundcloud = {};
var t = parent.playlistinfo.file;
if (t.substring(0,11) == 'soundcloud:') {
soundcloud.getTrackInfo(parent.playlistinfo.file, self.track.scResponseHandler);
} else if (t.match(/api\.soundcloud\.com\/tracks\/(\d+)\//)) {
var sc = t.match(/api\.soundcloud\.com\/tracks\/(\d+)\//);
soundcloud.getTrackInfo(sc[1], self.track.scResponseHandler);
} else if (t.match(/feeds\.soundcloud\.com\/stream\/(\d+)/)) {
var sc = t.match(/feeds\.soundcloud\.com\/stream\/(\d+)/);
soundcloud.getTrackInfo(sc[1], self.track.scResponseHandler);
} else {
trackmeta.soundcloud.track = {error: language.gettext("soundcloud_not")};
self.artist.populate();
self.track.doBrowserUpdate();
}
} else {
self.artist.populate();
}
},
scResponseHandler: function(data) {
debug.log("SOUNDCLOUD PLUGIN","Got SoundCloud Track Data:",data);
trackmeta.soundcloud.track = data;
artistmeta.soundcloud.id = data.user_id;
self.artist.populate();
self.track.doBrowserUpdate();
},
doBrowserUpdate: function() {
if (displaying && trackmeta.soundcloud.track !== undefined) {
debug.log("SOUNDCLOUD PLUGIN","Track was asked to display");
if (trackmeta.soundcloud.track.error) {
browser.Update(null, 'track', me, parent.nowplayingindex, { name: trackmeta.name,
link: "",
data: ''+trackmeta.soundcloud.track.error+'
'
}
);
} else {
var accepted = browser.Update(null, 'track', me, parent.nowplayingindex, { name: trackmeta.name,
link: trackmeta.soundcloud.track.permalink_url,
data: getTrackHTML(trackmeta.soundcloud.track)
}
);
if (accepted) {
debug.log("SOUNDCLOUD PLUGIN","Getting Track Waveform",formatSCMessyBits(trackmeta.soundcloud.track.waveform_url));
scImg.onload = self.track.doSCImageStuff;
scImg.src = "getRemoteImage.php?url="+formatSCMessyBits(trackmeta.soundcloud.track.waveform_url);
}
}
}
},
doSCImageStuff: function() {
// The soundcloud waveform is a png where the waveform itself is transparent
// and has a grey-ish border. We want an image with a gradient for the waveform
// and a transparent border.
tempcanvas.width = scImg.width;
tempcanvas.height = scImg.height;
var ctx = tempcanvas.getContext("2d");
ctx.clearRect(0,0,tempcanvas.width,tempcanvas.height);
// Fill tempcanvas with a linear gradient
var gradient = ctx.createLinearGradient(0,0,0,tempcanvas.height);
gradient.addColorStop(0,'rgba(255,82,0,1)');
gradient.addColorStop(0.6,'rgba(150, 48, 0, 1)');
gradient.addColorStop(1,'rgba(100, 25, 0, 0.1)');
ctx.fillStyle = gradient;
ctx.fillRect(0,0,tempcanvas.width,tempcanvas.height);
// Plop the image over the top.
ctx.drawImage(scImg,0,0,tempcanvas.width,tempcanvas.height);
// Now translate all the grey pixels into transparent ones
var pixels = ctx.getImageData(0,0,tempcanvas.width,tempcanvas.height);
var data = pixels.data;
for (var i = 0; i