from typing import Dict, Any, Mapping, Optional, Tuple, Type, Iterable from server.artist.utils import ImageService from server.track.models import TrackSearchData from server.core.helpers.discovery import DiscoveryHelper from server.core.helpers.params_parser import ParamsParser from server.db.constants import TRACK_SEARCH_INDEX, DSP_TIKTOK, DSP_YOUTUBE, DSP_SPOTIFY, DSP_SOUNDCLOUD, ALL_DSPS __all__ = ["TrackDiscoveryHelper"] class TrackParamsParser(ParamsParser): @classmethod def _transform_key_value(cls, key: str, value: Any) -> Optional[Tuple[str, Any]]: if key == "genre" and value == "any": return None return super()._transform_key_value(key, value) class _TrackDiscoveryHelper(DiscoveryHelper): _index_name: str = TRACK_SEARCH_INDEX _data_model = TrackSearchData _params_parser_cls: Type[ParamsParser] = TrackParamsParser _dsp_sort_mapping: Mapping[str, str] = { DSP_TIKTOK: "views", DSP_SPOTIFY: "streams", DSP_YOUTUBE: "views", DSP_SOUNDCLOUD: "plays", } _dsp_default_charts: Mapping[str, str] = { DSP_TIKTOK: "likes", DSP_YOUTUBE: "likes", DSP_SPOTIFY: "streams", DSP_SOUNDCLOUD: "plays", } def _get_sort(self, params: Dict[str, Any]) -> Dict[str, Any]: source = {} sort = {} for dsp in ALL_DSPS: if dsp in params.keys(): source[dsp] = f"{dsp}.{self._dsp_sort_mapping.get(dsp, {})}_change" if source.get(DSP_TIKTOK): sort = {f"{source[DSP_TIKTOK]}": {"order": "desc", "missing": "_last"}} elif source.get(DSP_SPOTIFY): sort = {f"{source[DSP_SPOTIFY]}": {"order": "desc", "missing": "_last"}} elif source.get(DSP_YOUTUBE): sort = {f"{source[DSP_YOUTUBE]}": {"order": "desc", "missing": "_last"}} elif source.get(DSP_SOUNDCLOUD): sort = {f"{source[DSP_SOUNDCLOUD]}": {"order": "desc", "missing": "_last"}} return sort def _hydrate_search(self, *args, **kwargs) -> Iterable[Dict[str, Any]]: for row in super()._hydrate_search(*args, **kwargs): spotify_track_id = row.get("spotify_track_id") row["artwork_url_alt"] = row.get("artwork_url") row["artwork_url"] = ImageService.get_track_img_url(spotify_track_id) yield row def _hydrate_get(self, *args, **kwargs) -> Dict[str, Any]: result = super()._hydrate_get(*args, **kwargs) spotify_track_id = result.get("spotify_track_id") result["artwork_url_alt"] = result.get("artwork_url") result["artwork_url"] = ImageService.get_track_img_url(spotify_track_id) return result TrackDiscoveryHelper = _TrackDiscoveryHelper()