from typing import List, Optional from server.core.constants import SPOTIFY_LINKED_TRACK_FIELDS def compare_tracks_ids_data(tracks_ids: List[str], tracks_data: List[dict]) -> List[dict]: """Compare requested tracks ids with retrieved ones, and update mismatched records with linked data. Arguments: tracks_ids (List[str]): Ids of requested tracks. tracks_data (List[dict]): Retrieved list of tracks data. Returns: dict: Updated tracks data. """ for i, track in enumerate(tracks_data): # if all ids are the same as requested list -> skip track if not track or track["id"] in tracks_ids: continue tracks_data[i] = replace_with_linked_data(track) return tracks_data def replace_with_linked_data(track_data: dict) -> dict: """Replaced native track data fields values with linked ones, if such exists. Arguments: track_data (dict): Track all data dict. Returns: dict: Updated track data. """ linked_from = track_data.get("linked_from") if not linked_from: return track_data # save linked track id track_data["linked_id"] = track_data["id"] # swap `linked_from` data with track one for field in SPOTIFY_LINKED_TRACK_FIELDS: track_data[field], linked_from[field] = linked_from[field], track_data[field] track_data["linked_from"] = linked_from return track_data def get_track_image_url(track_data: dict, image_size: int) -> Optional[str]: """Get image url from track data :param track_data: track data dictionary :param image_size; desirable image size :return: image url or None """ image = next( (image for image in track_data.get("album", {}).get("images", []) if image["height"] == image_size), {} ) return image.get("url") def get_playlist_image_url(playlist_data: dict) -> Optional[str]: """Get image url from playlist data :param playlist_data: playlist data dictionary :return: image url or None """ image = next((image for image in playlist_data.get("images", [])), {}) return image.get("url")