B
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
|
||||
from fastapi import FastAPI, HTTPException, Query, Request
|
||||
from fastapi.responses import Response
|
||||
|
||||
@@ -18,6 +20,7 @@ from app.services.subscriptions import (
|
||||
)
|
||||
|
||||
settings = get_settings()
|
||||
logger = logging.getLogger(__name__)
|
||||
app = FastAPI(title=settings.app_name)
|
||||
app_config = load_app_config(settings.sources_file)
|
||||
PUBLIC_PREFIX = "/" + (app_config.public_path or settings.public_path).strip("/")
|
||||
@@ -37,6 +40,7 @@ def _base_url(request: Request) -> str:
|
||||
def _resolve_sources(sources: str | None) -> list[tuple[str, SourceConfig]]:
|
||||
enabled = [(name, src) for name, src in app_config.sources.items() if src.enabled and str(src.url).strip()]
|
||||
if not sources:
|
||||
logger.info("resolve_sources default: selected=%s", [name for name, _ in enabled])
|
||||
return enabled
|
||||
|
||||
names = [item.strip() for item in sources.split(",") if item.strip()]
|
||||
@@ -52,6 +56,7 @@ def _resolve_sources(sources: str | None) -> list[tuple[str, SourceConfig]]:
|
||||
seen.add(name)
|
||||
if not selected:
|
||||
raise HTTPException(status_code=400, detail="no sources selected")
|
||||
logger.info("resolve_sources explicit: requested=%s selected=%s", sources, [name for name, _ in selected])
|
||||
return selected
|
||||
|
||||
|
||||
@@ -100,6 +105,7 @@ async def merged_provider(request: Request, sources: str | None = Query(default=
|
||||
try:
|
||||
document = await build_merged_provider_document(source_items)
|
||||
except Exception as exc: # noqa: BLE001
|
||||
logger.exception("merged_provider failed: sources=%s", [name for name, _ in source_items])
|
||||
raise HTTPException(status_code=502, detail=f"failed to build merged provider: {exc}") from exc
|
||||
|
||||
content = dump_provider_yaml(document)
|
||||
@@ -116,6 +122,7 @@ async def provider(name: str, request: Request) -> Response:
|
||||
try:
|
||||
document = await build_provider_document(name, source)
|
||||
except Exception as exc: # noqa: BLE001
|
||||
logger.exception("provider failed: source=%s", name)
|
||||
raise HTTPException(status_code=502, detail=f"failed to build provider: {exc}") from exc
|
||||
|
||||
content = dump_provider_yaml(document)
|
||||
@@ -174,6 +181,7 @@ async def bundle_profile(
|
||||
ttl_seconds=settings.bundle_cache_ttl_seconds,
|
||||
)
|
||||
if cached is not None:
|
||||
logger.info("bundle cache hit: client=%s sources=%s", client_type, [name for name, _ in source_items])
|
||||
headers = {
|
||||
"profile-update-interval": str(client.provider_interval),
|
||||
"X-Sub-Provider-Bundle-Cache": "HIT",
|
||||
@@ -184,6 +192,7 @@ async def bundle_profile(
|
||||
try:
|
||||
snapshots = await build_source_snapshots(source_items)
|
||||
except Exception as exc: # noqa: BLE001
|
||||
logger.exception("bundle_profile failed: client=%s sources=%s", client_type, [name for name, _ in source_items])
|
||||
raise HTTPException(status_code=502, detail=f"failed to build bundle: {exc}") from exc
|
||||
|
||||
content = dump_yaml(
|
||||
|
||||
Reference in New Issue
Block a user