Guest User

Untitled

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