from typing import Dict, List, Tuple from server.constants.tracks import SPOTIFY_EPISODE_URI_PREFIX, SPOTIFY_TRACK_URI_PREFIX def parse_juno_response(data: List[dict]) -> Tuple[List[str], List[str], List[str]]: """Parse juno response to get spotify track ID, episode ID and ISRC lists. Args: data: Juno response. Returns: Spotify track ID, episode ID and ISRC lists. """ track_id_list = [] episode_id_list = [] isrc_list = [] for item in data: track_uri = (item.get("spotify_top_track_meta") or {}).get("track_uri") if track_uri: if track_uri.startswith(SPOTIFY_TRACK_URI_PREFIX): track_id_list.append(track_uri.replace(SPOTIFY_TRACK_URI_PREFIX, "")) elif track_uri.startswith(SPOTIFY_EPISODE_URI_PREFIX): episode_id_list.append(track_uri.replace(SPOTIFY_EPISODE_URI_PREFIX, "")) if item.get("isrc"): isrc_list.append(item["isrc"]) return track_id_list, episode_id_list, isrc_list def update_juno_response( data: List[dict], is_starred_mapping: Dict[str, dict], track_meta_mapping: Dict[str, dict], episode_meta_mapping: Dict[str, dict], track_distributors_mapping: Dict[str, dict], include_is_starred: bool, include_spotify_meta: bool, include_image_url: bool, image_size: int, ): """Set some additional fields to Juno data. Args: data: Juno response. is_starred_mapping: ISRC to favorites data. track_meta_mapping: Spotify URI to data mapping. episode_meta_mapping: Spotify URI to data mapping. track_distributors_mapping: Spotify ID to distributors dict mapping. include_is_starred: Include is_starred flag. include_spotify_meta: Include Spotify meta. include_image_url: Include image URL. image_size: Image size. """ include_distributors = bool(track_distributors_mapping) for item in data: if include_is_starred: starred_data = is_starred_mapping.get(item.get("isrc"), {}) item["is_starred"] = bool(starred_data) item["favorites_id"] = starred_data.get("favorites_id") track_uri = (item.get("spotify_top_track_meta") or {}).get("track_uri") track_data = track_meta_mapping.get(track_uri, episode_meta_mapping.get(track_uri)) item["distributed_by"] = ( track_distributors_mapping.get(track_uri.replace(SPOTIFY_TRACK_URI_PREFIX, "")) if include_distributors and track_uri else None ) if include_spotify_meta: item["spotify_meta"] = track_data if include_image_url and track_data: image_list = track_data.get("images", track_data.get("album", {}).get("images", [])) item["image_url"] = next((i["url"] for i in image_list if i.get("width") == image_size), None)