104 Commits

Author SHA1 Message Date
Brandon Wees
f3b7cd6198
refactor: move encoded video to asset files table (#26863)
* refactor: move encoded video to asset files table

* chore: update
2026-03-12 16:15:21 -04:00
Daniel Dietzler
34ce68095d
chore: upgrade to kysely 0.28.11 (#26744) 2026-03-11 16:17:31 +01:00
Sergey Katsubo
4a384bca86
fix(server): opus handling as accepted audio codec in transcode policy (#26736)
* Fix opus handling as accepted audio codec in transcode policy

Fix the issue when opus is among accepted audio codecs in transcode policy
(which is default) but it still triggers transcoding because the codec name
from ffprobe (opus) does not match `libopus` literal in Immich.

Make a distinction between a codec name and encoder:
- codec name: switch to `opus` as the audio codec name. This matches what ffprobe
returns for a media file with opus audio.
- encoder: continue using the `libopus` encoder in ffmpeg.

* Add unit tests for accepted audio codecs and for libopus encoder

* Add db migration for ffmpeg.targetAudioCodec opus

* backward compatibility

* tweak

* noisy logs

* full mapping

* make check happy

* mark deprecated

* update api

* indexOf

---------

Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
2026-03-07 13:08:42 -05:00
Mees Frensel
9b642633c1
fix(server): clarify transcoding bitrate policy (#26711) 2026-03-05 12:13:29 -05:00
Daniel Dietzler
ca6c486a80
refactor: person stubs (#26512) 2026-02-25 08:56:00 -05:00
Min Idzelis
d14d0a9b9b
feat: add isTransparent to db (#26413) 2026-02-23 21:33:52 +00:00
Min Idzelis
430638e129
feat: warn when losing transparency during thumbnail generation (#26243)
* feat: preserve alpha

* refactor: use isTransparent naming and separate getImageMetadata

* warn instead of preserve
2026-02-23 08:16:28 -05:00
Daniel Dietzler
d0ed76dc37
refactor: small face tests (#26340) 2026-02-19 08:51:18 -05:00
Daniel Dietzler
7cb355279e
chore: remove asset stubs (#26187) 2026-02-13 11:00:31 -05:00
Daniel Dietzler
7e0356e227
refactor: more small tests (#26159) 2026-02-12 08:34:32 -05:00
Daniel Dietzler
e54678e0d6
refactor: small tests (#26141) 2026-02-11 11:49:00 -05:00
Mert
7fa6f617f5
fix(server): thumbnail queueing (#26077)
* fix thumbnail queueing

* add bmp

* other isEdited column
2026-02-10 09:04:03 -06:00
Jason Rasmussen
e3e243fa2b
refactor: tests (#25987) 2026-02-07 00:47:54 +01:00
Min Idzelis
092ebe01a5
fix: queue assets missing fullsize files for thumbnail regeneration (#25794)
* fix: queue assets missing fullsize files for thumbnail regeneration

* refactor: query

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2026-02-05 19:31:13 +00:00
Mert
9506398153
refactor(server): add isProgressive column (#25537)
* add isProgressive column

* don't select isProgressive by default

* linting

* exclude sidecars
2026-01-26 17:05:25 -05:00
Min Idzelis
357ec1394a
feat: generate progressive JPEGs for thumbnails (#25463) 2026-01-24 00:35:07 +00:00
Daniel Dietzler
1649d87360
refactor: extract isEdited into its own column in asset_file (#25358) 2026-01-21 16:08:21 +01:00
Brandon Wees
e8c80d88a5
feat: image editing (#24155) 2026-01-09 17:59:52 -05:00
Mees Frensel
271a42ac7f
fix(server): copy relevant panorama tags to preview image (#23953) 2025-11-19 03:02:12 +00:00
grgergo
6973683ea7
fix: use full-size image for non-web-compatible panoramas (#20359)
* fix(web): use full-size image for non-web-compatible panoramas

* always generate full-size image for panoramas

* add unit test

* fix formatting

---------

Co-authored-by: gergo= <gergo@pitty.hu>
2025-10-06 12:38:41 -04:00
Mert
24234bedf1
fix(server): override reserved color metadata for video thumbnails (#22348)
override reserved metadata
2025-10-06 12:13:10 -04:00
Jason Rasmussen
8f1b505ba0
fix: prevent an offline asset from being used as a person feature photo (#21278) 2025-08-25 22:40:56 -04:00
patrickgoering
1ca46fbd98
fix: video thumbnail generation for short videos (#20629)
fix video thumbnail generation for short videos

ffmpeg gives conversion failed with error 234 for short mp4 files (less
than 10s) that where converted from m2ts. Longer videos work fine.

It looks like ffmpeg has no frames left to use for generating a
thumbnail.

This change fixes this issue and seems to not change the behaviour for
other mp4 files (same thumbnail before and after change)

This might also fix all mts file thumbnail generation.
2025-08-06 13:10:49 +00:00
Jason Rasmussen
58521c9efb
feat: change default media location to /data (#20367)
* feat!: change default media location to /data

* feat: dynamically detect media location
2025-07-29 16:58:50 -04:00
Jason Rasmussen
493d85b021
feat!: absolute file paths (#19995)
feat: absolute file paths
2025-07-18 10:57:29 -04:00
Jason Rasmussen
bcb968e3d1
refactor: job names (#19949) 2025-07-15 18:39:00 -04:00
Jason Rasmussen
e73abe0762
refactor: enum casing (#19946) 2025-07-15 14:50:13 -04:00
Mert
493b9b7a54
fix(server): use preview path for person thumbnails from videos (#18419)
use preview path for person thumbnails from videos
2025-05-21 11:15:30 -05:00
Daimolean
dc8962f2bc
fix(server): select main stream according to bitrate (#18375)
* fix main stream

* update unit tests

---------

Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
2025-05-19 17:33:28 -04:00
Mert
2a80251dc3
fix(server): more robust person thumbnail generation (#17974)
* more robust person thumbnail generation

* clamp bounding boxes

* update sql

* no need to process invalid images after decoding

* cursed knowledge

* new line
2025-05-06 14:18:22 -04:00
Jason Rasmussen
526c02297c
refactor: stream queue migration (#17997) 2025-04-30 16:23:13 +00:00
Eli Gao
48bcbee6ed
feat(server): JXL previews from DNG 1.7+ (#17861)
* feat(server): JXL previews from RAW

* refactor(server): use var name assumedExtractedFormat for clarity

* test(server): fix existing media.extract() returning JPEG

* chore(openapi): regen

* style(server): lint

* fix(server): ignore undefined decode orientation

* fix(server): correct orientation assignment in media decode options

* test(server): unit tests of JXL-encoded DNG

* refactor(server): return buffer and format from mediaRepository.extract()

* chore(open-api): regen

* refactor

---------

Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
2025-04-28 18:18:46 -04:00
Daniel Dietzler
f621f8ef2c
refactor: more job queries (#17745) 2025-04-29 00:03:20 +02:00
Daniel Dietzler
f50e5d006c
refactor: dedicated queries for asset jobs (#17652) 2025-04-16 14:08:49 -04:00
Daniel Dietzler
21becbf1b0
refactor: dedicated query for asset migration job (#17631) 2025-04-15 15:49:15 -04:00
Daniel Dietzler
5bceefce75
refactor: stream assets for thumbnail job (#17623) 2025-04-15 19:53:28 +02:00
Daniel Dietzler
7a1e8ce6d8
chore: remove exif entity (#17499) 2025-04-10 12:36:29 -04:00
Mert
59e5c82569
fix(server): full-size images not migrated or deleted correctly (#17308)
* fix file path logic

* update tests

* add empty array fallback just in case for now
2025-04-01 18:11:46 -04:00
Eli Gao
5c80e8734b
feat: original-sized previews for non-web-friendly images (#14446)
* feat(server): extract full-size previews from RAW images

* feat(web): load fullsize preview for RAW images when zoomed in

* refactor: tweaks for code review

* refactor: rename "converted" preview/assets to "fullsize"

* feat(web/server): fullsize preview for non-web-friendly images

* feat: tweaks for code review

* feat(server): require ASSET_DOWNLOAD premission for fullsize previews

* test: fix types and interfaces

* chore: gen open-api

* feat(server): keep only essential exif in fullsize preview

* chore: regen openapi

* test: revert unnecessary timeout

* feat: move full-size preview config to standalone entry

* feat(i18n): update en texts

* fix: don't return fullsizePath when disabled

* test: full-size previews

* test(web): full-size previews

* chore: make open-api

* feat(server): redirect to preview/original URL when fullsize thumbnail not available

* fix(server): delete fullsize preview image on thumbnail regen after fullsize preview turned off

* refactor(server): AssetRepository.deleteFiles with Kysely

* fix(server): type of MediaRepository.writeExif

* minor simplification

* minor styling changes and condensed wording

* simplify

* chore: reuild open-api

* test(server): fix media.service tests

* test(web): fix photo-viewer test

* fix(server):  use fullsize image when requested

* fix file path extension

* formatting

* use fullsize when zooming back out or when "display original photos" is enabled

* simplify condition

---------

Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
2025-03-31 13:24:28 -04:00
Mert
9f46ba8eb4
fix(server): set pixel format when scaling and not tonemapping (#16932)
set pixel format when scaling and not tonemapping
2025-03-18 11:42:09 -05:00
Jason Rasmussen
fa5aeaf539
refactor: last repository (#16042) 2025-02-11 22:15:56 +00:00
Jason Rasmussen
9d85272c2b
refactor: repositories (#16036) 2025-02-11 14:08:13 -05:00
Jason Rasmussen
735f8d661e
refactor: test mocks (#16008) 2025-02-11 00:47:42 +01:00
Jason Rasmussen
03948a69e2
refactor: system metadata repository (#15954) 2025-02-07 17:26:49 -05:00
Jason Rasmussen
d3446f3092
refactor: logging repository (#15540) 2025-01-23 08:31:30 -05:00
Jason Rasmussen
66849d0d45
refactor: migrate media repository (#15536) 2025-01-22 22:11:07 +00:00
Daniel Dietzler
332a865ce6
refactor: migrate person repository to kysely (#15242)
* refactor: migrate person repository to kysely

* `asVector` begone

* linting

* fix metadata faces

* update test

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
2025-01-21 13:12:28 -05:00
Mert
fef36e6a37
chore(server)!: default max bitrate unit to kbps (#15264)
default unit to kbps
2025-01-11 22:09:19 -06:00
Mert
60c783bbe9
fix(server): partial fallback for hardware transcoding (#14611) 2024-12-10 12:11:19 -05:00
Mert
52247c3650
fix(server): always set transcoding device, prefer renderD* (#14455)
always set device, prefer renderD*
2024-12-02 20:28:50 -05:00