MusicBrainz function library

Musicbrainz function library.

目前为 2014-09-18 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/5140/18011/MusicBrainz%20function%20library.js

  1. // ==UserScript==
  2. // @name MusicBrainz function library
  3. // @namespace http://www.jens-bertram.net/userscripts/mbz-lib
  4. // @description Musicbrainz function library.
  5. // @require https://code.jquery.com/jquery-2.1.1.min.js
  6. // @version 0.1.2beta
  7. // @grant none
  8. // @supportURL https://github.com/JensBee/userscripts
  9. // @license MIT
  10. // ==/UserScript==
  11. window.MBZ = {
  12. /**
  13. * Convert anything to string.
  14. */
  15. asString: function(data) {
  16. if (data == null) {
  17. return '';
  18. }
  19. switch (typeof data) {
  20. case 'string':
  21. return data.trim();
  22. case 'object':
  23. return data.toString().trim();
  24. case 'function':
  25. return 'function';
  26. case 'undefined':
  27. return '';
  28. default:
  29. data = data + '';
  30. return data.trim();
  31. }
  32. },
  33.  
  34. /**
  35. * Convert HH:MM:SS, MM:SS, SS to seconds.
  36. * http://stackoverflow.com/a/9640417
  37. */
  38. hmsToSeconds: function (str) {
  39. var p = str.split(':'), s = 0, m = 1;
  40.  
  41. while (p.length > 0) {
  42. s += m * parseInt(p.pop(), 10);
  43. m *= 60;
  44. }
  45.  
  46. return s;
  47. }
  48. };
  49.  
  50. MBZ.Release = function() {
  51. var formId = 'mbRelease';
  52. var formTarget = 'https://musicbrainz.org/release/add';
  53. var form = $('<form method="post" id="' + formId + '" target="_blank" action="' + formTarget + '" acceptCharset="UTF-8"></form>');
  54.  
  55. var data = {
  56. annotation: '', // content
  57. artists: [], // name
  58. labels: [], // [name, catalog number]
  59. mediums: {}, // index -> format
  60. note: '', // content
  61. packaging: '', // type
  62. releases: [], // [year, month, day, region]
  63. title: '', // release title
  64. tracks: {}, // medium -> {title -> [number, length]}
  65. urls: [] // [target, type]
  66. };
  67.  
  68. function addField(name, value, escape) {
  69. if (escape) {
  70. form.append($('<input type="hidden" name="' + name + '" value="' + value
  71. .replace(/&/g, '&amp;')
  72. .replace(/"/g, '&quot;')
  73. .replace(/'/g, '&#39;')
  74. .replace(/</g, '&lt;')
  75. .replace(/>/g, '&gt;')
  76. + '"/>'));
  77. } else {
  78. form.append($('<input type="hidden" name="' + name + '" value="' + value + '"/>'));
  79. }
  80. }
  81.  
  82. function buildForm() {
  83. if (data.annotation != '') {
  84. addField('annotation', data.annotation, true);
  85. }
  86.  
  87. if (data.artists.length > 0) {
  88. $.each(data.artists, function(idx, val) {
  89. addField('artist_credit.names.' + idx + '.name', val);
  90. });
  91. }
  92.  
  93. if (data.labels.length > 0) {
  94. $.each(data.labels, function(idx, val) {
  95. if (val[0] != '') {
  96. addField('labels.' + idx + '.name', val[0]);
  97. }
  98. if (val[1] != '') {
  99. addField('labels.' + idx + '.catalog_number', val[1]);
  100. }
  101. });
  102. }
  103.  
  104. if (data.note != '') {
  105. addField('edit_note', data.note, true);
  106. }
  107.  
  108. if (data.releases.length > 0) {
  109. $.each(data.releases, function(idx, val) {
  110. var prefix = 'events.' + idx + '.';
  111. addField(prefix + 'date.year', val[0]);
  112. addField(prefix + 'date.month', val[1]);
  113. addField(prefix + 'date.day', val[2]);
  114. if (val[3] != '') {
  115. addField(prefix + 'country', val[3]);
  116. }
  117. });
  118. }
  119.  
  120. $.each(data.mediums, function(idx, val) {
  121. addField('mediums.'+idx+'.format', val);
  122. });
  123.  
  124. if (data.packaging != '') {
  125. addField('packaging', data.packaging);
  126. }
  127.  
  128. if (data.title != '') {
  129. addField('name', data.title);
  130. }
  131.  
  132. $.each(data.tracks, function(medium, tracks) {
  133. $.each(data.tracks[medium], function(name, val) {
  134. var prefix = 'mediums.' + medium + '.track.' + val[0] + '.';
  135. addField(prefix + 'name', name);
  136. var length = val[1];
  137. if (!isNaN(length)) {
  138. addField(prefix + 'length', length);
  139. }
  140. });
  141. });
  142.  
  143. if (data.urls.length > 0) {
  144. $.each(data.urls, function(idx, val) {
  145. addField('urls.'+idx+'.url', val[0]);
  146. addField('urls.'+idx+'.link_type', val[1]);
  147. });
  148. }
  149. }
  150.  
  151. var api = {
  152. /**
  153. * @name artist name
  154. * @return true if value was added
  155. */
  156. addArtist: function(name) {
  157. name = MBZ.asString(name);
  158. if (name != '' && data.artists.indexOf(name) == -1) {
  159. data.artists.push(name);
  160. return true;
  161. }
  162. return false;
  163. },
  164.  
  165. /**
  166. * @name label name
  167. * @catNo catalog number
  168. * @return true if value was added
  169. */
  170. addLabel: function(name, catNo) {
  171. name = MBZ.asString(name);
  172. catNo = MBZ.asString(catNo);
  173.  
  174. if (name != '' || catNo != '') {
  175. data.labels.push([name, catNo]);
  176. return true;
  177. }
  178. return false;
  179. },
  180.  
  181. addMediumFormat: function(idx, format) {
  182. idx = MBZ.asString(idx);
  183. format = MBZ.asString(format);
  184.  
  185. if (idx != '') {
  186. data.mediums[idx] = format;
  187. }
  188. },
  189.  
  190. /**
  191. * @dateArr [YYYY, MM, DD]
  192. * @country code
  193. * @return true if value was added
  194. */
  195. addRelease: function(year, month, day, country) {
  196. year = MBZ.asString(year);
  197. month = MBZ.asString(month);
  198. day = MBZ.asString(day);
  199. country = MBZ.asString(country);
  200.  
  201. data.releases.push([year, month, day, country]);
  202. return true;
  203. },
  204.  
  205. /**
  206. * @medium medium number
  207. * @name track name
  208. * @number track number
  209. * @return 1 if value was added, 2 if updated, 0 if no value was changed
  210. */
  211. addTrack: function(medium, name, number, length) {
  212. name = MBZ.asString(name);
  213. number = MBZ.asString(number);
  214. length = MBZ.asString(length);
  215. medium = MBZ.asString(medium);
  216. var updated = false;
  217.  
  218. if (name == '') {
  219. return 0;
  220. } else {
  221. if (length == 'NaN') {
  222. length = '';
  223. }
  224. if (typeof data.tracks[medium] == 'undefined') {
  225. data.tracks[medium] = {};
  226. } else {
  227. if (typeof data.tracks[medium][name] != 'undefined') {
  228. // only update unset values
  229. var currNum = data.tracks[medium][name][0];
  230. var currLength = data.tracks[medium][name][1];
  231. if (currNum != '') {
  232. number = currNum;
  233. } else {
  234. updated = true;
  235. }
  236. if (currLength != '') {
  237. length = currLength;
  238. } else {
  239. updated = true;
  240. }
  241. }
  242. }
  243. data.tracks[medium][name] = [number, length];
  244. if (updated) {
  245. return 2;
  246. }
  247. return 1;
  248. }
  249. },
  250.  
  251. /**
  252. * @url target url
  253. * @type musicbrainz url type
  254. * @return true if value was added
  255. */
  256. addUrl: function(url, type) {
  257. url = MBZ.asString(url);
  258. type = MBZ.asString(type);
  259.  
  260. data.urls.push([url, type]);
  261. return true;
  262. },
  263.  
  264. /**
  265. * Dump current data (best viewed in FireBug).
  266. */
  267. dump : function() {
  268. console.log(data);
  269. },
  270.  
  271. /**
  272. * @content annotation content
  273. * @return old value
  274. */
  275. setAnnotation: function(content) {
  276. var old = data.annotation;
  277. data.annotation = MBZ.asString(content);
  278. return old;
  279. },
  280.  
  281. /**
  282. * @content edeting note content
  283. * @return old value
  284. */
  285. setNote: function(content) {
  286. var old = data.note;
  287. data.note = MBZ.asString(content);
  288. return old;
  289. },
  290.  
  291. /**
  292. * @content packaging type
  293. * @return old value
  294. */
  295. setPackaging: function(type) {
  296. var old = data.packaging;
  297. data.packaging = MBZ.asString(type);
  298. return old;
  299. },
  300.  
  301. /**
  302. * @name release title
  303. * @return old value
  304. */
  305. setTitle: function(name) {
  306. var old = data.title;
  307. data.title = MBZ.asString(name);
  308. return old;
  309. },
  310.  
  311. /**
  312. * Submit data to musicbrainz.
  313. */
  314. submitRelease:function() {
  315. buildForm();
  316. $('body').append(form);
  317. form.submit();
  318. }
  319. };
  320.  
  321. return api;
  322. };

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址