From a4738dfd80240ea2533b72f4c209b3a9697ebf56 Mon Sep 17 00:00:00 2001 From: "alexei.dolgolyov" Date: Fri, 30 Jan 2026 05:00:18 +0300 Subject: [PATCH] Add support for asset download url --- immich_album_watcher/const.py | 1 + immich_album_watcher/coordinator.py | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/immich_album_watcher/const.py b/immich_album_watcher/const.py index 80784e9..6f7fd33 100644 --- a/immich_album_watcher/const.py +++ b/immich_album_watcher/const.py @@ -55,6 +55,7 @@ ATTR_ASSET_CREATED: Final = "asset_created" ATTR_ASSET_OWNER: Final = "asset_owner" ATTR_ASSET_OWNER_ID: Final = "asset_owner_id" ATTR_ASSET_URL: Final = "asset_url" +ATTR_ASSET_DOWNLOAD_URL: Final = "asset_download_url" ATTR_ASSET_DESCRIPTION: Final = "asset_description" # Asset types diff --git a/immich_album_watcher/coordinator.py b/immich_album_watcher/coordinator.py index c2b9698..585aac6 100644 --- a/immich_album_watcher/coordinator.py +++ b/immich_album_watcher/coordinator.py @@ -23,6 +23,7 @@ from .const import ( ATTR_ALBUM_URL, ATTR_ASSET_CREATED, ATTR_ASSET_DESCRIPTION, + ATTR_ASSET_DOWNLOAD_URL, ATTR_ASSET_FILENAME, ATTR_ASSET_OWNER, ATTR_ASSET_OWNER_ID, @@ -430,7 +431,7 @@ class ImmichAlbumWatcherCoordinator(DataUpdateCoordinator[AlbumData | None]): ] def _get_asset_public_url(self, asset_id: str) -> str | None: - """Get the public URL for an asset.""" + """Get the public viewer URL for an asset (web page).""" accessible_links = self._get_accessible_links() if accessible_links: return f"{self._url}/share/{accessible_links[0].key}/photos/{asset_id}" @@ -439,6 +440,16 @@ class ImmichAlbumWatcherCoordinator(DataUpdateCoordinator[AlbumData | None]): return f"{self._url}/share/{non_expired[0].key}/photos/{asset_id}" return None + def _get_asset_download_url(self, asset_id: str) -> str | None: + """Get the direct download URL for an asset (media file).""" + accessible_links = self._get_accessible_links() + if accessible_links: + return f"{self._url}/api/assets/{asset_id}/original?key={accessible_links[0].key}" + non_expired = [link for link in self._shared_links if not link.is_expired] + if non_expired: + return f"{self._url}/api/assets/{asset_id}/original?key={non_expired[0].key}" + return None + async def _async_update_data(self) -> AlbumData | None: """Fetch data from Immich API.""" if self._session is None: @@ -542,6 +553,9 @@ class ImmichAlbumWatcherCoordinator(DataUpdateCoordinator[AlbumData | None]): asset_url = self._get_asset_public_url(asset.id) if asset_url: asset_detail[ATTR_ASSET_URL] = asset_url + asset_download_url = self._get_asset_download_url(asset.id) + if asset_download_url: + asset_detail[ATTR_ASSET_DOWNLOAD_URL] = asset_download_url added_assets_detail.append(asset_detail) event_data = {