Refactor music video stream fetching

This commit is contained in:
Rafael Moraes
2026-05-23 22:41:28 -03:00
parent eb9caff85c
commit 50f82b5de2
+38 -22
View File
@@ -147,31 +147,32 @@ class AppleMusicMusicVideoInterface:
return tags return tags
async def get_stream_info( async def get_m3u8_master_url(
self, self,
metadata: dict, metadata: dict,
itunes_page_metadata: dict, itunes_page_metadata: dict,
) -> StreamInfoAv | None: ) -> str | None:
log = logger.bind(
action="get_music_video_stream_info",
media_id=metadata["id"],
)
url_media_id = self.base.parse_media_id_from_url(metadata) url_media_id = self.base.parse_media_id_from_url(metadata)
m3u8_master_url = None
if url_media_id == metadata["id"]: if url_media_id == metadata["id"]:
m3u8_master_url = self._get_m3u8_master_url_from_itunes_page_metadata( return self._get_m3u8_master_url_from_itunes_page_metadata(
itunes_page_metadata, itunes_page_metadata,
) )
if not m3u8_master_url: webplayback_response = await self.base.apple_music_api.get_webplayback(
webplayback_response = await self.base.apple_music_api.get_webplayback( metadata["id"]
metadata["id"] )
) return self._get_m3u8_master_url_from_webplayback(
m3u8_master_url = self._get_m3u8_master_url_from_webplayback( webplayback_response["songList"][0],
webplayback_response["songList"][0], )
)
async def _get_stream_info(
self,
m3u8_master_url: str,
) -> StreamInfoAv | None:
log = logger.bind(
action="get_music_video_stream_info", m3u8_master_url=m3u8_master_url
)
playlist_master_m3u8_obj = m3u8.loads( playlist_master_m3u8_obj = m3u8.loads(
(await self.base.get_response(m3u8_master_url)).text (await self.base.get_response(m3u8_master_url)).text
@@ -368,6 +369,21 @@ class AppleMusicMusicVideoInterface:
return stream_info return stream_info
async def get_stream_info(
self,
media_id: str,
m3u8_master_url: str | None,
) -> StreamInfoAv:
stream_info = None
if m3u8_master_url:
stream_info = await self._get_stream_info(m3u8_master_url)
if not stream_info:
raise GamdlInterfaceFormatNotAvailableError(media_id, self.codec_priority)
return stream_info
async def get_decryption_key( async def get_decryption_key(
self, self,
stream_info: StreamInfoAv, stream_info: StreamInfoAv,
@@ -434,20 +450,20 @@ class AppleMusicMusicVideoInterface:
playback["songList"][0]["assets"][0]["metadata"], playback["songList"][0]["assets"][0]["metadata"],
) )
else: else:
playback = None
media.tags = await self.get_tags( media.tags = await self.get_tags(
media.media_metadata, media.media_metadata,
itunes_page_metadata, itunes_page_metadata,
) )
media.stream_info = await self.get_stream_info( m3u8_master_url = await self.get_m3u8_master_url(
media.media_metadata, media.media_metadata,
itunes_page_metadata, itunes_page_metadata,
) )
if not media.stream_info: media.stream_info = await self.get_stream_info(
raise GamdlInterfaceFormatNotAvailableError( media.media_id,
media.media_id, m3u8_master_url,
self.codec_priority, )
)
if ( if (
not media.stream_info.video_track.widevine_pssh not media.stream_info.video_track.widevine_pssh