From ad2fd3369709dd4c7145712e17d94c8d7dbfc743 Mon Sep 17 00:00:00 2001 From: "alexei.dolgolyov" Date: Tue, 24 Mar 2026 15:40:28 +0300 Subject: [PATCH] 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. --- .../notifications/dispatcher.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/core/src/notify_bridge_core/notifications/dispatcher.py b/packages/core/src/notify_bridge_core/notifications/dispatcher.py index 7a50313..8b1ac71 100644 --- a/packages/core/src/notify_bridge_core/notifications/dispatcher.py +++ b/packages/core/src/notify_bridge_core/notifications/dispatcher.py @@ -150,20 +150,26 @@ class NotificationDispatcher: return {"success": False, "error": "No receivers configured"} # Prepare assets list once (shared across receivers) - provider_urls = [] - if target.provider_internal_url: - provider_urls.append(target.provider_internal_url) - if target.provider_external_url: - provider_urls.append(target.provider_external_url) + # Prefer internal URL for fetching (LAN speed vs public internet) + internal_url = (target.provider_internal_url or "").rstrip("/") + external_url = (target.provider_external_url or "").rstrip("/") + provider_urls = [u for u in (internal_url, external_url) if u] assets = [] for asset in event.added_assets[:max_media]: url = asset.full_url or asset.thumbnail_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_headers = {} if target.provider_api_key and any(url.startswith(u) for u in provider_urls): 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]] = [] async with aiohttp.ClientSession() as session: