Skip to content

Commit cb75898

Browse files
committed
Fix data source penalty for mbpseudo
1 parent defc602 commit cb75898

File tree

3 files changed

+85
-42
lines changed

3 files changed

+85
-42
lines changed

beetsplug/mbpseudo.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ def candidates(
9595
@override
9696
def album_info(self, release: JSONDict) -> AlbumInfo:
9797
official_release = super().album_info(release)
98-
official_release.data_source = "MusicBrainz"
9998

10099
if release.get("status") == _STATUS_PSEUDO:
101100
return official_release
@@ -113,7 +112,6 @@ def album_info(self, release: JSONDict) -> AlbumInfo:
113112
pseudo_release, official_release
114113
),
115114
official_release=official_release,
116-
data_source="MusicBrainz",
117115
)
118116
except musicbrainzngs.MusicBrainzError as exc:
119117
raise MusicBrainzAPIError(
@@ -172,17 +170,20 @@ def _wanted_pseudo_release_id(
172170
def _adjust_final_album_match(self, match: AlbumMatch):
173171
album_info = match.info
174172
if isinstance(album_info, PseudoAlbumInfo):
175-
mapping = match.mapping
176173
self._log.debug(
177174
"Switching {0} to pseudo-release source for final proposal",
178175
album_info.album_id,
179176
)
180177
album_info.use_pseudo_as_ref()
178+
mapping = match.mapping
181179
new_mappings, _, _ = assign_items(
182180
list(mapping.keys()), album_info.tracks
183181
)
184182
mapping.update(new_mappings)
185183

184+
if album_info.data_source == self.data_source:
185+
album_info.data_source = "MusicBrainz"
186+
186187
@override
187188
def _extract_id(self, url: str) -> str | None:
188189
return extract_release_id("MusicBrainz", url)
@@ -220,17 +221,12 @@ def get_official_release(self) -> AlbumInfo:
220221
return self.__dict__["_official_release"]
221222

222223
def determine_best_ref(self, items: Sequence[Item]) -> str:
223-
ds = self.data_source
224-
self.data_source = None
225-
226224
self.use_pseudo_as_ref()
227225
pseudo_dist = self._compute_distance(items)
228226

229227
self.use_official_as_ref()
230228
official_dist = self._compute_distance(items)
231229

232-
self.data_source = ds
233-
234230
if official_dist < pseudo_dist:
235231
self.use_official_as_ref()
236232
return "official"

docs/plugins/mbpseudo.rst

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pseudo-releases with desired scripts.
1919
Configuration
2020
-------------
2121

22-
Since this plugin first searches for official releases from MusicBrainz, most
22+
Since this plugin first searches for official releases from MusicBrainz, all
2323
options from the `musicbrainz` plugin's :ref:`musicbrainz-config` are supported,
2424
but they must be specified under `mbpseudo` in the configuration file.
2525
Additionally, the configuration expects an array of scripts that are desired for
@@ -36,8 +36,8 @@ like this:
3636
3737
Note that the `search_limit` configuration applies to the initial search for
3838
official releases, and that the `data_source` in the database will be
39-
"MusicBrainz". Because of this, the only configuration that must remain under
40-
`musicbrainz` is `data_source_mismatch_penalty` (see also
39+
"MusicBrainz". Nevertheless, `data_source_mismatch_penalty` must also be
40+
specified under `mbpseudo` (see also
4141
:ref:`metadata-source-plugin-configuration`). An example with multiple data
4242
sources may look like this:
4343

@@ -46,11 +46,9 @@ sources may look like this:
4646
plugins: mbpseudo deezer
4747
4848
mbpseudo:
49+
data_source_mismatch_penalty: 0
4950
scripts:
5051
- Latn
5152
52-
musicbrainz:
53-
data_source_mismatch_penalty: 0
54-
5553
deezer:
56-
data_source_mismatch_penalty: 0.5
54+
data_source_mismatch_penalty: 0.2

test/plugins/test_mbpseudo.py

Lines changed: 76 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
import pytest
55

6+
from beets.autotag import AlbumMatch
7+
from beets.autotag.distance import Distance
68
from beets.autotag.hooks import AlbumInfo, TrackInfo
79
from beets.library import Item
810
from beets.test.helper import PluginMixin
@@ -14,48 +16,50 @@
1416
)
1517

1618

17-
class TestPseudoAlbumInfo:
18-
@pytest.fixture
19-
def official_release(self) -> AlbumInfo:
20-
return AlbumInfo(
21-
tracks=[TrackInfo(title="百花繚乱")],
22-
album_id="official",
23-
album="百花繚乱",
24-
)
19+
@pytest.fixture(scope="module")
20+
def official_release_info() -> AlbumInfo:
21+
return AlbumInfo(
22+
tracks=[TrackInfo(title="百花繚乱")],
23+
album_id="official",
24+
album="百花繚乱",
25+
)
2526

26-
@pytest.fixture
27-
def pseudo_release(self) -> AlbumInfo:
28-
return AlbumInfo(
29-
tracks=[TrackInfo(title="In Bloom")],
30-
album_id="pseudo",
31-
album="In Bloom",
32-
)
3327

28+
@pytest.fixture(scope="module")
29+
def pseudo_release_info() -> AlbumInfo:
30+
return AlbumInfo(
31+
tracks=[TrackInfo(title="In Bloom")],
32+
album_id="pseudo",
33+
album="In Bloom",
34+
)
35+
36+
37+
class TestPseudoAlbumInfo:
3438
def test_album_id_always_from_pseudo(
35-
self, official_release: AlbumInfo, pseudo_release: AlbumInfo
39+
self, official_release_info: AlbumInfo, pseudo_release_info: AlbumInfo
3640
):
37-
info = PseudoAlbumInfo(pseudo_release, official_release)
41+
info = PseudoAlbumInfo(pseudo_release_info, official_release_info)
3842
info.use_official_as_ref()
3943
assert info.album_id == "pseudo"
4044

4145
def test_get_attr_from_pseudo(
42-
self, official_release: AlbumInfo, pseudo_release: AlbumInfo
46+
self, official_release_info: AlbumInfo, pseudo_release_info: AlbumInfo
4347
):
44-
info = PseudoAlbumInfo(pseudo_release, official_release)
48+
info = PseudoAlbumInfo(pseudo_release_info, official_release_info)
4549
assert info.album == "In Bloom"
4650

4751
def test_get_attr_from_official(
48-
self, official_release: AlbumInfo, pseudo_release: AlbumInfo
52+
self, official_release_info: AlbumInfo, pseudo_release_info: AlbumInfo
4953
):
50-
info = PseudoAlbumInfo(pseudo_release, official_release)
54+
info = PseudoAlbumInfo(pseudo_release_info, official_release_info)
5155
info.use_official_as_ref()
5256
assert info.album == info.get_official_release().album
5357

5458
def test_determine_best_ref(
55-
self, official_release: AlbumInfo, pseudo_release: AlbumInfo
59+
self, official_release_info: AlbumInfo, pseudo_release_info: AlbumInfo
5660
):
5761
info = PseudoAlbumInfo(
58-
pseudo_release, official_release, data_source="test"
62+
pseudo_release_info, official_release_info, data_source="test"
5963
)
6064
item = Item()
6165
item["title"] = "百花繚乱"
@@ -126,7 +130,7 @@ def test_album_info_for_pseudo_release(
126130
):
127131
album_info = mbpseudo_plugin.album_info(pseudo_release["release"])
128132
assert not isinstance(album_info, PseudoAlbumInfo)
129-
assert album_info.data_source == "MusicBrainz"
133+
assert album_info.data_source == "MusicBrainzPseudoRelease"
130134
assert album_info.albumstatus == _STATUS_PSEUDO
131135

132136
@pytest.mark.parametrize(
@@ -147,7 +151,7 @@ def test_interception_skip_when_rel_values_dont_match(
147151

148152
album_info = mbpseudo_plugin.album_info(official_release["release"])
149153
assert not isinstance(album_info, PseudoAlbumInfo)
150-
assert album_info.data_source == "MusicBrainz"
154+
assert album_info.data_source == "MusicBrainzPseudoRelease"
151155

152156
def test_interception_skip_when_script_doesnt_match(
153157
self,
@@ -160,7 +164,7 @@ def test_interception_skip_when_script_doesnt_match(
160164

161165
album_info = mbpseudo_plugin.album_info(official_release["release"])
162166
assert not isinstance(album_info, PseudoAlbumInfo)
163-
assert album_info.data_source == "MusicBrainz"
167+
assert album_info.data_source == "MusicBrainzPseudoRelease"
164168

165169
def test_interception(
166170
self,
@@ -173,4 +177,49 @@ def test_interception(
173177
)
174178
album_info = mbpseudo_plugin.album_info(official_release["release"])
175179
assert isinstance(album_info, PseudoAlbumInfo)
176-
assert album_info.data_source == "MusicBrainz"
180+
assert album_info.data_source == "MusicBrainzPseudoRelease"
181+
182+
def test_final_adjustment_skip(
183+
self,
184+
mbpseudo_plugin: MusicBrainzPseudoReleasePlugin,
185+
):
186+
match = AlbumMatch(
187+
distance=Distance(),
188+
info=AlbumInfo(tracks=[], data_source="mb"),
189+
mapping={},
190+
extra_items=[],
191+
extra_tracks=[],
192+
)
193+
194+
mbpseudo_plugin._adjust_final_album_match(match)
195+
assert match.info.data_source == "mb"
196+
197+
def test_final_adjustment(
198+
self,
199+
mbpseudo_plugin: MusicBrainzPseudoReleasePlugin,
200+
official_release_info: AlbumInfo,
201+
pseudo_release_info: AlbumInfo,
202+
):
203+
pseudo_album_info = PseudoAlbumInfo(
204+
pseudo_release=pseudo_release_info,
205+
official_release=official_release_info,
206+
data_source=mbpseudo_plugin.data_source,
207+
)
208+
pseudo_album_info.use_official_as_ref()
209+
210+
item = Item()
211+
item["title"] = "百花繚乱"
212+
213+
match = AlbumMatch(
214+
distance=Distance(),
215+
info=pseudo_album_info,
216+
mapping={item: pseudo_album_info.tracks[0]},
217+
extra_items=[],
218+
extra_tracks=[],
219+
)
220+
221+
mbpseudo_plugin._adjust_final_album_match(match)
222+
223+
assert match.info.data_source == "MusicBrainz"
224+
assert match.info.album_id == "pseudo"
225+
assert match.info.album == "In Bloom"

0 commit comments

Comments
 (0)