';
html += '
';
if (data.recording) {
if (data.recording.disambiguation) {
html += '
'+data.recording.disambiguation+'
';
}
}
if (data.work) {
if (data.work.disambiguation) {
html += '
'+data.work.disambiguation+'
';
}
}
if (data.recording.rating && data.recording.rating.value !== null) {
html += '
- RATING: '
+language.gettext("musicbrainz_votes", [data.recording.rating.value, data.recording.rating['votes-count']])
+'
';
}
var rels = new Array();
if (data.work) {
for (var i in data.work.relations) {
rels.push(data.work.relations[i]);
}
}
if (data.recording) {
for (var i in data.recording.relations) {
rels.push(data.recording.relations[i]);
}
}
html += getURLs(rels, true);
html += '
';
html += '
';
if ((data.work && data.work.annotation) || (data.recording && data.recording.annotation)) {
var a = "";
if (data.work && data.work.annotation) {
a = a + data.work.annotation;
}
if (data.recording && data.recording.annotation) {
a = a + data.recording.annotation;
}
a = a.replace(/\n/, '
');
a = a.replace(/\[(.*?)\|(.*?)\]/, '
$2');
html += '
'+language.gettext("musicbrainz_notes")+':
'+a+'
';
}
if (data.recording && data.recording.tags && data.recording.tags.length > 0) {
html += '
'+language.gettext("musicbrainz_tags")+'
';
for (var i in data.recording.tags) {
html += ''+data.recording.tags[i].name+' ';
}
html += '
';
}
html += doCredits(rels);
if (data.recording && data.recording.releases && data.recording.releases.length > 0) {
html += '
'+language.gettext("musicbrainz_appears")+'
';
for (var i in data.recording.releases) {
html += ''+
data.recording.releases[i].title+' | '+
data.recording.releases[i].date+' | '+
data.recording.releases[i].status+','+
data.recording.releases[i].country+' |
';
}
html += '
';
}
html += '
';
return html;
}
function doCredits(rels) {
var doit = true;
var html = "";
for (var i in rels) {
if (rels[i].artist) {
if (doit) {
html += '
'+language.gettext("musicbrainz_credits")+'
';
doit = false;
}
html += ''+rels[i].type;
if (rels[i].attributes) {
var c = false;
for (var j in rels[i].attributes) {
if (j == 0) {
html += ' (';
c = true;
} else {
html = html +', ';
}
html += rels[i].attributes[j];
}
if (c) {
html += ')';
}
}
html = html +' | '+rels[i].artist.name+'';
if (rels[i].artist.disambiguation) {
html += ' ('+rels[i].artist.disambiguation+')';
}
html = html +' |
';
}
}
if (!doit) {
html += '
';
}
return html;
}
return {
getRequirements: function(parent) {
if (parent.playlistinfo.metadata.artists[parent.artistindex].musicbrainz_id == "" ||
parent.playlistinfo.metadata.album.musicbrainz_id == "" ||
parent.playlistinfo.metadata.track.musicbrainz_id == "") {
return ["lastfm"];
} else {
return [];
}
},
collection: function(parent, artistmeta, albummeta, trackmeta) {
debug.trace(medebug, "Creating data collection");
var self = this;
var displaying = false;
this.populate = function() {
self.artist.populate();
self.album.populate();
self.track.populate();
}
this.displayData = function() {
displaying = true;
self.artist.doBrowserUpdate();
self.album.doBrowserUpdate();
self.track.doBrowserUpdate();
}
this.stopDisplaying = function() {
displaying = false;
}
this.handleClick = function(source, element, event) {
debug.trace(medebug,parent.nowplayingindex,source,"is handling a click event");
if (element.hasClass('clickdoartist')){
var targetdiv = element.parent().next();
if (!(targetdiv.hasClass('full')) && element.isClosed()) {
doSomethingUseful(targetdiv, language.gettext("info_gettinginfo"));
targetdiv.slideToggle('fast');
getArtistData(element.attr('name'));
element.toggleOpen();
targetdiv.addClass('underline');
} else {
if (element.isOpen()) {
element.toggleClosed();
targetdiv.removeClass('underline');
} else {
element.toggleOpen();
targetdiv.addClass('underline');
}
targetdiv.slideToggle('fast');
}
} else if (element.hasClass('clickdodiscography')) {
var targetdiv = element.parent().next();
if (!(targetdiv.hasClass('full')) && element.isClosed()) {
doSomethingUseful(targetdiv, language.gettext("info_gettinginfo"));
getArtistReleases(element.attr('name'), 'discography_'+element.attr('name'));
element.toggleOpen();
targetdiv.slideToggle('fast');
} else {
if (element.isOpen()) {
element.toggleClosed();
} else {
element.toggleOpen();
}
targetdiv.slideToggle('fast');
}
} else if (element.hasClass('clickexpandbox')) {
var id = element.attr('name');
var expandingframe = element.parent().parent().parent().parent();
var content = expandingframe.html();
content=content.replace(/
'+data.error+'';
}
var html = '';
html += '
';
if (data['cover-art-archive'].artwork == true) {
debug.trace(medebug,"There is cover art available");
html += '
';
html += getCoverArt();
html += '
';
}
html += '
';
html += '
- '+language.gettext("musicbrainz_status")+': ';
if (data.status) {
html = html +data.status+" ";
}
for(var j in data['release-group']['secondary-types']) {
html += data['release-group']['secondary-types'][j] + " ";
}
html += (data['release-group']['primary-type'] || "");
html += '
';
if (data['release-group'] && data['release-group']['first-release-date']) {
html += '
- '+language.gettext("musicbrainz_date")+': '+data['release-group']['first-release-date']+'
';
} else {
html += '
- '+language.gettext("musicbrainz_date")+': '+data.date+'
';
}
if (data.country) {
html += '
- '+language.gettext("musicbrainz_country")+': '+data.country+'
';
}
if (data['label-info'] && data['label-info'].length > 0) {
html += '
- '+language.gettext("title_label")+':
';
for (var i in data['label-info']) {
if (data['label-info'][i].label) {
html += '- '+data['label-info'][i].label.name+'
';
}
}
html += '
';
}
html += '
'+getURLs(data.relations, true);
html += '
';
html += '
';
if (data.annotation) {
var a = data.annotation;
a = a.replace(/\n/, '
');
a = a.replace(/\[(.*?)\|(.*?)\]/, '
$2');
html += '
'+language.gettext("musicbrainz_notes")+':
'+a+'
';
}
if (data.tags && data.tags.length > 0) {
html += '
'+language.gettext("musicbrainz_tags")+'
';
for (var i in data.tags) {
html += ''+data.tags[i].name+' ';
}
html += '
';
}
html += doCredits(data.relations);
html += '
'+language.gettext("discogs_tracklisting")+'
';
for (var i in data.media) {
html += ''+language.gettext("musicbrainz_disc")+' '+data.media[i].position;
if (data.media[i].title !== null && data.media[i].title != "") {
html += " - " + data.media[i].title;
}
html += ' |
';
for (var j in data.media[i].tracks) {
html += ''+data.media[i].tracks[j].number+' | ';
html += ''+data.media[i].tracks[j].title;
if (data['artist-credit'][0].name == "Various Artists" && data.media[i].tracks[j]['artist-credit']) {
html += ' ';
var jp = "";
for (var k in data.media[i].tracks[j]['artist-credit']) {
if (jp != "") {
html += " "+jp+" ";
}
html += data.media[i].tracks[j]['artist-credit'][k].name;
jp = data.media[i].tracks[j]['artist-credit'][k].joinphrase;
}
html += '';
}
html += ' | ';
html += ''+formatTimeString(Math.round(data.media[i].tracks[j].length/1000))+' |
';
}
}
html += '
';
html += '
';
html += '
';
html += '
';
return html;
}
function getCoverArt() {
debug.mark(medebug,parent.nowplayingindex,"Getting Cover Art");
if (albummeta.musicbrainz.coverart === undefined) {
debug.trace(medebug,parent.nowplayingindex," ... retrieivng data");
musicbrainz.album.getCoverArt(
albummeta.musicbrainz_id,
self.album.coverResponseHandler,
self.album.coverResponseHandler
);
return "";
} else {
debug.trace(medebug,parent.nowplayingindex," ... displaying what we've already got");
return (getCoverHTML(albummeta.musicbrainz.coverart));
}
}
this.artist = function() {
return {
populate: function() {
if (artistmeta.musicbrainz === undefined) {
artistmeta.musicbrainz = {};
}
if (artistmeta.musicbrainz_id == "") {
debug.shout(medebug,parent.nowplayingindex,"Artist asked to populate but no MBID, trying again in 2 seonds");
setTimeout(self.artist.populate, 2000);
return;
}
if (artistmeta.musicbrainz_id === null) {
debug.fail(medebug,parent.nowplayingindex,"Artist asked to populate but no MBID could be found. Aborting");
artistmeta.musicbrainz.artist = {error: language.gettext("musicbrainz_noartist")};
parent.updateData({
wikipedia: { artistlink: null },
discogs: { artistlink: null },
allmusic: { artistlink: null }
},
artistmeta
);
self.artist.doBrowserUpdate();
return;
}
if (artistmeta.musicbrainz.artist === undefined &&
artistmeta.musicbrainz[artistmeta.musicbrainz_id] === undefined) {
debug.trace(medebug,parent.nowplayingindex,"artist is populating",artistmeta.musicbrainz_id);
musicbrainz.artist.getInfo(artistmeta.musicbrainz_id, self.artist.mbResponseHandler, self.artist.mbResponseHandler);
} else {
debug.trace(medebug,parent.nowplayingindex,"artist is already populated",artistmeta.musicbrainz_id);
}
},
mbResponseHandler: function(data) {
debug.trace(medebug,parent.nowplayingindex,"got artist data for",artistmeta.musicbrainz_id,data);
// Look for the information that other plugins need
var update = { disambiguation: null,
wikipedia: { artistlink: null },
discogs: { artistlink: null },
allmusic: { artistlink: null }
};
if (data) {
if (data.error) {
artistmeta.musicbrainz.artist = data;
} else {
artistmeta.musicbrainz[artistmeta.musicbrainz_id] = data;
var wikilinks = { user: null, english: null, anything: null };
debug.trace(medebug,parent.nowplayingindex,"wikipedia language is",wikipedia.getLanguage());
var domain = '^http://'+wikipedia.getLanguage();
var re = new RegExp(domain);
for (var i in data.relations) {
if (data.relations[i].type == "wikipedia") {
debug.mark(medebug,parent.nowplayingindex,"has found a Wikipedia artist link",data.relations[i].url.resource);
// For wikipedia links we need to prioritise:
// user's chosen domain first
// english second
// followed by anything will do
// the php side will also try to use the link we choose to get language links for the
// user's chosen language, but it's definitely best if we prioritise them here
var wikitemp = data.relations[i].url.resource;
if (re.test(wikitemp)) {
debug.trace(medebug,parent.nowplayingindex,"found user domain wiki link");
wikilinks.user = wikitemp;
} else if (wikitemp.match(/en.wikipedia.org/)) {
debug.trace(medebug,parent.nowplayingindex,"found english domain wiki link");
wikilinks.english = wikitemp;
} else {
debug.trace(medebug,parent.nowplayingindex,"found wiki link");
wikilinks.anything = wikitemp;
}
}
if (data.relations[i].type == "discogs" && update.discogs.artistlink == null) {
debug.mark(medebug,parent.nowplayingindex,"has found a Discogs artist link",data.relations[i].url.resource);
update.discogs.artistlink = data.relations[i].url.resource;
}
if (data.relations[i].type == "allmusic" && update.allmusic.artistlink == null) {
debug.mark(medebug,parent.nowplayingindex,"has found an Allmusic artist link",data.relations[i].url.resource);
update.allmusic.artistlink = data.relations[i].url.resource;
}
}
if (update.wikipedia.artistlink == null) {
if (wikilinks.user) {
debug.trace(medebug,parent.nowplayingindex,"using user domain wiki link",wikilinks.user);
update.wikipedia.artistlink = wikilinks.user;
} else if (wikilinks.english) {
debug.trace(medebug,parent.nowplayingindex,"using english domain wiki link",wikilinks.english);
update.wikipedia.artistlink = wikilinks.english;
} else if (wikilinks.anything) {
debug.trace(medebug,parent.nowplayingindex,"using any old domain wiki link",wikilinks.anything);
update.wikipedia.artistlink = wikilinks.anything;
}
}
if (data.disambiguation) {
update.disambiguation = data.disambiguation;
}
}
} else {
artistmeta.musicbrainz.artist = {error: language.gettext("musicbrainz_noinfo")};
}
parent.updateData(update, artistmeta);
self.artist.doBrowserUpdate();
},
extraResponseHandler: function(data) {
if (data) {
debug.trace(medebug,parent.nowplayingindex,"got extra artist data for",data.id,data);
artistmeta.musicbrainz[data.id] = data;
putArtistData(artistmeta.musicbrainz[data.id], data.id);
}
},
releaseResponseHandler: function(data) {
if (data) {
debug.trace(medebug,parent.nowplayingindex,"got release data for",data.id,data);
artistmeta.musicbrainz[data.id] = data;
putArtistReleases(artistmeta.musicbrainz[data.id], data.id);
}
},
doBrowserUpdate: function() {
if (displaying) {
debug.trace(medebug,parent.nowplayingindex," artist was asked to display");
var up = null;
if (artistmeta.musicbrainz.artist !== undefined && artistmeta.musicbrainz.artist.error) {
up = { name: artistmeta.name,
link: null,
data: ''+artistmeta.musicbrainz.artist.error+'
'}
} else if (artistmeta.musicbrainz[artistmeta.musicbrainz_id] !== undefined) {
up = { name: artistmeta.musicbrainz[artistmeta.musicbrainz_id].name,
link: 'http://musicbrainz.org/artist/'+artistmeta.musicbrainz_id,
data: getArtistHTML(artistmeta.musicbrainz[artistmeta.musicbrainz_id], false)}
}
if (up !== null) {
browser.Update(
null,
'artist',
me,
parent.nowplayingindex,
up
);
}
}
},
}
}();
this.album = function() {
return {
populate: function() {
if (albummeta.musicbrainz === undefined) {
albummeta.musicbrainz = {};
}
if (albummeta.musicbrainz.album === undefined) {
if (albummeta.musicbrainz_id == "") {
debug.shout(medebug,parent.nowplayingindex,"Album asked to populate but no MBID, trying again in 2 seonds");
setTimeout(self.album.populate, 2000);
return;
}
if (albummeta.musicbrainz_id === null) {
debug.fail(medebug,parent.nowplayingindex,"Album asked to populate but no MBID could be found.");
albummeta.musicbrainz.album = {error: language.gettext("musicbrainz_noalbum")};
parent.updateData({
musicbrainz: { album_releasegroupid: null },
wikipedia: { albumlink: null },
discogs: { albumlink: null }
}, albummeta);
self.album.doBrowserUpdate();
return;
}
debug.trace(medebug,parent.nowplayingindex,"album is populating",albummeta.musicbrainz_id);
musicbrainz.album.getInfo(
albummeta.musicbrainz_id,
self.album.mbResponseHandler,
self.album.mbResponseHandler
);
} else {
debug.trace(medebug,parent.nowplayingindex,"album is already populated",albummeta.musicbrainz_id);
}
},
mbResponseHandler: function(data) {
debug.trace(medebug,parent.nowplayingindex,"got album data for",albummeta.musicbrainz_id);
// Look for the information that other plugins need
var update = {
musicbrainz: { album_releasegroupid: null },
wikipedia: { albumlink: null },
discogs: { albumlink: null }
};
if (data) {
albummeta.musicbrainz.album = data;
var wikilinks = { user: null, english: null, anything: null };
debug.trace(medebug,parent.nowplayingindex,"wikipedia language is",wikipedia.getLanguage());
var domain = '^http://'+wikipedia.getLanguage();
var re = new RegExp(domain);
for (var i in data.relations) {
if (data.relations[i].type == "wikipedia" && update.wikipedia.albumlink === null) {
debug.mark(medebug,parent.nowplayingindex,"has found a Wikipedia album link",data.relations[i].url.resource);
var wikitemp = data.relations[i].url.resource;
if (re.test(wikitemp)) {
debug.trace(medebug,parent.nowplayingindex,"found user domain wiki link");
wikilinks.user = wikitemp;
} else if (wikitemp.match(/en.wikipedia.org/)) {
debug.trace(medebug,parent.nowplayingindex,"found english domain wiki link");
wikilinks.english = wikitemp;
} else {
debug.trace(medebug,parent.nowplayingindex,"found wiki link");
wikilinks.anything = wikitemp;
}
}
if (data.relations[i].type == "discogs" && update.discogs.albumlink === null) {
debug.mark(medebug,parent.nowplayingindex,"has found a Discogs album link",data.relations[i].url.resource);
update.discogs.albumlink = data.relations[i].url.resource;
}
}
if (update.wikipedia.albumlink == null) {
if (wikilinks.user) {
debug.trace(medebug,parent.nowplayingindex,"using user domain wiki link",wikilinks.user);
update.wikipedia.albumlink = wikilinks.user;
} else if (wikilinks.english) {
debug.trace(medebug,parent.nowplayingindex,"using english domain wiki link",wikilinks.english);
update.wikipedia.albumlink = wikilinks.english;
} else if (wikilinks.anything) {
debug.trace(medebug,parent.nowplayingindex,"using any old domain wiki link",wikilinks.anything);
update.wikipedia.albumlink = wikilinks.anything;
}
}
if (data['release-group']) {
update.musicbrainz.album_releasegroupid = data['release-group'].id;
}
} else {
albummeta.musicbrainz.album = {error: language.gettext("musicbrainz_noinfo")};
}
parent.updateData(update,albummeta);
self.album.doBrowserUpdate();
},
coverResponseHandler: function(data) {
debug.mark(medebug,parent.nowplayingindex,"got Cover Art Data",data);
parent.updateData({ musicbrainz: { coverart: data }}, albummeta);
if (displaying) {
$("#coverart").html(getCoverHTML(albummeta.musicbrainz.coverart));
}
},
doBrowserUpdate: function() {
if (displaying && albummeta.musicbrainz.album !== undefined) {
debug.trace(medebug,parent.nowplayingindex,"album was asked to display");
var up = null;
if (parent.playlistinfo.type == 'stream') {
browser.Update(null, 'album', me, parent.nowplayingindex, { name: "",
link: "",
data: null
}
);
} else if (albummeta.musicbrainz.album.error) {
up = { name: albummeta.name,
link: null,
data: ''+albummeta.musicbrainz.album.error+'
'}
} else {
up = { name: albummeta.musicbrainz.album.title,
link: 'http://musicbrainz.org/release/'+albummeta.musicbrainz.album.id,
data: html = getAlbumHTML(albummeta.musicbrainz.album)}
}
browser.Update(
null,
'album',
me,
parent.nowplayingindex,
up
);
}
}
}
}();
this.track = function() {
return {
populate: function() {
if (trackmeta.musicbrainz === undefined) {
trackmeta.musicbrainz = {};
}
if (trackmeta.musicbrainz.track === undefined) {
if (trackmeta.musicbrainz_id == "") {
debug.shout(medebug,parent.nowplayingindex,"Track asked to populate but no MBID, trying again in 2 seonds");
setTimeout(self.track.populate, 2000);
return;
}
if (trackmeta.musicbrainz_id === null) {
debug.fail(medebug,parent.nowplayingindex,"Track asked to populate but no MBID could be found..");
trackmeta.musicbrainz.track = {};
trackmeta.musicbrainz.track.error = {error: language.gettext("musicbrainz_notrack")};
parent.updateData({
wikipedia: { tracklink: null },
discogs: { tracklink: null }
}, trackmeta);
self.track.doBrowserUpdate();
return;
}
debug.trace(medebug,parent.nowplayingindex,"track is populating",trackmeta.musicbrainz_id);
musicbrainz.track.getInfo(trackmeta.musicbrainz_id, self.track.mbResponseHandler, self.track.mbResponseHandler);
} else {
debug.trace(medebug,parent.nowplayingindex,"track is already populated",trackmeta.musicbrainz_id);
}
},
mbResponseHandler: function(data) {
debug.trace(medebug,parent.nowplayingindex,"got track data for",trackmeta.musicbrainz_id,data);
// Look for the information that other plugins need
var update = {
wikipedia: { tracklink: null },
discogs: { tracklink: null }
};
if (data) {
if (data.error) {
trackmeta.musicbrainz.track = {};
trackmeta.musicbrainz.track.error = data;
} else {
trackmeta.musicbrainz.track = data;
if (data.recording) {
for (var i in data.recording.relations) {
if (data.recording.relations[i].type == "wikipedia" && update.wikipedia.tracklink === null) {
debug.mark(medebug,parent.nowplayingindex,"has found a Wikipedia track link!!!!!",data.recording.relations[i].url.resource);
update.wikipedia.tracklink = data.recording.relations[i].url.resource;
}
if (data.recording.relations[i].type == "discogs" && update.discogs.tracklink === null) {
debug.mark(medebug,parent.nowplayingindex,"has found a Discogs track link!!!!!",data.recording.relations[i].url.resource);
update.discogs.tracklink = data.recording.relations[i].url.resource;
}
}
}
if (data.work) {
for (var i in data.work.relations) {
if (data.work.relations[i].type == "wikipedia" && update.wikipedia.tracklink === null) {
debug.mark(medebug,parent.nowplayingindex,"has found a Wikipedia track link!!!!!",data.work.relations[i].url.resource);
update.wikipedia.tracklink = data.work.relations[i].url.resource;
}
if (data.work.relations[i].type == "discogs" && update.discogs.tracklink === null) {
debug.mark(medebug,parent.nowplayingindex,"has found a Discogs track link!!!!!",data.work.relations[i].url.resource);
update.discogs.tracklink = data.work.relations[i].url.resource;
}
}
}
}
} else {
trackmeta.musicbrainz.track.error = {error: language.gettext("musicbrainz_noinfo")};
}
parent.updateData(update,trackmeta);
self.track.doBrowserUpdate();
},
doBrowserUpdate: function() {
if (displaying && trackmeta.musicbrainz.track !== undefined &&
(trackmeta.musicbrainz.track.error !== undefined ||
trackmeta.musicbrainz.track.recording !== undefined ||
trackmeta.musicbrainz.track.work !== undefined)) {
debug.trace(medebug,parent.nowplayingindex,"track was asked to display");
var link = null;
if (trackmeta.musicbrainz.track.recording) {
link = 'http://musicbrainz.org/recording/'+trackmeta.musicbrainz.track.recording.id;
}
browser.Update(
null,
'track',
me,
parent.nowplayingindex,
{ name: trackmeta.name,
link: link,
data: getTrackHTML(trackmeta.musicbrainz.track)
}
);
}
}
}
}();
}
}
}();
nowplaying.registerPlugin("musicbrainz", info_musicbrainz, "icon-musicbrainz", "button_musicbrainz");