MusicBrainz function library

Musicbrainz function library.

目前為 2014-09-18 提交的版本,檢視 最新版本

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.gf.qytechs.cn/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, '&amp;')
				.replace(/"/g, '&quot;')
				.replace(/'/g, '&#39;')
				.replace(/</g, '&lt;')
				.replace(/>/g, '&gt;')
			+ '"/>'));
		} 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;
};

QingJ © 2025

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