Skip to content

Commit c4bda5a

Browse files
committed
Support embedded album ids
1 parent d0c88c9 commit c4bda5a

File tree

1 file changed

+48
-7
lines changed

1 file changed

+48
-7
lines changed

beetsplug/mbpseudo.py

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ def _intercept_mb_candidates(self, info: AlbumInfo):
101101
)
102102
self._intercepted_candidates[info.album_id] = info.copy()
103103

104+
elif info.get("albumstatus", "") == "Pseudo-Release":
105+
self._purge_intercepted_pseudo_releases(info)
106+
104107
def candidates(
105108
self,
106109
items: Sequence[Item],
@@ -144,14 +147,29 @@ def candidates(
144147
isinstance(plugin, mbplugin.MusicBrainzPlugin)
145148
for plugin in find_plugins()
146149
):
147-
self._log.debug("No releases found by main MusicBrainz plugin")
150+
self._log.debug(
151+
"No releases found after main MusicBrainz plugin executed"
152+
)
148153
return []
149154

150155
# musicbrainz plugin isn't enabled
151156
self._log.debug("Searching for official releases")
152-
official_candidates = list(
153-
self._mb.candidates(items, artist, album, va_likely)
154-
)
157+
158+
try:
159+
existing_album_id = next(
160+
item.mb_albumid for item in items if item.mb_albumid
161+
)
162+
existing_album_info = self._mb.album_for_id(existing_album_id)
163+
if not isinstance(existing_album_info, AlbumInfo):
164+
official_candidates = list(
165+
self._mb.candidates(items, artist, album, va_likely)
166+
)
167+
else:
168+
official_candidates = [existing_album_info]
169+
except StopIteration:
170+
official_candidates = list(
171+
self._mb.candidates(items, artist, album, va_likely)
172+
)
155173

156174
recursion = self._mb_plugin_simulation_matched(
157175
items, official_candidates
@@ -160,7 +178,11 @@ def candidates(
160178
if not self.config.get().get("include_official_releases"):
161179
official_candidates = []
162180

181+
self._log.debug(
182+
"Emitting {0} official match(es)", len(official_candidates)
183+
)
163184
if recursion:
185+
self._log.debug("Matches found after search")
164186
return itertools.chain(
165187
self.candidates(items, artist, album, va_likely),
166188
iter(official_candidates),
@@ -197,19 +219,38 @@ def _mb_plugin_simulation_matched(
197219
items: Sequence[Item],
198220
official_candidates: list[AlbumInfo],
199221
) -> bool:
200-
recursion = False
222+
matched = False
201223
for official_candidate in official_candidates:
202224
if official_candidate.album_id in self._pseudo_release_ids:
203225
self._intercept_mb_candidates(official_candidate)
226+
204227
if official_candidate.album_id in self._intercepted_candidates:
205228
intercepted = self._intercepted_candidates[
206229
official_candidate.album_id
207230
]
208231
intercepted.mapping, _, _ = assign_items(
209232
items, intercepted.tracks
210233
)
211-
recursion = True
212-
return recursion
234+
matched = True
235+
236+
if official_candidate.get("albumstatus", "") == "Pseudo-Release":
237+
self._purge_intercepted_pseudo_releases(official_candidate)
238+
239+
return matched
240+
241+
def _purge_intercepted_pseudo_releases(self, official_candidate: AlbumInfo):
242+
rm_keys = [
243+
album_id
244+
for album_id, pseudo_album_ids in self._pseudo_release_ids.items()
245+
if official_candidate.album_id in pseudo_album_ids
246+
]
247+
if rm_keys:
248+
self._log.debug(
249+
"No need to resolve {0}, removing",
250+
rm_keys,
251+
)
252+
for k in rm_keys:
253+
del self._pseudo_release_ids[k]
213254

214255
@override
215256
def album_distance(

0 commit comments

Comments
 (0)