* Fix pytube not matching function name.
* Fix personal playlists for multiple instances. (#725)
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")
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):
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"]
"thumbnails"
]
track["isAvailable"] = track_obj["playabilityStatus"]["status"] == "OK"
+ track["streamingData"] = track_obj["streamingData"]
return track
return await asyncio.to_thread(_get_song)
"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
}
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