def test_valid(self): release_type_score_config = "Album 1.0 Single 0.5 EP 0.5 Compilation 0.5 Soundtrack 0.5 Spokenword 0.5 Interview 0.2 Audiobook 0.0 Live 0.5 Remix 0.4 Other 0.0" release_type_scores = util.load_release_type_scores(release_type_score_config) self.assertEqual(1.0, release_type_scores["Album"]) self.assertEqual(0.5, release_type_scores["Single"]) self.assertEqual(0.2, release_type_scores["Interview"]) self.assertEqual(0.0, release_type_scores["Audiobook"]) self.assertEqual(0.4, release_type_scores["Remix"])
def load(self): scores = load_release_type_scores(config.setting["release_type_scores"]) for (release_type, release_type_slider) in self._release_type_sliders.iteritems(): release_type_slider.setValue(int(scores.get(release_type, 0.5) * 100)) self._load_list_items("preferred_release_countries", RELEASE_COUNTRIES, self.ui.country_list, self.ui.preferred_country_list) self._load_list_items("preferred_release_formats", RELEASE_FORMATS, self.ui.format_list, self.ui.preferred_format_list)
def compare_to_release(self, release, weights, return_parts=False): """ Compare metadata to a MusicBrainz release. Produces a probability as a linear combination of weights that the metadata matches a certain album. """ total = 0.0 parts = [] if "album" in self: b = release.title[0].text parts.append((similarity2(self["album"], b), weights["album"])) total += weights["album"] if "albumartist" in self and "albumartist" in weights: a = self["albumartist"] b = artist_credit_from_node(release.artist_credit[0])[0] parts.append((similarity2(a, b), weights["albumartist"])) total += weights["albumartist"] if "totaltracks" in self: a = int(self["totaltracks"]) if "title" in weights: b = int(release.medium_list[0].medium[0].track_list[0].count) else: b = int(release.medium_list[0].track_count[0].text) score = 0.0 if a > b else 0.3 if a < b else 1.0 parts.append((score, weights["totaltracks"])) total += weights["totaltracks"] preferred_countries = config.setting["preferred_release_countries"] preferred_formats = config.setting["preferred_release_formats"] total_countries = len(preferred_countries) if total_countries: score = 0.0 if "country" in release.children: try: i = preferred_countries.index(release.country[0].text) score = float(total_countries - i) / float(total_countries) except ValueError: pass parts.append((score, weights["releasecountry"])) total_formats = len(preferred_formats) if total_formats: score = 0.0 subtotal = 0 for medium in release.medium_list[0].medium: if "format" in medium.children: try: i = preferred_formats.index(medium.format[0].text) score += float(total_formats - i) / float(total_formats) except ValueError: pass subtotal += 1 if subtotal > 0: score /= subtotal parts.append((score, weights["format"])) if "releasetype" in weights: type_scores = load_release_type_scores(config.setting["release_type_scores"]) if 'release_group' in release.children and 'type' in release.release_group[0].attribs: release_type = release.release_group[0].type score = type_scores.get(release_type, type_scores.get('Other', 0.5)) else: score = 0.0 parts.append((score, weights["releasetype"])) total += weights["releasetype"] rg = QObject.tagger.get_release_group_by_id(release.release_group[0].id) if release.id in rg.loaded_albums: parts.append((1.0, 6)) return (total, parts) if return_parts else \ (reduce(lambda x, y: x + y[0] * y[1] / total, parts, 0.0), release)
def compare_to_release(self, release, weights, config): total = 0.0 parts = [] if "album" in self: b = release.title[0].text parts.append((similarity2(self["album"], b), weights["album"])) total += weights["album"] if "totaltracks" in self: a = int(self["totaltracks"]) if "title" in weights: b = int(release.medium_list[0].medium[0].track_list[0].count) else: b = int(release.medium_list[0].track_count[0].text) if a > b: score = 0.0 elif a < b: score = 0.3 else: score = 1.0 parts.append((score, weights["totaltracks"])) total += weights["totaltracks"] preferred_countries = config.setting["preferred_release_countries"].split(" ") preferred_formats = config.setting["preferred_release_formats"].split(" ") total_countries = len(preferred_countries) if total_countries: score = 0.0 if "country" in release.children: try: i = preferred_countries.index(release.country[0].text) score = float(total_countries - i) / float(total_countries) except ValueError: pass parts.append((score, weights["releasecountry"])) total_formats = len(preferred_formats) if total_formats: score = 0.0 subtotal = 0 for medium in release.medium_list[0].medium: if "format" in medium.children: try: i = preferred_formats.index(medium.format[0].text) score += float(total_formats - i) / float(total_formats) except ValueError: pass subtotal += 1 if subtotal > 0: score /= subtotal parts.append((score, weights["format"])) if "releasetype" in weights: type_scores = load_release_type_scores(config.setting["release_type_scores"]) if 'release_group' in release.children and 'type' in release.release_group[0].attribs: release_type = release.release_group[0].type score = type_scores.get(release_type, type_scores.get('Other', 0.5)) else: score = 0.0 parts.append((score, weights["releasetype"])) total += weights["releasetype"] return (total, parts)
def test_invalid(self): release_type_score_config = "Album 1.0 Other" release_type_scores = util.load_release_type_scores(release_type_score_config) self.assertEqual(1.0, release_type_scores["Album"]) self.assertEqual(0.0, release_type_scores["Other"])
def compare_to_release(self, release, weights, return_parts=False): """ Compare metadata to a MusicBrainz release. Produces a probability as a linear combination of weights that the metadata matches a certain album. """ total = 0.0 parts = [] if "album" in self: b = release.title[0].text parts.append((similarity2(self["album"], b), weights["album"])) total += weights["album"] if "albumartist" in self and "albumartist" in weights: a = self["albumartist"] b = artist_credit_from_node(release.artist_credit[0])[0] parts.append((similarity2(a, b), weights["albumartist"])) total += weights["albumartist"] if "totaltracks" in self: a = int(self["totaltracks"]) if "title" in weights: b = int(release.medium_list[0].medium[0].track_list[0].count) else: b = int(release.medium_list[0].track_count[0].text) score = 0.0 if a > b else 0.3 if a < b else 1.0 parts.append((score, weights["totaltracks"])) total += weights["totaltracks"] preferred_countries = config.setting[ "preferred_release_countries"].split(" ") preferred_formats = config.setting["preferred_release_formats"].split( " ") total_countries = len(preferred_countries) if total_countries: score = 0.0 if "country" in release.children: try: i = preferred_countries.index(release.country[0].text) score = float(total_countries - i) / float(total_countries) except ValueError: pass parts.append((score, weights["releasecountry"])) total_formats = len(preferred_formats) if total_formats: score = 0.0 subtotal = 0 for medium in release.medium_list[0].medium: if "format" in medium.children: try: i = preferred_formats.index(medium.format[0].text) score += float(total_formats - i) / float(total_formats) except ValueError: pass subtotal += 1 if subtotal > 0: score /= subtotal parts.append((score, weights["format"])) if "releasetype" in weights: type_scores = load_release_type_scores( config.setting["release_type_scores"]) if 'release_group' in release.children and 'type' in release.release_group[ 0].attribs: release_type = release.release_group[0].type score = type_scores.get(release_type, type_scores.get('Other', 0.5)) else: score = 0.0 parts.append((score, weights["releasetype"])) total += weights["releasetype"] rg = QObject.tagger.get_release_group_by_id( release.release_group[0].id) if release.id in rg.loaded_albums: parts.append((1.0, 6)) return (total, parts) if return_parts else \ (reduce(lambda x, y: x + y[0] * y[1] / total, parts, 0.0), release)
def test_invalid(self): release_type_score_config = "Album 1.0 Other" release_type_scores = util.load_release_type_scores( release_type_score_config) self.assertEqual(1.0, release_type_scores["Album"]) self.assertEqual(0.0, release_type_scores["Other"])