from typing import List from external_api.base.clients.client_factory import ApiClientFactory from external_api.playlists.providers.playlists_provider import PlaylistsProvider from external_api.playlists.providers.spotify_playlists_provider import SpotifyPlaylistsProvider from external_api.playlists.providers.apple_playlists_provider import ApplePlaylistsProvider from external_api.playlists.schemas import PlaylistsQuery, PlaylistResults from utils.async_helpers import await_all class PlaylistsFetcher: providers: List[PlaylistsProvider] = [] def __init__(self, providers: List[PlaylistsProvider]) -> None: self.providers = providers async def fetch(self, query: PlaylistsQuery) -> List[PlaylistResults]: return await self.fetch_playlists(query) async def fetch_playlists(self, query: PlaylistsQuery): tasks = list(map(lambda p: p.fetch(query), self.providers)) result = await await_all(tasks) return result def default_playlists_fetcher() -> PlaylistsFetcher: apollo_api_client = ApiClientFactory.apollo_api_client() providers: List[PlaylistsProvider] = [ SpotifyPlaylistsProvider(apollo_api_client), ApplePlaylistsProvider(apollo_api_client), ] return PlaylistsFetcher(providers)