Exemple #1
0
 def compare_to_release(self, release, weights):
     """
     Compare metadata to a MusicBrainz release. Produces a probability as a
     linear combination of weights that the metadata matches a certain album.
     """
     parts = self.compare_to_release_parts(release, weights)
     sim = linear_combination_of_weights(parts) * get_score(release)
     return SimMatchRelease(similarity=sim, release=release)
Exemple #2
0
    def compare_to_track(self, track, weights):
        parts = []

        if 'title' in self:
            a = self['title']
            b = track.get('title', '')
            parts.append((similarity2(a, b), weights["title"]))

        if 'artist' in self:
            a = self['artist']
            artist_credits = track.get('artist-credit', [])
            b = artist_credit_from_node(artist_credits)[0]
            parts.append((similarity2(a, b), weights["artist"]))

        a = self.length
        if a > 0 and 'length' in track:
            b = track['length']
            score = self.length_score(a, b)
            parts.append((score, weights["length"]))

        releases = []
        if "releases" in track:
            releases = track['releases']

        search_score = get_score(track)
        if not releases:
            sim = linear_combination_of_weights(parts) * search_score
            return SimMatchTrack(similarity=sim,
                                 releasegroup=None,
                                 release=None,
                                 track=track)

        if 'isvideo' in weights:
            metadata_is_video = self['~video'] == '1'
            track_is_video = track.get('video', False)
            score = 1 if metadata_is_video == track_is_video else 0
            parts.append((score, weights['isvideo']))

        result = SimMatchTrack(similarity=-1,
                               releasegroup=None,
                               release=None,
                               track=None)
        for release in releases:
            release_parts = self.compare_to_release_parts(release, weights)
            sim = linear_combination_of_weights(parts +
                                                release_parts) * search_score
            if sim > result.similarity:
                rg = release[
                    'release-group'] if "release-group" in release else None
                result = SimMatchTrack(similarity=sim,
                                       releasegroup=rg,
                                       release=release,
                                       track=track)
        return result
Exemple #3
0
 def test_get_score_no_score(self):
     self.assertEqual(1.0, get_score({}))
Exemple #4
0
 def test_get_score(self):
     for score, expected in ((42, 0.42), ('100', 1.0), (0, 0.0), (None, 1.0), ('', 1.0)):
         self.assertEqual(expected, get_score({'score': score}))