from distutils.util import strtobool import os from server.core.constants import SPOTIFY, TRACK_SEARCH_SUPPORTED_ID_TYPES, APPLE, SEARCH_ISRC def str_to_bool(value: str) -> bool: return bool(value and strtobool(value)) ENVIRONMENT = os.environ.get("ENVIRONMENT", "development") SENTRY_DSN = os.environ.get("SENTRY_DSN") SENTRY_PROJECT = os.environ.get("SENTRY_PROJECT", "vendor-api") VERSION = os.environ.get("VERSION", "0.0.1") DEBUG = str_to_bool(os.environ.get("DEBUG")) CACHE_BACKEND = os.environ.get("CACHE_BACKEND", "server.core.cache.backends.redis") REDIS_URL = os.environ.get("REDIS_URL") REDIS_COMPRESSION_LIB = os.environ.get("REDIS_COMPRESSION_LIB", "zstd") MONGODB_HOST = os.environ.get("MONGODB_HOST") MONGODB_PORT = int(os.environ.get("MONGODB_PORT", 27017)) MONGODB_USER = os.environ.get("MONGODB_USER") MONGODB_PASSWORD = os.environ.get("MONGODB_PASSWORD") MONGODB_DATABASE = os.environ.get("MONGODB_DATABASE") MONGODB_AUTH_MECHANISM = os.environ.get("MONGODB_AUTH_MECHANISM", "SCRAM-SHA-1") MONGODB_ENABLE_SSL = str_to_bool(os.environ.get("MONGODB_ENABLE_SSL")) # The maximum allowable number of concurrent connections MONGODB_MAX_POOL_SIZE = int(os.environ.get("MONGODB_MAX_POOL_SIZE", 200)) # How long the driver will wait to find an available, appropriate server to carry out a database operation MONGODB_SELECT_TIMEOUT_MS = int(os.environ.get("MONGODB_TIMEOUT", 1000)) # 1s # The maximum number of milliseconds that a connection can remain idle in the pool before being removed and replaced MONGODB_CONNECTION_IDLE_TIME_MS = int(os.environ.get("MONGODB_CONNECTION_IDLE_TIME_MS", 30 * 60 * 1000)) # 30m # How long the driver will wait for a response after sending MONGODB_SOCKET_TIMEOUT_MS = int(os.environ.get("MONGODB_SOCKET_TIMEOUT_MS", 3 * 1000)) # 3s # How long the driver will wait during connecting a new socket to a server before concluding the server is unavailable MONGODB_CONNECTION_TIMEOUT_MS = int(os.environ.get("MONGODB_CONNECTION_TIMEOUT_MS", 2 * 1000)) # 2s # How long a thread will wait for a socket from the pool if the pool has no free sockets MONGODB_WAIT_QUEUE_TIMEOUT_MS = int(os.environ.get("MONGODB_WAIT_QUEUE_TIMEOUT_MS", 2 * 1000)) # 2s # Multiplied by maxPoolSize to give the number of threads allowed to wait for a socket at one time MONGODB_WAIT_QUEUE_MULTIPLE = int(os.environ.get("MONGODB_WAIT_QUEUE_MULTIPLE", 2)) # Whether supported read operations executed within this MongoClient will be retried once after a network error MONGODB_RETRY_READS = str_to_bool(os.environ.get("MONGODB_RETRY_READS")) # Whether supported write operations executed within this MongoClient will be retried once after a network error MONGODB_RETRY_WRITES = str_to_bool(os.environ.get("MONGODB_RETRY_WRITES")) # Write operations will block until they have been replicated to the specified number or tagged set of servers MONGODB_WAIT_WRITE_REPLICAS = int(os.environ.get("MONGODB_WAIT_WRITE_REPLICAS", 1)) # How long to wait for write propagation to complete MONGODB_WRITE_TIMEOUT_MS = int(os.environ.get("MONGODB_WRITE_TIMEOUT_MS", 1000)) # 1s # Block until write operations have been committed to the journal MONGODB_WAIT_JOURNAL = str_to_bool(os.environ.get("MONGO_DB_WAIT_JOURNAL", "True")) # Blocks until the server has synced all data files to disk MONGODB_WAIT_FSYNC = str_to_bool(os.environ.get("MONGO_DB_WAIT_FSYNC")) MONGODB_COMPRESSION_LIB = os.environ.get("MONGODB_COMPRESSION_LIB", "zstd") VENDORAPI_APPKEY = os.environ["VENDORAPI_APPKEY"] APPLE_MUSICKIT_BASE_URL = os.environ.get("APPLE_MUSICKIT_BASE_URL", "https://api.music.apple.com") APPLE_MUSICKIT_KEYID = os.environ["APPLE_MUSICKIT_KEYID"] APPLE_MUSICKIT_KEY = os.environ["APPLE_MUSICKIT_KEY"].replace("\\n", "\n") APPLE_MUSICKIT_TEAM_ID = os.environ.get("APPLE_MUSICKIT_TEAM_ID", "Y38Y7276CK") SPOTIFY_CLIENT_BASE_URL = os.environ.get("SPOTIFY_CLIENT_BASE_URL", "https://api.spotify.com") SPOTIFY_CLIENT_TOKEN_URL = os.environ.get("SPOTIFY_CLIENT_TOKEN_URL", "https://accounts.spotify.com/api/token") SPOTIFY_CLIENT_ID = os.environ["SPOTIFY_CLIENT_ID"] SPOTIFY_CLIENT_SECRET = os.environ["SPOTIFY_CLIENT_SECRET"] MAX_LINE_SIZE = int(os.environ.get("MAX_LINE_SIZE", 81900)) MAX_FIELD_SIZE = int(os.environ.get("MAX_LINE_SIZE", 81900)) DEFAULT_RETRY_COUNT = int(os.environ.get("DEFAULT_RETRY_COUNT", 2)) DEFAULT_RETRY_WAIT = int(os.environ.get("DEFAULT_RETRY_WAIT", 1)) DEFAULT_RETRY_MAX_TIMEOUT = int(os.environ.get("DEFAULT_RETRY_MAX_TIMEOUT", 6)) RETRY_FOR_STATUS_CODES = [ int(i.strip()) for i in os.environ.get("RETRY_FOR_STATUS_CODES", "500,502,503,504").split(",") ] MAX_KEY_LENGTH = int(os.environ.get("MAX_KEY_LENGTH", 768)) AWS_DEFAULT_REGION = os.environ.get("AWS_DEFAULT_REGION", "us-east-1") IMAGE_CACHING_MESSAGE_QUEUE_URL = os.environ.get("IMAGE_CACHING_MESSAGE_QUEUE_URL") IMAGE_CACHING_ENABLED = bool(IMAGE_CACHING_MESSAGE_QUEUE_URL) TEMP_IMAGE_MAX_TTL = int(os.environ.get("TEMP_IMAGE_MAX_TTL", 6 * 60 * 60)) DEFAULT_DATA_TIMEOUT = int(os.environ.get("DEFAULT_DATA_TIMEOUT", 0)) DEBUG_DATA_SOURCE = str_to_bool(os.environ.get("DEBUG_DATA_SOURCE", "y")) DEBUG_RETRY_STATS = str_to_bool(os.environ.get("DEBUG_RETRY_STATS", "y")) DEBUG_REQUEST_COUNT = str_to_bool(os.environ.get("DEBUG_REQUEST_COUNT", "y")) DEBUG_EXECUTION_TIME = str_to_bool(os.environ.get("DEBUG_EXECUTION_TIME", "y")) SQS_MAX_POOL_CONNECTIONS = int(os.environ.get("SQS_MAX_POOL_CONNECTIONS", 30)) ORIGINAL_STATUS_CODES_TO_BYPASS = os.environ.get("ORIGINAL_STATUS_CODES_TO_BYPASS", "404") if ORIGINAL_STATUS_CODES_TO_BYPASS: ORIGINAL_STATUS_CODES_TO_BYPASS = [int(i) for i in ORIGINAL_STATUS_CODES_TO_BYPASS.split(",")] SENTRY_IGNORE_STATUS_CODES = os.environ.get("SENTRY_IGNORE_STATUS_CODES", "400,401,404") if SENTRY_IGNORE_STATUS_CODES: SENTRY_IGNORE_STATUS_CODES = [int(i) for i in SENTRY_IGNORE_STATUS_CODES.split(",")] DD_TRACE_HEADERS = os.environ.get("DD_TRACE_HEADERS", "client-type,x-app-slug,x-type,x-version,x-data-timeout").split( "," ) # we do not use track_id search for apple, because it works weird ALLOW_APPLE_SEARCH_BY_EQUIVALENT_TRACK_ID = bool(os.environ.get("ALLOW_APPLE_SEARCH_BY_EQUIVALENT_TRACK_ID", False)) DSP_TO_TRACK_SEARCH_ID_TYPES = { SPOTIFY: TRACK_SEARCH_SUPPORTED_ID_TYPES, APPLE: TRACK_SEARCH_SUPPORTED_ID_TYPES if ALLOW_APPLE_SEARCH_BY_EQUIVALENT_TRACK_ID else (SEARCH_ISRC,), } SEARCH_MISSING_TRACKS_BY_KNOWN_MARKET = bool(os.environ.get("SEARCH_MISSING_TRACKS_BY_KNOWN_DATA", True)) SEARCH_MISSING_TRACKS_BY_DEFAULT_MARKET = bool(os.environ.get("SEARCH_MISSING_TRACKS_BY_DEFAULT_MARKET", False))