""" Constants and utilities for working with Redis keys. Contains: 1. Constants for all keys used in the application. 2. Constants with expiration time for all keys. 3. Useful utilities for handling keys. """ import os from flask import current_app as app def get_key(key, *args, **kwargs): """ Compose a Redis key. Args: key (str): Key as a format string with placeholders. *args: Arguments for substituting the placeholders in the key. **kwargs: Named key parts. Returns: str: Complete key constructed by substituting placeholders with provided arguments and adding prefix from src.config. """ return app.config["REDIS_KEY_PREFIX"] + key.format(*args, **kwargs) # Current state of comparison page. Expires in 30 days since last access. COMPARED_TRACKS = "compared_tracks/{}" COMPARED_TRACKS_TTL = int(os.environ.get("COMPARED_TRACKS_TTL", 2592000)) AUTH0_MANAGEMENT_TOKEN = "auth0_management_token/{}" # nosec AUTH0_MANAGEMENT_TOKEN_TTL = 86400 # nosec (24 hours) DSP_CACHE_TTL = int(os.environ.get("DSP_CACHE_TTL", 86400)) SPOTIFY_TRACK_IS_SONY = "is_sony/spotify/{}/{}" TWO_LAST_CHARTS_SPOTIFY = "2charts/{}/{}/{}/{}" TWO_LAST_CHARTS_APPLE = "2charts/{}/{}" TWO_LAST_CHARTS_TTL = int(os.environ.get("TWO_LAST_CHARTS_TTL", 1200)) CHART_TRACK_STATS = "chart/stats/{}/{}/{}/{}" SPOTIFY_TRACK_PLAYLISTS_STATS = "spotify/playlists-stats/{}/{}/{}" APPLE_PLAYLISTS_ADDED_DATES = "apple-music/track-playlists/added-dates/{}/{}/{}" APPLE_PLAYLISTS_ADDED_DATES_TTL = 21600 CHARTS_BUILDER_FIELDS_DELIMITER = "-F-" CHARTS_BUILDER_BASE_QUERY_PATTERN = ( "charts/{builder_name}/{vendor}/{market}/{chart_type}/{chart_date}/{is_sony}" + "/{start_position}/{end_position}/{change}/{compact}" ) CHARTS_RESPONSE_TTL = 14400 SPOTIFY_TRACK_PLAYLISTS_STATS_TTL = int(os.environ.get("SPOTIFY_TRACK_PLAYLISTS_STATS_TTL", 1200)) CHART_AVAILABILITY_TTL = 86400 CHART_AVAILABILITY = "chart/availability/{}/{}" APPLICATION_MARKETS = "app-markets" APPLICATION_MARKETS_TTL = int(os.environ.get("APPLICATION_MARKETS_TTL", 86400)) APOLLO_MARKETS = "apollo-markets/{}/{}" APOLLO_MARKETS_TTL = int(os.environ.get("APOLLO_MARKETS_TTL", 86400)) APOLLO_VERSION_CAROUSEL = "apollo-carousel/{}/{}" APOLLO_VERSION_CAROUSEL_TTL = int(os.environ.get("APOLLO_VERSION_CAROUSEL_TTL", 86400)) APOLLO_USER_CAROUSEL = "apollo-carousel-viewed/{}/{}" APOLLO_USER_CAROUSEL_TTL = int(os.environ.get("APOLLO_USER_CAROUSEL_TTL", 86400)) PERSONALIZED_PLAYLISTS_IDS = "personalized-playlists-ids" PERSONALIZED_PLAYLISTS_IDS_TTL = int(os.environ.get("PERSONALIZED_PALYLISTS_IDS_TTL", 3600)) APOLLO_MOBILE_VERSION = "apollo_go/latest_version/{}" APOLLO_MOBILE_VERSION_TTL = int(os.environ.get("APOLLO_MOBILE_VERSION_TTL", 1800)) APOLLO_VERSION_COPIES = "copies/{}/{}" APOLLO_VERSION_COPIES_TTL = 10800 DEFAULT_PAGINATION_TLL = int(os.environ.get("DEFAULT_PAGINATION_TLL", 180)) RAW_APPLE_TRACK_PLAYLISTS_TTL = 900 RAW_APPLE_TRACK_PLAYLISTS = "apple-music/track-playlists/db/{}/{}" APPLE_TRACK_PLAYLISTS_V1 = ( "apple-music/v1/track/playlists/{isrc}/{markets_list}/{search}/{image_size}/{order_by}/{recent_adds_only}" ) APPLE_TRACK_PLAYLISTS_V2 = ( "apple-music/v2/track/playlists/{isrc_list}/{markets_list}/{search}/{image_size}/{order_by}/{recent_adds_only}" + "/{include}/{category_id}" ) APPLE_TRACK_PREVIOUS_PLAYLISTS_V1 = ( "apple-music/v1/track/previous-playlists/{isrc_list}/{markets_list}/{search}/{order_by}/{recent_removals_only}" + "/{exclude_current_playlists}/{image_size}/{include}/{category_id}" ) APPLE_TRACK_PLAYLISTS_FULL = ( "apple-music/track/playlists-full/{}/{markets_list}/{image_size}/{search}/{playlists_ids}/{include_username}" + "/{include_playlist_count}/{include_streams_7_days}/{include_isrc}/{include_owner}/{category_id}" ) APPLE_TRACK_PLAYLISTS_FULL_TTL = int(os.environ.get("APPLE_TRACK_PLAYLISTS_FULL_TTL", 1800)) APPLE_TRACK_PLAYLISTS_OWNER_FULL = "apple-music/track/playlists-owners-full/{}/{playlists_list}/{markets_list}" APPLE_TRACK_PLAYLISTS_OWNER_FULL_TTL = int(os.environ.get("APPLE_TRACK_PLAYLISTS_OWNER_FULL_TTL", 1800)) APPLE_TRACK_PREVIOUS_PLAYLISTS_FULL = ( "apple-music/track/previous-playlists-full/{}/{markets_list}/{search}" + "/{image_size}/{include_owner}/{category_id}/{exclude_current_playlists}" ) APPLE_TRACK_PREVIOUS_PLAYLISTS_FULL_TTL = int(os.environ.get("APPLE_TRACK_PREVIOUS_PLAYLISTS_FULL_TTL", 1800)) APPLE_PLAYLIST_TRACKLIST = "apple-music/playlist/tracks/{playlist_id}/{market}/{search}/{order_by}/{image_size}" APPLE_PLAYLIST_MARKETS = "apple-music/playlist/markets/{}" APPLE_PLAYLIST_MARKETS_TTL = 21600 APPLE_PLAYLIST_DATA = "apple-music/playlist/data/{}/{}" APPLE_PLAYLIST_DATA_TTL = 21600 APPLE_PLAYLIST_TRACKLIST_ALLOCATION_GRAPH = "apple-music/playlist/tracks/allocation-graph/{playlist_id}/{market}" SPOTIFY_TRACK_PLAYLISTS_v1 = ( "spotify/v1/track/playlists/{isrc_list}/{markets_list}/{search}/{order_by}/{recent_adds_only}" ) SPOTIFY_TRACK_PLAYLISTS_v2 = ( "spotify/v2/track/playlists_/{isrc_list}/{markets_list}/{search}/{order_by}/{include}" + "/{streams_markets_list}/{category_id}" ) SPOTIFY_TRACK_IN_PLAYLIST_TREND_POSITIONS = "spotify/track-in-playlists/trend/position/{isrc_list}/{playlist_id_list}" SPOTIFY_TRACK_PLAYLISTS_FULL = ( "spotify/track/playlists-full/{}/{markets_list}/{search}/{playlists_ids}/{include_track_count}/{include_username}" + "/{include_streams_7_days}/{include_followers}/{streams_markets_list}/{include_owner}/{category_id}" ) SPOTIFY_TRACK_PLAYLISTS_FULL_TTL = int(os.environ.get("SPOTIFY_TRACK_PLAYLISTS_FULL_TTL", 1800)) SPOTIFY_TRACK_PLAYLISTS_TREND_POSITION_FULL = "spotify/track/playlists/trend/position/full/{}/{isrc_list}" SPOTIFY_TRACK_PLAYLISTS_TREND_POSITION_FULL_TTL = int( os.environ.get("SPOTIFY_TRACK_PLAYLISTS_TREND_POSITION_FULL_TTL", 1800) ) SPOTIFY_TRACK_PREVIOUS_PLAYLISTS_v1 = ( "spotify/v1/track/previous-playlists/{isrc_list}/{markets_list}/{search}/{order_by}/{recent_removals_only}" + "/{exclude_current_playlists}/{include}/{category_id}" ) SPOTIFY_TRACK_PREVIOUS_PLAYLISTS_FULL = ( "spotify/track/previous-playlists-full/{}/{markets_list}/{search}/{exclude_current_playlists}" + "/{include_owner}/{include_followers}/{category_id}" ) SPOTIFY_TRACK_PREVIOUS_PLAYLISTS_FULL_TTL = int(os.environ.get("SPOTIFY_TRACK_PREVIOUS_PLAYLISTS_FULL_TTL", 1800)) SPOTIFY_PLAYLIST_LISTENERS_GRAPH = "spotify/playlist/listeners/graph/{}/{}/{}" SPOTIFY_PLAYLIST_LISTENERS_RANGE = ( "spotify/playlist/listeners/range/{playlist_id}/{market}/{current_range}/{prev_range}" ) SPOTIFY_PLAYLIST_LISTENERS_GRAPH_TTL = 10800 SPOTIFY_PLAYLIST_LISTENERS_RANGE_TTL = 10800 SPOTIFY_PLAYLIST_FOLLOWERS_GRAPH = "spotify/playlist/followers/graph/{playlist_ids}/{date_range}" SPOTIFY_PLAYLIST_FOLLOWERS_RANGE = "spotify/playlist/followers/range/{playlist_id}/{current_range}/{prev_range}" SPOTIFY_PLAYLIST_FOLLOWERS_GRAPH_TTL = 10800 SPOTIFY_PLAYLIST_FOLLOWERS_RANGE_TTL = 10800 SPOTIFY_PLAYLIST_MARKETS = "spotify/playlist/markets/{}" SPOTIFY_PLAYLIST_MARKETS_TTL = 21600 SPOTIFY_PLAYLIST_DATA = "spotify/playlist/data/{}/{include_owner_data}" SPOTIFY_PLAYLIST_DATA_TTL = 21600 SPOTIFY_NMF_AVAILABLE_DATES = "spotify/available-dates" SPOTIFY_NMF_PLAYLISTS = "spotify/playlists/{with_name}" SPOTIFY_NMF_TRACKLIST = "spotify/tracklist/{nmf_date}" PLAYLISTS_NMF_TRACKS = "playlists/nmf/tracks/{nmf_date}" PLAYLISTS_NMF_TRACKS_TTL = int(os.environ.get("PLAYLISTS_NMF_TRACKS_TTL", 900)) SPOTIFY_NMF_TRACK = "spotify/nmf/track/{isrc}/{region}/{order_by}/{include}" SPOTIFY_NMF_TTL = int(os.environ.get("SPOTIFY_NMF_TTL", 900)) TRACKS_PLAYLISTS_NMF = "tracks/playlists/nmf/{isrc}/{region}/{order_by}/{include}" TRACKS_PLAYLISTS_NMF_TTL = int(os.environ.get("TRACKS_PLAYLISTS_NMF_TTL", 900)) SPOTIFY_NMF_TRACK_TTL = int(os.environ.get("SPOTIFY_NMF_TRACK_TTL", 900)) SPOTIFY_NMF_TRACK_DATA = "spotify/nmf/track/data/{}/{}/{}/{}/{}" SPOTIFY_NMF_TRACK_DATA_TTL = int(os.environ.get("SPOTIFY_NMF_TRACK_DATA_TTL", 900)) SPOTIFY_MARKETS_BY_STREAMS = "spotify/markets/by-streams" SPOTIFY_MARKETS_BY_STREAMS_TTL = int(os.environ.get("SPOTIFY_MARKETS_BY_STREAMS_TTL", 30 * 60)) TRACKS_POSITIONS_CHANGES_IN_PLAYLIST_TTL = 900 TRACKS_POSITIONS_CHANGES_IN_PLAYLIST = "_v1/spotify/playlist/tracklist/{playlist_id}/{isrc}" PLAYLISTS_SEARCH = "playlists-search/{vendors}/{query}/{image_size}/{items_size}" SPOTIFY_HH_TRACK = "spotify/hot-hits/track/{isrc}/{region}/{order_by}/{include}" SPOTIFY_HH_TRACK_TTL = int(os.environ.get("SPOTIFY_HH_TRACK_TTL", 900)) TRACKS_PLAYLISTS_HH = "tracks/playlists/hh/{isrc}/{region}/{order_by}/{include}" TRACKS_PLAYLISTS_HH_TTL = int(os.environ.get("TRACKS_PLAYLISTS_HH_TTL", 900)) SPOTIFY_HH_TRACK_DATA = "spotify/hot-hits/track/data/{}/{}/{}" SPOTIFY_HH_TRACK_DATA_TTL = int(os.environ.get("SPOTIFY_HH_TRACK_DATA_TTL", 900)) PLAYLIST_DIGEST_CHART = "pd-chart/{}/{}/{}/{}/{}/{}/{}/{}" PLAYLIST_DIGEST_CHART_TTL = int(os.environ.get("PLAYLIST_DIGEST_PLAYLISTS_TTL", 1800)) BLACKLISTED_PLAYLISTS = "playlists/blacklisted/" BLACKLISTED_PLAYLISTS_TTL = int(os.environ.get("BLACKLISTED_PLAYLISTS_TTL", 900))