from copy import deepcopy from typing import Dict, Iterable, List, Optional, Set from smelog.factory import BoundLogger from apollo_playlists_messages.config import FULL_APP_NAME, TTL from apollo_playlists_messages.constants import MESSAGE_TYPE_TO_SUBJECT, MESSAGE_VIEWS from apollo_playlists_messages.utils.misc import get_playlist_image_url from apollo_playlists_messages.utils.playlist_id import full_id def create_messages( account_ids: Set[int], account_id_to_devices: Dict[int, Iterable[dict]], message_type: str, country_code: str, data: dict, logger: BoundLogger, ) -> List[dict]: event_id, playlist_id, track_data = data["event_id"], data["playlist_id"], data.get("track") messages = format_messages( account_ids=account_ids, account_id_to_devices=account_id_to_devices, dsp=data["dsp"], country_code=country_code, message_type=message_type, event_id=event_id, playlist=data["playlist"], track=track_data, current_position=data.get("current_position"), previous_position=data.get("previous_position") ) track_str = f"[{track_data['isrc']}]" if track_data else "" logger.info( f"{FULL_APP_NAME}[{event_id}][{full_id(playlist_id)}][{message_type}]{track_str}[{country_code}] " f"created {len(messages)} messages." ) return messages def format_messages( account_ids: Iterable[int], account_id_to_devices: Dict[int, Iterable[dict]], dsp: str, country_code: str, message_type: str, event_id: int, playlist: dict, track: Optional[dict] = None, current_position: Optional[int] = None, previous_position: Optional[int] = None, ): content = {"playlist": deepcopy(playlist)} if track: content["track"] = deepcopy(track) if current_position is not None: content["current_position"] = current_position + 1 if previous_position is not None: content["previous_position"] = previous_position + 1 content["playlist"]["image_url"] = get_playlist_image_url( playlist_id=playlist["id"], dsp=dsp, country_code=country_code ) meta = { "dsp": dsp, "country_code": country_code, "views": MESSAGE_VIEWS, "type": message_type, "subject": MESSAGE_TYPE_TO_SUBJECT[message_type], } return [ format_message( account_id=account_id, event_id=event_id, devices=account_id_to_devices[account_id], content=content, meta=meta, ) for account_id in account_ids ] def format_message(account_id: int, event_id: int, devices: Iterable[dict], content: dict, meta: dict): return { "account_id": account_id, "event_id": event_id, "ttl": TTL, "meta": meta, "data": {"content": content, "recipient": {"devices": devices}}, }