Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ==UserScript==
- // @name MusicBrainz: Set recording comments for a release
- // @version 2011-12-27
- // @author Michael Wiencek
- // @namespace http://userscripts.org/users/266906
- // @include http://musicbrainz.org/release/*
- // @include http://test.musicbrainz.org/release/*
- // @include http://beta.musicbrainz.org/release/*
- // ==/UserScript==
- var scr = document.createElement("script");
- scr.textContent = "(" + recording_comments + ")();";
- document.body.appendChild(scr);
- function recording_comments() {
- var $tracks = $("tr").filter(function() {return $(this).attr("typeof") == "mo:Track";});
- if ($tracks.length == 0)
- return;
- var MBID_REGEX = /[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/,
- location = window.location.href;
- if (location.match(/\/edits$/) || location.match(/\/release\/add/))
- return;
- var release = location.match(MBID_REGEX)[0],
- editing = false, submitting = false;
- function RequestManager(rate) {
- this.queue = [];
- this.last = 0;
- this.next = function() {
- var request = this.queue.shift();
- if (request) {
- request();
- this.last = new Date().getTime();
- if (this.queue.length > 0) {
- setTimeout(function(foo) {foo.next();}, rate, this);
- }
- }
- }
- this.push = function(req) {
- this.queue.push(req);
- if (this.queue.length == 1)
- this.start_queue();
- }
- this.unshift = function(req) {
- this.queue.unshift(req);
- if (this.queue.length == 1)
- this.start_queue();
- }
- this.start_queue = function() {
- var now = new Date().getTime();
- if (now - this.last >= rate) {
- this.next();
- } else {
- setTimeout(function(foo) {foo.next();},
- rate - now + this.last, this);
- }
- }
- }
- function button(text) {
- return $("<button>" + text + "</button>")
- .css({"color": "#565656",
- "background-color": "#F0F0F0",
- "border": "1px solid #D0D0D0",
- "border-top": "1px solid #EAEAEA",
- "border-left": "1px solid #EAEAEA"});
- }
- $.each($tracks, function(i, track) {
- var $td = $($(track).children("td")[1]), node = $td.children(".mp")[0];
- if (node === undefined) {
- node = $td.children("a[rel=mo\\:publication_of]")[0];
- }
- $('<input type="text" class="recording-comment">')
- .insertAfter(node)
- .css({"background": "inherit", "border": "1px #999 solid", "width": "18em", "margin-left": "0.5em"})
- .hide();
- });
- var $inputs = $(".recording-comment")
- .bind("input.rc", function() {
- var comment = this.value, old = $(this).data("old");
- if (comment == old) {
- $(this).css("border-color", "#999");
- } else {
- $(this).css("border-color", "red");
- }
- });
- var $container = $("<div></div>")
- .css({"background": "#F1F1F1", "border": "1px #999 dotted", "display": "inline-block"})
- .insertBefore("table.tbl");
- var $edit_button = button("Edit recording comments")
- .bind("click", function() {
- if (editing) {
- $(this).text("Edit recording comments");
- $("#rc-table").hide();
- $inputs.hide();
- } else {
- $(this).text("Hide recording comments");
- $("#rc-table").show();
- $inputs.show();
- }
- editing = !editing;
- })
- .appendTo($container);
- $container.append('\
- <table id="rc-table">\
- <tr>\
- <td><label for="all-comments">Set all comments to:</label></td>\
- <td><input type="text" id="all-comments" style="width: 18em;"></td>\
- </tr>\
- <tr>\
- <td><label for="rc-edit-note">Edit note:</label></td>\
- <td><input type="text" id="rc-edit-note" style="width: 18em;"></td>\
- </tr>\
- <tr>\
- <td></td><td></td>\
- </tr>\
- </table>');
- $("#rc-table").hide();
- var $all_comments = $("#all-comments")
- .bind("input", function() {
- $inputs.val($(this).val()).trigger("input.rc");
- });
- var edit_requests = new RequestManager(1000);
- var $submit_button = button("Submit changes (marked red)")
- .bind("click", function() {
- if (submitting) {
- edit_requests.queue = [];
- submitting = false;
- $(this).text("Submit changes (marked red)");
- $inputs.attr("disabled", false).trigger("input.rc");
- return;
- }
- submitting = true;
- $(this).text("Submitting...click to cancel!");
- $inputs.attr("disabled", true);
- var edit_count = 0;
- $.each($tracks, function(i, track) {
- var input = $inputs[i], comment = input.value;
- if (comment == $(input).data("old")) {
- input.disabled = false;
- return;
- }
- edit_count += 1;
- var link = $($(track).children("td")[1]).find("a[rel=mo\\:publication_of]")[0],
- mbid = link.href.match(MBID_REGEX)[0];
- var request = function() {
- $.get("/recording/" + mbid + "/edit", function(html, textStatus, jqXHR) {
- if (jqXHR.status != 200) {
- edit_requests.push(request);
- return;
- }
- $(input).css("border-color", "blue");
- var xml = $.parseXML(html.replace(/ /g, "")), data = {};
- data["edit-recording.name"] = xml.getElementById("id-edit-recording.name").value;
- data["edit-recording.length"] = xml.getElementById("id-edit-recording.length").value;
- for (var i = 0; true; i++) {
- var a = [];
- a[0] = "edit-recording.artist_credit.names." + i + ".artist.name";
- a[1] = "edit-recording.artist_credit.names." + i + ".artist.id";
- a[2] = "edit-recording.artist_credit.names." + i + ".name";
- a[3] = "edit-recording.artist_credit.names." + i + ".join_phrase";
- var artist_name = xml.getElementById("id-" + a[0]);
- if (artist_name == null)
- break;
- data[a[0]] = artist_name.value;
- data[a[1]] = xml.getElementById("id-" + a[1]).value;
- data[a[2]] = xml.getElementById("id-" + a[2]).value;
- data[a[3]] = xml.getElementById("id-" + a[3]).value;
- }
- data["edit-recording.edit_note"] = $("#rc-edit-note").val();
- data["edit-recording.as_auto_editor"] = "1";
- data["edit-recording.comment"] = comment;
- var post_edit = function() {
- $.post("/recording/" + mbid + "/edit", data,
- function(data) {
- $(input)
- .data("old", comment)
- .trigger("input.rc")
- .attr("disabled", false);
- if (edit_requests.queue.length == 0)
- $submit_button.attr("disabled", false).text("Submit changes (marked red)");
- }).error(function() {
- $(input)
- .css("border-color", "red")
- .attr("disabled", false);
- edit_requests.unshift(post_edit);
- });
- };
- edit_requests.unshift(post_edit);
- }).error(function() {
- edit_requests.push(request);
- });
- };
- edit_requests.push(request);
- });
- if (edit_count == 0)
- $(this).attr("disabled", false).text("Submit changes (marked red)");
- })
- .appendTo($container.find("td")[5]);
- $.get("/ws/2/release/" + release + "?inc=recordings", function(data) {
- var $recordings = $(data).find("recording");
- for (var i = 0; i < $recordings.length; i++) {
- var recording = $recordings[i], input = $inputs[i],
- disambiguation = $(recording).children("disambiguation")[0];
- if (disambiguation === undefined) {
- $(input).data("old", "");
- continue;
- }
- var comment = $(disambiguation).text();
- $(input).val(comment).data("old", comment);
- }
- });
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement