Advertisement
jesus2099

MusicBrainz: Set recording comments for a release 2012-02-11

Feb 29th, 2012
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name           MusicBrainz: Set recording comments for a release
  3. // @version        2012-05-16
  4. // @author         Michael Wiencek
  5. // @namespace      http://userscripts.org/users/266906
  6. // @include        http://musicbrainz.org/release/*
  7. // @include        http://test.musicbrainz.org/release/*
  8. // @include        http://beta.musicbrainz.org/release/*
  9. // @match          http://musicbrainz.org/release/*
  10. // @match          http://test.musicbrainz.org/release/*
  11. // @match          http://beta.musicbrainz.org/release/*
  12. // ==/UserScript==
  13.  
  14. var scr = document.createElement("script");
  15. scr.textContent = "(" + recording_comments + ")();";
  16. document.body.appendChild(scr);
  17.  
  18. function recording_comments() {
  19.     var $tracks = $("tr").filter(function() {return $(this).attr("typeof") == "mo:Track";});
  20.     if ($tracks.length == 0)
  21.         return;
  22.  
  23.     var location = window.location.pathname;
  24.     if (!location.match(/\/release\/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/))
  25.         return;
  26.  
  27.     var MBID_REGEX = /[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/,
  28.         release = location.match(MBID_REGEX)[0],
  29.         editing = false, submitting = false;
  30.  
  31.     function RequestManager(rate) {
  32.         this.queue = [];
  33.         this.last = 0;
  34.  
  35.         this.next = function() {
  36.             var request = this.queue.shift();
  37.             if (request) {
  38.                 request();
  39.                 this.last = new Date().getTime();
  40.                 if (this.queue.length > 0) {
  41.                     setTimeout(function(foo) {foo.next();}, rate, this);
  42.                 }
  43.             }
  44.         }
  45.  
  46.         this.push = function(req) {
  47.             this.queue.push(req);
  48.             if (this.queue.length == 1)
  49.                 this.start_queue();
  50.         }
  51.  
  52.         this.unshift = function(req) {
  53.             this.queue.unshift(req);
  54.             if (this.queue.length == 1)
  55.                 this.start_queue();
  56.         }
  57.  
  58.         this.start_queue = function() {
  59.             var now = new Date().getTime();
  60.             if (now - this.last >= rate) {
  61.                 this.next();
  62.             } else {
  63.                 setTimeout(function(foo) {foo.next();},
  64.                     rate - now + this.last, this);
  65.             }
  66.         }
  67.     }
  68.  
  69.     function button(text) {
  70.         return $("<button>" + text + "</button>")
  71.             .css({"color": "#565656",
  72.                   "background-color": "#F0F0F0",
  73.                   "border": "1px solid #D0D0D0",
  74.                   "border-top": "1px solid #EAEAEA",
  75.                   "border-left": "1px solid #EAEAEA"});
  76.     }
  77.  
  78.     $.each($tracks, function(i, track) {
  79.         var $td = $($(track).children("td")[1]), node = $td.children(".mp")[0];
  80.         if (node === undefined) {
  81.             node = $td.children("a[rel=mo\\:publication_of]")[0];
  82.         }
  83.         $('<input type="text" class="recording-comment">')
  84.             .insertAfter(node)
  85.             .css({"background": "inherit", "border": "1px #999 solid", "width": "18em", "margin-left": "0.5em"})
  86.             .hide();
  87.     });
  88.  
  89.     var $inputs = $(".recording-comment")
  90.         .bind("input.rc", function() {
  91.             var comment = this.value, old = $(this).data("old");
  92.             if (comment == old) {
  93.                 $(this).css("border-color", "#999");
  94.             } else {
  95.                 $(this).css("border-color", "red");
  96.             }
  97.         });
  98.  
  99.     var $container = $("<div></div>")
  100.         .css({"background": "#F1F1F1", "border": "1px #999 dotted", "display": "inline-block"})
  101.         .insertBefore("table.tbl");
  102.  
  103.     var $edit_button = button("Edit recording comments")
  104.         .bind("click", function() {
  105.             if (editing) {
  106.                 $(this).text("Edit recording comments");
  107.                 $("#rc-table").hide();
  108.                 $inputs.hide();
  109.             } else {
  110.                 $(this).text("Hide recording comments");
  111.                 $("#rc-table").show();
  112.                 $inputs.show();
  113.             }
  114.             editing = !editing;
  115.         })
  116.         .appendTo($container);
  117.  
  118.     $container.append('\
  119. <table id="rc-table">\
  120. <tr>\
  121. <td><label for="all-comments">Set all comments to:</label></td>\
  122. <td><input type="text" id="all-comments" style="width: 18em;"></td>\
  123. </tr>\
  124. <tr>\
  125. <td><label for="rc-edit-note">Edit note:</label></td>\
  126. <td><input type="text" id="rc-edit-note" style="width: 18em;"></td>\
  127. </tr>\
  128. <tr>\
  129. <td></td><td></td>\
  130. </tr>\
  131. </table>');
  132.     $("#rc-table").hide();
  133.  
  134.     var $all_comments = $("#all-comments")
  135.         .bind("input", function() {
  136.             $inputs.val($(this).val()).trigger("input.rc");
  137.         });
  138.  
  139.     var edit_requests = new RequestManager(2000);
  140.  
  141.     var $submit_button = button("Submit changes (marked red)")
  142.         .bind("click", function() {
  143.             if (submitting) {
  144.                 edit_requests.queue = [];
  145.                 submitting = false;
  146.                 $(this).text("Submit changes (marked red)");
  147.                 $inputs.attr("disabled", false).trigger("input.rc");
  148.                 return;
  149.             }
  150.             submitting = true;
  151.             $(this).text("Submitting...click to cancel!");
  152.             $inputs.attr("disabled", true);
  153.             var edit_count = 0;
  154.  
  155.             $.each($tracks, function(i, track) {
  156.                 var input = $inputs[i], comment = input.value;
  157.                 if (comment == $(input).data("old")) {
  158.                     input.disabled = false;
  159.                     return;
  160.                 }
  161.                 edit_count += 1;
  162.                 var link = $($(track).children("td")[1]).find("a[rel=mo\\:publication_of]")[0],
  163.                     mbid = link.href.match(MBID_REGEX)[0];
  164.  
  165.                 var request = function() {
  166.                     $.get("/recording/" + mbid + "/edit", function(html) {
  167.                         $(input).css("border-color", "blue");
  168.                         var $html = $(html), data = {};
  169.  
  170.                         data["edit-recording.name"] = $html.find("#id-edit-recording\\.name").val();
  171.                         data["edit-recording.length"] = $html.find("#id-edit-recording\\.length").val();
  172.  
  173.                         for (var i = 0; true; i++) {
  174.                             var a = [];
  175.                             a[0] = "edit-recording.artist_credit.names." + i + ".artist.name";
  176.                             a[1] = "edit-recording.artist_credit.names." + i + ".artist.id";
  177.                             a[2] = "edit-recording.artist_credit.names." + i + ".name";
  178.                             a[3] = "edit-recording.artist_credit.names." + i + ".join_phrase";
  179.                             var $artist_name = $html.find("#id-" + a[0].replace(/\./g, "\\."));
  180.                             if ($artist_name.length == 0)
  181.                                 break;
  182.                             data[a[0]] = $artist_name.val();
  183.                             data[a[1]] = $html.find("#id-" + a[1].replace(/\./g, "\\.")).val();
  184.                             data[a[2]] = $html.find("#id-" + a[2].replace(/\./g, "\\.")).val();
  185.                             data[a[3]] = $html.find("#id-" + a[3].replace(/\./g, "\\.")).val();
  186.                         }
  187.  
  188.                         data["edit-recording.edit_note"] = $("#rc-edit-note").val();
  189.                         data["edit-recording.as_auto_editor"] = "1";
  190.                         data["edit-recording.comment"] = comment;
  191.  
  192.                         var post_edit = function() {
  193.                             $.post("/recording/" + mbid + "/edit", data,
  194.                                 function(data) {
  195.                                     $(input)
  196.                                         .data("old", comment)
  197.                                         .trigger("input.rc")
  198.                                         .attr("disabled", false);
  199.                                     if (edit_requests.queue.length == 0)
  200.                                         $submit_button.attr("disabled", false).text("Submit changes (marked red)");
  201.                                 }).error(function() {
  202.                                     $(input)
  203.                                         .css("border-color", "red")
  204.                                         .attr("disabled", false);
  205.                                 });
  206.                         };
  207.                         edit_requests.unshift(post_edit);
  208.  
  209.                     })
  210.                 };
  211.                 edit_requests.push(request);
  212.             });
  213.  
  214.             if (edit_count == 0)
  215.                 $(this).attr("disabled", false).text("Submit changes (marked red)");
  216.         })
  217.         .appendTo($container.find("td")[5]);
  218.  
  219.     $.get("/ws/2/release/" + release + "?inc=recordings", function(data) {
  220.         var $recordings = $(data).find("recording");
  221.         for (var i = 0; i < $recordings.length; i++) {
  222.             var recording = $recordings[i], input = $inputs[i],
  223.                 disambiguation = $(recording).children("disambiguation")[0];
  224.             if (disambiguation === undefined) {
  225.                 $(input).data("old", "");
  226.                 continue;
  227.             }
  228.             var comment = $(disambiguation).text();
  229.             $(input).val(comment).data("old", comment);
  230.         }
  231.     });
  232. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement