from typing import Any, Dict, List import requests import config import consts from utils import retry def _get_headers() -> Dict[str, str]: """Get headers for API request.""" return { "Authorization": config.DSPAPI.APP_KEY, "Content-Type": "application/json", "X-App-Slug": "apollo", "X-Client-Type": "job", "X-Client-Name": consts.APP_NAME, } @retry() def get(url: str, params: dict) -> Any: """Make get request. Args: url: URL. params: Request params. Returns: Parsed json result. """ response = requests.get(url, headers=_get_headers(), params=params, timeout=config.DSPAPI.TIMEOUT) return response.json() def get_playlist_tracks(playlist_id: str) -> List[dict]: """Get Spotify playlist tracks. Args: playlist_id: Playlist ID. Returns: List of tracks. """ url = f"{config.DSPAPI.HOST}/api/delphi/public/track-positions/playlists/current-tracklist" offset = 0 result = [] while True: data = get( url, params={ "offset": offset, "limit": config.DSPAPI.PAGE_SIZE, "include": "track_info", "playlist_id": f"spotify_{playlist_id}", } ) result += [i for i in data.get("items", []) if i.get("spotify_track")] if data.get("next"): offset += config.DSPAPI.PAGE_SIZE else: break return result