- // ==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;
- };