diff --git a/cd1d_importer.user.js b/cd1d_importer.user.js
new file mode 100644
index 0000000..2c1fcb5
--- /dev/null
+++ b/cd1d_importer.user.js
@@ -0,0 +1,253 @@
+// ==UserScript==
+// @name Import CD1D releases into MB
+// @namespace http://userscripts.org/users/517952
+// @include http://cd1d.com/*/album/*
+// @version 2015.05.26.1
+// @downloadURL https://raw.github.com/murdos/musicbrainz-userscripts/master/cd1d_importer.user.js
+// @updateURL https://raw.github.com/murdos/musicbrainz-userscripts/master/cd1d_importer.user.js
+// @require http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js
+// @require https://raw.github.com/murdos/musicbrainz-userscripts/master/lib/import_functions.js
+// @require https://raw.github.com/murdos/musicbrainz-userscripts/master/lib/logger.js
+// @grant none
+// ==/UserScript==
+
+/* Import releases from http://cd1d.com to MusicBrainz */
+
+
+if (!unsafeWindow) unsafeWindow = window;
+
+var CD1DImporter = {
+ _releaseobj: null,
+
+ getActiveTab: function () {
+ return $('#container-1 li.ui-state-active a');
+ },
+
+ getActiveTabId: function () {
+ return this.getActiveTab().attr('href').split('#')[1];
+ },
+
+ getActiveTabLabel: function () {
+ return this.getActiveTab().text();
+ },
+
+ getTracks: function () {
+ // extract tracks from active tab
+ var selector = 'div#' + this.getActiveTabId() + ' table.tracklist-content tbody tr';
+ return $(selector).map(function () {
+ // $(this) is used more than once; cache it for performance.
+ var row = $(this);
+
+ // For each row that's "mapped", return an object that
+ // describes the first and second
in the row.
+ var duration = row.find('td.tracklist-content-length').text().replace('"', '').replace('\' ', ':').split(
+ ':');
+ duration = 60 * parseInt(duration[0]) + parseInt(duration[1]); // convert MM:SS to seconds
+
+ // drop track number prefix (A A2 C3 01 05 etc...)
+ var title = row.find('td.tracklist-content-title').text().replace(/^[0-9A-F][0-9]* /, '')
+ return {
+ title: title,
+ duration: duration * 1000 // milliseconds in MB
+ };
+ }).get();
+ },
+
+ getArtists: function () {
+ // get artists
+ var artists = $('div.infos-releasegrp div.list-artist a').map(function () {
+ return $(this).text()
+ }).get();
+ artists = artists.map(function (item) {
+ return {
+ artist_name: item
+ };
+ });
+ if (artists.length > 2) {
+ var last = artists.pop();
+ last.joinphrase = '';
+ var prev = artists.pop();
+ prev.joinphrase = ' & ';
+ for (var i = 0; i < artists.length; i++) {
+ artists[i].joinphrase = ', ';
+ }
+ artists.push(prev);
+ artists.push(last);
+ } else if (artists.length == 2) {
+ artists[0].joinphrase = ' & ';
+ }
+ return artists;
+ },
+
+ getAlbum: function () {
+ // get release title
+ return $('h1').text();
+ },
+
+ fromCurrentTime: function (offset_in_seconds) {
+ var millis = Date.now();
+ if (!isNaN(offset_in_seconds)) {
+ millis += offset_in_seconds * 1000;
+ }
+ var date = new Date(millis);
+ var dd = date.getDate();
+ var mm = date.getMonth() + 1; //January is 0!
+ var yyyy = date.getFullYear();
+ return {
+ 'year': yyyy,
+ 'month': mm,
+ 'day': dd
+ };
+ },
+
+ getReleaseDate: function () {
+ // get release date and convert it to object
+ var text = $('div.infos-releasegrp div.row-date').text()
+ if (text == 'yesterday') {
+ return this.fromCurrentTime(-24 * 60 * 60);
+ }
+ if (text == 'today') {
+ return this.fromCurrentTime(0);
+ }
+ var date = text
+ .replace('janvier', '01')
+ .replace('février', '02')
+ .replace('mars', '03')
+ .replace('avril', '04')
+ .replace('mai', '05')
+ .replace('juin', '06')
+ .replace('juillet', '07')
+ .replace('août', '08')
+ .replace('septembre', '09')
+ .replace('octobre', '10')
+ .replace('novembre', '11')
+ .replace('décembre', '12')
+ .replace('January', '01')
+ .replace('February', '02')
+ .replace('March', '03')
+ .replace('April', '04')
+ .replace('May', '05')
+ .replace('June', '06')
+ .replace('July', '07')
+ .replace('August', '08')
+ .replace('September', '09')
+ .replace('October', '10')
+ .replace('November', '11')
+ .replace('December', '12')
+ .split(' ');
+ return {
+ 'year': parseInt(date[2]),
+ 'month': parseInt(date[1]),
+ 'day': parseInt(date[0])
+ };
+ },
+
+ retrieveReleaseInfo: function () {
+ // Analyze CD1D data and return a release object
+ var release = {
+ artist_credit: this.getArtists(),
+ title: this.getAlbum(),
+ country: "XW", // Worldwide
+ type: 'album',
+ status: 'official',
+ language: 'eng',
+ script: 'latn',
+ barcode: '',
+ urls: [],
+ discs: [],
+ };
+
+ // Grab release event information
+ var releasedate = this.getReleaseDate();
+ release.year = releasedate.year;
+ release.month = releasedate.month;
+ release.day = releasedate.day;
+
+ var link_type = {
+ purchase_for_download: 74,
+ download_for_free: 75,
+ stream_for_free: 85,
+ license: 301,
+ purchase_for_mail_order: 79
+ };
+
+ current_url = window.location.href.replace(/\/[a-z]{2}\/album\//i, '/album/');
+
+ activetab = this.getActiveTabLabel();
+ if (activetab.indexOf('digital') != -1) {
+ release.packaging = 'None';
+ release.format = "Digital Media";
+ release.urls.push({
+ 'url': current_url,
+ 'link_type': link_type.purchase_for_download
+ });
+ } else if (activetab.indexOf('vinyl') != -1) {
+ release.country = 'FR';
+ release.format = "Vinyl";
+ release.urls.push({
+ 'url': current_url,
+ 'link_type': link_type.purchase_for_mail_order
+ });
+
+ } else {
+ release.country = 'FR';
+ release.format = 'CD';
+ release.urls.push({
+ 'url': current_url,
+ 'link_type': link_type.purchase_for_mail_order
+ });
+ }
+
+ release.labels = $('div.infos-details div.row-structure').map(function () {
+ return {
+ name: $(this).text(),
+ mbid: '',
+ catno: 'none'
+ };
+ })
+ .get();
+
+ // Tracks
+ var disc = {
+ tracks: [],
+ format: release.format
+ };
+ release.discs.push(disc);
+ $.each(this.getTracks(), function (index, track) {
+ var track = {
+ 'title': track.title,
+ 'duration': track.duration,
+ 'artist_credit': []
+ }
+ disc.tracks.push(track);
+ });
+
+ LOGGER.info("Parsed release: ", release);
+ this._releaseobj = release;
+ return release;
+ },
+
+ insertLink: function (release) {
+ // Insert links in page
+ if (typeof release === 'undefined') {
+ if (this._releaseobj) {
+ release = this._releaseobj;
+ } else {
+ release = this.retrieveReleaseInfo();
+ }
+ }
+
+ // Form parameters
+ var edit_note = 'Imported from ' + window.location.href;
+ var parameters = MBReleaseImportHelper.buildFormParameters(release, edit_note);
+
+ // Build form
+ var innerHTML = MBReleaseImportHelper.buildFormHTML(parameters);
+ $('div.pane-service-links-service-links h2.pane-title').append(innerHTML);
+
+ }
+};
+
+$(document).ready(function () {
+ CD1DImporter.insertLink();
+});
|