-
Notifications
You must be signed in to change notification settings - Fork 92
/
hdtracks_importer.user.js
98 lines (89 loc) · 4.38 KB
/
hdtracks_importer.user.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// ==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. Also allows to submit their ISRCs to MusicBrainz releases.
// @version 2021.11.21.1
// @author kellnerd
// @license MIT
// @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.addEventListener('hashchange', 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 audioQuality = data.quality.replace(' · ', '/');
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.getUTCFullYear(),
month: releaseDate.getUTCMonth() + 1,
day: releaseDate.getUTCDate(),
comment: audioQuality != '44.1kHz/16bit' ? audioQuality : '',
annotation: [`${audioQuality} available on HDtracks`, data.cLine, data.pLine].join('\n'),
// `data.credits` is currently not included as it is unclear for which tracks the individual credits apply
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 kepstin’s 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();
}