refactor: use pydantic-settings for environment configuration

- Add pydantic-settings as direct dependency

- Replace os.getenv calls with typed Settings class

- Add BLOCK_MEDIA and RETURN_ONLY_COOKIES env defaults
This commit is contained in:
ThePhaseless
2026-07-04 17:42:53 +02:00
parent 80a608a629
commit 8c3e7a9fe4
4 changed files with 40 additions and 11 deletions
+1
View File
@@ -13,6 +13,7 @@ dependencies = [
"playwright==1.60.*",
"playwright-captcha==0.1.*",
"pydantic==2.*",
"pydantic-settings==2.*",
]
urls = { repository = "https://github.com/ThePhaseless/Byparr" }
[dependency-groups]
+35 -9
View File
@@ -1,20 +1,46 @@
import logging
import os
import sys
from pydantic_settings import BaseSettings, SettingsConfigDict
from playwright_captcha import CaptchaType
LOG_LEVEL = logging.getLevelNamesMapping()[os.getenv("LOG_LEVEL", "INFO").upper()]
VERSION = os.getenv("VERSION", "unknown").removeprefix("v")
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_file=".env", extra="ignore")
MAX_ATTEMPTS = sys.maxsize
log_level: str = "INFO"
version: str = "unknown"
PROXY_SERVER = os.getenv("PROXY_SERVER")
PROXY_USERNAME = os.getenv("PROXY_USERNAME")
PROXY_PASSWORD = os.getenv("PROXY_PASSWORD")
max_attempts: int = sys.maxsize
HOST = os.getenv("HOST", "0.0.0.0") # noqa: S104
PORT = int(os.getenv("PORT", "8191"))
proxy_server: str | None = None
proxy_username: str | None = None
proxy_password: str | None = None
host: str = "0.0.0.0" # noqa: S104
port: int = 8191
block_media: bool = False
return_only_cookies: bool = False
settings = Settings()
LOG_LEVEL = logging.getLevelNamesMapping()[settings.log_level.upper()]
VERSION = settings.version.removeprefix("v")
MAX_ATTEMPTS = settings.max_attempts
PROXY_SERVER = settings.proxy_server
PROXY_USERNAME = settings.proxy_username
PROXY_PASSWORD = settings.proxy_password
HOST = settings.host
PORT = settings.port
BLOCK_MEDIA = settings.block_media
RETURN_ONLY_COOKIES = settings.return_only_cookies
CHALLENGE_TITLES_MAP: dict[CaptchaType, list[str]] = {
# Cloudflare
+2 -2
View File
@@ -24,12 +24,12 @@ class LinkRequest(BaseModel):
description="Maximum timeout in seconds for resolving the anti-bot challenge.",
)
block_media: bool = Field(
default=False,
default=consts.BLOCK_MEDIA,
alias="blockMedia",
description="Block image, media, and font resources from loading.",
)
return_only_cookies: bool = Field(
default=False,
default=consts.RETURN_ONLY_COOKIES,
alias="returnOnlyCookies",
description="Return only cookies, skip the page HTML content in the response.",
)
Generated
+2
View File
@@ -65,6 +65,7 @@ dependencies = [
{ name = "playwright" },
{ name = "playwright-captcha" },
{ name = "pydantic" },
{ name = "pydantic-settings" },
]
[package.dev-dependencies]
@@ -88,6 +89,7 @@ requires-dist = [
{ name = "playwright", specifier = "==1.60.*" },
{ name = "playwright-captcha", specifier = "==0.1.*" },
{ name = "pydantic", specifier = "==2.*" },
{ name = "pydantic-settings", specifier = "==2.*" },
]
[package.metadata.requires-dev]