From de0958ca65dd00ce270ca0ed67f42ffc133a915a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0ar=C5=ABnas=20Nejus?= Date: Mon, 21 Apr 2025 23:09:16 +0100 Subject: [PATCH] Use candidate function from plugins instead of hooks --- beets/autotag/hooks.py | 25 +------------------------ beets/autotag/match.py | 14 ++++++++------ beetsplug/mbsync.py | 7 +++---- beetsplug/missing.py | 5 ++--- 4 files changed, 14 insertions(+), 37 deletions(-) diff --git a/beets/autotag/hooks.py b/beets/autotag/hooks.py index 530b5d7ad..88213b06a 100644 --- a/beets/autotag/hooks.py +++ b/beets/autotag/hooks.py @@ -23,7 +23,7 @@ from typing import TYPE_CHECKING, Any, NamedTuple, TypeVar from jellyfish import levenshtein_distance from unidecode import unidecode -from beets import config, logging, plugins +from beets import config, logging from beets.util import as_string, cached_classproperty if TYPE_CHECKING: @@ -590,26 +590,3 @@ class AlbumMatch(NamedTuple): class TrackMatch(NamedTuple): distance: Distance info: TrackInfo - - -# Aggregation of sources. - - -def album_for_id(*args, **kwargs) -> AlbumInfo | None: - """Get AlbumInfo object for the given ID string.""" - return plugins.album_for_id(*args, **kwargs) - - -def track_for_id(*args, **kwargs) -> TrackInfo | None: - """Get TrackInfo object for the given ID string.""" - return plugins.track_for_id(*args, **kwargs) - - -@plugins.notify_info_yielded("albuminfo_received") -def album_candidates(*args, **kwargs) -> Iterator[AlbumInfo]: - yield from plugins.candidates(*args, **kwargs) - - -@plugins.notify_info_yielded("trackinfo_received") -def item_candidates(*args, **kwargs) -> Iterator[TrackInfo]: - yield from plugins.item_candidates(*args, **kwargs) diff --git a/beets/autotag/match.py b/beets/autotag/match.py index 5333b93fe..b3df1304f 100644 --- a/beets/autotag/match.py +++ b/beets/autotag/match.py @@ -356,7 +356,7 @@ def match_by_id(items: Iterable[Item]) -> AlbumInfo | None: return None # If all album IDs are equal, look up the album. log.debug("Searching for discovered album ID: {0}", first) - return hooks.album_for_id(first) + return plugins.album_for_id(first) def _recommendation( @@ -511,7 +511,7 @@ def tag_album( if search_ids: for search_id in search_ids: log.debug("Searching for album ID: {0}", search_id) - if info := hooks.album_for_id(search_id): + if info := plugins.album_for_id(search_id): _add_candidate(items, candidates, info) # Use existing metadata or text search. @@ -554,8 +554,8 @@ def tag_album( log.debug("Album might be VA: {0}", va_likely) # Get the results from the data sources. - for matched_candidate in hooks.album_candidates( - items, search_artist, search_album, va_likely, extra_tags + for matched_candidate in plugins.candidates( + items, search_artist, search_album, va_likely ): _add_candidate(items, candidates, matched_candidate) @@ -589,7 +589,7 @@ def tag_item( if trackids: for trackid in trackids: log.debug("Searching for track ID: {0}", trackid) - if info := hooks.track_for_id(trackid): + if info := plugins.track_for_id(trackid): dist = track_distance(item, info, incl_artist=True) candidates[info.track_id] = hooks.TrackMatch(dist, info) # If this is a good match, then don't keep searching. @@ -615,7 +615,9 @@ def tag_item( log.debug("Item search terms: {0} - {1}", search_artist, search_title) # Get and evaluate candidate metadata. - for track_info in hooks.item_candidates(item, search_artist, search_title): + for track_info in plugins.item_candidates( + item, search_artist, search_title + ): dist = track_distance(item, track_info, incl_artist=True) candidates[track_info.track_id] = hooks.TrackMatch(dist, track_info) diff --git a/beetsplug/mbsync.py b/beetsplug/mbsync.py index 2e62b7b7e..94870232c 100644 --- a/beetsplug/mbsync.py +++ b/beetsplug/mbsync.py @@ -16,8 +16,7 @@ from collections import defaultdict -from beets import autotag, library, ui, util -from beets.autotag import hooks +from beets import autotag, library, plugins, ui, util from beets.plugins import BeetsPlugin, apply_item_changes @@ -80,7 +79,7 @@ class MBSyncPlugin(BeetsPlugin): ) continue - if not (track_info := hooks.track_for_id(item.mb_trackid)): + if not (track_info := plugins.track_for_id(item.mb_trackid)): self._log.info( "Recording ID not found: {0.mb_trackid} for track {0}", item ) @@ -101,7 +100,7 @@ class MBSyncPlugin(BeetsPlugin): self._log.info("Skipping album with no mb_albumid: {}", album) continue - if not (album_info := hooks.album_for_id(album.mb_albumid)): + if not (album_info := plugins.album_for_id(album.mb_albumid)): self._log.info( "Release ID {0.mb_albumid} not found for album {0}", album ) diff --git a/beetsplug/missing.py b/beetsplug/missing.py index ccaa65320..c4bbb83fd 100644 --- a/beetsplug/missing.py +++ b/beetsplug/missing.py @@ -21,8 +21,7 @@ from collections.abc import Iterator import musicbrainzngs from musicbrainzngs.musicbrainz import MusicBrainzError -from beets import config -from beets.autotag import hooks +from beets import config, plugins from beets.dbcore import types from beets.library import Album, Item, Library from beets.plugins import BeetsPlugin @@ -223,7 +222,7 @@ class MissingPlugin(BeetsPlugin): item_mbids = {x.mb_trackid for x in album.items()} # fetch missing items # TODO: Implement caching that without breaking other stuff - if album_info := hooks.album_for_id(album.mb_albumid): + if album_info := plugins.album_for_id(album.mb_albumid): for track_info in album_info.tracks: if track_info.track_id not in item_mbids: self._log.debug(