From 3356e9d7bbb8039e4f2286d142ae1c300cd7d827 Mon Sep 17 00:00:00 2001 From: Petru101 <43178362+Petru101@users.noreply.github.com> Date: Wed, 11 Nov 2026 20:04:19 +0000 Subject: [PATCH] Handle null mediaMetadata on tracks and albums TIDAL sometimes sends "mediaMetadata": null. parse_track only handled a missing key, so an available track with null metadata raised AttributeError, and Album.parse raised TypeError for any album with null metadata. One such item makes a whole playlist fail to load, as reported in High Tide (Nokse22/high-tide#217, #218). Null is now treated like a missing value. Co-Authored-By: Claude Opus 5.5 --- tests/test_parsing.py | 32 ++++++++++++++++++++++++++++++++ tidalapi/album.py | 6 ++++-- tidalapi/media.py | 4 +++- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/tests/test_parsing.py b/tests/test_parsing.py index 35a4ff3..e1df814 100644 --- a/tests/test_parsing.py +++ b/tests/test_parsing.py @@ -198,3 +198,35 @@ def test_track_with_album_parses_album_artist(session): assert track.album.artist is None assert track.artist is None + + +def test_available_track_with_null_media_metadata(session): + track = session.track().parse_track( + track_json(allowStreaming=True, streamReady=True, mediaMetadata=None) + ) + + assert track.media_metadata_tags == {} + + +def test_track_media_metadata_tags_are_read(session): + track = session.track().parse_track( + track_json( + allowStreaming=True, + streamReady=True, + mediaMetadata={"tags": ["LOSSLESS", "HIRES_LOSSLESS"]}, + ) + ) + + assert track.media_metadata_tags == ["LOSSLESS", "HIRES_LOSSLESS"] + + +def test_album_with_null_media_metadata_keeps_default_tags(session): + album = session.album().parse(album_json(mediaMetadata=None)) + + assert album.media_metadata_tags == [""] + + +def test_album_media_metadata_tags_are_read(session): + album = session.album().parse(album_json(mediaMetadata={"tags": ["LOSSLESS"]})) + + assert album.media_metadata_tags == ["LOSSLESS"] diff --git a/tidalapi/album.py b/tidalapi/album.py index c1eb8d3..95db962 100644 --- a/tidalapi/album.py +++ b/tidalapi/album.py @@ -139,8 +139,10 @@ def parse( self.audio_quality = json_obj.get("audioQuality") self.audio_modes = json_obj.get("audioModes") - if "mediaMetadata" in json_obj: - self.media_metadata_tags = json_obj.get("mediaMetadata")["tags"] + # mediaMetadata can be null + media_metadata = json_obj.get("mediaMetadata") or {} + if "tags" in media_metadata: + self.media_metadata_tags = media_metadata["tags"] self.artist = artist self.artists = artists diff --git a/tidalapi/media.py b/tidalapi/media.py index 2ff35e9..55b6b39 100644 --- a/tidalapi/media.py +++ b/tidalapi/media.py @@ -361,7 +361,9 @@ def parse_track(self, json_obj: JsonObj, album: Album | None = None) -> Track: if self.available: self.access_type = json_obj.get("accessType", "None") - self.media_metadata_tags = json_obj.get("mediaMetadata", {}).get("tags", {}) + # mediaMetadata can be null + media_metadata = json_obj.get("mediaMetadata") or {} + self.media_metadata_tags = media_metadata.get("tags", {}) self.index = json_obj.get("index") self.item_uuid = json_obj.get("itemUuid")