|
import os |
|
import random |
|
import string |
|
|
|
from typing import List, Optional |
|
from databases import Database |
|
from pydantic import BaseModel, field_validator |
|
from pydantic_settings import BaseSettings, SettingsConfigDict |
|
from RTN import RTN, BestRanking, SettingsModel |
|
|
|
|
|
class AppSettings(BaseSettings): |
|
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8") |
|
|
|
ADDON_ID: Optional[str] = "stremio.comet.fast" |
|
ADDON_NAME: Optional[str] = "Comet" |
|
FASTAPI_HOST: Optional[str] = "0.0.0.0" |
|
FASTAPI_PORT: Optional[int] = 8000 |
|
FASTAPI_WORKERS: Optional[int] = 2 * (os.cpu_count() or 1) |
|
DASHBOARD_ADMIN_PASSWORD: Optional[str] = None |
|
DATABASE_TYPE: Optional[str] = "sqlite" |
|
DATABASE_URL: Optional[str] = "username:password@hostname:port" |
|
DATABASE_PATH: Optional[str] = "data/comet.db" |
|
CACHE_TTL: Optional[int] = 86400 |
|
DEBRID_PROXY_URL: Optional[str] = None |
|
INDEXER_MANAGER_TYPE: Optional[str] = "jackett" |
|
INDEXER_MANAGER_URL: Optional[str] = "http://127.0.0.1:9117" |
|
INDEXER_MANAGER_API_KEY: Optional[str] = None |
|
INDEXER_MANAGER_TIMEOUT: Optional[int] = 30 |
|
INDEXER_MANAGER_INDEXERS: List[str] = ["EXAMPLE1_CHANGETHIS", "EXAMPLE2_CHANGETHIS"] |
|
GET_TORRENT_TIMEOUT: Optional[int] = 5 |
|
ZILEAN_URL: Optional[str] = None |
|
ZILEAN_TAKE_FIRST: Optional[int] = 500 |
|
SCRAPE_TORRENTIO: Optional[bool] = False |
|
CUSTOM_HEADER_HTML: Optional[str] = None |
|
PROXY_DEBRID_STREAM: Optional[bool] = False |
|
PROXY_DEBRID_STREAM_PASSWORD: Optional[str] = None |
|
PROXY_DEBRID_STREAM_MAX_CONNECTIONS: Optional[int] = 100 |
|
PROXY_DEBRID_STREAM_DEBRID_DEFAULT_SERVICE: Optional[str] = "realdebrid" |
|
PROXY_DEBRID_STREAM_DEBRID_DEFAULT_APIKEY: Optional[str] = None |
|
TITLE_MATCH_CHECK: Optional[bool] = True |
|
|
|
@field_validator("DASHBOARD_ADMIN_PASSWORD") |
|
def set_dashboard_admin_password(cls, v, values): |
|
if v is None: |
|
return "".join(random.choices(string.ascii_letters + string.digits, k=16)) |
|
return v |
|
|
|
@field_validator("INDEXER_MANAGER_TYPE") |
|
def set_indexer_manager_type(cls, v, values): |
|
if v == "None": |
|
return None |
|
return v |
|
|
|
@field_validator("PROXY_DEBRID_STREAM_PASSWORD") |
|
def set_debrid_stream_proxy_password(cls, v, values): |
|
if v is None: |
|
return "".join(random.choices(string.ascii_letters + string.digits, k=16)) |
|
return v |
|
|
|
|
|
settings = AppSettings() |
|
|
|
|
|
class ConfigModel(BaseModel): |
|
indexers: List[str] |
|
languages: Optional[List[str]] = ["All"] |
|
resolutions: Optional[List[str]] = ["All"] |
|
resultFormat: Optional[List[str]] = ["All"] |
|
maxResults: Optional[int] = 0 |
|
maxSize: Optional[float] = 0 |
|
debridService: str |
|
debridApiKey: str |
|
debridStreamProxyPassword: Optional[str] = "" |
|
|
|
@field_validator("indexers") |
|
def check_indexers(cls, v, values): |
|
settings.INDEXER_MANAGER_INDEXERS = [ |
|
indexer.replace(" ", "_").lower() |
|
for indexer in settings.INDEXER_MANAGER_INDEXERS |
|
] |
|
valid_indexers = [ |
|
indexer for indexer in v if indexer in settings.INDEXER_MANAGER_INDEXERS |
|
] |
|
|
|
|
|
|
|
|
|
return valid_indexers |
|
|
|
@field_validator("maxResults") |
|
def check_max_results(cls, v): |
|
if v < 0: |
|
v = 0 |
|
return v |
|
|
|
@field_validator("maxSize") |
|
def check_max_size(cls, v): |
|
if v < 0: |
|
v = 0 |
|
return v |
|
|
|
@field_validator("debridService") |
|
def check_debrid_service(cls, v): |
|
if v not in ["realdebrid", "alldebrid", "premiumize", "torbox", "debridlink"]: |
|
raise ValueError("Invalid debridService") |
|
return v |
|
|
|
|
|
rtn_settings = SettingsModel() |
|
rtn_ranking = BestRanking() |
|
|
|
|
|
rtn = RTN(settings=rtn_settings, ranking_model=rtn_ranking) |
|
|
|
database_url = ( |
|
settings.DATABASE_PATH |
|
if settings.DATABASE_TYPE == "sqlite" |
|
else settings.DATABASE_URL |
|
) |
|
database = Database( |
|
f"{'sqlite' if settings.DATABASE_TYPE == 'sqlite' else 'postgresql+asyncpg'}://{'/' if settings.DATABASE_TYPE == 'sqlite' else ''}{database_url}" |
|
) |
|
|