close

  
<p> var base_url = "http://musicbrainz.org/ws/1/";

function get_text_from_node(start, tag) {
  var nodes = start.getElementsByTagName(tag);
  if (nodes.length &gt; 0) {
    var node = nodes[0];
    if (node.childNodes.length &gt; 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 &gt; 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 &amp;&amp; res.key !== null) {
      mbid = res.key.value;  
    } else if (res !== null &amp;&amp; res.releases !== null &amp;&amp; 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 &amp;&amp; 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>

Comments

Hide