mirror of
https://github.com/murdos/musicbrainz-userscripts
synced 2025-03-04 06:17:16 +00:00
Merge pull request #575 from djl/boomkat-fixes-no-jquery
This commit is contained in:
commit
720e6c1726
2 changed files with 77 additions and 72 deletions
|
@ -69,6 +69,7 @@ One-click importing of releases from beatport.com/release pages into MusicBrainz
|
|||
Add a button on Boomkat release pages to open MusicBrainz release editor with pre-filled data for the selected release
|
||||
|
||||
[](https://github.com/murdos/musicbrainz-userscripts/blob/master/boomkat_importer.user.js)
|
||||
[](https://raw.githubusercontent.com/murdos/musicbrainz-userscripts/master/boomkat_importer.user.js)
|
||||
|
||||
## <a name="cd1d_importer"></a> Import CD1D releases to MusicBrainz
|
||||
|
||||
|
@ -170,7 +171,7 @@ One-click importing of releases from vgmdb.net into MusicBrainz
|
|||
|
||||
## <a name="mb_1200px_caa"></a> MusicBrainz: 1200px CAA
|
||||
|
||||
Use the 1200px images for the pop‐up/previews on Release cover art pages. (Also adds 1200px “thumbnail” links.)
|
||||
Use the 1200px images for the pop‐up/previews on Release cover art pages.
|
||||
|
||||
[](https://github.com/murdos/musicbrainz-userscripts/blob/master/mb_1200px_caa.user.js)
|
||||
[](https://raw.githubusercontent.com/murdos/musicbrainz-userscripts/master/mb_1200px_caa.user.js)
|
||||
|
|
|
@ -1,44 +1,36 @@
|
|||
// ==UserScript==
|
||||
// @name Import Boomkat releases to Musicbrainz
|
||||
// @description Add a button on Boomkat release pages to open MusicBrainz release editor with pre-filled data for the selected release
|
||||
// @version 2020.07.21.1
|
||||
// @version 2024.09.10.1
|
||||
// @license X11
|
||||
// @downloadURL https://raw.githubusercontent.com/murdos/musicbrainz-userscripts/master/boomkat_importer.user.js
|
||||
// @updateURL https://raw.githubusercontent.com/murdos/musicbrainz-userscripts/master/boomkat_importer.user.js
|
||||
// @namespace https://github.com/murdos/musicbrainz-userscripts
|
||||
// @include https://boomkat.com/products/*
|
||||
// @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js
|
||||
// @require lib/mbimport.js
|
||||
// @require lib/logger.js
|
||||
// @require lib/mbimportstyle.js
|
||||
|
||||
// ==/UserScript==
|
||||
|
||||
// prevent JQuery conflicts, see http://wiki.greasespot.net/@grant
|
||||
this.$ = this.jQuery = jQuery.noConflict(true);
|
||||
|
||||
if (!unsafeWindow) unsafeWindow = window;
|
||||
|
||||
$(document).ready(function () {
|
||||
async function onLoad() {
|
||||
MBImportStyle();
|
||||
|
||||
const release_url = window.location.href.replace('/?.*$/', '').replace(/#.*$/, '');
|
||||
let release = retrieveReleaseInfo(release_url);
|
||||
insertLink(release, release_url, true);
|
||||
await fetchTracksAndInsertLink(release_url);
|
||||
|
||||
// Update the release info when a different tab/format is
|
||||
// selected. We need a timeout here due to a slight delay between
|
||||
// clicking the tab and the tab's classes (and the tracklist)
|
||||
// being updated.
|
||||
$('ul.tabs li.tab-title a').click(function () {
|
||||
setTimeout(function () {
|
||||
release = retrieveReleaseInfo(release_url);
|
||||
updateLink(release, release_url, false);
|
||||
}, 150);
|
||||
// selected. We pass the event target down to fetchTracksAndInsertLink
|
||||
// so we can easily fetch the format type from the clicked link.
|
||||
// Without this, we'd need to resort to delays which are... inconsistent
|
||||
// on Boomkat.
|
||||
document.querySelectorAll('ul.tabs li.tab-title a').forEach(function (elem) {
|
||||
elem.addEventListener('click', async function (event) {
|
||||
await fetchTracksAndInsertLink(release_url, event.target);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
function getFormat() {
|
||||
const format = $('ul.tabs .tab-title.active a').text().trim();
|
||||
}
|
||||
|
||||
function getFormat(format) {
|
||||
if (format.match(/MP3|WAV|FLAC/i)) {
|
||||
return 'Digital Media';
|
||||
}
|
||||
|
@ -65,14 +57,19 @@ function getLinkType(media) {
|
|||
return MBImport.URL_TYPES.purchase_for_mail_order;
|
||||
}
|
||||
|
||||
function retrieveReleaseInfo(release_url) {
|
||||
const releaseDateStr = $('span.release-date-placeholder').first().text().replace('Release date: ', '');
|
||||
async function fetchTracksAndInsertLink(release_url, formatElement) {
|
||||
const release = await retrieveReleaseInfo(release_url, formatElement);
|
||||
insertLink(release, release_url);
|
||||
}
|
||||
|
||||
async function retrieveReleaseInfo(release_url, formatElement) {
|
||||
const releaseDateStr = document.querySelector('span.release-date-placeholder').textContent.replace('Release date: ', '');
|
||||
const releaseDate = new Date(releaseDateStr);
|
||||
const artist = $('h1.detail--artists').text().trim();
|
||||
const artist = document.querySelector('h1.detail--artists').textContent.trim();
|
||||
|
||||
const release = {
|
||||
artist_credit: MBImport.makeArtistCredits([artist]),
|
||||
title: $('h2.detail_album').text().trim(),
|
||||
title: document.querySelector('h2.detail_album').textContent.trim(),
|
||||
year: releaseDate.getUTCFullYear(),
|
||||
month: releaseDate.getUTCMonth() + 1,
|
||||
day: releaseDate.getUTCDate(),
|
||||
|
@ -88,14 +85,18 @@ function retrieveReleaseInfo(release_url) {
|
|||
|
||||
// Labels
|
||||
release.labels.push({
|
||||
name: $('span.label-placeholder a').first().text(),
|
||||
catno: $('span.catalogue-number-placeholder')
|
||||
.text()
|
||||
.replace(/Cat No:/, ''),
|
||||
name: document.querySelector('span.label-placeholder a').textContent,
|
||||
catno: document.querySelector('span.catalogue-number-placeholder').textContent.replace(/Cat No:/, ''),
|
||||
});
|
||||
|
||||
// Format/packaging
|
||||
release.format = getFormat();
|
||||
let format;
|
||||
if (formatElement != null) {
|
||||
format = formatElement.textContent.trim();
|
||||
} else {
|
||||
format = document.querySelector('ul.tabs .tab-title.active a').textContent.trim();
|
||||
}
|
||||
release.format = getFormat(format);
|
||||
release.packaging = release.format == 'Digital Media' ? 'None' : '';
|
||||
|
||||
// URLs
|
||||
|
@ -108,56 +109,59 @@ function retrieveReleaseInfo(release_url) {
|
|||
// Boomkat loads the tracklist dynamically. Using setTimeout()
|
||||
// here is not consistent for reasons I have not yet figured out.
|
||||
// For now, just fetch the tracks the same way Boomkat does.
|
||||
const releaseID = $('a.play-all').first().data('audio-player-release');
|
||||
const releaseID = document.querySelector('a.play-all').dataset.audioPlayerRelease;
|
||||
const tracklistURL = `https://boomkat.com/tracklist/${releaseID}`;
|
||||
const tracks = [];
|
||||
$.ajax({
|
||||
url: tracklistURL,
|
||||
async: false,
|
||||
success: function (data) {
|
||||
$($.parseHTML(data))
|
||||
.find('div.table-row.track.mp3.clearfix a')
|
||||
.each(function (index, link) {
|
||||
tracks.push({
|
||||
artist_credit: MBImport.makeArtistCredits([$(link).data('artist')]),
|
||||
title: $(link).data('name'),
|
||||
duration: $(link).siblings('.time').first().text(),
|
||||
});
|
||||
});
|
||||
|
||||
release.discs.push({
|
||||
tracks: tracks,
|
||||
format: release.format,
|
||||
});
|
||||
},
|
||||
const response = await fetch(tracklistURL);
|
||||
const body = await response.text();
|
||||
const doc = document.implementation.createHTMLDocument('');
|
||||
doc.body.innerHTML = body;
|
||||
doc.querySelectorAll('div.table-row.track.mp3.clearfix a').forEach(function (link) {
|
||||
tracks.push({
|
||||
artist_credit: MBImport.makeArtistCredits([link.dataset.artist]),
|
||||
title: link.dataset.name,
|
||||
duration: link.dataset.duration,
|
||||
});
|
||||
});
|
||||
release.discs.push({
|
||||
tracks: tracks,
|
||||
format: release.format,
|
||||
});
|
||||
LOGGER.info('Parsed release: ', release);
|
||||
return release;
|
||||
}
|
||||
|
||||
function updateLink(release, release_url) {
|
||||
$('.musicbrainz-import').remove();
|
||||
$('.musicbrainz_import_add').remove();
|
||||
insertLink(release, release_url, false);
|
||||
}
|
||||
// Insert button into page
|
||||
function insertLink(release, release_url) {
|
||||
// Remove any existing buttons
|
||||
document.querySelectorAll('.musicbrainz-import').forEach(function (elem) {
|
||||
elem.remove();
|
||||
});
|
||||
|
||||
// Insert button into page under label information
|
||||
function insertLink(release, release_url, animate) {
|
||||
const edit_note = MBImport.makeEditNote(release_url, 'Boomkat');
|
||||
const parameters = MBImport.buildFormParameters(release, edit_note);
|
||||
|
||||
const mbUI = $(
|
||||
`<li class="tab-title musicbrainz-import">${MBImport.buildFormHTML(parameters)}</li>
|
||||
<li class="tab-title musicbrainz-import">${MBImport.buildSearchButton(release)}</li>`
|
||||
);
|
||||
const div = document.createElement('div');
|
||||
div.className = 'product-note';
|
||||
|
||||
if (animate) {
|
||||
mbUI.hide();
|
||||
}
|
||||
const formButton = document.createElement('span');
|
||||
formButton.className = 'tab-title musicbrainz-import';
|
||||
formButton.innerHTML = MBImport.buildFormHTML(MBImport.buildFormParameters(release, edit_note));
|
||||
formButton.style.display = 'inline-block';
|
||||
|
||||
$('ul.tabs.product-page-tabs').append(mbUI);
|
||||
const searchButton = document.createElement('span');
|
||||
searchButton.className = 'tab-title musicbrainz-import';
|
||||
searchButton.innerHTML = MBImport.buildSearchButton(release);
|
||||
searchButton.style.display = 'inline-block';
|
||||
|
||||
if (animate) {
|
||||
mbUI.slideDown();
|
||||
}
|
||||
div.appendChild(formButton);
|
||||
div.appendChild(searchButton);
|
||||
|
||||
const albumHeader = document.querySelector('h2.detail_album');
|
||||
albumHeader.after(div);
|
||||
}
|
||||
|
||||
if (document.readyState !== 'loading') {
|
||||
onLoad();
|
||||
} else {
|
||||
document.addEventListener('DOMContentLoaded', onLoad);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue