Fix pytube not matching function name. (#731)
authorMarvin Schenkel <marvinschenkel@gmail.com>
Sat, 24 Jun 2023 06:39:08 +0000 (08:39 +0200)
committerGitHub <noreply@github.com>
Sat, 24 Jun 2023 06:39:08 +0000 (08:39 +0200)
* Fix pytube not matching function name.

* Fix personal playlists for multiple instances. (#725)

music_assistant/server/providers/ytmusic/__init__.py
music_assistant/server/providers/ytmusic/helpers.py
music_assistant/server/providers/ytmusic/manifest.json
requirements_all.txt

index 88bab587b1dfe8ab8eac02d7f594d02f9082bf6b..e1df9d32aa5112cd23f91d8cc62ec7018afc235b 100644 (file)
@@ -310,7 +310,11 @@ class YoutubeMusicProvider(MusicProvider):
     async def get_track(self, prov_track_id) -> Track:
         """Get full track details by id."""
         await self._check_oauth_token()
-        if track_obj := await get_track(prov_track_id=prov_track_id, headers=self._headers):
+        if track_obj := await get_track(
+            prov_track_id=prov_track_id,
+            headers=self._headers,
+            signature_timestamp=self._signature_timestamp,
+        ):
             return await self._parse_track(track_obj)
         raise MediaNotFoundError(f"Item {prov_track_id} not found")
 
@@ -485,13 +489,19 @@ class YoutubeMusicProvider(MusicProvider):
 
     async def get_stream_details(self, item_id: str, retry=0) -> StreamDetails:
         """Return the content details for the given track when it will be streamed."""
-        data = {
-            "playbackContext": {
-                "contentPlaybackContext": {"signatureTimestamp": self._signature_timestamp}
-            },
-            "video_id": item_id,
-        }
-        track_obj = await self._post_data("player", data=data)
+        # Misschien dit vervangen met api.get_song()? https://github.com/KoljaWindeler/ytube_music_player/blob/main/custom_components/ytube_music_player/media_player.py#L1493
+        # data = {
+        #     "playbackContext": {
+        #         "contentPlaybackContext": {"signatureTimestamp": self._signature_timestamp}
+        #     },
+        #     "video_id": item_id,
+        # }
+        # track_obj = await self._post_data("player", data=data)
+        track_obj = await get_track(
+            prov_track_id=item_id,
+            headers=self._headers,
+            signature_timestamp=self._signature_timestamp,
+        )
         stream_format = await self._parse_stream_format(track_obj)
         url = await self._parse_stream_url(stream_format=stream_format, item_id=item_id)
         if not await self._is_valid_deciphered_url(url=url):
index a783634971404f51fbd430f577a2267047f1c724..e994ad0f25f08ae65f1972df7f3316dfce50d190 100644 (file)
@@ -63,12 +63,14 @@ async def get_playlist(prov_playlist_id: str, headers: dict[str, str]) -> dict[s
     return await asyncio.to_thread(_get_playlist)
 
 
-async def get_track(prov_track_id: str, headers: dict[str, str]) -> dict[str, str]:
+async def get_track(
+    prov_track_id: str, headers: dict[str, str], signature_timestamp: str
+) -> dict[str, str]:
     """Async wrapper around the ytmusicapi get_playlist function."""
 
     def _get_song():
         ytm = ytmusicapi.YTMusic(auth=json.dumps(headers))
-        track_obj = ytm.get_song(videoId=prov_track_id)
+        track_obj = ytm.get_song(videoId=prov_track_id, signatureTimestamp=signature_timestamp)
         track = {}
         track["videoId"] = track_obj["videoDetails"]["videoId"]
         track["title"] = track_obj["videoDetails"]["title"]
@@ -83,6 +85,7 @@ async def get_track(prov_track_id: str, headers: dict[str, str]) -> dict[str, st
             "thumbnails"
         ]
         track["isAvailable"] = track_obj["playabilityStatus"]["status"] == "OK"
+        track["streamingData"] = track_obj["streamingData"]
         return track
 
     return await asyncio.to_thread(_get_song)
index 0bbe9174d7151c90eb948364bf1d3f648f9d10de..6386577bb088071aa0de7aee29c0209fbfcfb557 100644 (file)
@@ -4,7 +4,7 @@
   "name": "YouTube Music",
   "description": "Support for the YouTube Music streaming provider in Music Assistant.",
   "codeowners": ["@MarvinSchenkel"],
-  "requirements": ["ytmusicapi==1.0.0", "git+https://github.com/pytube/pytube.git@refs/pull/1501/head"],
+  "requirements": ["ytmusicapi==1.0.0", "git+https://github.com/pytube/pytube.git@refs/pull/1680/head"],
   "documentation": "https://github.com/music-assistant/hass-music-assistant/discussions/606",
   "multi_instance": true
 }
index 8d705aa02fdf9308003e5b3d618d41638b186ba8..45fb3e4f228702e7e479f1c9e4fe4180dd2d93bf 100644 (file)
@@ -15,7 +15,7 @@ deezer-python==5.12.0
 faust-cchardet>=2.1.18
 git+https://github.com/gieljnssns/python-radios.git@main
 git+https://github.com/jozefKruszynski/python-tidal.git@v0.7.1
-git+https://github.com/pytube/pytube.git@refs/pull/1501/head
+git+https://github.com/pytube/pytube.git@refs/pull/1680/head
 mashumaro==3.7
 memory-tempfile==2.2.3
 music-assistant-frontend==20230616.0