<p> var base_url = "http://musicbrainz.org/ws/1/";
function get_text_from_node(start, tag) {
var nodes = start.getElementsByTagName(tag);
if (nodes.length > 0) {
var node = nodes[0];
if (node.childNodes.length > 0)
return node.childNodes[0].nodeValue;
}
return null;
}
function musicbrainz_request(service, mbid, args) {
var url = base_url+service+'/';
if (mbid)
url += mbid;
// XXX fulhack, since the musicbrainz api won't accept + urlencoded
url = acre.form.build_url(url, args).replace('%2B', '+');
var body = acre.urlfetch(url).body;
return acre.xml.parse(body);
}
function handle_relation_list(relation_list_nodes) {
var relations = {};
if (relation_list_nodes.length > 0) {
var relation_list_node = relation_list_nodes[0];
var relation_nodes = relation_list_node.childNodes;
for (var j = 0; j
var rel_type = relation_node.getAttribute('type');
var rel_target = relation_node.getAttribute('target');
var rel_begin = relation_node.getAttribute('begin');
var rel_end = relation_node.getAttribute('end');
var relation = {'type':rel_type, 'target':rel_target, 'begin':rel_begin, 'end':rel_end};
if (!(rel_type in relations)) {
relations[rel_type] = [];
}
relations[rel_type].push(relation);
}
}
return relations;
}
function get_relations_by_album(id, mbid) {
if (typeof mbid == 'undefined') {
var q = acre.require('get_artist_album_mbid').query;
var res = acre.freebase.mqlread(acre.freebase.extend_query(q, {'id':id})).result;
var album_wpids = {};
if (!res) return {};
for (var a in res['wp:key']) {
var wpkey = res['wp:key'][a];
album_wpids[wpkey.value] = true;
}
var mbid = null;
if (res !== null && res.key !== null) {
mbid = res.key.value;
} else if (res !== null && res.releases !== null && res.releases.key !== null) {
mbid = res.releases.key.value;
}
}
if (mbid !== null) {
var mbres = musicbrainz_request('release', mbid, {'type':'xml', inc:'url-rels'});
var relation_list_nodes = mbres.getElementsByTagName('relation-list');
var relations = handle_relation_list(relation_list_nodes);
if (typeof id == 'undefined') {
// reverse the Wikipedia relationship to find a matching freebase id
if (!('Wikipedia' in relations)) {
return {'relations':relations, 'mbid':mbid, 'id':null};
} else {
var wpkeys= [];
for (var a in relations['Wikipedia']) {
var wp_rel = relations['Wikipedia'][a];
wpkeys.push(acre.freebase.mqlkey_quote(decodeURIComponent(wp_rel.target.split('/').pop())));
}
var q = acre.require('resolve_wpkey').query;
q = acre.freebase.extend_query(q, {'key.value|=': wpkeys});
var wp_key_ids = acre.freebase.mqlread(q).result;
return {'relations':relations, 'mbid':mbid, 'id':wp_key_ids.id};
}
}
return {'relations':relations, 'mbid':mbid, 'id':id};
} else if (res.artist !== null && res.artist.key !== null) {
var artist_mbid = res.artist.key.value;
var mbres = musicbrainz_request('artist', artist_mbid, {'type':'xml', 'inc':'url-rels+sa-Album'});
var release_nodes = mbres.getElementsByTagName('release');
for (var i = 0; i </p>