diff --git a/beets/autotag/distance.py b/beets/autotag/distance.py index 03c4afe53..7c762de0c 100644 --- a/beets/autotag/distance.py +++ b/beets/autotag/distance.py @@ -16,7 +16,7 @@ if TYPE_CHECKING: from collections.abc import Iterator, KeysView, Sequence from beets.library import Item - from beets.util import AttrDict + from beets.util import Likelies from beets.util.color import ColorName from .hooks import AlbumInfo, TrackInfo @@ -428,7 +428,7 @@ def track_distance( def distance( - original: AttrDict[Any], + original: Likelies, album_info: AlbumInfo, item_info_pairs: list[tuple[Item, TrackInfo]], unmatched_count: int, @@ -436,7 +436,7 @@ def distance( """Determine how "significant" an album metadata change would be. Returns a Distance object. - `original` is an AttrDict with the original album metadata. + `original` contains original album metadata. `album_info` is an AlbumInfo object reflecting the album to be compared. `item_info_pairs` is a list with matched (Item, TrackInfo) pairs. `unmatched_count` is the number of unmatched tracks on the release. diff --git a/beets/autotag/source.py b/beets/autotag/source.py index 4f1b222e2..08cd1c186 100644 --- a/beets/autotag/source.py +++ b/beets/autotag/source.py @@ -1,8 +1,8 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Literal, NamedTuple +from typing import TYPE_CHECKING, Literal, NamedTuple -from beets.util import AttrDict, get_most_common_tags +from beets.util import Likelies, get_most_common_tags if TYPE_CHECKING: from collections.abc import Sequence @@ -14,7 +14,7 @@ class Source(NamedTuple): type: Literal["album", "track"] artist: str name: str - data: AttrDict[Any] + data: Likelies items: Sequence[Item] id: str id_consensus: bool @@ -35,11 +35,11 @@ class Source(NamedTuple): likelies = get_most_common_tags(items) return cls( type="album", - artist=likelies["artist"], - name=likelies["album"], - data=AttrDict(likelies), + artist=likelies.artist, + name=likelies.album, + data=likelies, items=items, - id=likelies["mb_albumid"], + id=likelies.mb_albumid, id_consensus=len({i.mb_albumid for i in items}) == 1, ) @@ -50,7 +50,7 @@ class Source(NamedTuple): type="track", artist=item.artist, name=item.title, - data=AttrDict(item), + data=Likelies(item), items=[item], id=item.mb_trackid, id_consensus=True, diff --git a/beets/util/__init__.py b/beets/util/__init__.py index e1f104b28..159fbc3fd 100644 --- a/beets/util/__init__.py +++ b/beets/util/__init__.py @@ -811,7 +811,7 @@ def plurality(objs: Iterable[T]) -> tuple[T, int]: return c.most_common(1)[0] -def get_most_common_tags(items: Sequence[Item]) -> dict[str, Any]: +def get_most_common_tags(items: Sequence[Item]) -> Likelies: """Extract the most common value for each field given a list of items.""" assert items # Must be nonempty. @@ -839,7 +839,7 @@ def get_most_common_tags(items: Sequence[Item]) -> dict[str, Any]: if len({i.albumartist for i in items}) == 1 and likelies["albumartist"]: likelies["artist"] = likelies["albumartist"] - return likelies + return Likelies(likelies) # stdout and stderr as bytes @@ -1245,3 +1245,21 @@ class AttrDict(dict[str, T]): def __hash__(self) -> int: # type: ignore[override] return id(self) + + +class Likelies(AttrDict[Any]): + """A dictionary of the most common tags in a list of items.""" + + artist: str + album: str + albumartist: str + year: int + disctotal: int + mb_albumid: str + label: str + barcode: str + catalognum: str + country: str + media: str + albumdisambig: str + data_source: str