"""Script configs.""" import os import uuid from datetime import datetime def get_url(field_name: str) -> str: """Get URL in correct format. Args: field_name: Environ field name. Returns: URL. """ url = os.environ[field_name] if not url.startswith("https://"): url = f"https://{url}" return url.rstrip("/") ENVIRONMENT = os.environ.get("ENVIRONMENT", "prod").lower() class MySQL: HOST = os.environ["MYSQL_HOST"] PORT = int(os.environ.get("MYSQL_PORT", 3306)) USER = os.environ["MYSQL_USER"] PASSWORD = os.environ["MYSQL_PASSWORD"] DATABASE = os.environ["MYSQL_DATABASE"] POOL_RECYCLE = int(os.environ.get("MYSQL_POOL_RECYCLE", 7200)) POOL_SIZE = int(os.environ.get("MYSQL_POOL_SIZE", 1)) class Redis: HOST = os.environ.get("REDIS_HOST") PORT = int(os.environ.get("REDIS_PORT", 6379)) LOCK_ENABLED = bool(os.environ.get("REDIS_LOCK_ENABLED", True)) LOCK_TTL = int(os.environ.get("REDIS_LOCK_TTL", 86400)) class DSPAPI: HOST = get_url("DSPAPI_HOSTNAME") APP_KEY = os.environ["DSPAPI_APPKEY"] PAGE_SIZE = int(os.environ.get("DSPAPI_PAGE_SIZE", 10000)) TIMEOUT = int(os.environ.get("DSPAPI_TIMEOUT", 120)) # S3 bucket name S3_BUCKET = os.environ["S3_BUCKET"] # AWS region AWS_DEFAULT_REGION = os.environ.get("AWS_DEFAULT_REGION", "us-east-1") # unique run identifier CURRENT_RUN_ID = os.environ.get("CURRENT_RUN_ID", str(uuid.uuid4())[:8]) # possible date range to update (min of these dates and max hot hits date) DATE_TO = ( datetime.strptime(os.environ["DATE_TO"], "%Y-%m-%d") if "DATE_TO" in os.environ else datetime.utcnow()).date() DATE_FROM = datetime.strptime(os.environ["DATE_FROM"], "%Y-%m-%d").date() if "DATE_FROM" in os.environ else DATE_TO # max possible retry count RETRY_COUNT = int(os.environ.get("RETRY_COUNT", 10)) # retry wait multiplier RETRY_WAIT_RATE = int(os.environ.get("RETRY_WAIT_RATE", 3)) # athena DB name ATHENA_DATABASE = os.environ.get("ATHENA_DATABASE", "dev_apollo") # try create athena DB or not ATHENA_TRY_CREATE_DATABASE = bool(os.environ.get("ATHENA_TRY_CREATE_DATABASE", "")) # enable aggregate missing feature AGGREGATE_MISSING_PLAYLISTS = bool(os.environ.get("AGGREGATE_MISSING_PLAYLISTS", False)) # enable update aggregated data feature UPDATE_AGGREGATED_DATA = bool(os.environ.get("UPDATE_AGGREGATED_DATA", True)) # enable update hot hits playlists ranks feature UPDATE_PLAYLISTS_RANKS = bool(os.environ.get("UPDATE_PLAYLISTS_RANKS", True)) # update hot hits playlists ranks by streams from the current date (-3 days) or from latest available UPDATE_RANKS_FROM_TODAY = bool(os.environ.get("UPDATE_RANKS_FROM_TODAY", True)) # update playlists ranks each UPDATE_RANKS_INTERVAL days UPDATE_RANKS_INTERVAL = int(os.environ.get("UPDATE_RANKS_INTERVAL", 7)) # if some markets does not exists in the playlists streams table then set their ranks from this position alphabetically UNKNOWN_MARKET_RANK_FROM = int(os.environ.get("UNKNOWN_MARKET_RANK_FROM", 50)) # we have two aggregated hot hits tables, specify which should be updated UPDATE_TABLE_LIST = os.environ.get("UPDATE_TABLE_LIST", "stats").strip().split(",") # need to update after full list aggregation or not UPDATE_AFTER_AGGREGATE = bool(os.environ.get("UPDATE_AFTER_AGGREGATE", True)) # count previous position only from current to current - PREVIOUS_POSITION_INTERVAL days PREVIOUS_POSITION_INTERVAL = int(os.environ.get("PREVIOUS_POSITION_INTERVAL", 15)) # force recalculate previous positions FORCE_UPDATE_PREVIOUS_POSITIONS = bool(os.environ.get("FORCE_UPDATE_PREVIOUS_POSITIONS", "")) SENTRY_DSN = os.environ.get("SENTRY_DSN")