NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
'use strict'; var meta = function() { // ==UserScript== // @name MusicBrainz: Batch-propagate recording dates // @namespace mbz-loujine // @author loujine // @version 2015.11.08 // @downloadURL https://bitbucket.org/loujine/musicbrainz-scripts/raw/default/mbz-propagatedates.user.js // @updateURL https://bitbucket.org/loujine/musicbrainz-scripts/raw/default/mbz-propagatedates.user.js // @supportURL https://bitbucket.org/loujine/musicbrainz-scripts // @icon https://bitbucket.org/loujine/musicbrainz-scripts/raw/default/icon.png // @description musicbrainz.org: Copy dates on relevant recording AR fields // @compatible firefox+greasemonkey // @licence CC BY-NC-SA 3.0 (https://creativecommons.org/licenses/by-nc-sa/3.0/) // @require https://greasyfork.org/scripts/13748-musicbrainz-common-files-for-the-relationships-editor/code/MusicBrainz:%20common%20files%20for%20the%20relationships%20editor.js?version=85768 // @require https://greasyfork.org/scripts/13747-musicbrainz-common-files/code/MusicBrainz:%20common%20files.js?version=85770 // @include http*://*musicbrainz.org/release/*/edit-relationships // @grant none // @run-at document-end // ==/UserScript== }; if (meta && meta.toString && (meta = meta.toString())) { var meta = {'name': meta.match(/@name\s+(.+)/)[1], 'version': meta.match(/@version\s+(.+)/)[1]}; } function copyDate(from_date, relation) { ['beginDate', 'endDate'].forEach(function(date) { ['day', 'month', 'year'].forEach(function(unit) { relation.period[date][unit](from_date[date][unit]()); }); }); } function removeDate(relation) { ['beginDate', 'endDate'].forEach(function(date) { ['day', 'month', 'year'].forEach(function(unit) { relation.period[date][unit](''); }); }); relation.period.ended(false); } function referenceDate(relations) { var idx_ref = -1; // look for one recording link with a date // give priority to the most precise one (day > month > year) ['day', 'month', 'year'].forEach(function(unit) { relations.forEach(function(rel, idx) { if (idx_ref === -1 && rel.period.endDate[unit]() > 0) { idx_ref = idx; } }); }); return idx_ref; } // imported from mbz-loujine-common.js: linkTypeXXX function propagateDates() { var recordings = MB.relationshipEditor.UI.checkedRecordings(); recordings.forEach(function(recording) { var relations = recording.relationships(), idx = referenceDate(relations); if (idx !== -1) { var from_period = relations[idx].period; relations.forEach(function(rel) { var linkType = parseInt(rel.linkTypeID()); if (linkType === linkTypePerformer || linkType === linkTypeWork || linkType === linkTypeInstrument || linkType === linkTypeVocals || linkType === linkTypeOrchestra || linkType === linkTypeConductor || linkType === linkTypePlace || linkType === linkTypeArea) { copyDate(from_period, rel); } }); } }); } function removeDates() { var recordings = MB.relationshipEditor.UI.checkedRecordings(); recordings.forEach(function(recording) { var relations = recording.relationships(); relations.forEach(function(relation) { removeDate(relation); }); }); } // imported from mbz-loujine-releditor.js: container $('div.tabs').after( $container .append( $('<h3></h3>', {'text': 'Dates'}) ) .append( $('<input></input>', { 'id': 'copydates', 'type': 'button', 'value': 'Copy dates' }) ) .append( $('<input></input>', { 'id': 'removedates', 'type': 'button', 'value': 'Remove dates' }) ) ); $(document).ready(function() { $('#removedates').click(function() { removeDates(); releditorEditNote(meta); }); $('#copydates').click(function() { propagateDates(); releditorEditNote(meta, 'Propagate recording dates from other advanced relationships'); }); return false; });