from typing import Dict, List, Tuple from server.constants.tracks import Track def filter_track(track: Dict, search: List[str], search_by: Tuple = (Track.NAME, Track.ARTISTS)) -> bool: """Method that check tracks filtering condition. Args: track: Dictionary with all required track data. search: Search string. search_by: search parameters for track Returns: bool: True - track should be included in result list, False - otherwise. """ def _check_search(look_for: List[str], search_in: str): return all(list(map(lambda item: item in (search_in or "").lower(), look_for))) return ( Track.NAME in search_by and _check_search(search, track.get("name", "")) or Track.ARTISTS in search_by and _check_search(search, ",".join(track.get("artists", []))) ) def filter_playlist_tracklist(tracks: List[Dict], search: List[str], isrc_filter: str or None = None) -> List[Dict]: """Filter list of tracks by name and artist name fields. And also implement logic for source track adding to search result. Args: tracks: List of playlist's tracks. search: Search string to filter by. isrc_filter: Track ISRC value. Returns: List[Dict]: List of tracks with founded items. """ items = list(filter(lambda track: filter_track(track, search), tracks)) source_track = ( next((track for track in tracks if track["isrc"] and track["isrc"].lower() == isrc_filter.lower()), None) if isrc_filter else None ) if source_track and items and not (source_track in items): items.append(source_track) return items