Commit Graph
10939 Commits
Author SHA1 Message Date
Lin, Chiang-Yu b26b0cc806 fix(server): let a second metadata extraction replace stored AV metadata (#30900)
`upsertExif` writes derived audio, video and keyframe metadata with an
`ON CONFLICT DO UPDATE`, but every column in those three update lists
assigns the stored row back to itself:

    bitrate: ref('asset_audio.bitrate')

`SET bitrate = asset_audio.bitrate` is a self-assignment, so once a row
exists nothing can change it. Re-running metadata extraction re-reads the
file, builds a fresh snapshot, and then quietly discards it. The rest of the
file already uses `excluded` for this, as does `plugin.repository.ts`.

`asset_video.frameCount` had a second problem: it is supplied on insert but
was missing from the update list, so it would have stayed stale even after
the reference was corrected.

Extraction is meant to be repeatable. Probing improves between releases, a
file can be repaired or replaced, and a fix to how a stream is chosen is
worthless if it cannot reach the assets that were already imported. An
`upsert` that silently degrades to insert-only defeats all of that.

Metadata extraction is the only caller that passes these three objects, and
it passes a complete snapshot or nothing: each object is built from a single
probe behind a guard, and `upsertExif` skips the branch entirely when the
object is absent. So taking the incoming row cannot write partial values
over good ones. The other three callers pass `exif` only, and every other
reference to these tables is a read.
2026-08-22 17:58:05 +00:00
Santo Shakil 2237b28813 fix(mobile): permanently delete local copies when moving to the locked folder (#29730)
* permanently delete local copies when moving to the locked folder

* simplify the delete path and move the stubs into the mock defaults

* drop the kept count from the partial message and log the mismatch instead
2026-08-22 07:42:11 +05:30
Adam Gastineau 11cdfa9c5e chore(mobile): remove commited db.repository.steps.dart (#30910) 2026-08-22 07:37:47 +05:30
Alex 7412079f88 chore: search filter animation improvement and reactive search cue example (#30866)
* chore: better animation for search form and search cue

* better search cue example

* chore: revert mise.lock changes
2026-08-21 15:11:23 -05:00
shenlongandshenlong-tanwen a36fb67736 chore: align icon and font size of bottom bar actions (#30890)
* chore: align icon and font size of bottom bar actions

* align base action font weight to immich ui weights

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-08-21 14:06:42 -05:00
Jordan BrockandRay 79c4c00f70 feat(web): tag renaming v2 (#27909)
* implement updated rename tag feature

* Fix tag update handler

* Ensure toast displays updated tag name

* Ensure toast displays updated tag name

* Handle updates to tag closure table, prevent slash in API filename, test case updates

* delete child tags on parent delete

* Update frontend for better handling of nested tags

* pr checklist fixes

* fix unit test for tag controller

* Hide path for top-level tags

* regenerate SQL files

* name updates optional for tag update operations

* e2e tests for new tag api changes

* changes from code review, additional test coverage

* test fixes, web component refactor

* test assets

* test asset updates

* open-api rebuild

* update unit tests

* fix tag dto tests

* Update web/src/lib/modals/TagEditModal.svelte

Fix missing color bug

Co-authored-by: Ray <3608878+Pecacheu@users.noreply.github.com>

* fix tag e2e test

* remove closure table bug fixes

* remove nullish from tag name update schema

* regenerate openapi and sql

* fix test and e2e test

* simplify tag repository update process

* minor fix and sql regenerate

* fix tests, regen open-api, update dto

* Remove unused function

* Remove accidental test asset ref

* re-add test assets

* pin submodule to main branch commit

* Update test cases based on feedback

* Server fixes based on feedback

* regenerate sql

---------

Co-authored-by: Ray <3608878+Pecacheu@users.noreply.github.com>
2026-08-21 14:55:11 -04:00
Adam Gastineau 37e033a09d chore(mobile): migrate remaining simple classes to Freezed (#30907) 2026-08-21 22:37:03 +05:30
Jason Rasmussen 2f48a8aab4 refactor: memory e2e (#30906) 2026-08-21 12:15:17 -04:00
Jason RasmussenandDaniel Dietzler caea849fee feat: asset file apis (#25900)
* feat: asset file endpoints

* Update server/src/controllers/asset-file.controller.ts

Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>

* Update server/src/controllers/asset-file.controller.ts

Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>

---------

Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
2026-08-21 13:55:25 +00:00
Daniel Dietzler 8ae98f2a04 fix: quote database owner in restore (#30905) 2026-08-21 15:11:20 +02:00
renovate[bot] 47c0dea07f chore(deps): update grafana/grafana docker tag to v12.4.8-ubuntu (#30835) 2026-08-21 14:50:10 +02:00
HolegotsandDaniel Dietzler 57ce9b2221 fix(server): correct asset dimensions from exif metadata (#29244)
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-08-21 13:32:17 +02:00
Santo Shakil a490cea1c4 fix(mobile): dedupe stale remote_asset rows on sync (#28445)
* fix(mobile): dedupe stale remote_asset rows on sync

queue a pre-delete on the matching partial-index tuple before each
upsert in updateAssetsV1/V2 so the second insert does not crash on
SqliteException(2067) when the server re-issues a new id for the
same (ownerId, checksum). closes #22522 #27186.

* run the dedupe deletes before the inserts and keep only the last duplicate per payload

* switch the asset upsert to insert or replace

* trim the dedupe tests to the essentials
2026-08-21 11:13:48 +00:00
Jason Rasmussen 4c26a7ca76 refactor: activity e2e (#30896) 2026-08-21 12:57:50 +02:00
Patryk GęborysandDaniel Dietzler 8ce6b18563 fix(server): library exclusion patterns can soft-delete assets outside their directory (#30850)
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-08-21 12:28:12 +02:00
Diogo Correia c9776fb990 fix(web): download archives via html POST forms (#30021)
* fix: download archives via html POST forms

* refactor: fix css of download panel, add translations and toasts

* style: run lint, formatter, check

* chore: generate open-api specs

* refactor(web): simplify download manager, use SvelteMap

* refactor(server): parse fields from x-www-form-urlencoded request

* refactor: move content-disposition to ImmichReadStream

* Pass asset ids as a comma-separated string

This fixes a bug where the 1000 parameter limit is being hit when
downloading 1000+ assets.

* Add download controller test

* Fix lint warnings
2026-08-20 20:58:41 -04:00
Jason Rasmussen c7531a36f9 refactor: partner e2e (#30895) 2026-08-20 17:32:51 -04:00
Sacha Brouté c7f6197e75 feat: add oauth account management url (#30873) 2026-08-20 21:31:34 +00:00
Jason Rasmussen 24532c4d82 fix(ci): docker caching (#30894) 2026-08-20 16:37:43 -04:00
Adam Gastineau c8199ef32f chore(mobile): update flutter-maplibre-gl to 0.27.0 (#30892) 2026-08-20 23:47:05 +05:30
Jason RasmussenandDaniel Dietzler 11b1aa5ecf feat: cluster groups (#30739)
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-08-20 20:03:00 +02:00
Adam Gastineau f88fb628ff chore(mobile): patch Flutter to allow building against iOS simulator (#30821)
* chore(mobile): patch Flutter to allow building against iOS simulator

* Fixed mise script path
2026-08-20 16:53:44 +00:00
Jason Rasmussen f9f7311418 refactor: use public config (#30891) 2026-08-20 12:44:39 -04:00
Jason Rasmussen e529557160 feat: new config endpoints (#30881)
* refactor: config endpoints

* chore: pr feedback
2026-08-20 11:46:17 -04:00
Jason Rasmussen 47c5a3dbf6 refactor: api key response dto (#30887) 2026-08-20 11:23:12 -04:00
Santo Shakil a066b5f301 fix(mobile): order album/place/person timelines by local date (#29338)
* fix(mobile): order album/place/person timelines by local date

* fold the timeline date ordering into one helper and tighten the tests

* drop the redundant none guard from the place asset query

* format
2026-08-20 13:52:33 +06:00
Jason Rasmussen 47dccf7283 refactor: dockerfile caching (#30874) 2026-08-19 16:52:50 -04:00
Yaros 7165eb61eb fix(server): unicode email validation (#30871) 2026-08-19 16:40:10 -04:00
renovate[bot] bd2cbb751b fix(deps): update sharp to ^0.35.3 (#29132)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-19 15:49:10 -04:00
Jason Rasmussen 7cd0a7d30c refactor: e2e tests (#30870) 2026-08-19 14:31:57 -04:00
Jason Rasmussen c63824bcea refactor: library e2e (#30867) 2026-08-19 11:49:41 -04:00
Jason Rasmussen d2759ec41e refactor: library e2e (#30865) 2026-08-19 10:36:35 -04:00
Jason Rasmussen db3b31709d refactor: library controller tests (#30863) 2026-08-19 09:54:08 -04:00
Jonathan JogenforsandJason Rasmussen 2018e4f8c4 chore(server): migrate library e2e tests (#27277)
* migrate library e2e tests

* fix: real storage repo

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2026-08-19 13:14:40 +00:00
Ben Beckford 394996eb59 feat(web): new search ui (#30279) 2026-08-19 14:32:32 +02:00
Quantum Cucumber 7918ad9f79 docs: Update backup script to match manual/automatic backups (#26810)
fix(docs):  Update backup script to match manual/automatic backups
fixes immich-app#26421
2026-08-18 19:48:18 -04:00
Mees Frensel d8e25b8df0 fix(web): gracefully handle map errors when WebGL is disabled (#26538) 2026-08-18 22:37:47 +00:00
TimonandJason Rasmussen 3c279983bc fix(server): Sort stacked assets by creation date (#24033)
* feat: add ordering by file creation date in asset and stack repositories

* refactor: update asset aggregation to include JSON formatting and ordering by creation date

* refactor: add ordering by file creation date in asset aggregation queries

* fix: types

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2026-08-18 21:38:58 +00:00
Chandan PandJason Rasmussen 17d4e39af3 fix(server): do not throw on unparsable DB_URL when building backup arguments (#30759)
Closes #30331

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2026-08-18 17:17:47 -04:00
Fredrik Ekre 5274f8fcb7 docs: fix identity provider examples in oauth guide (#30828)
- enable PKCE in the authelia client example
- fix the authelia and authentik issuer URLs to point at the identity
  provider host instead of the immich host
- remove the `.well-known` suffix to homogenize with the Google and
  Keycloak examples
2026-08-18 16:26:00 -04:00
Matthew Momjian 14c21f531d fix: redis cli ping command (#30329)
update redis cli ping
2026-08-18 16:23:19 -04:00
bo0tzz 821c933c51 fix(cli): enforce node engine version on start (#30437) 2026-08-18 16:17:43 -04:00
renovate[bot] a5dc877ca2 chore(deps): update github-actions (major) (#30845)
chore(deps): update github-actions

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-18 16:16:22 -04:00
Brandon Wees 93d2d30fe0 feat: rotate an API key (#30801)
* feat: rotate an API key

* fix: test response

* chore: create new api key scope

* chore: code review
2026-08-18 16:07:39 -04:00
renovate[bot] c8c9d703ef chore(deps): update github-actions (#30838)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-18 16:04:53 -04:00
nikhilpodilaandshenlong 65b4b9b8fb fix(mobile): cannot deep link to memory lane (#30634) (#30787)
Co-authored-by: shenlong <139912620+shenlong-tanwen@users.noreply.github.com>
2026-08-18 18:37:15 +00:00
shenlongandshenlong-tanwen ea3fa92776 feat: actions undo handling (#30481)
* feat: actions undo handling

# Conflicts:
#	mobile/lib/main.dart

* address pr reviews

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-08-19 00:06:57 +05:30
Santo Shakil 1539ae8b07 fix(mobile): resend an upload once when the connection dies before a response (#30843) 2026-08-18 22:38:52 +06:00
Daniel Dietzler 03da1ba108 chore: single line block comments (#30852) 2026-08-18 17:55:26 +02:00
YarosandDaniel Dietzler 80a90fabf3 fix(server): update ocr & faces after asset edit (#29303)
* fix: update ocr & faces after asset edit

* chore: remove client-side refresh

* fix(server): sync asset OCR visibility changes

* chore: prettier format

* test: missing updatedAt

* chore: remove comment

* chore: fix test

* chore: update migration timestamp

* chore(server): AssetOcrSyncReset

* chore: migration timestamps

---------

Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-08-18 14:32:21 +00:00