from apollo_utils.core.constants.dsp import DSP from typing import Any, Callable, Iterable, Union from server.schemas.images.core_image_service import get_core_image_service_availability from server.utils.common import prefix_str from server.utils.mappers.misc import map_id from server.utils.mappers.playlists.misc import map_image_url from server.utils.mappers.playlists.tracks.extra import set_audio_features, set_distributed_by_upc, set_is_sony_by_upc from server.utils.processor.core import Processor, processor def track_basic_processors( dsp: DSP, key_prefix: str = None, # key in outer object id_to_int: bool = False, ) -> Iterable[Union[Callable, Processor]]: """Get basic processors for track items.""" entity = "track" # Params preparation for map_image_url function # For Core Image Service url creation function inside map_image_url we need to pass "none_values": () to not to # handle cases when "image_url" == One Of DEFAULT_NONE_VALUES = (ABSENT, EMPTY_DICT, None, "null", "", "unknown") # because in this case the "core_image_service_url_creation_function" is not called, # and we assign "image_url" = None. # If we pass "none_values": () then the "core_image_service_url_creation_function" will run anyway, no matter value # is in "image_url". core_image_service_available = get_core_image_service_availability(dsp, entity) map_image_url_kwargs = ( {"none_values": ()} if core_image_service_available else {"core_image_url": core_image_service_available} ) return [ processor( map_id, key=prefix_str("track_id", prefix=key_prefix), key_to=prefix_str("id", prefix=key_prefix), to_int=id_to_int, ), processor( map_image_url, dsp=dsp, key="image_url", key_prefix=key_prefix, entity=entity, **map_image_url_kwargs ), ] def track_extra_data_processors( key_prefix: str = None, # key in outer object upc_path: str = None, is_sony_upc_data: Any = None, audio_features_data: Any = None, upc_to_distributor_data: Any = None, ) -> Iterable[Union[Callable, Processor]]: """Get extra data processors for track items.""" processors = [] if upc_to_distributor_data: processors.append( processor(set_distributed_by_upc, data=upc_to_distributor_data, key_prefix=key_prefix, upc_path=upc_path) ) if is_sony_upc_data: processors.append( processor(set_is_sony_by_upc, data=is_sony_upc_data, key_prefix=key_prefix, upc_path=upc_path) ) if audio_features_data: processors.append(processor(set_audio_features, data=audio_features_data, key_prefix=key_prefix)) return processors