musicbrainz-userscripts/hdtracks_importer.user.js
David Kellner 17be011a33 hdtracks: Fix ESLint errors
Forgo optional chaining which is an ES2020 feature. It feels odd to
raise the ES version even further for such a minor improvement.
2021-10-17 23:00:22 +02:00

94 lines
4.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ==UserScript==
// @name Import HDtracks releases into MusicBrainz
// @namespace https://github.com/murdos/musicbrainz-userscripts/
// @description One-click importing of releases from hdtracks.com into MusicBrainz.
// @version 2021.9.16.1
// @downloadURL https://raw.githubusercontent.com/murdos/musicbrainz-userscripts/master/hdtracks_importer.user.js
// @updateURL https://raw.githubusercontent.com/murdos/musicbrainz-userscripts/master/hdtracks_importer.user.js
// @match *://www.hdtracks.com/
// @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js
// @require lib/mbimport.js
// @require lib/mbimportstyle.js
// @icon https://raw.githubusercontent.com/murdos/musicbrainz-userscripts/master/assets/images/Musicbrainz_import_logo.png
// @grant GM_xmlhttpRequest
// ==/UserScript==
// prevent JQuery conflicts, see http://wiki.greasespot.net/@grant
this.$ = this.jQuery = jQuery.noConflict(true);
$(document).ready(function () {
MBImportStyle();
window.onhashchange = parsePage; // HDtracks is a single page app (SPA)
});
async function parsePage() {
const releaseMatch = window.location.hash.match(/#\/album\/(.+)/);
if (!releaseMatch) return; // SPA currently shows a different type of page
const releaseId = releaseMatch[1];
// our buttons might already be there since the SPA caches the previous page for "also available in"
if (document.getElementById(`mb-import-ui-${releaseId}`)) return;
const url = window.location.href;
const apiUrl = `https://hdtracks.azurewebsites.net/api/v1/album/${releaseId}`;
const response = await fetch(apiUrl);
const release = parseHDtracksRelease(await response.json(), url);
insertButtons(release, url);
}
function parseHDtracksRelease(data, releaseUrl) {
const releaseDate = new Date(data.release);
const release = {
id: data.productId, // not used as release editor seed
title: data.name,
artist_credit: data.artists.map(name => ({ artist_name: name })),
barcode: data.upc,
labels: [{ name: data.label }],
year: releaseDate.getFullYear(),
month: releaseDate.getMonth() + 1,
day: releaseDate.getDate(),
comment: data.quality.replace(' · ', '/'),
annotation: [data.cLine, data.pLine, '\n== Credits (HDtracks) ==\n', data.credits].join('\n'),
discs: [],
urls: [],
packaging: 'None',
status: 'official',
script: 'Latn',
};
release.discs.push({
// disc numbers of the tracks are not available for releases with multiple discs!
format: 'Digital Media',
tracks: data.tracks.map(track => ({
number: track.index,
title: track.name,
artist_credit: [{ artist_name: track.mainArtist }], // TODO: try to split strings into multiple artists?
duration: track.duration * 1000,
isrc: track.isrc, // not used as release editor seed
})),
});
release.urls.push({
link_type: MBImport.URL_TYPES.purchase_for_download,
url: releaseUrl,
});
return release;
}
function insertButtons(release, releaseUrl) {
const editNote = MBImport.makeEditNote(releaseUrl, 'HDtracks');
const formParameters = MBImport.buildFormParameters(release, editNote);
const importerUI = $(`<div id="mb-import-ui-${release.id}" class="musicbrainz_import" style="line-height: 2.5em">
${MBImport.buildFormHTML(formParameters)}
${MBImport.buildSearchButton(release)}
</div>`).hide();
$('<button type="button" title="Submit ISRCs to MusicBrainz with kepstins MagicISRC">Submit ISRCs</button>')
.on('click', () => {
const allTracks = release.discs.map(disc => disc.tracks).flat();
const query = allTracks.map(track => `isrc${track.number}=${track.isrc}`).join('&');
window.open(`https://magicisrc.kepstin.ca?${query}`);
})
.appendTo(importerUI);
$('div.page-current div.album-buttons-group').prepend(importerUI);
importerUI.slideDown();
}