This commit is contained in:
riglen
2026-04-09 11:11:49 +08:00
parent 0dbb84d308
commit 4e97dbc369
3 changed files with 41 additions and 4 deletions

View File

@@ -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(