NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name mb. PLAIN TEXT TRACKLIST
// @version 2022.9.26.1
// @description Get a quick copy of the tracklists in plain text (several formats) for quick re-use (in track parser, EAC, foobar2000 or mp3tag for instance)
// @namespace https://github.com/jesus2099/konami-command
// @supportURL https://github.com/jesus2099/konami-command/labels/mb_PLAIN-TEXT-TRACKLIST
// @downloadURL https://github.com/jesus2099/konami-command/raw/master/mb_PLAIN-TEXT-TRACKLIST.user.js
// @author jesus2099
// @licence CC-BY-NC-SA-4.0; https://creativecommons.org/licenses/by-nc-sa/4.0/
// @licence GPL-3.0-or-later; http://www.gnu.org/licenses/gpl-3.0.txt
// @since 2010-10-28; https://web.archive.org/web/20131119110027/userscripts.org/scripts/show/89036 / https://web.archive.org/web/20141011084012/userscripts-mirror.org/scripts/show/89036
// @icon data:image/gif;base64,R0lGODlhEAAQAKEDAP+/3/9/vwAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh/glqZXN1czIwOTkAIfkEAQACAwAsAAAAABAAEAAAAkCcL5nHlgFiWE3AiMFkNnvBed42CCJgmlsnplhyonIEZ8ElQY8U66X+oZF2ogkIYcFpKI6b4uls3pyKqfGJzRYAACH5BAEIAAMALAgABQAFAAMAAAIFhI8ioAUAIfkEAQgAAwAsCAAGAAUAAgAAAgSEDHgFADs=
// @require https://github.com/jesus2099/konami-command/raw/de88f870c0e6c633e02f32695e32c4f50329fc3e/lib/SUPER.js?version=2022.3.24.224
// @grant none
// @include /^https?:\/\/(\w+\.)?musicbrainz\.org\/release\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(\/disc\/\d+#[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})?/
// @run-at document-end
// ==/UserScript==
"use strict";
/* - --- - --- - --- - START OF CONFIGURATION - --- - --- - --- -
patterns: tweak the result tracklist using \n for new lines
nextDisc: used to show when going next medium/tracklist in multi-discs releases */
var patterns = {
"Track\u00A0parser": {
withoutTrackArtists: "%tracknumber%. %title% (%length%)\n",
withTrackArtists: "%tracknumber%. %title% - %artist% (%length%)\n"
},
"Always\u00A0artists": {
withTrackArtists: "%tracknumber%. %title% - %artist% (%length%)\n"
},
"No\u00A0times": {
withoutTrackArtists: "%tracknumber%. %title%\n",
withTrackArtists: "%tracknumber%. %title% - %artist%\n"
},
"EAC": {
withoutTrackArtists: "%title%\n",
withTrackArtists: "%title% / %artist%\n"
},
};
var nextDisc = "\n";
/* - --- - --- - --- - END OF CONFIGURATION - --- - --- - --- - */
var userjs = "jesus2099plainTextTracklist";
var tracks = document.querySelectorAll("div#content > table.tbl > tbody > tr[id]");
/* ## PLAIN TEXT TRACKLIST ## */
function textTracklist(tracks, patt) {
// link to mb_INLINE-STUFF (start)
var inlineStuffedRecordingNames = document.querySelectorAll("a[jesus2099userjs81127recname]");
for (var n = 0; n < inlineStuffedRecordingNames.length; n++) {
replaceChildren(createTag("bdi", {}, inlineStuffedRecordingNames[n].getAttribute("jesus2099userjs81127recname")), inlineStuffedRecordingNames[n]);
inlineStuffedRecordingNames[n].removeAttribute("jesus2099userjs81127recname");
}
var inlineStuffedRecordingComments = document.querySelectorAll("span.jesus2099userjs81127recdis");
for (var c = 0; c < inlineStuffedRecordingComments.length; c++) {
removeNode(inlineStuffedRecordingComments[c]);
}
// link to mb_INLINE-STUFF (end)
var pattern = patterns[patt].withoutTrackArtists;
var replaces = [
[/%artist%/g, "artist"],
[/%length%/g, "length"],
[/%title%/g, "title"],
[/%tracknumber%/g, "tracknumber"],
];
var tracklist = "";
for (var i = 0; i < tracks.length; i++) {
var tracknumber = tracks[i].querySelector("td.pos").textContent.trim();
if (tracknumber == "1" && i != 0) { tracklist += nextDisc; }
// eslint-disable-next-line no-unused-vars -- title sera utilisée par un eval(), plus loin
var title = (tracks[i].querySelector("td:not(.pos):not(.video) a[href^='/recording/']").textContent);
var artist = tracks[i].querySelector("td:not([class]) + td:not([class])");
if (artist) {
artist = artist.textContent.trim();
pattern = patterns[patt].withTrackArtists || patterns[patt].withoutTrackArtists;
} else if (!patterns[patt].withoutTrackArtists) {
pattern = patterns[patt].withTrackArtists;
artist = JSON.parse(document.querySelector("script[type='application/ld+json']").textContent).creditedTo;
}
// eslint-disable-next-line no-unused-vars -- length sera utilisée par un eval(), plus loin
var length = tracks[i].querySelector("td.treleases").textContent.replace(/[^0-9:(?)]/g, "");
var txt = pattern;
for (var j = 0; j < replaces.length; j++) {
txt = txt.replace(replaces[j][0], eval(replaces[j][1]));
}
tracklist += txt.replace(" (?:??)", "");
}
return tracklist;
}
if (tracks.length > 0) {
for (var p in patterns) if (Object.prototype.hasOwnProperty.call(patterns, p)) {
var a = document.createElement("a");
a.style.setProperty("cursor", "pointer");
a.addEventListener("click", function(event) {
function coolstuff(tagName, zIndex, size, background, opacity) {
var truc = document.body.appendChild(document.createElement(tagName));
truc.style.setProperty("position", "fixed");
truc.style.setProperty("z-index", zIndex);
truc.style.setProperty("top", (100 - size) / 2 + "%");
truc.style.setProperty("left", (100 - size) / 2 + "%");
truc.style.setProperty("width", size + "%");
truc.style.setProperty("height", size + "%");
if (background) { truc.style.setProperty("background", background); }
if (opacity) { truc.style.setProperty("opacity", opacity); }
return truc;
}
coolstuff("div", "50", 100, "black", ".6").addEventListener("click", function(event) {
this.parentNode.removeChild(this.nextSibling);
this.parentNode.removeChild(this);
});
var thisisit = coolstuff("textarea", "55", 80);
thisisit.style.setProperty("font-family", "sans-serif");
thisisit.addEventListener("keydown", function(event) {
if (event.key == "Escape") { this.previousSibling.click(); }
});
thisisit.appendChild(document.createTextNode(textTracklist(tracks, this.getAttribute("rel"))));
thisisit.setAttribute("title", "press ESC to close");
thisisit.select();
});
a.appendChild(document.createTextNode(p));
a.setAttribute("rel", p);
var relprop = document.querySelector("div#sidebar dl.properties");
if (relprop) {
var tlddid = userjs + "tracklists";
var tldd = relprop.querySelector("dd#" + tlddid);
var sep = ", ";
if (!tldd) {
relprop.appendChild(document.createElement("dt")).appendChild(document.createTextNode("Tracklist:"));
tldd = relprop.appendChild(document.createElement("dd"));
tldd.setAttribute("id", tlddid);
sep = "";
}
tldd.appendChild(document.createTextNode(sep));
tldd.appendChild(a);
}
}
}