perf: rewrite asset URLs to internal provider URL for LAN fetching

When both internal URL and external domain are configured, rewrite
asset download URLs from external to internal before fetching.
This avoids routing through public internet when the bot and
provider are on the same LAN.
This commit is contained in:
2026-03-24 15:40:28 +03:00
parent d8ecb60073
commit ad2fd33697
@@ -150,20 +150,26 @@ class NotificationDispatcher:
return {"success": False, "error": "No receivers configured"} return {"success": False, "error": "No receivers configured"}
# Prepare assets list once (shared across receivers) # Prepare assets list once (shared across receivers)
provider_urls = [] # Prefer internal URL for fetching (LAN speed vs public internet)
if target.provider_internal_url: internal_url = (target.provider_internal_url or "").rstrip("/")
provider_urls.append(target.provider_internal_url) external_url = (target.provider_external_url or "").rstrip("/")
if target.provider_external_url: provider_urls = [u for u in (internal_url, external_url) if u]
provider_urls.append(target.provider_external_url)
assets = [] assets = []
for asset in event.added_assets[:max_media]: for asset in event.added_assets[:max_media]:
url = asset.full_url or asset.thumbnail_url url = asset.full_url or asset.thumbnail_url
if url: if url:
# Rewrite external URL to internal for faster LAN fetching
if internal_url and external_url and url.startswith(external_url):
url = internal_url + url[len(external_url):]
asset_type = "video" if asset.type.value == "video" else "photo" asset_type = "video" if asset.type.value == "video" else "photo"
asset_headers = {} asset_headers = {}
if target.provider_api_key and any(url.startswith(u) for u in provider_urls): if target.provider_api_key and any(url.startswith(u) for u in provider_urls):
asset_headers["x-api-key"] = target.provider_api_key asset_headers["x-api-key"] = target.provider_api_key
assets.append({"url": url, "type": asset_type, "headers": asset_headers}) asset_entry: dict[str, Any] = {"url": url, "type": asset_type, "headers": asset_headers}
# Pass explicit cache_key if set by provider (e.g. Google Photos)
if asset.extra.get("cache_key"):
asset_entry["cache_key"] = asset.extra["cache_key"]
assets.append(asset_entry)
results: list[dict[str, Any]] = [] results: list[dict[str, Any]] = []
async with aiohttp.ClientSession() as session: async with aiohttp.ClientSession() as session: