from playlist.constants.handler_constants import STOREFRONT_ENABLED DEFAULT_PAGE_SIZE = 20 INSIGHTS_FILTER_INCORRECT_PLAYLISTS = "insights_filter_incorrect_playlists" INSIGHTS_PLAYLIST_V2_CURRENT_PAST = "insights_playlist_v2_current_past" INSIGHTS_PRIMARY_PLAYLIST_TYPE = "insights_primary_playlist_type" INSIGHTS_DISABLE_PLAYLISTS_CACHE = "insights_disable_playlists_cache" INSIGHTS_PLAYLIST_PAGE_HOURLY_PLAYLISTS = "insights_playlist_page_hourly_playlists" INSIGHTS_PLAYLIST_PAGE_APPLE_MUSIC_PLAYLISTS = ( "insights_playlist_page_apple_music_playlists" ) INSIGHTS_PLAYLIST_PAGE_NON_PRIORITY_PLAYLISTS = ( "insights_playlist_page_non_priority_playlists" ) INSIGHTS_PLAYLIST_PAGE_HIDE_COMPILATION_ART = ( "insights_playlist_page_hide_compilation_art" ) INSIGHTS_TRANSFER_PRODUCT_OWNERSHIP = "insights_transfer_product_ownership" # --- Tables --- # contains isrc column, can be used for song queries PUBLIC_PLACEMENT_TABLE = "v_playlists_placements_by_isrc_playlist_public" PRIVATE_PLACEMENT_TABLE = "v_playlists_placements_by_isrc_playlist_country_private" PRIVATE_PLACEMENT_TABLE_WITHOUT_COUNTRY = ( "v_playlists_placements_by_isrc_playlist_private" ) # contains global_participant_id columns, can be used for song and participant queries PUBLIC_PLACEMENT_TABLE_PARTICIPANT = ( "v_playlists_placements_by_participant_isrc_playlist_public" ) PRIVATE_PLACEMENT_TABLE_PARTICIPANT = ( "v_playlists_placements_by_participant_isrc_playlist_country_private" ) PRIVATE_PLACEMENT_TABLE_PARTICIPANT_WITHOUT_COUNTRY = ( "v_playlists_placements_by_participant_isrc_playlist_private" ) # Playlist streams tables for sound-recording/top-placements query PLAYLIST_STREAMS_TABLE = "streams_by_playlist_rollup" PLAYLIST_STREAMS_FEED_TABLE = "streams_by_playlist_feed_rollup" PLAYLIST_STREAMS_COUNTRY_TABLE = "streams_by_playlist_country_rollup" PLAYLIST_STREAMS_COUNTRY_FEED_TABLE = "streams_by_playlist_country_feed_rollup" PLAYLIST_STREAMS_TIMESERIES_COUNTRY_FEED_TABLE = ( "V_STREAMS_BY_PLAYLIST_COUNTRY_FEED_DISTRIBUTOR_DAILY" ) # Followers table (Spotify only, global metrics) PLAYLIST_FOLLOWERS_TABLE = "V_PLAYLISTS_FOLLOWERS_BY_PLAYLIST_DATE_SPOTIFY" # Demographics tables DEMOGRAPHICS_TABLE = "V_DEMOGRAPHICS_BY_PLAYLIST_COUNTRY" PRIORITY_PLACEMENTS_PUBLIC_TABLE = ( "playlists_priority_placements_by_isrc_playlist_public" ) PLAYLIST_METADATA_TABLE = "v_playlists_by_playlist" PLAYLIST_METADATA_OWNER_TABLE = "v_playlist_metadata" PLAYLIST_SPOTIFY_APOLLO_METADATA_OVERRIDES_TABLE = ( "playlist_spotify_apollo_metadata_overrides" ) # Priority playlists list PRIORITY_PLAYLISTS_TABLE = "priority_playlists" HOURLY_PLAYLISTS_TABLE = "hourly_playlists" # Recent placements tables RECENT_PLACEMENTS_TABLE_NAME = ( "v_playlists_placements_by_track_playlist_distributor_public" ) RECENT_PLACEMENTS_BY_TRACK_PLAYLIST_DISTRIBUTOR_TABLE = ( "v_recent_playlists_placements_by_track_playlist_distributor" ) # Recent placements tables for employees with default params RECENT_PLACEMENTS_TABLE_NAME_ONLY_FRESHEST = ( "v_playlists_placements_by_track_playlist_distributor_public_only_freshest" ) RECENT_PLACEMENTS_BY_TRACK_PLAYLIST_DISTRIBUTOR_ONLY_FRESHEST_TABLE = ( "v_recent_playlists_placements_by_track_playlist_distributor_only_freshest" ) # Recent placements filenames RECENT_PLACEMENTS_FILENAME = "recent_placements.sql" # use the table below to return non-grouped AM playlists as unique records RECENT_PLACEMENTS_WITH_STOREFRONT_FILENAME = "recent_placements_with_storefront.sql" # contains placement position events PLACEMENT_POSITION_EVENTS_TABLE = "v_playlists_placement_events_by_isrc_playlist" AVAILABLE_STOREFRONTS_TABLE = "v_playlists_available_storefronts_apple" DEFAULT_DISTRIBUTORS = ["theorchard", "awal"] DISTRIBUTORS_WITH_SME = ["theorchard", "awal", "sme"] SHOW_SME_DATA = "show_sme_data" def get_placement_table_default(): return { "public_placement_table_name": PUBLIC_PLACEMENT_TABLE, "private_placement_table_name": PRIVATE_PLACEMENT_TABLE, "playlist_rollup_table": PLAYLIST_STREAMS_COUNTRY_TABLE, "placement_position_events_table_name": PLACEMENT_POSITION_EVENTS_TABLE, } def get_private_placement_table_name(user_params: dict) -> str: if ( "isrc" in user_params or "sound_recording_playlist_placements" in user_params or "product_id" in user_params ): if ( "stream_countries" in user_params or "curator_countries" in user_params or user_params.get("storefront_defined") is True or user_params.get(STOREFRONT_ENABLED) ): private_placement_table_name = PRIVATE_PLACEMENT_TABLE else: private_placement_table_name = PRIVATE_PLACEMENT_TABLE_WITHOUT_COUNTRY else: if ( "stream_countries" in user_params or "curator_countries" in user_params or user_params.get(STOREFRONT_ENABLED) ): private_placement_table_name = PRIVATE_PLACEMENT_TABLE_PARTICIPANT else: private_placement_table_name = ( PRIVATE_PLACEMENT_TABLE_PARTICIPANT_WITHOUT_COUNTRY ) return private_placement_table_name def get_placement_table_dynamic(user_params: dict) -> dict: default_params = { "placement_position_events_table_name": PLACEMENT_POSITION_EVENTS_TABLE, "available_storefronts_table": AVAILABLE_STOREFRONTS_TABLE, } if "stream_countries" in user_params: default_params.update({"playlist_rollup_table": PLAYLIST_STREAMS_COUNTRY_TABLE}) else: default_params.update({"playlist_rollup_table": PLAYLIST_STREAMS_TABLE}) if ( "isrc" in user_params or "sound_recording_playlist_placements" in user_params or "product_id" in user_params ): default_params.update( { "public_placement_table_name": PUBLIC_PLACEMENT_TABLE, "private_placement_table_name": get_private_placement_table_name( user_params ), } ) else: default_params.update( { "public_placement_table_name": PUBLIC_PLACEMENT_TABLE_PARTICIPANT, "private_placement_table_name": get_private_placement_table_name( user_params ), } ) return default_params def get_playlist_table_dynamic(user_params: dict) -> dict: default_params = {} if user_params.get("storefront_defined") is True: playlist_rollup_table_name = PLAYLIST_STREAMS_COUNTRY_TABLE else: playlist_rollup_table_name = PLAYLIST_STREAMS_TABLE default_params.update( { "playlist_metadata_table": PLAYLIST_METADATA_TABLE, "playlist_metadata_owner_table": PLAYLIST_METADATA_OWNER_TABLE, "playlist_spotify_apollo_metadata_overrides_table": ( PLAYLIST_SPOTIFY_APOLLO_METADATA_OVERRIDES_TABLE ), "playlist_rollup_table": playlist_rollup_table_name, } ) return default_params def get_playlist_streams_table_name() -> dict: return {"playlist_streams_table": PLAYLIST_STREAMS_TABLE} def get_recent_placements_table_params(user_params) -> dict: is_storefront_enabled = user_params.get(STOREFRONT_ENABLED) tables = { "recent_placements_table_name": ( RECENT_PLACEMENTS_BY_TRACK_PLAYLIST_DISTRIBUTOR_ONLY_FRESHEST_TABLE if is_storefront_enabled else RECENT_PLACEMENTS_TABLE_NAME_ONLY_FRESHEST ), "private_placement_table_name": PRIVATE_PLACEMENT_TABLE_WITHOUT_COUNTRY, } if any( user_params.get(key) for key in [ "permission_label_ids", "permission_subaccount_ids", "permission_label_participant_ids", "global_participant_ids", "filter_label_ids", "filter_subaccount_ids", ] ): tables["recent_placements_table_name"] = ( RECENT_PLACEMENTS_BY_TRACK_PLAYLIST_DISTRIBUTOR_TABLE if is_storefront_enabled else RECENT_PLACEMENTS_TABLE_NAME ) return tables HIGHWATERMARK_DATE = "HIGHWATERMARK" COMPLETION_RATE_FIELDS = [ "completion_rate_all_time", "completion_rate_last_365_days", "completion_rate_last_183_days", "completion_rate_last_28_days", "completion_rate_last_7_days", ] # Default streaming related aggregations DEFAULT_STREAMING_AGGREGATION_VALUES = { "streams_all_time": 0, "streams_last_365_days": 0, "streams_last_183_days": 0, "streams_last_90_days": 0, "streams_last_28_days": 0, "streams_last_14_days": 0, "streams_last_7_days": 0, "streams_last_1_day": 0, "completion_rate_all_time": 0, "completion_rate_last_365_days": 0, "completion_rate_last_183_days": 0, "completion_rate_last_28_days": 0, "completion_rate_last_7_days": 0, "total_count": 0, } ALLOWED_ORDER_BY_KEYS = [ "total_playlist_streams_last_7_days", "total_playlist_streams_last_28_days", "streams_last_1_day", "streams_last_7_days", "streams_last_28_days", "streams_last_183_days", "streams_last_365_days", "streams_all_time", "completion_rate_last_1_day", "completion_rate_last_7_days", "completion_rate_last_28_days", "completion_rate_last_183_days", "completion_rate_last_365_days", "completion_rate_all_time", "last_added_on_date", "removed_on", "current_position", "previous_position", "peak_position", "playlist_track_count", "playlist_follower_count", "position_change", "playlist_name", "playlist_genres", "days_on_playlist", "first_play", ] ADD_HISTORY_EVENT = "ADD_HISTORY" ADD_CURRENT_EVENT = "ADD_CURRENT" CHANGE_EVENT = "CHANGE" REMOVAL_EVENT = "REMOVAL" CONSECUTIVE_EVENTS_TIMESTAMP_THRESHOLD = 60