您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Musicbrainz function library.
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/5140/18011/MusicBrainz%20function%20library.js
// ==UserScript== // @name MusicBrainz function library // @namespace http://www.jens-bertram.net/userscripts/mbz-lib // @description Musicbrainz function library. // @require https://code.jquery.com/jquery-2.1.1.min.js // @version 0.1.2beta // @grant none // @supportURL https://github.com/JensBee/userscripts // @license MIT // ==/UserScript== window.MBZ = { /** * Convert anything to string. */ asString: function(data) { if (data == null) { return ''; } switch (typeof data) { case 'string': return data.trim(); case 'object': return data.toString().trim(); case 'function': return 'function'; case 'undefined': return ''; default: data = data + ''; return data.trim(); } }, /** * Convert HH:MM:SS, MM:SS, SS to seconds. * http://stackoverflow.com/a/9640417 */ hmsToSeconds: function (str) { var p = str.split(':'), s = 0, m = 1; while (p.length > 0) { s += m * parseInt(p.pop(), 10); m *= 60; } return s; } }; MBZ.Release = function() { var formId = 'mbRelease'; var formTarget = 'https://musicbrainz.org/release/add'; var form = $('<form method="post" id="' + formId + '" target="_blank" action="' + formTarget + '" acceptCharset="UTF-8"></form>'); var data = { annotation: '', // content artists: [], // name labels: [], // [name, catalog number] mediums: {}, // index -> format note: '', // content packaging: '', // type releases: [], // [year, month, day, region] title: '', // release title tracks: {}, // medium -> {title -> [number, length]} urls: [] // [target, type] }; function addField(name, value, escape) { if (escape) { form.append($('<input type="hidden" name="' + name + '" value="' + value .replace(/&/g, '&') .replace(/"/g, '"') .replace(/'/g, ''') .replace(/</g, '<') .replace(/>/g, '>') + '"/>')); } else { form.append($('<input type="hidden" name="' + name + '" value="' + value + '"/>')); } } function buildForm() { if (data.annotation != '') { addField('annotation', data.annotation, true); } if (data.artists.length > 0) { $.each(data.artists, function(idx, val) { addField('artist_credit.names.' + idx + '.name', val); }); } if (data.labels.length > 0) { $.each(data.labels, function(idx, val) { if (val[0] != '') { addField('labels.' + idx + '.name', val[0]); } if (val[1] != '') { addField('labels.' + idx + '.catalog_number', val[1]); } }); } if (data.note != '') { addField('edit_note', data.note, true); } if (data.releases.length > 0) { $.each(data.releases, function(idx, val) { var prefix = 'events.' + idx + '.'; addField(prefix + 'date.year', val[0]); addField(prefix + 'date.month', val[1]); addField(prefix + 'date.day', val[2]); if (val[3] != '') { addField(prefix + 'country', val[3]); } }); } $.each(data.mediums, function(idx, val) { addField('mediums.'+idx+'.format', val); }); if (data.packaging != '') { addField('packaging', data.packaging); } if (data.title != '') { addField('name', data.title); } $.each(data.tracks, function(medium, tracks) { $.each(data.tracks[medium], function(name, val) { var prefix = 'mediums.' + medium + '.track.' + val[0] + '.'; addField(prefix + 'name', name); var length = val[1]; if (!isNaN(length)) { addField(prefix + 'length', length); } }); }); if (data.urls.length > 0) { $.each(data.urls, function(idx, val) { addField('urls.'+idx+'.url', val[0]); addField('urls.'+idx+'.link_type', val[1]); }); } } var api = { /** * @name artist name * @return true if value was added */ addArtist: function(name) { name = MBZ.asString(name); if (name != '' && data.artists.indexOf(name) == -1) { data.artists.push(name); return true; } return false; }, /** * @name label name * @catNo catalog number * @return true if value was added */ addLabel: function(name, catNo) { name = MBZ.asString(name); catNo = MBZ.asString(catNo); if (name != '' || catNo != '') { data.labels.push([name, catNo]); return true; } return false; }, addMediumFormat: function(idx, format) { idx = MBZ.asString(idx); format = MBZ.asString(format); if (idx != '') { data.mediums[idx] = format; } }, /** * @dateArr [YYYY, MM, DD] * @country code * @return true if value was added */ addRelease: function(year, month, day, country) { year = MBZ.asString(year); month = MBZ.asString(month); day = MBZ.asString(day); country = MBZ.asString(country); data.releases.push([year, month, day, country]); return true; }, /** * @medium medium number * @name track name * @number track number * @return 1 if value was added, 2 if updated, 0 if no value was changed */ addTrack: function(medium, name, number, length) { name = MBZ.asString(name); number = MBZ.asString(number); length = MBZ.asString(length); medium = MBZ.asString(medium); var updated = false; if (name == '') { return 0; } else { if (length == 'NaN') { length = ''; } if (typeof data.tracks[medium] == 'undefined') { data.tracks[medium] = {}; } else { if (typeof data.tracks[medium][name] != 'undefined') { // only update unset values var currNum = data.tracks[medium][name][0]; var currLength = data.tracks[medium][name][1]; if (currNum != '') { number = currNum; } else { updated = true; } if (currLength != '') { length = currLength; } else { updated = true; } } } data.tracks[medium][name] = [number, length]; if (updated) { return 2; } return 1; } }, /** * @url target url * @type musicbrainz url type * @return true if value was added */ addUrl: function(url, type) { url = MBZ.asString(url); type = MBZ.asString(type); data.urls.push([url, type]); return true; }, /** * Dump current data (best viewed in FireBug). */ dump : function() { console.log(data); }, /** * @content annotation content * @return old value */ setAnnotation: function(content) { var old = data.annotation; data.annotation = MBZ.asString(content); return old; }, /** * @content edeting note content * @return old value */ setNote: function(content) { var old = data.note; data.note = MBZ.asString(content); return old; }, /** * @content packaging type * @return old value */ setPackaging: function(type) { var old = data.packaging; data.packaging = MBZ.asString(type); return old; }, /** * @name release title * @return old value */ setTitle: function(name) { var old = data.title; data.title = MBZ.asString(name); return old; }, /** * Submit data to musicbrainz. */ submitRelease:function() { buildForm(); $('body').append(form); form.submit(); } }; return api; };