diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e942855..50556aa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,7 +8,7 @@ jobs: fail-fast: false matrix: python: ["3.8", "3.9", "3.10", "3.11", "3.12"] - beets: ["1.4.9", "1.5.0", "1.6.0"] + beets: ["1.5.0", "1.6.0"] steps: - uses: actions/checkout@v4 diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f11b6f..5af617d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ ## [0.20.0] 2024-06-25 +### Removed + +- Drop support for `beets<1.5`. + ### Fixed - `album`: diff --git a/beetsplug/bandcamp/metaguru.py b/beetsplug/bandcamp/metaguru.py index a3701cb..a27a655 100644 --- a/beetsplug/bandcamp/metaguru.py +++ b/beetsplug/bandcamp/metaguru.py @@ -23,7 +23,6 @@ from .tracks import Tracks BEETS_VERSION = Version(beets_version) -EXTENDED_FIELDS_SUPPORT = BEETS_VERSION >= Version("1.5.0") ALBUMTYPES_LIST_SUPPORT = BEETS_VERSION >= Version("1.6.0") JSONDict = Dict[str, Any] @@ -426,11 +425,18 @@ def get_fields(self, fields: Iterable[str], src: object = None) -> JSONDict: @property def _common_album(self) -> JSONDict: common_data: JSONDict = {"album": self.album_name} - fields = ["label", "catalognum", "albumtype", "country"] - if EXTENDED_FIELDS_SUPPORT: - fields.extend(["genre", "style", "comments", "albumtypes"]) + fields = [ + "albumtype", + "albumtypes", + "catalognum", + "comments", + "country", + "genre", + "label", + "style", + ] common_data.update(self.get_fields(fields)) - if EXTENDED_FIELDS_SUPPORT and not ALBUMTYPES_LIST_SUPPORT: + if not ALBUMTYPES_LIST_SUPPORT: common_data["albumtypes"] = "; ".join(common_data["albumtypes"]) reldate = self.release_date if reldate: @@ -447,9 +453,6 @@ def _trackinfo(self, track: Track, **kwargs: Any) -> TrackInfo: data.pop("catalognum", None) if not data["lyrics"]: data.pop("lyrics", None) - if not EXTENDED_FIELDS_SUPPORT: - data.pop("catalognum", None) - data.pop("lyrics", None) for field in set(data.keys()) & self.excluded_fields: data.pop(field) @@ -460,9 +463,8 @@ def singleton(self) -> TrackInfo: self._singleton = True self.media = self.media_formats[0] track = self._trackinfo(self.tracks.first) - if EXTENDED_FIELDS_SUPPORT: - track.update(self._common_album) - track.pop("album", None) + track.update(self._common_album) + track.pop("album", None) track.track_id = track.data_url return track diff --git a/poetry.lock b/poetry.lock index b181427..2fd6085 100644 --- a/poetry.lock +++ b/poetry.lock @@ -57,32 +57,35 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p [[package]] name = "beets" -version = "1.6.0" +version = "2.0.0" description = "music tagger and library organizer" optional = false python-versions = "*" files = [ - {file = "beets-1.6.0.tar.gz", hash = "sha256:aa6fb734e44afc9b039c0abd0edd4c7706df00d4eb4aae7afa9ff4b6bb15525d"}, + {file = "beets-2.0.0-py3-none-any.whl", hash = "sha256:6fe596f578ce50652fc634d399af67bc0450b325c349989af781805599fcedb3"}, + {file = "beets-2.0.0.tar.gz", hash = "sha256:3b1172b5bc3729e33a6ea4689f7d0236682bf828c67196b6a260f0389cb1f8cf"}, ] [package.dependencies] -confuse = ">=1.0.0" +confuse = ">=1.5.0" jellyfish = "*" -mediafile = ">=0.2.0" +mediafile = ">=0.12.0" munkres = ">=1.0.0" musicbrainzngs = ">=0.4" pyyaml = "*" -unidecode = "*" +typing-extensions = "*" +unidecode = ">=1.3.6" [package.extras] absubmit = ["requests"] beatport = ["requests-oauthlib (>=0.6.1)"] bpd = ["PyGObject"] chroma = ["pyacoustid"] -discogs = ["python3-discogs-client (>=2.3.10)"] +discogs = ["python3-discogs-client (>=2.3.15)"] +docs = ["pydata-sphinx-theme", "sphinx"] embedart = ["Pillow"] embyupdate = ["requests"] -fetchart = ["Pillow", "requests"] +fetchart = ["Pillow", "beautifulsoup4", "requests"] import = ["py7zr", "rarfile"] kodiupdate = ["requests"] lastgenre = ["pylast"] @@ -91,12 +94,13 @@ lint = ["flake8", "flake8-docstrings", "pep8-naming"] lyrics = ["beautifulsoup4", "langdetect", "requests"] metasync = ["dbus-python"] mpdstats = ["python-mpd2 (>=0.4.2)"] +mypy = ["mypy", "types-Flask-Cors", "types-Pillow", "types-PyYAML", "types-beautifulsoup4", "types-requests", "types-urllib3"] plexupdate = ["requests"] reflink = ["reflink"] replaygain = ["PyGObject"] scrub = ["mutagen (>=1.33)"] sonosupdate = ["soco"] -test = ["beautifulsoup4", "coverage", "flask", "mock", "py7zr", "pylast", "pytest", "python-mpd2", "python3-discogs-client", "pyxdg", "rarfile", "reflink", "requests_oauthlib", "responses (>=0.3.0)"] +test = ["beautifulsoup4", "flask", "mock", "py7zr", "pylast", "pytest", "pytest-cov", "python-mpd2", "python3-discogs-client (>=2.3.15)", "pyxdg", "rarfile", "reflink", "requests-oauthlib", "responses (>=0.3.0)"] thumbnails = ["Pillow", "pyxdg"] web = ["flask", "flask-cors"] @@ -1321,4 +1325,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8, <4" -content-hash = "8a4755ba16c19f0f9dd082a510a9c39866572015bee7baaa30c7b15a1f59cf84" +content-hash = "670bb59f57eeb6862aaabfe640d23f4733a42f72c4768d70960523a79a889bab" diff --git a/pyproject.toml b/pyproject.toml index 2c82276..1287549 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ Changelog = "https://github.com/snejus/beetcamp/blob/master/CHANGELOG.md" python = ">=3.8, <4" pycountry = ">=20.7.3" -beets = ">=1.4,<=2" +beets = ">=1.5,<=2" httpx = ">=0.27.0" ordered-set = ">=4.0" packaging = ">=24.0" diff --git a/tests/conftest.py b/tests/conftest.py index 860b0df..a0480f4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -14,7 +14,7 @@ from rich_tables.utils import make_console, pretty_diff from beetsplug.bandcamp import DEFAULT_CONFIG -from beetsplug.bandcamp.metaguru import ALBUMTYPES_LIST_SUPPORT, EXTENDED_FIELDS_SUPPORT +from beetsplug.bandcamp.metaguru import ALBUMTYPES_LIST_SUPPORT if TYPE_CHECKING: from _pytest.config import Config @@ -178,26 +178,6 @@ def bandcamp_html(bandcamp_data_path: Path) -> str: JSONDictOrList = Union[Dict[str, Any], List[Dict[str, Any]]] -def remove_extra_fields(data: JSONDictOrList) -> JSONDictOrList: - """Remove extra fields from the JSON data.""" - t_fields = set(TrackInfo(None, None).__dict__) - a_fields = set(AlbumInfo(None, None, None, None, None).__dict__) - - def keep_fields(data: JSONDict, fields: set[str]) -> JSONDict: - return {k: v for k, v in data.items() if k in fields} - - def album(album_data: JSONDict) -> JSONDict: - return { - **keep_fields(album_data, a_fields), - "tracks": [keep_fields(t, t_fields) for t in album_data["tracks"]], - } - - if isinstance(data, dict): - return keep_fields(data, t_fields) - - return [album(a) for a in data] - - @pytest.fixture def expected_release(bandcamp_data_path: Path) -> list[AlbumInfo] | TrackInfo | None: """Return corresponding expected release JSON data. @@ -213,9 +193,6 @@ def expected_release(bandcamp_data_path: Path) -> list[AlbumInfo] | TrackInfo | release_data = json.loads(release_datastr) - if not EXTENDED_FIELDS_SUPPORT: - release_data = remove_extra_fields(release_data) - if isinstance(release_data, dict): if ALBUMTYPES_LIST_SUPPORT: release_data["albumtypes"] = release_data["albumtypes"].split("; ")