import asyncio import operator from server.client import services from server.constants import DSP, VISITED_TRACKS_DSP from server.constants.tracks import VISIT_TRACKS_LIMIT from server.domains.tracks.get_visited_tracks import get_dsp_visited_tracks from server.utils.parallel import get_awaitable_or_default async def get_visited_tracks(market, dsp_visits=VISITED_TRACKS_DSP): """Get most visited tracks for user""" tasks = [ get_awaitable_or_default( f=services.apollo.get_visited_tracks, condition=DSP.SPOTIFY in dsp_visits, default=[], vendor=DSP.SPOTIFY.value, ), get_awaitable_or_default( f=services.apollo.get_visited_tracks, condition=DSP.APPLE in dsp_visits, default=[], vendor=DSP.APPLE.value, ), ] spotify_visited_tracks, apple_visited_tracks = await asyncio.gather(*tasks) if not any([spotify_visited_tracks, apple_visited_tracks]): return [] data = spotify_visited_tracks + apple_visited_tracks # Sort by visit count and last date descending data.sort(key=operator.itemgetter("visit_count", "last_visit_date"), reverse=True) data = data[:VISIT_TRACKS_LIMIT] tracks = { DSP.APPLE.value: [x for x in data if x["vendor"] == DSP.APPLE.value], DSP.SPOTIFY.value: [x for x in data if x["vendor"] == DSP.SPOTIFY.value], } tasks = [ get_dsp_visited_tracks(dsp=DSP.SPOTIFY, data=tracks[DSP.SPOTIFY.value], market=market), get_dsp_visited_tracks(dsp=DSP.APPLE, data=tracks[DSP.APPLE.value], market=market), ] spotify, apple = await asyncio.gather(*tasks) data = spotify + apple data.sort(key=operator.itemgetter("visit_count", "last_visit_date"), reverse=True) return data