Skip to content

Fix upload of Live photos via iOS - #45

Merged
joojoooo merged 1 commit into
joojoooo:mainfrom
timaschew:fix-ios-live-photos
May 21, 2026
Merged

Fix upload of Live photos via iOS#45
joojoooo merged 1 commit into
joojoooo:mainfrom
timaschew:fix-ios-live-photos

Conversation

@timaschew

@timaschew timaschew commented May 21, 2026

Copy link
Copy Markdown

I've updated immich and immich (server+client) upload optimizer to the latest version.

Currently it is failing for Live photos, here is an example log:

2026/05/21 06:36:34 172.18.0.1: job 593: received: "IMG_9336.MOV" (deviceAssetId: 355A7C06-48E8-4161-BCCC-2CE5F3367DD7/L0/001)
2026/05/21 06:36:34 172.18.0.1: job 593: downloaded: "IMG_9336.MOV" (4.55 MB)
2026/05/21 06:37:47 172.18.0.1: job 594: received: "IMG_9336.HEIC" (deviceAssetId: 355A7C06-48E8-4161-BCCC-2CE5F3367DD7/L0/001)
2026/05/21 06:37:47 172.18.0.1: job err: job 594: job 593 is already processing this asset

I have used Claude Code with Opus 4.7 xhigh
and adjusted the comment regarding this:

https://github.com/immich-app/immich/blob/b414b3d32b3952eb6f655d60b91240614be14acc/mobile/lib/services/foreground_upload.service.dart#L323

// deviceAssetId/deviceId required by server v2.7.5 and below (drop in v4.0 per #27818).

immich-app/immich#27818

Breaking changes

Remove deviceId and deviceAssetId and the respective endpoint /assets/exists and /assets/device/:deviceId

Currently it is failing with, here is an example log:

2026/05/21 06:36:34 172.18.0.1: job 593: received: "IMG_9336.MOV" (deviceAssetId: 355A7C06-48E8-4161-BCCC-2CE5F3367DD7/L0/001)
2026/05/21 06:36:34 172.18.0.1: job 593: downloaded: "IMG_9336.MOV" (4.55 MB)
2026/05/21 06:37:47 172.18.0.1: job 594: received: "IMG_9336.HEIC" (deviceAssetId: 355A7C06-48E8-4161-BCCC-2CE5F3367DD7/L0/001)
2026/05/21 06:37:47 172.18.0.1: job err: job 594: job 593 is already processing this asset
@joojoooo

Copy link
Copy Markdown
Owner

if the field was removed, what is 355A7C06-48E8-4161-BCCC-2CE5F3367DD7/L0/001 in the logs? and why does this issue affect only live photos?

@timaschew

timaschew commented May 21, 2026

Copy link
Copy Markdown
Author

if the field was removed, what is 355A7C06-48E8-4161-BCCC-2CE5F3367DD7/L0/001 in the logs?

Somehow I don't find the commit or PR number here: https://github.com/immich-app/immich/commits/main/
But anyhow, the comment:

// deviceAssetId/deviceId required by server v2.7.5 and below (drop in v4.0 per #27818).

explains that it will be suported until version 3.x and only removed in version 4.x

@timaschew

Copy link
Copy Markdown
Author

and why does this issue affect only live photos?

I guess because internally live photos are a pair of a photo and a video (two files) but they are handled even in the iOS gallery as a single asset.

@timaschew

timaschew commented May 21, 2026

Copy link
Copy Markdown
Author

I've did another iOS test. It seems to be not always to occur:

2026/05/21 10:04:12 172.18.0.1: job 599: received: "IMG_0215.MOV" (deviceAssetId: 8B10D7D8-D684-49CC-89EC-D88861660D8C/L0/001)
2026/05/21 10:04:12 172.18.0.1: job 599: downloaded: "IMG_0215.MOV" (3.44 MB)
2026/05/21 10:04:12 172.18.0.1: job 599: running task: ffmpeg-apple: ./convert-ios-video.sh 25 "/tempfs/upload-2793709427.MOV" "/tempfs/processing-145271258/upload-2793709427.mp4"
2026/05/21 10:04:14 172.18.0.1: job 600: received: "IMG_0213.MOV" (deviceAssetId: 40188F7F-F318-4CDE-9227-8726A2DC29D6/L0/001)
2026/05/21 10:04:14 172.18.0.1: job 600: downloaded: "IMG_0213.MOV" (3.67 MB)
2026/05/21 10:04:14 172.18.0.1: job 601: received: "IMG_0214.MOV" (deviceAssetId: D000AF31-AD91-4ECC-8DC7-660E913F46D8/L0/001)
2026/05/21 10:04:14 172.18.0.1: job 601: downloaded: "IMG_0214.MOV" (4.22 MB)
2026/05/21 10:04:32 172.18.0.1: job 600: running task: ffmpeg-apple: ./convert-ios-video.sh 25 "/tempfs/upload-590271154.MOV" "/tempfs/processing-2414207217/upload-590271154.mp4"
2026/05/21 10:04:32 172.18.0.1: job 599: uploaded: "IMG_0215.mp4" (669.44 KB) <- (3.44 MB) "IMG_0215.MOV"
2026/05/21 10:04:32 172.18.0.1: request URL: /api/assets
2026/05/21 10:04:36 172.18.0.1: job 602: received: "IMG_0215.HEIC" (deviceAssetId: 8B10D7D8-D684-49CC-89EC-D88861660D8C/L0/001)
2026/05/21 10:04:36 172.18.0.1: job 602: downloaded: "IMG_0215.HEIC" (1.72 MB)
2026/05/21 10:04:36 172.18.0.1: job 602: running task: heic-to-avif: ./convert-heic.sh 55 "/tempfs" "upload-3292346308" "HEIC" "/tempfs/processing-3115640769"
2026/05/21 10:04:43 172.18.0.1: job 602: uploaded: "IMG_0215.avif" (238.83 KB) <- (1.72 MB) "IMG_0215.HEIC"

In this case IMG_0215.MOV and IMG_0215.HEIC were uploaded without any errors and also the webui is showing me a correct live photo (with the correct icon). Maybe it depends on the upload order, I'm not sure. But in the morning the error occurred only for live photos.
But you see here also, that both files are sharing the same deviceAssetId: 8B10D7D8-D684-49CC-89EC-D88861660D8C/L0/001

@joojoooo
joojoooo merged commit 2c861eb into joojoooo:main May 21, 2026
1 check failed
@timaschew

timaschew commented May 21, 2026

Copy link
Copy Markdown
Author

Okay, I was able to reproduce it.
I've uploaded 3 long videos first and then 3 live photos and it failed again.

# 3 long videos
immich-upload-optimizer-1  | 2026/05/21 16:35:49 172.18.0.1: job 1: received: "IMG_0222.MOV" (deviceAssetId: AD4FD156-CBC3-4693-B7EA-412D85F660E7/L0/001)
immich-upload-optimizer-1  | 2026/05/21 16:35:50 172.18.0.1: job 1: downloaded: "IMG_0222.MOV" (43.59 MB)
immich-upload-optimizer-1  | 2026/05/21 16:35:50 172.18.0.1: job 1: running task: ffmpeg-apple: ./convert-ios-video.sh 25 "/tempfs/upload-201512554.MOV" "/tempfs/processing-2821222854/upload-201512554.mp4"
immich-upload-optimizer-1  | 2026/05/21 16:36:08 172.18.0.1: job 2: received: "IMG_0224.MOV" (deviceAssetId: D82F563B-215A-4D84-8D21-93565DB94A10/L0/001)
immich-upload-optimizer-1  | 2026/05/21 16:36:08 172.18.0.1: job 3: received: "IMG_0223.MOV" (deviceAssetId: 441C29AF-1B87-4126-9A84-76A076D62C27/L0/001)
immich-upload-optimizer-1  | 2026/05/21 16:36:08 172.18.0.1: job 3: downloaded: "IMG_0223.MOV" (45.85 MB)
immich-upload-optimizer-1  | 2026/05/21 16:36:08 172.18.0.1: job 2: downloaded: "IMG_0224.MOV" (45.95 MB)
# live photos (video part)
immich-upload-optimizer-1  | 2026/05/21 16:37:04 172.18.0.1: job 4: received: "IMG_0221.MOV" (deviceAssetId: DA12FEA6-14E2-409C-916F-AC8E8B61CB85/L0/001)
immich-upload-optimizer-1  | 2026/05/21 16:37:04 172.18.0.1: job 4: downloaded: "IMG_0221.MOV" (3.87 MB)
immich-upload-optimizer-1  | 2026/05/21 16:37:37 172.18.0.1: job 5: received: "IMG_0220.MOV" (deviceAssetId: 492F0662-B61A-4DCE-9603-4B3B4868EDFB/L0/001)
immich-upload-optimizer-1  | 2026/05/21 16:37:37 172.18.0.1: job 5: downloaded: "IMG_0220.MOV" (3.96 MB)
immich-upload-optimizer-1  | 2026/05/21 16:37:40 172.18.0.1: job 6: received: "IMG_0219.MOV" (deviceAssetId: FA6D05A4-ABD0-4EF5-A0D5-6283C42055B4/L0/001)
immich-upload-optimizer-1  | 2026/05/21 16:37:40 172.18.0.1: job 6: downloaded: "IMG_0219.MOV" (3.92 MB)
# live photos (image part)
immich-upload-optimizer-1  | 2026/05/21 16:38:08 172.18.0.1: job 7: received: "IMG_0221.HEIC" (deviceAssetId: DA12FEA6-14E2-409C-916F-AC8E8B61CB85/L0/001)
immich-upload-optimizer-1  | 2026/05/21 16:38:08 172.18.0.1: job err: job 7: job 4 is already processing this asset
immich-upload-optimizer-1  | 2026/05/21 16:38:08 172.18.0.1: request URL: /api/assets
immich-upload-optimizer-1  | 2026/05/21 16:38:44 172.18.0.1: job 8: received: "IMG_0220.HEIC" (deviceAssetId: 492F0662-B61A-4DCE-9603-4B3B4868EDFB/L0/001)
immich-upload-optimizer-1  | 2026/05/21 16:38:44 172.18.0.1: job err: job 8: job 5 is already processing this asset
immich-upload-optimizer-1  | 2026/05/21 16:38:44 172.18.0.1: request URL: /api/assets
immich-upload-optimizer-1  | 2026/05/21 16:39:03 172.18.0.1: job 9: received: "IMG_0219.HEIC" (deviceAssetId: FA6D05A4-ABD0-4EF5-A0D5-6283C42055B4/L0/001)
immich-upload-optimizer-1  | 2026/05/21 16:39:03 172.18.0.1: job err: job 9: job 6 is already processing this asset

Fortunately if I just restart the upload process, it's self healing (missing live photos parts) are uploaded again and I see real live photos in the web ui again.


I've also tested the new changes/the patch on my instance.
I've deleted the media in my test setup from above and started upload again.

And it did work, live photos were uploaded without any issues. Even from a previous upload attempt with the unpatched IUO version the "broken" live photos were fixed/self-healed.

Here is the log:

# 3 long videos
immich-upload-optimizer-1  | 2026/05/21 18:38:50 172.18.0.1: job 1: received: "IMG_0222.MOV" (deviceAssetId: AD4FD156-CBC3-4693-B7EA-412D85F660E7/L0/001|IMG_0222.MOV)
immich-upload-optimizer-1  | 2026/05/21 18:38:50 172.18.0.1: job 1: downloaded: "IMG_0222.MOV" (43.59 MB)
immich-upload-optimizer-1  | 2026/05/21 18:38:50 172.18.0.1: job 1: running task: ffmpeg-apple: ./convert-ios-video.sh 25 "/tempfs/upload-2480132758.MOV" "/tempfs/processing-1351800829/upload-2480132758.mp4"
immich-upload-optimizer-1  | 2026/05/21 18:38:52 172.18.0.1: job 2: received: "IMG_0223.MOV" (deviceAssetId: 441C29AF-1B87-4126-9A84-76A076D62C27/L0/001|IMG_0223.MOV)
immich-upload-optimizer-1  | 2026/05/21 18:38:52 172.18.0.1: job 2: downloaded: "IMG_0223.MOV" (45.85 MB)
immich-upload-optimizer-1  | 2026/05/21 18:38:52 172.18.0.1: job 3: received: "IMG_0224.MOV" (deviceAssetId: D82F563B-215A-4D84-8D21-93565DB94A10/L0/001|IMG_0224.MOV)
immich-upload-optimizer-1  | 2026/05/21 18:38:52 172.18.0.1: job 3: downloaded: "IMG_0224.MOV" (45.95 MB)
# live photos (video part)
immich-upload-optimizer-1  | 2026/05/21 18:39:52 172.18.0.1: job 4: received: "IMG_0221.MOV" (deviceAssetId: DA12FEA6-14E2-409C-916F-AC8E8B61CB85/L0/001|IMG_0221.MOV)
immich-upload-optimizer-1  | 2026/05/21 18:39:52 172.18.0.1: job 4: downloaded: "IMG_0221.MOV" (3.87 MB)
immich-upload-optimizer-1  | 2026/05/21 18:39:54 172.18.0.1: job 5: received: "IMG_0220.MOV" (deviceAssetId: 492F0662-B61A-4DCE-9603-4B3B4868EDFB/L0/001|IMG_0220.MOV)
immich-upload-optimizer-1  | 2026/05/21 18:39:54 172.18.0.1: job 5: downloaded: "IMG_0220.MOV" (3.96 MB)
immich-upload-optimizer-1  | 2026/05/21 18:39:54 172.18.0.1: job 6: received: "IMG_0219.MOV" (deviceAssetId: FA6D05A4-ABD0-4EF5-A0D5-6283C42055B4/L0/001|IMG_0219.MOV)
# live photos (image part)
immich-upload-optimizer-1  | 2026/05/21 18:39:54 172.18.0.1: job 6: downloaded: "IMG_0219.MOV" (3.92 MB)
immich-upload-optimizer-1  | 2026/05/21 18:40:52 172.18.0.1: job 7: received: "IMG_0221.HEIC" (deviceAssetId: DA12FEA6-14E2-409C-916F-AC8E8B61CB85/L0/001|IMG_0221.HEIC)
immich-upload-optimizer-1  | 2026/05/21 18:40:52 172.18.0.1: job 7: downloaded: "IMG_0221.HEIC" (986.15 KB)
immich-upload-optimizer-1  | 2026/05/21 18:40:52 172.18.0.1: job 7: running task: heic-to-avif: ./convert-heic.sh 55 "/tempfs" "upload-3086376658" "HEIC" "/tempfs/processing-358859876"
immich-upload-optimizer-1  | 2026/05/21 18:40:54 172.18.0.1: job 8: received: "IMG_0220.HEIC" (deviceAssetId: 492F0662-B61A-4DCE-9603-4B3B4868EDFB/L0/001|IMG_0220.HEIC)
immich-upload-optimizer-1  | 2026/05/21 18:40:54 172.18.0.1: job 8: downloaded: "IMG_0220.HEIC" (755.75 KB)
immich-upload-optimizer-1  | 2026/05/21 18:40:54 172.18.0.1: job 8: running task: heic-to-avif: ./convert-heic.sh 55 "/tempfs" "upload-1137923725" "HEIC" "/tempfs/processing-3407529150"
immich-upload-optimizer-1  | 2026/05/21 18:40:54 172.18.0.1: job 9: received: "IMG_0219.HEIC" (deviceAssetId: FA6D05A4-ABD0-4EF5-A0D5-6283C42055B4/L0/001|IMG_0219.HEIC)
immich-upload-optimizer-1  | 2026/05/21 18:40:54 172.18.0.1: job 9: downloaded: "IMG_0219.HEIC" (1.62 MB)
immich-upload-optimizer-1  | 2026/05/21 18:40:54 172.18.0.1: job 9: running task: heic-to-avif: ./convert-heic.sh 55 "/tempfs" "upload-487947191" "HEIC" "/tempfs/processing-1950833579"
immich-upload-optimizer-1  | 2026/05/21 18:41:00 172.18.0.1: job 7: uploaded: "IMG_0221.avif" (119.85 KB) <- (986.15 KB) "IMG_0221.HEIC"
immich-upload-optimizer-1  | 2026/05/21 18:41:00 172.18.0.1: request URL: /api/assets
immich-upload-optimizer-1  | Duplicate checksum pair: 4uNczoVhQvnZbT0SSpCB4Dz2kiA= <-> dcifal5FgQD3y/jDt57S7859uLY=
immich-upload-optimizer-1  | 2026/05/21 18:41:03 172.18.0.1: job 8: uploaded: "IMG_0220.avif" (100.69 KB) <- (755.75 KB) "IMG_0220.HEIC"
immich-upload-optimizer-1  | Duplicate checksum pair: OinXCMllHa4yugr+1fM+oFINa6c= <-> 6fKE03Hpw+W6q1ywTK4Gas1wOs0=
immich-upload-optimizer-1  | 2026/05/21 18:41:03 172.18.0.1: request URL: /api/assets
immich-upload-optimizer-1  | 2026/05/21 18:41:03 172.18.0.1: job 9: uploaded: "IMG_0219.avif" (183.46 KB) <- (1.62 MB) "IMG_0219.HEIC"
immich-upload-optimizer-1  | 2026/05/21 18:41:03 172.18.0.1: request URL: /api/assets
immich-upload-optimizer-1  | Duplicate checksum pair: visfl+WismNBs4PJpys4sU+9icA= <-> qwE/jaLp1ButQjQZ/yufjbvcN6g=

I've noticed that there is now Duplicate checksum pair entry, but that is expected, because deletion on immich server is not removing the checksum pairs. But it's also not really required.

@timaschew

Copy link
Copy Markdown
Author

It seems that deviceAssetId will be replaced by sha1 in future, calculated by the client.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants