diff --git a/gamdl/interface/interface.py b/gamdl/interface/interface.py index 15fe959..d2307c1 100644 --- a/gamdl/interface/interface.py +++ b/gamdl/interface/interface.py @@ -44,7 +44,7 @@ class AppleMusicInterface: self.concurrency = concurrency self.disallowed_media_types = disallowed_media_types - self._base = song._base + self.base = song.base @staticmethod def get_url_info(url: str) -> AppleMusicUrlInfo | None: @@ -74,7 +74,7 @@ class AppleMusicInterface: if not media_metadata: try: media_metadata = ( - await self._base.apple_music_api.get_song( + await self.base.apple_music_api.get_song( media_id, ) )[ @@ -88,7 +88,7 @@ class AppleMusicInterface: ) if not media_id: - media_id = self._base.parse_catalog_media_id(media_metadata) + media_id = self.base.parse_catalog_media_id(media_metadata) base_media = AppleMusicMedia(media_id, media_metadata) @@ -132,7 +132,7 @@ class AppleMusicInterface: if not media_metadata: try: media_metadata = ( - await self._base.apple_music_api.get_music_video( + await self.base.apple_music_api.get_music_video( media_id, ) )["data"][0] @@ -184,7 +184,7 @@ class AppleMusicInterface: ) -> AppleMusicMedia: try: media_metadata = ( - await self._base.apple_music_api.get_uploaded_video( + await self.base.apple_music_api.get_uploaded_video( media_id, ) )["data"][0] @@ -230,11 +230,11 @@ class AppleMusicInterface: ) -> AsyncGenerator[AppleMusicMedia, None]: try: media_metadata = ( - await self._base.apple_music_api.get_library_album( + await self.base.apple_music_api.get_library_album( media_id, ) if is_library - else await self._base.apple_music_api.get_album( + else await self.base.apple_music_api.get_album( media_id, ) )["data"][0] @@ -308,11 +308,11 @@ class AppleMusicInterface: ) -> AsyncGenerator[AppleMusicMedia, None]: try: media_metadata = ( - await self._base.apple_music_api.get_library_playlist( + await self.base.apple_music_api.get_library_playlist( media_id, ) if is_library - else await self._base.apple_music_api.get_playlist( + else await self.base.apple_music_api.get_playlist( media_id, ) )["data"][0] @@ -357,7 +357,7 @@ class AppleMusicInterface: href_uri = media_metadata["relationships"]["tracks"].get("href") while next_uri: try: - extended_data = await self._base.apple_music_api.get_extended_api_data( + extended_data = await self.base.apple_music_api.get_extended_api_data( next_uri, href_uri, ) @@ -405,7 +405,7 @@ class AppleMusicInterface: ) -> AsyncGenerator[AppleMusicMedia, None]: try: media_metadata = ( - await self._base.apple_music_api.get_artist( + await self.base.apple_music_api.get_artist( media_id, ) )[ @@ -468,7 +468,7 @@ class AppleMusicInterface: href_uri = items_relation.get("href") while next_uri: try: - extended_data = await self._base.apple_music_api.get_extended_api_data( + extended_data = await self.base.apple_music_api.get_extended_api_data( next_uri, href_uri, ) diff --git a/gamdl/interface/music_video.py b/gamdl/interface/music_video.py index ddaa4e9..b227176 100644 --- a/gamdl/interface/music_video.py +++ b/gamdl/interface/music_video.py @@ -41,19 +41,18 @@ class AppleMusicMusicVideoInterface: Callable[[list[dict | m3u8.Playlist]], dict] | None ) = None, ): + self.base = base self.resolution = resolution self.codec_priority = codec_priority self.ask_video_codec_function = ask_video_codec_function self.ask_audio_codec_function = ask_audio_codec_function - self._base = base - async def get_itunes_page_metadata( self, music_video_metadata: dict, ) -> dict: - url_media_id = self._base.parse_media_id_from_url(music_video_metadata) - itunes_page = await self._base.itunes_api.get_itunes_page( + url_media_id = self.base.parse_media_id_from_url(music_video_metadata) + itunes_page = await self.base.itunes_api.get_itunes_page( "music-video", url_media_id, ) @@ -88,11 +87,11 @@ class AppleMusicMusicVideoInterface: ) -> MediaTags: log = logger.bind( action="get_music_video_tags", - media_id=self._base.parse_catalog_media_id(metadata), + media_id=self.base.parse_catalog_media_id(metadata), ) - url_media_id = self._base.parse_media_id_from_url(metadata) - lookup_metadata = (await self._base.itunes_api.get_lookup_result(url_media_id))[ + url_media_id = self.base.parse_media_id_from_url(metadata) + lookup_metadata = (await self.base.itunes_api.get_lookup_result(url_media_id))[ "results" ] @@ -108,18 +107,18 @@ class AppleMusicMusicVideoInterface: artist=lookup_metadata[0]["artistName"], artist_id=int(lookup_metadata[0]["artistId"]), copyright=itunes_page_metadata.get("copyright"), - date=self._base.parse_date(lookup_metadata[0]["releaseDate"]), + date=self.base.parse_date(lookup_metadata[0]["releaseDate"]), genre=lookup_metadata[0]["primaryGenreName"], genre_id=int(itunes_page_metadata["genres"][0]["genreId"]), media_type=MediaType.MUSIC_VIDEO, - storefront=self._base.itunes_api.storefront_id, + storefront=self.base.itunes_api.storefront_id, title=lookup_metadata[0]["trackCensoredName"], title_id=int(metadata["id"]), rating=rating, ) if len(lookup_metadata) > 1: - album = await self._base.get_album_cached( + album = await self.base.get_album_cached( itunes_page_metadata["collectionId"] ) if not album: @@ -145,10 +144,10 @@ class AppleMusicMusicVideoInterface: ) -> StreamInfoAv | None: log = logger.bind( action="get_music_video_stream_info", - media_id=self._base.parse_catalog_media_id(metadata), + media_id=self.base.parse_catalog_media_id(metadata), ) - 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"]: @@ -157,7 +156,7 @@ class AppleMusicMusicVideoInterface: ) 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"] ) m3u8_master_url = self._get_m3u8_master_url_from_webplayback( @@ -165,7 +164,7 @@ class AppleMusicMusicVideoInterface: ) playlist_master_m3u8_obj = m3u8.loads( - (await self._base.get_response(m3u8_master_url)).text + (await self.base.get_response(m3u8_master_url)).text ) playlist_master_m3u8_obj.base_uri = m3u8_master_url.rpartition("/")[0] stream_info_video = await self._get_stream_info_video(playlist_master_m3u8_obj) @@ -319,7 +318,7 @@ class AppleMusicMusicVideoInterface: stream_info.width, stream_info.height = playlist.stream_info.resolution playlist_m3u8_obj = m3u8.loads( - (await self._base.get_response(stream_info.stream_url)).text + (await self.base.get_response(stream_info.stream_url)).text ) stream_info.widevine_pssh = self._get_widevine_pssh(playlist_m3u8_obj) stream_info.fairplay_key = self._get_fairplay_key(playlist_m3u8_obj) @@ -345,7 +344,7 @@ class AppleMusicMusicVideoInterface: stream_info.codec = playlist["group_id"] playlist_m3u8_obj = m3u8.loads( - (await self._base.get_response(stream_info.stream_url)).text + (await self.base.get_response(stream_info.stream_url)).text ) stream_info.widevine_pssh = self._get_widevine_pssh(playlist_m3u8_obj) stream_info.fairplay_key = self._get_fairplay_key(playlist_m3u8_obj) @@ -358,11 +357,11 @@ class AppleMusicMusicVideoInterface: stream_info: StreamInfoAv, ) -> DecryptionKeyAv: decryption_key_video, decryption_key_audio = await asyncio.gather( - self._base.get_decryption_key( + self.base.get_decryption_key( stream_info.video_track.widevine_pssh, stream_info.media_id, ), - self._base.get_decryption_key( + self.base.get_decryption_key( stream_info.audio_track.widevine_pssh, stream_info.media_id, ), @@ -380,21 +379,21 @@ class AppleMusicMusicVideoInterface: playlist_track: dict | None = None, ) -> AppleMusicMedia: media = AppleMusicMedia( - media_id=self._base.parse_catalog_media_id(music_video_metadata), + media_id=self.base.parse_catalog_media_id(music_video_metadata), media_metadata=music_video_metadata, ) - if not self._base.is_media_streamable(music_video_metadata): + if not self.base.is_media_streamable(music_video_metadata): raise GamdlInterfaceMediaNotStreamableError(media.media_id) if playlist_metadata and playlist_track: media.playlist_metadata = playlist_metadata - media.playlist_tags = self._base.get_playlist_tags( + media.playlist_tags = self.base.get_playlist_tags( playlist_metadata, playlist_track, ) - media.cover = await self._base.get_cover(music_video_metadata) + media.cover = await self.base.get_cover(music_video_metadata) itunes_page_metadata = await self.get_itunes_page_metadata(music_video_metadata) media.tags = await self.get_tags( diff --git a/gamdl/interface/song.py b/gamdl/interface/song.py index 7caaa85..685e127 100644 --- a/gamdl/interface/song.py +++ b/gamdl/interface/song.py @@ -43,21 +43,20 @@ class AppleMusicSongInterface: skip_decryption_key_non_legacy: bool = False, ask_codec_function: Callable[[list[dict]], dict] | None = None, ): + self.base = base self.synced_lyrics_format = synced_lyrics_format self.codec_priority = codec_priority self.use_album_date = use_album_date self.skip_decryption_key_non_legacy = skip_decryption_key_non_legacy self.ask_codec_function = ask_codec_function - self._base = base - async def get_lyrics( self, song_metadata: dict, ) -> Lyrics | None: log = logger.bind( action="get_lyrics", - song_id=self._base.parse_catalog_media_id(song_metadata), + song_id=self.base.parse_catalog_media_id(song_metadata), ) if not song_metadata["attributes"]["hasLyrics"]: @@ -69,8 +68,8 @@ class AppleMusicSongInterface: or "lyrics" not in song_metadata["relationships"] ): song_metadata = ( - await self._base.apple_music_api.get_song( - self._base.parse_catalog_media_id(song_metadata) + await self.base.apple_music_api.get_song( + self.base.parse_catalog_media_id(song_metadata) ) )["data"][0] @@ -219,10 +218,10 @@ class AppleMusicSongInterface: composer_sort=webplayback_metadata.get("sort-composer"), copyright=webplayback_metadata.get("copyright"), date=( - await self._base.get_media_date(webplayback_metadata["playlistId"]) + await self.base.get_media_date(webplayback_metadata["playlistId"]) if self.use_album_date else ( - self._base.parse_date(webplayback_metadata["releaseDate"]) + self.base.parse_date(webplayback_metadata["releaseDate"]) if webplayback_metadata.get("releaseDate") else None ) @@ -268,8 +267,8 @@ class AppleMusicSongInterface: if "extendedAssetUrls" not in song_metadata["attributes"]: song_metadata = ( - await self._base.apple_music_api.get_song( - self._base.parse_catalog_media_id(song_metadata), + await self.base.apple_music_api.get_song( + self.base.parse_catalog_media_id(song_metadata), ) )["data"][0] @@ -280,7 +279,7 @@ class AppleMusicSongInterface: return None m3u8_master_obj = m3u8.loads( - (await self._base.get_response(m3u8_master_url)).text + (await self.base.get_response(m3u8_master_url)).text ) m3u8_master_data = m3u8_master_obj.data @@ -327,7 +326,7 @@ class AppleMusicSongInterface: ) else: m3u8_obj = m3u8.loads( - (await self._base.get_response(stream_info.stream_url)).text + (await self.base.get_response(stream_info.stream_url)).text ) stream_info.widevine_pssh = self._get_drm_uri_from_m3u8_keys( @@ -437,7 +436,7 @@ class AppleMusicSongInterface: )["URL"] m3u8_obj = m3u8.loads( - (await self._base.get_response(stream_info.stream_url)).text + (await self.base.get_response(stream_info.stream_url)).text ) stream_info.widevine_pssh = m3u8_obj.keys[0].uri @@ -457,27 +456,27 @@ class AppleMusicSongInterface: playlist_track: int | None = None, ) -> AppleMusicMedia: media = AppleMusicMedia( - media_id=self._base.parse_catalog_media_id(song_metadata), + media_id=self.base.parse_catalog_media_id(song_metadata), media_metadata=song_metadata, ) - if not self._base.is_media_streamable(song_metadata): + if not self.base.is_media_streamable(song_metadata): raise GamdlInterfaceMediaNotStreamableError( media_id=media.media_id, ) if playlist_metadata and playlist_track: media.playlist_metadata = playlist_metadata - media.playlist_tags = self._base.get_playlist_tags( + media.playlist_tags = self.base.get_playlist_tags( playlist_metadata, playlist_track, ) - media.cover = await self._base.get_cover(song_metadata) + media.cover = await self.base.get_cover(song_metadata) media.lyrics = await self.get_lyrics(song_metadata) - webplayback = await self._base.apple_music_api.get_webplayback(media.media_id) + webplayback = await self.base.apple_music_api.get_webplayback(media.media_id) media.tags = await self.get_tags( webplayback, @@ -508,7 +507,7 @@ class AppleMusicSongInterface: and not self.skip_decryption_key_non_legacy ) or media.stream_info.audio_track.legacy: media.decryption_key = DecryptionKeyAv( - audio_track=await self._base.get_decryption_key( + audio_track=await self.base.get_decryption_key( media.stream_info.audio_track.widevine_pssh, media.media_id, ) diff --git a/gamdl/interface/uploaded_video.py b/gamdl/interface/uploaded_video.py index ec0afb0..d99dd49 100644 --- a/gamdl/interface/uploaded_video.py +++ b/gamdl/interface/uploaded_video.py @@ -21,11 +21,10 @@ class AppleMusicUploadedVideoInterface: quality: UploadedVideoQuality = UploadedVideoQuality.BEST, ask_quality_function: Callable[[list[dict]], dict] | None = None, ): + self.base = base self.quality = quality self.ask_quality_function = ask_quality_function - self._base = base - def _get_best_stream_url(self, metadata: dict) -> str: best_quality = next( ( @@ -89,10 +88,10 @@ class AppleMusicUploadedVideoInterface: tags = MediaTags( artist=attributes.get("artistName"), - date=self._base.parse_date(upload_date) if upload_date else None, + date=self.base.parse_date(upload_date) if upload_date else None, title=attributes.get("name"), title_id=int(metadata["id"]), - storefront=self._base.itunes_api.storefront_id, + storefront=self.base.itunes_api.storefront_id, ) log.debug("success", tags=tags) @@ -108,10 +107,10 @@ class AppleMusicUploadedVideoInterface: uploaded_video_metadata, ) - if not self._base.is_media_streamable(uploaded_video_metadata): + if not self.base.is_media_streamable(uploaded_video_metadata): raise GamdlInterfaceMediaNotStreamableError(media.media_id) - media.cover = await self._base.get_cover(uploaded_video_metadata) + media.cover = await self.base.get_cover(uploaded_video_metadata) media.stream_info = await self.get_stream_info(uploaded_video_metadata) if not media.stream_info: