from datetime import timedelta from apollo_messages_views.constants.base import Emoji from apollo_messages_views.utils.misc import get_flag from tests.data.base import playlist, track, device, dt_now, chart from tests.data.utils import set_data, serialize_datetime def basic_update_message( i, j=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, extra=None, exclude=None, serialize_dt=True): if dsp: is_spotify = dsp == "spotify" else: is_spotify = (j is not None) and (j % 2 == 0) or (i % 2 == 0) created_dt = dt_now() - timedelta(minutes=(10 + i)) playlist_data = playlist(j or i, country_code=country_code) data = { "id": i, "ttl": 1800, "event_id": event_id or i, "account_id": account_id or i, "app": "apollo", "code": "messages_created", "created_at": serialize_datetime(created_dt) if serialize_dt else created_dt, "meta": { "dsp": "spotify" if is_spotify else "apple", "country_code": country_code or "us", "views": ["feed_message", "push_message"], "subject": "starred_playlist", "type": "starred_playlist_tracklist_update" }, "data": { "recipient": { "devices": devices or [device(int(f"{i}{j}")) for j in range(1, 3)] }, "content": { "playlist": playlist_data } }, } return set_data(data, exclude=exclude, extra=extra) def basic_parsed_update_message(i, j=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None): data = basic_update_message( i, j=j, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, serialize_dt=False) return set_data(data, exclude=("meta.views", "data.content.playlist.country_code"), extra={"message_id": data["id"], "data.content.title": ""}) def feed_update_message(i, j=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None): data = basic_parsed_update_message( i, j=j, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices) dsp_part = "Spotify" if data['meta']['dsp'] == "spotify" else "Apple Music" body = ( f"⭐ name_{j or i} tracklist has been updated on {dsp_part} {get_flag(country_code or 'us')}" ) return set_data( data, exclude=("id", "app", "code", "created_at"), extra={"ttl": 1800 - 60 * (10 + i), "data.content.body": body}) def basic_entry_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, artists_sorted=False, artist_with_order=True, exclude=None, extra=None, serialize_dt=True): if dsp: is_spotify = dsp == "spotify" else: is_spotify = (j is not None) and (j % 2 == 0) or (i % 2 == 0) created_at = dt_now() - timedelta(minutes=(10 + i)) data = { "id": i, "ttl": 1800, "event_id": event_id or i, "account_id": account_id or i, "app": "apollo", "code": "messages_created", "created_at": serialize_datetime(created_at) if serialize_dt else created_at, "meta": { "dsp": "spotify" if is_spotify else "apple", "country_code": country_code or "us", "views": ["feed_message", "push_message"], "subject": "starred_track_in_playlist", "type": type }, "data": { "recipient": { "devices": devices or [device(int(f"{i}{j}")) for j in range(1, 3)] }, "content": { "playlist": playlist(j or i, country_code=country_code), "track": track(k or i, artists_sorted=artists_sorted, artist_with_order=artist_with_order), "current_position": k or i, "previous_position": None } }, } return set_data(data, exclude=exclude, extra=extra) def basic_parsed_entry_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, artists_sorted=False, artist_with_order=True, serialize_dt=False): data = basic_entry_message( i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, artists_sorted=artists_sorted, artist_with_order=artist_with_order, serialize_dt=serialize_dt ) return set_data(data, exclude=("meta.views", "data.content.playlist.country_code"), extra={"message_id": data["id"], "data.content.title": ""}) def basic_starred_entry_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_starred_playlist_entry", exclude=None, extra=None): return basic_entry_message(i, j, k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, exclude=exclude, extra=extra) def basic_parsed_starred_entry_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_starred_playlist_entry"): return basic_parsed_entry_message(i, j, k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type) def basic_top_entry_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_top_playlist_entry", exclude=None, extra=None): return basic_entry_message(i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, exclude=exclude, extra=extra) def basic_parsed_top_entry_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_top_playlist_entry"): return basic_parsed_entry_message(i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type) def feed_entry_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, track_artists_names=True ): data = basic_parsed_entry_message( i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, artists_sorted=True, artist_with_order=False ) extra = {"ttl": 1800 - 60 * (10 + i), "data.content.previous_position": None} if track_artists_names: artists = data["data"]["content"]["track"]["artists"] extra.update({"data.content.track.artists_names": ", ".join(i["name"] for i in artists)}) return set_data( data, exclude=("id", "app", "code", "created_at"), extra=extra) def feed_starred_entry_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_starred_playlist_entry", track_artists_names=True): data = feed_entry_message(i, j, k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, track_artists_names=track_artists_names) j, k = j or i, k or i dsp_part = "Spotify" if data['meta']['dsp'] == "spotify" else "Apple Music" body = ( f"{Emoji.FIRE.value} name_{k}1 & name_{k}2 - name_{k} " f"has been added to ⭐ name_{j} at position {k} on " f"{dsp_part} {get_flag(country_code or 'us')}" ) return set_data(data, extra={"data.content.body": body}) def feed_top_entry_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_top_playlist_entry", track_artists_names=True): data = feed_entry_message(i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, track_artists_names=track_artists_names) j, k = j or i, k or i dsp_part = "Spotify" if data['meta']['dsp'] == "spotify" else "Apple Music" body = ( f"{Emoji.FIRE.value} name_{k}1 & name_{k}2 - name_{k} " f"has been added to name_{j} at position {k} on " f"{dsp_part} {get_flag(country_code or 'us')}" ) return set_data(data, extra={"data.content.body": body}) def basic_exit_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, artists_sorted=False, artist_with_order=True, exclude=None, extra=None, serialize_dt=True): if dsp: is_spotify = dsp == "spotify" else: is_spotify = (j is not None) and (j % 2 == 0) or (i % 2 == 0) created_at = dt_now() - timedelta(minutes=(10 + i)) data = { "id": i, "ttl": 1800, "event_id": event_id or i, "account_id": account_id or i, "app": "apollo", "code": "messages_created", "created_at": serialize_datetime(created_at) if serialize_dt else created_at, "meta": { "dsp": "spotify" if is_spotify else "apple", "country_code": country_code or "us", "views": ["feed_message", "push_message"], "subject": "starred_track_in_playlist", "type": type }, "data": { "recipient": { "devices": devices or [device(int(f"{i}{j}")) for j in range(1, 3)] }, "content": { "playlist": playlist(j or i, country_code=country_code), "track": track(k or i, artists_sorted=artists_sorted, artist_with_order=artist_with_order), "current_position": None, "previous_position": k or i } }, } return set_data(data, exclude=exclude, extra=extra) def basic_parsed_exit_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, artists_sorted=False, artist_with_order=True, serialize_dt=False): data = basic_exit_message( i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, artists_sorted=artists_sorted, artist_with_order=artist_with_order, serialize_dt=serialize_dt ) return set_data(data, exclude=("meta.views", "data.content.playlist.country_code"), extra={"message_id": data["id"], "data.content.title": ""}) def basic_starred_exit_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_starred_playlist_exit", exclude=None, extra=None): return basic_exit_message(i, j, k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, exclude=exclude, extra=extra) def basic_parsed_starred_exit_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_starred_playlist_exit"): return basic_parsed_exit_message(i, j, k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type) def basic_top_exit_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_top_playlist_exit", exclude=None, extra=None): return basic_exit_message(i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, exclude=exclude, extra=extra) def basic_parsed_top_exit_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_top_playlist_exit"): return basic_parsed_exit_message(i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type) def feed_exit_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, track_artists_names=True ): data = basic_parsed_exit_message( i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, artists_sorted=True, artist_with_order=False ) extra = {"ttl": 1800 - 60 * (10 + i), "data.content.current_position": None} if track_artists_names: artists = data["data"]["content"]["track"]["artists"] extra.update({"data.content.track.artists_names": ", ".join(i["name"] for i in artists)}) return set_data( data, exclude=("id", "app", "code", "created_at"), extra=extra) def feed_starred_exit_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_starred_playlist_exit", track_artists_names=False): data = feed_exit_message(i, j, k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, track_artists_names=track_artists_names) j, k = j or i, k or i dsp_part = "Spotify" if data['meta']['dsp'] == "spotify" else "Apple Music" body = ( f"{Emoji.EXCLAMATION_POINT.value} name_{k}1 & name_{k}2 - name_{k} " f"has been removed from ⭐ name_{j} at position {k} on " f"{dsp_part} {get_flag(country_code or 'us')}" ) return set_data(data, extra={"data.content.body": body}) def feed_top_exit_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_top_playlist_exit", track_artists_names=False): data = feed_exit_message(i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, track_artists_names=track_artists_names) j, k = j or i, k or i dsp_part = "Spotify" if data['meta']['dsp'] == "spotify" else "Apple Music" body = ( f"{Emoji.EXCLAMATION_POINT.value} name_{k}1 & name_{k}2 - name_{k} " f"has been removed from name_{j} at position {k} on " f"{dsp_part} {get_flag(country_code or 'us')}" ) return set_data(data, extra={"data.content.body": body}) def basic_major_move_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, artists_sorted=False, artist_with_order=True, exclude=None, extra=None, serialize_dt=True, move_up=True): if dsp: is_spotify = dsp == "spotify" else: is_spotify = (j is not None) and (j % 2 == 0) or (i % 2 == 0) created_at = dt_now() - timedelta(minutes=(10 + i)) data = { "id": i, "ttl": 1800, "event_id": event_id or i, "account_id": account_id or i, "app": "apollo", "code": "messages_created", "created_at": serialize_datetime(created_at) if serialize_dt else created_at, "meta": { "dsp": "spotify" if is_spotify else "apple", "country_code": country_code or "us", "views": ["feed_message", "push_message"], "subject": "starred_track_in_playlist", "type": type }, "data": { "recipient": { "devices": devices or [device(int(f"{i}{j}")) for j in range(1, 3)] }, "content": { "playlist": playlist(j or i, country_code=country_code), "track": track(k or i, artists_sorted=artists_sorted, artist_with_order=artist_with_order), "current_position": i or k, "previous_position": (i or k) + 5 } }, } if not move_up: data["data"]["content"]["current_position"] = data["data"]["content"]["current_position"] + 5 data["data"]["content"]["previous_position"] = data["data"]["content"]["previous_position"] - 5 return set_data(data, exclude=exclude, extra=extra) def basic_parsed_major_move_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, artists_sorted=False, artist_with_order=True, serialize_dt=False, move_up=True): data = basic_major_move_message( i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, artists_sorted=artists_sorted, artist_with_order=artist_with_order, serialize_dt=serialize_dt, move_up=move_up ) return set_data(data, exclude=("meta.views", "data.content.playlist.country_code"), extra={"message_id": data["id"], "data.content.title": ""}) def basic_starred_major_move_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_starred_playlist_major_move", exclude=None, extra=None, move_up=True): return basic_major_move_message(i, j, k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, exclude=exclude, extra=extra, move_up=move_up) def basic_parsed_starred_major_move_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, move_up=True, type="starred_track_starred_playlist_major_move"): return basic_parsed_major_move_message(i, j, k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, move_up=move_up) def basic_top_major_move_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_top_playlist_major_move", exclude=None, extra=None, move_up=True): return basic_major_move_message(i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, exclude=exclude, extra=extra, move_up=move_up) def basic_parsed_top_major_move_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, move_up=True, type="starred_track_top_playlist_major_move"): return basic_parsed_major_move_message(i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, move_up=move_up) def feed_major_move_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, move_up=True, track_artists_names=True ): data = basic_parsed_major_move_message( i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, artists_sorted=True, artist_with_order=False, move_up=move_up ) extra = {"ttl": 1800 - 60 * (10 + i)} if track_artists_names: artists = data["data"]["content"]["track"]["artists"] extra.update({"data.content.track.artists_names": ", ".join(i["name"] for i in artists)}) return set_data( data, exclude=("id", "app", "code", "created_at"), extra=extra) def feed_starred_major_move_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_starred_playlist_major_move", move_up: bool = True, track_artists_names=False ): data = feed_major_move_message(i, j, k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, move_up=move_up, track_artists_names=track_artists_names) j, k = j or i, k or i dsp_part = "Spotify" if data['meta']['dsp'] == "spotify" else "Apple Music" body = ( f"{Emoji.FIRE.value if move_up else Emoji.EXCLAMATION_POINT.value} name_{k}1 & name_{k}2 - name_{k} " f"has moved {'up' if move_up else 'down'} {5} spots on ⭐ name_{j} to position {i if move_up else i + 5} on " f"{dsp_part} {get_flag(country_code or 'us')}" ) return set_data(data, extra={"data.content.body": body}) def feed_top_major_move_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, move_up=True, type="starred_track_top_playlist_major_move", track_artists_names=False): data = feed_major_move_message(i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, move_up=move_up, track_artists_names=track_artists_names) j, k = j or i, k or i dsp_part = "Spotify" if data['meta']['dsp'] == "spotify" else "Apple Music" body = ( f"{Emoji.FIRE.value if move_up else Emoji.EXCLAMATION_POINT.value} name_{k}1 & name_{k}2 - name_{k} " f"has moved {'up' if move_up else 'down'} {5} spots on name_{j} to position {i if move_up else i + 5} on " f"{dsp_part} {get_flag(country_code or 'us')}" ) return set_data(data, extra={"data.content.body": body}) def basic_chart_update_message( i, j=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, extra=None, exclude=None, serialize_dt=True): if dsp: is_spotify = dsp == "spotify" else: is_spotify = (j is not None) and (j % 2 == 0) or (i % 2 == 0) created_dt = dt_now() - timedelta(minutes=(10 + i)) dsp = "spotify" if is_spotify else "apple" country_code = country_code or "us" chart_data = chart(dsp=dsp, country_code=country_code, is_spotify=is_spotify) data = { "id": i, "ttl": 1800, "event_id": event_id or i, "account_id": account_id or i, "app": "apollo", "code": "messages_created", "created_at": serialize_datetime(created_dt) if serialize_dt else created_dt, "meta": { "dsp": dsp, "type": "top_chart_tracklist_update", "subject": "top_chart", "country_code": country_code, "views": ["feed_message", "push_message"], }, "data": { "recipient": { "devices": devices or [device(int(f"{i}{j}")) for j in range(1, 3)] }, "content": { "chart": chart_data } }, } return set_data(data, exclude=exclude, extra=extra) def basic_parsed_chart_update_message( i, j=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None ): data = basic_chart_update_message( i, j=j, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, serialize_dt=False) return set_data( data, exclude=( "meta.views", "data.content.chart.breakdown", "data.content.chart.country_code", "data.content.chart.domain", "data.content.chart.type" ), extra={"message_id": data["id"], "data.content.title": ""} ) def feed_chart_update_message(i, j=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None): data = basic_parsed_chart_update_message( i, j=j, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices ) chart_name_part = "Spotify Daily Top 200 Chart" if data['meta']['dsp'] == "spotify" else "Apple Music Top 100 Chart" body = ( f"{Emoji.FIRE.value} {chart_name_part} {get_flag(country_code or 'us')} has been updated" ) return set_data( data, exclude=("id", "app", "code", "created_at", "data.content.chart.dsp"), extra={"ttl": 1800 - 60 * (10 + i), "data.content.body": body, "data.content.chart.name": chart_name_part}) def basic_chart_entry_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, artists_sorted=False, artist_with_order=True, exclude=None, extra=None, serialize_dt=True): if dsp: is_spotify = dsp == "spotify" else: is_spotify = (j is not None) and (j % 2 == 0) or (i % 2 == 0) dsp = "spotify" if is_spotify else "apple" created_at = dt_now() - timedelta(minutes=(10 + i)) data = { "id": i, "ttl": 1800, "event_id": event_id or i, "account_id": account_id or i, "app": "apollo", "code": "messages_created", "created_at": serialize_datetime(created_at) if serialize_dt else created_at, "meta": { "dsp": dsp, "country_code": country_code or "us", "views": ["feed_message", "push_message"], "subject": "starred_track_in_chart", "type": "starred_track_top_chart_entry" }, "data": { "recipient": { "devices": devices or [device(int(f"{i}{j}")) for j in range(1, 3)] }, "content": { "chart": chart(dsp=dsp, country_code=country_code, is_spotify=is_spotify), "track": track(k or i, artists_sorted=artists_sorted, artist_with_order=artist_with_order), "current_position": k or i, "previous_position": None } }, } return set_data(data, exclude=exclude, extra=extra) def basic_starred_chart_entry_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_top_chart_entry", exclude=None, extra=None): return basic_chart_entry_message(i, j, k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, exclude=exclude, extra=extra) def basic_parsed_chart_entry_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, artists_sorted=False, artist_with_order=True, serialize_dt=False): data = basic_chart_entry_message( i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, artists_sorted=artists_sorted, artist_with_order=artist_with_order, serialize_dt=serialize_dt ) return set_data( data, exclude=("meta.views", "data.content.chart.breakdown", "data.content.chart.country_code", "data.content.chart.type", "data.content.chart.domain", "data.content.chart.country_code"), extra={"message_id": data["id"], "data.content.title": ""},) def feed_chart_entry_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, track_artists_names=True ): data = basic_parsed_chart_entry_message( i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, artists_sorted=True, artist_with_order=False ) extra = {"ttl": 1800 - 60 * (10 + i), "data.content.previous_position": None} if track_artists_names: artists = data["data"]["content"]["track"]["artists"] extra.update({"data.content.track.artists_names": ", ".join(i["name"] for i in artists)}) return set_data( data, exclude=("id", "app", "code", "created_at"), extra=extra) def feed_top_chart_entry_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_top_chart_entry", track_artists_names=True): data = feed_chart_entry_message(i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, track_artists_names=track_artists_names) j, k = j or i, k or i chart_name_part = "Spotify Daily Top 200 Chart" if data['meta']['dsp'] == "spotify" else "Apple Music Top 100 Chart" body = ( f"{Emoji.FIRE.value} name_{k}1 & name_{k}2 - name_{k} entered {chart_name_part} {get_flag(country_code or 'us')} " f"at position {k}" ) return set_data( data, exclude=("data.content.chart.dsp",), extra={"data.content.body": body, "data.content.chart.name": chart_name_part} ) def basic_chart_exit_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, artists_sorted=False, artist_with_order=True, exclude=None, extra=None, serialize_dt=True): if dsp: is_spotify = dsp == "spotify" else: is_spotify = (j is not None) and (j % 2 == 0) or (i % 2 == 0) dsp = "spotify" if is_spotify else "apple" created_at = dt_now() - timedelta(minutes=(10 + i)) data = { "id": i, "ttl": 1800, "event_id": event_id or i, "account_id": account_id or i, "app": "apollo", "code": "messages_created", "created_at": serialize_datetime(created_at) if serialize_dt else created_at, "meta": { "dsp": dsp, "country_code": country_code or "us", "views": ["feed_message", "push_message"], "subject": "starred_track_in_chart", "type": "starred_track_top_chart_exit" }, "data": { "recipient": { "devices": devices or [device(int(f"{i}{j}")) for j in range(1, 3)] }, "content": { "chart": chart(dsp=dsp, country_code=country_code, is_spotify=is_spotify), "track": track(k or i, artists_sorted=artists_sorted, artist_with_order=artist_with_order), "current_position": None, "previous_position": k or i } }, } return set_data(data, exclude=exclude, extra=extra) def basic_starred_chart_exit_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_top_chart_entry", exclude=None, extra=None): return basic_chart_exit_message(i, j, k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, exclude=exclude, extra=extra) def basic_parsed_chart_exit_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, artists_sorted=False, artist_with_order=True, serialize_dt=False): data = basic_chart_exit_message( i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, artists_sorted=artists_sorted, artist_with_order=artist_with_order, serialize_dt=serialize_dt ) return set_data( data, exclude=("meta.views", "data.content.chart.breakdown", "data.content.chart.country_code", "data.content.chart.type", "data.content.chart.domain", "data.content.chart.country_code"), extra={"message_id": data["id"], "data.content.title": ""},) def feed_chart_exit_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, track_artists_names=True ): data = basic_parsed_chart_exit_message( i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, artists_sorted=True, artist_with_order=False ) extra = {"ttl": 1800 - 60 * (10 + i)} if track_artists_names: artists = data["data"]["content"]["track"]["artists"] extra.update({"data.content.track.artists_names": ", ".join(i["name"] for i in artists)}) return set_data( data, exclude=("id", "app", "code", "created_at"), extra=extra) def feed_top_chart_exit_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_top_chart_entry", track_artists_names=True): data = feed_chart_exit_message(i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, track_artists_names=track_artists_names) j, k = j or i, k or i chart_name_part = "Spotify Daily Top 200 Chart" if data['meta']['dsp'] == "spotify" else "Apple Music Top 100 Chart" body = ( f"{Emoji.EXCLAMATION_POINT.value} name_{k}1 & name_{k}2 - name_{k} exited {chart_name_part} {get_flag(country_code or 'us')} " f"at position {k}" ) return set_data( data, exclude=("data.content.chart.dsp",), extra={"data.content.body": body, "data.content.chart.name": chart_name_part} ) def basic_chart_major_move_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, artists_sorted=False, artist_with_order=True, exclude=None, extra=None, serialize_dt=True, move_up=True): if dsp: is_spotify = dsp == "spotify" else: is_spotify = (j is not None) and (j % 2 == 0) or (i % 2 == 0) dsp = "spotify" if is_spotify else "apple" created_at = dt_now() - timedelta(minutes=(10 + i)) data = { "id": i, "ttl": 1800, "event_id": event_id or i, "account_id": account_id or i, "app": "apollo", "code": "messages_created", "created_at": serialize_datetime(created_at) if serialize_dt else created_at, "meta": { "dsp": dsp, "country_code": country_code or "us", "views": ["feed_message", "push_message"], "subject": "starred_track_in_chart", "type": "starred_track_top_chart_move" }, "data": { "recipient": { "devices": devices or [device(int(f"{i}{j}")) for j in range(1, 3)] }, "content": { "chart": chart(dsp=dsp, country_code=country_code, is_spotify=is_spotify), "track": track(k or i, artists_sorted=artists_sorted, artist_with_order=artist_with_order), "current_position": i or k, "previous_position": (i or k) + 5 } }, } if not move_up: data["data"]["content"]["current_position"] = data["data"]["content"]["current_position"] + 5 data["data"]["content"]["previous_position"] = data["data"]["content"]["previous_position"] - 5 return set_data(data, exclude=exclude, extra=extra) def basic_parsed_chart_major_move_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, artists_sorted=False, artist_with_order=True, serialize_dt=False, move_up=True): data = basic_chart_major_move_message( i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, artists_sorted=artists_sorted, artist_with_order=artist_with_order, serialize_dt=serialize_dt, move_up=move_up ) return set_data( data, exclude=("meta.views", "data.content.chart.breakdown", "data.content.chart.country_code", "data.content.chart.type", "data.content.chart.domain", "data.content.chart.country_code"), extra={"message_id": data["id"], "data.content.title": ""} ) def basic_chart_top_major_move_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type="starred_track_top_playlist_major_move", exclude=None, extra=None, move_up=True): return basic_chart_major_move_message(i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, exclude=exclude, extra=extra, move_up=move_up) def basic_parsed_chart_top_major_move_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, move_up=True, type="starred_track_top_playlist_major_move"): return basic_parsed_chart_major_move_message(i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, move_up=move_up) def feed_chart_major_move_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, type=None, move_up=True, track_artists_names=True ): data = basic_parsed_chart_major_move_message( i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, artists_sorted=True, artist_with_order=False, move_up=move_up ) extra = {"ttl": 1800 - 60 * (10 + i)} if track_artists_names: artists = data["data"]["content"]["track"]["artists"] extra.update({"data.content.track.artists_names": ", ".join(i["name"] for i in artists)}) return set_data( data, exclude=("id", "app", "code", "created_at"), extra=extra) def feed_top_chart_major_move_message( i, j=None, k=None, event_id=None, account_id=None, dsp=None, country_code=None, devices=None, move_up=True, type="starred_track_top_playlist_major_move", track_artists_names=True): data = feed_chart_major_move_message(i, j=j, k=k, event_id=event_id, account_id=account_id, dsp=dsp, country_code=country_code, devices=devices, type=type, move_up=move_up, track_artists_names=track_artists_names) j, k = j or i, k or i chart_name_part = "Spotify Daily Top 200 Chart" if data['meta']['dsp'] == "spotify" else "Apple Music Top 100 Chart" body = ( f"{Emoji.FIRE.value if move_up else Emoji.EXCLAMATION_POINT.value} name_{k}1 & name_{k}2 - name_{k} moved " f"{'up' if move_up else 'down'} {5} spots on {chart_name_part} {get_flag(country_code or 'us')} " f"to position {i if move_up else i + 5}" ) return set_data( data, exclude=("data.content.chart.dsp",), extra={"data.content.body": body, "data.content.chart.name": chart_name_part} )