Skip to content

Commit

Permalink
get_playlist: join multiple title runs
Browse files Browse the repository at this point in the history
* Return complete titles when split on time-like strings:

```diff
>>> yt.get_playlist("PLaZPMsuQNCsWn0iVMtGbaUXO6z-EdZaZm")["title"]
-03 Jan
+03 Jan 12:09
```

* `test_get_playlist`: assert more props have the expected value/shape
  • Loading branch information
sgvictorino committed Oct 28, 2024
1 parent 9ce284a commit f4ee2cb
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 12 deletions.
54 changes: 43 additions & 11 deletions tests/mixins/test_playlists.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,25 +13,57 @@

class TestPlaylists:
@pytest.mark.parametrize(
("test_file", "owned"),
("test_file", "output"),
[
("2024_03_get_playlist.json", True),
("2024_03_get_playlist_public.json", False),
("2024_07_get_playlist_collaborative.json", True),
(
"2024_03_get_playlist.json",
{
"id": "PLaZPMsuQNCsWn0iVMtGbaUXO6z-EdZaZm",
"title": "03 Jan 12:09",
"owned": True,
"trackCount": 245,
"year": "2024",
"description": "Created by Playlist Generator Bot, @spotify_youtube_playlist_bot",
"duration": "5+ hours",
},
),
(
"2024_03_get_playlist_public.json",
{
"id": "RDCLAK5uy_lWy02cQBnTVTlwuRauaGKeUDH3L6PXNxI",
"title": "Feel-Good Classic Rock",
"owned": False,
"trackCount": 101,
"year": "2024",
"description": "Hold on to the feeling.\n#essentials #rock #happy",
"duration": "6+ hours",
},
),
(
"2024_07_get_playlist_collaborative.json",
{
"id": "PLEUijtLfpCOgI8LNOwiwvq0EJ8HAGj7dT",
"title": "Example_collaborative_playlist",
"owned": True,
"trackCount": 4,
"year": "2024",
"description": "Example playlist with collaboration",
"duration": "11 minutes, 15 seconds",
},
),
],
)
def test_get_playlist_2024(self, yt, test_file, owned):
def test_get_playlist(self, yt, test_file, output):
with open(Path(__file__).parent.parent / "data" / test_file, encoding="utf8") as f:
mock_response = json.load(f)
with mock.patch("ytmusicapi.YTMusic._send_request", return_value=mock_response):
playlist = yt.get_playlist("MPREabc")
assert playlist["year"] == "2024"
assert playlist["owned"] == owned
assert "hours" in playlist["duration"] or "minutes" in playlist["duration"]
assert playlist["id"]
assert isinstance(playlist["description"], str) and playlist["description"]
assert len(playlist["tracks"]) > 0
assert playlist == playlist | output

for thumbnail in playlist.get("thumbnails", []):
assert thumbnail["url"] and thumbnail["width"] and thumbnail["height"]

assert len(playlist["tracks"]) > 0
for track in playlist["tracks"]:
assert isinstance(track["title"], str) and track["title"]

Expand Down
2 changes: 1 addition & 1 deletion ytmusicapi/parsers/playlists.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def parse_playlist_header_meta(header: dict[str, Any]) -> dict[str, Any]:
"views": None,
"duration": None,
"trackCount": None,
"title": nav(header, TITLE_TEXT, none_if_absent=True),
"title": "".join([run["text"] for run in header.get("title", {}).get("runs", [])]),
"thumbnails": nav(header, THUMBNAILS),
}
if "runs" in header["secondSubtitle"]:
Expand Down

0 comments on commit f4ee2cb

Please sign in to comment.