musicbrainz-augmentation
Advanced tools
Comparing version 0.3.0 to 0.4.0
@@ -14,2 +14,3 @@ import * as spotify from './spotify/spotify.types'; | ||
static isSameRelease(mbRelease: mb.IRelease, spotifyAlbum: spotify.IAlbum): boolean; | ||
static hasSimilarTrackName(spotifyName: string, mbName: string): boolean; | ||
static normalizeTrackName(trackName: string): string; | ||
@@ -16,0 +17,0 @@ static countMbReleaseTracks(mbRelease: mb.IRelease): number; |
@@ -48,19 +48,16 @@ "use strict"; | ||
} | ||
let score = StringUtils_1.similarity(AugmentFromSpotify.normalizeTrackName(spotifyTrack.name), AugmentFromSpotify.normalizeTrackName(track.title)); | ||
if (score < releaseDeltaSettings.minTrackSimilarity) { | ||
if (score < 0.15) { | ||
debug(`Track name mismatch: score=${score}: Spotify: ${spotifyTrack.name}, MusicBrainz: ${track.title}`); | ||
return false; | ||
if (!this.hasSimilarTrackName(spotifyTrack.name, track.title)) { | ||
if (!this.hasSimilarTrackName(spotifyTrack.name, track.recording.title)) { | ||
let matchingAlias = false; | ||
for (const alias of track.recording.aliases) { | ||
matchingAlias = this.hasSimilarTrackName(spotifyTrack.name, track.recording.title); | ||
if (matchingAlias) | ||
break; | ||
} | ||
if (!matchingAlias) | ||
return false; | ||
} | ||
const spName = StringUtils_1.removeBrackets(spotifyTrack.name); | ||
const mbName = StringUtils_1.removeBrackets(track.title); | ||
score = StringUtils_1.similarity(spName, mbName); | ||
if (score < releaseDeltaSettings.minTrackSimilarity) { | ||
debug(`Track name mismatch: score=${score}: Spotify: ${spotifyTrack.name}, MusicBrainz: ${track.title}`); | ||
return false; | ||
} | ||
} | ||
const deltaTrackLength = spotifyTrack.duration_ms - track.length; | ||
if (deltaTrackLength > releaseDeltaSettings.maxDeltaTrackDuration) { | ||
debug(`Rec: score=${score}`); | ||
debug(`Track delta to high ${deltaTrackLength}>${releaseDeltaSettings.maxDeltaTrackDuration} of ${medium.position}.${track.position} - ${track.title}`); | ||
@@ -70,3 +67,2 @@ if (track.recording.length) { | ||
if (deltaRecordingLength > releaseDeltaSettings.maxDeltaTrackDuration) { | ||
debug(`Rec: score=${score}`); | ||
debug(`Recording delta to high ${deltaRecordingLength}>${releaseDeltaSettings.maxDeltaTrackDuration} of ${medium.position}.${track.position} - ${track.title}`); | ||
@@ -82,2 +78,36 @@ return false; | ||
} | ||
static hasSimilarTrackName(spotifyName, mbName) { | ||
const namePairs = []; | ||
let namePair = { | ||
spotify: AugmentFromSpotify.normalizeTrackName(spotifyName), | ||
musicBrainz: AugmentFromSpotify.normalizeTrackName(mbName) | ||
}; | ||
namePairs.push(namePair); | ||
// Create a pair with stripped brackets | ||
namePairs.push({ | ||
spotify: StringUtils_1.removeBrackets(namePair.spotify), | ||
musicBrainz: StringUtils_1.removeBrackets(namePair.musicBrainz) | ||
}); | ||
const minLen = Math.min(namePair.spotify.length, namePair.musicBrainz.length); | ||
if (minLen >= 2 && (minLen < namePair.spotify.length || minLen < namePair.musicBrainz.length)) { | ||
// Create a pair with stripped prefix | ||
namePairs.push({ | ||
spotify: StringUtils_1.removeBrackets(namePair.spotify.substring(0, minLen)), | ||
musicBrainz: StringUtils_1.removeBrackets(namePair.musicBrainz.substring(0, minLen)) | ||
}); | ||
// Create a pair with stripped suffix | ||
namePairs.push({ | ||
spotify: StringUtils_1.removeBrackets(namePair.spotify.substring(namePair.spotify.length - minLen)), | ||
musicBrainz: StringUtils_1.removeBrackets(namePair.musicBrainz.substring(namePair.musicBrainz.length - minLen)) | ||
}); | ||
} | ||
for (namePair of namePairs) { | ||
const score = StringUtils_1.similarity(AugmentFromSpotify.normalizeTrackName(namePair.spotify), AugmentFromSpotify.normalizeTrackName(namePair.musicBrainz)); | ||
debug(`Compare '${namePair.spotify}' with '${namePair.musicBrainz}' => score=${score} => ${score >= releaseDeltaSettings.minTrackSimilarity ? 'match' : 'no match'}`); | ||
if (score >= releaseDeltaSettings.minTrackSimilarity) { | ||
return true; | ||
} | ||
} | ||
return false; | ||
} | ||
static normalizeTrackName(trackName) { | ||
@@ -152,3 +182,3 @@ return trackName.replace('- Live', ''); | ||
titles.push(release.title); | ||
titles.push(release.title.replace(/ *\([^)]*\) */g, "").trim()); | ||
titles.push(release.title.replace(/ *\([^)]*\) */g, '').trim()); | ||
titles = titles.filter(unique).filter(s => s.length > 0); | ||
@@ -155,0 +185,0 @@ for (const title of titles) { |
{ | ||
"name": "musicbrainz-augmentation", | ||
"version": "0.3.0", | ||
"version": "0.4.0", | ||
"description": "MusicBrainz metadata augmentation", | ||
@@ -21,3 +21,3 @@ "main": "lib/AugmentFromSpotify.js", | ||
"fix-lint": "tslint --fix 'src/**/*.ts' --exclude 'src/**/*.d.ts' 'test/**/*.ts' --exclude 'test/**/*.d.ts'", | ||
"test": "mocha --require ts-node/register --full-trace test", | ||
"test": "mocha --require ts-node/register --require source-map-support/register --full-trace test/*.ts", | ||
"build": "npm run clean && npm run compile", | ||
@@ -44,3 +44,3 @@ "start": "npm-run-all compile lint cover-test", | ||
"debug": "^4.1.1", | ||
"musicbrainz-api": "^0.3.10", | ||
"musicbrainz-api": "^0.4.0", | ||
"spotify-web-api-node": "^4.0.0" | ||
@@ -47,0 +47,0 @@ }, |
43340
811
+ Addedmusicbrainz-api@0.4.0(transitive)
- Removedmusicbrainz-api@0.3.11(transitive)
Updatedmusicbrainz-api@^0.4.0