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: