musicbrainz-userscripts/metalarchives_importer.user.js

269 lines
8.4 KiB
JavaScript

// ==UserScript==
// @name Import Metal Archives releases into MusicBrainz
// @namespace https://github.com/murdos/musicbrainz-userscripts/
// @version 2018.2.18.1
// @description Add a button on Metal Archives release pages allowing to open MusicBrainz release editor with pre-filled data for the selected release
// @downloadURL https://raw.github.com/murdos/musicbrainz-userscripts/master/metalarchives_importer.user.js
// @update https://raw.github.com/murdos/musicbrainz-userscripts/master/metalarchives_importer.user.js
// @include http*://www.metal-archives.com/albums/*/*/*
// @require https://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js
// @require lib/mbimport.js
// @require lib/mbimportstyle.js
// @require lib/logger.js
// @icon https://raw.githubusercontent.com/murdos/musicbrainz-userscripts/master/assets/images/Musicbrainz_import_logo.png
// ==/UserScript==
// prevent JQuery conflicts, see http://wiki.greasespot.net/@grant
this.$ = this.jQuery = jQuery.noConflict(true);
$(document).ready(function() {
MBImportStyle();
let release_url = window.location.href.replace('/?.*$/', '').replace(/#.*$/, '');
let release = retrieveReleaseInfo(release_url);
insertLink(release, release_url);
LOGGER.info('Parsed release: ', release);
});
function setreleasedate(release, datestring) {
if (/^\d{4}$/.exec(datestring)) {
release.year = datestring;
} else if (datestring.indexOf(',') != -1) {
let commaindex = datestring.indexOf(',');
var d = new Date(datestring.substring(0, commaindex - 2) + datestring.substring(commaindex));
release.year = d.getFullYear();
release.month = d.getMonth() + 1;
release.day = d.getDate();
} else {
var d = new Date(`2 ${datestring}`);
release.year = d.getFullYear();
release.month = d.getMonth() + 1;
}
return release;
}
function getGenericalData() {
let rdata = new Array();
let keydata = $('dl.float_left dt, dl.float_right dt')
.map(function() {
let s = $.trim($(this).text());
return s.substring(0, s.length - 1);
})
.get();
let valuedata = $('dl.float_left dd,dl.float_right dd')
.map(function() {
return $.trim($(this).text());
})
.get();
for (i = 0; i < keydata.length; i++) {
rdata[keydata[i]] = valuedata[i];
}
return rdata;
}
function getArtistsList() {
return $.map(
$('h2.band_name')
.text()
.split('/'),
$.trim
);
}
function retrieveReleaseInfo(release_url) {
let release = {
discs: [],
artist_credit: [],
title: '',
year: 0,
month: 0,
day: 0,
parent_album_url: '',
labels: [],
format: '',
country: '',
type: '',
status: 'official',
packaging: '',
language: '',
script: '',
urls: []
};
let rdata = getGenericalData();
let artists = getArtistsList();
let joinphrase = '';
if (artists.length > 1) {
if (rdata['Type'] == 'Split') {
joinphrase = ' / ';
} else {
joinphrase = ' & ';
}
}
for (let i = 0; i < artists.length; i++) {
release.artist_credit.push({
artist_name: artists[i],
credited_name: artists[i],
joinphrase: i != artists.length - 1 ? joinphrase : ''
});
}
release.title = $('h1.album_name').text();
release = setreleasedate(release, rdata['Release date']);
if ('Label' in rdata) {
// TODO: add case for multiple labels if such a case exist
let label = rdata['Label'];
let label_mbid = '';
if (label == 'Independent') {
label = '[no label]';
label_mbid = '157afde4-4bf5-4039-8ad2-5a15acc85176';
}
let catno = rdata['Catalog ID'];
if (catno == undefined || catno == 'N/A') {
catno = '';
}
release.labels.push({
name: label,
catno: catno,
mbid: label_mbid
});
}
if (rdata['Type'] in ReleaseTypes) {
let types = ReleaseTypes[rdata['Type']];
release.type = types[0];
// NOTE: secondary type may not be selected on MB editor, but it still works, a bug on MB side
release.secondary_types = types.slice(1);
}
// FIXME: multiple vinyls ie. http://www.metal-archives.com/albums/Reverend_Bizarre/III%3A_So_Long_Suckers/415313
if (rdata['Format'] in ReleaseFormat) {
release.format = ReleaseFormat[rdata['Format']];
}
if ('Version desc.' in rdata) {
if (rdata['Version desc.'].indexOf('Digipak') != -1) {
release.packaging = 'Digipak';
}
if (release.format == 'CD' && rdata['Version desc.'] == 'CD-R') {
release.format = 'CD-R';
}
}
let identifiers = $('#album_tabs_notes > div:nth-child(2)')
.find('p:not([class])')
.contents();
for (let j = 0; j < identifiers.length; j++) {
if (identifiers[j].textContent.indexOf('Barcode:') != -1) {
release.barcode = $.trim(identifiers[j].textContent.substring(8));
break;
}
}
// URLs
let link_type = MBImport.URL_TYPES;
release.urls.push({
url: release_url,
link_type: link_type.other_databases
});
let releaseNumber = 0;
let disc = {
tracks: [],
format: release.format
};
release.discs.push(disc);
let tracksline = $('table.table_lyrics tr.even,table.table_lyrics tr.odd');
tracksline.each(function(index, element) {
let trackNumber = $.trim(element.children[0].textContent).replace('.', '');
if (trackNumber == '1' && trackNumber != index + 1) {
releaseNumber++;
release.discs.push({
tracks: [],
format: release.format
});
}
// TODO: handling of split and compilation artists (artist - title)
let track = {
number: trackNumber,
title: $.trim(element.children[1].textContent.replace(/\s+/g, ' ')),
duration: $.trim(element.children[2].textContent),
artist_credit: [release.artist_credit]
};
release.discs[releaseNumber].tracks.push(track);
});
return release;
}
// Insert button into page under label information
function insertLink(release, release_url) {
let edit_note = MBImport.makeEditNote(release_url, 'Metal Archives');
let parameters = MBImport.buildFormParameters(release, edit_note);
let mbUI = $(`<div id="musicbrainz-import">${MBImport.buildFormHTML(parameters)}${MBImport.buildSearchButton(release)}</div>`).hide();
$('h2.band_name').after(mbUI);
$('#musicbrainz-import form').css({
padding: '0'
});
$('form.musicbrainz_import').css({
display: 'inline-block',
margin: '1px'
});
$('form.musicbrainz_import img').css({
display: 'inline-block'
});
mbUI.slideDown();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Metal Archives -> MusicBrainz mapping //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
release.type primary type release secondary release type
on MA on MB
Full-length Album Compilation
Live album Single Demo
Demo EP DJ-mix
Single Broadcast Interview
EP Other Live
Video Audiobook
Boxed set Mixtape/Street
Split Remix
Video/VHS (legacy) Soundtrack
Compilation Spokenword
Split video
*/
//ReleaseTypes[MAtype]=["primary type","secondary type on mb"];
var ReleaseTypes = {
'Full-length': ['album'],
'Live album': ['album', 'live'],
Demo: ['album', 'demo'],
Single: ['single'],
EP: ['ep'],
Compilation: ['album', 'compilation'],
Split: ['album'],
Collaboration: ['']
};
//ReleaseFormat[MAformat]="MBformat";
var ReleaseFormat = {
CD: 'CD',
'2CD': 'CD',
Vinyl: 'Vinyl',
'7" vinyl': '7" Vinyl',
'7" vinyl (33⅓ RPM)': '7" Vinyl',
'10" vinyl (33⅓ RPM)': '10" Vinyl',
'10" vinyl': '10" Vinyl',
'12" vinyl': '12" Vinyl',
'2 12" vinyls': '12" Vinyl',
'12" vinyl (33⅓ RPM)': '12" Vinyl',
Cassette: 'Cassette',
Digital: 'Digital Media'
};