From d4084764c83ffde05f15574b791976edc499f24e Mon Sep 17 00:00:00 2001 From: Dhruv Maniya Date: Wed, 29 Jul 2026 22:07:22 +0530 Subject: [PATCH] fix: report filtered MusicBrainz track totals Signed-off-by: Dhruv Maniya --- beetsplug/musicbrainz.py | 12 ++++++------ test/plugins/test_musicbrainz.py | 21 ++++++++++++++++----- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/beetsplug/musicbrainz.py b/beetsplug/musicbrainz.py index 5498f257d8..13b459ec79 100644 --- a/beetsplug/musicbrainz.py +++ b/beetsplug/musicbrainz.py @@ -562,12 +562,6 @@ def get_tracks_from_medium(self, medium: Medium) -> Iterable[TrackInfo]: if not self.ignore_data_tracks: all_tracks.extend(medium.get("data_tracks", [])) - medium_data = { - "medium": medium["position"], - "medium_total": medium["track_count"], - "disctitle": medium["title"], - "media": medium["format"], - } valid_tracks = [ t for t in all_tracks @@ -578,6 +572,12 @@ def get_tracks_from_medium(self, medium: Medium) -> Iterable[TrackInfo]: and not (self.ignore_video_tracks and t["recording"]["video"]) ) ] + medium_data = { + "medium": medium["position"], + "medium_total": len(valid_tracks), + "disctitle": medium["title"], + "media": medium["format"], + } for track in valid_tracks: # make a copy since we need to modify it with track-level overrides recording = track["recording"].copy() diff --git a/test/plugins/test_musicbrainz.py b/test/plugins/test_musicbrainz.py index 6f776802ea..13b288d642 100644 --- a/test/plugins/test_musicbrainz.py +++ b/test/plugins/test_musicbrainz.py @@ -411,23 +411,32 @@ def test_missing_tracks(self, mb): assert mb.album_info(release).mediums == 2 @pytest.mark.parametrize( - "beets_match_config, expected_titles", + "beets_match_config, expected_titles, expected_medium_total", [ - _p({}, ("Audio",), id="only audio tracks by default"), + _p({}, ("Audio",), 1, id="only audio tracks by default"), _p( {"ignore_data_tracks": False}, ("Audio", "Data"), + 2, id="include data tracks", ), _p( {"ignore_data_tracks": False, "ignore_video_tracks": False}, ("Audio", "Video: Video", "Data"), + 3, id="include data and video tracks", ), - _p({"ignored_media": "Vinyl"}, (), id="ignore all tracks"), + _p({"ignored_media": "Vinyl"}, (), 0, id="ignore all tracks"), ], ) - def test_data_tracks(self, config, beets_match_config, mb, expected_titles): + def test_data_tracks( + self, + config, + beets_match_config, + mb, + expected_titles, + expected_medium_total, + ): medium = medium_factory( format="Vinyl", tracks=[ @@ -441,9 +450,11 @@ def test_data_tracks(self, config, beets_match_config, mb, expected_titles): config.set({"match": beets_match_config}) - actual_titles = tuple(t.title for t in mb.album_info(release).tracks) + tracks = mb.album_info(release).tracks + actual_titles = tuple(t.title for t in tracks) assert actual_titles == expected_titles + assert all(t.medium_total == expected_medium_total for t in tracks) class TestParseRelease(MusicBrainzPluginTestMixin):