mirror of
https://github.com/murdos/musicbrainz-userscripts
synced 2024-12-12 19:32:27 +00:00
CD1D importer
CD1D.com is a french website distributing independent music, in digital and physical formats. The importer supports following features: - release date, including "today", and "yesterday" - label - multiple artists - vinyl/CD/digital (whenever possible, not perfect due to the way releases are listed) - track times conversion (the website don't use mm:ss format) - add a download link for digital, a mailorder link for physical
This commit is contained in:
parent
e933144d2f
commit
55955213cb
1 changed files with 253 additions and 0 deletions
253
cd1d_importer.user.js
Normal file
253
cd1d_importer.user.js
Normal file
|
@ -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 <td> 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();
|
||||||
|
});
|
Loading…
Reference in a new issue