* feat(server): get random assets API
* Fix tests
* Use correct validation annotation
* Fix offset use in query
* Update API specs
* Fix typo
* Random assets e2e tests
* Improve e2e tests
* use access core for all person methods
* minor fixes, feedback
* reorder assignments
* remove unnecessary permission requirement
* unify naming of tests
* reorder variables
* soft delete albums when user gets soft deleted
* fix wrong intl openapi version
* fix tests
* ability to restore albums, automatically restore when user restored
* (e2e) tests for shared albums via link and with user
* (e2e) test deletion of users and linked albums
* (e2e) fix share album with owner test
* fix: deletedAt
* chore: fix restore order
* fix: use timezone date column
* chore: cleanup e2e tests
* (e2e) fix user delete test
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* feat: add setting for minimum face count for face detection
Adds the minimum face count setting to the web interface to
circumvent detection of strangers and random background people
if desired.
* fix: codestyle, remove max for face count
* tests for person service
* tests for auth service
* tests for access core
* improve tests for album service
* fix missing brackets and remove comments
* tests for asset service
* tests for face recognition
* tests for job service
* feedback
* tests for search service (broken)
* fix: disabled search test
* tests for smart-info service
* tests for storage template service
* tests for user service
* fix formatting of untouched files LOL
* attempt to fix formatting
* streamline api utils, add asset api for uploading files
* test upload of assets
* fix formatting
* move test-utils to correct folder
* test add assets to album
* use random bytes instead of test image
* (e2e) test albums with assets
* (e2e) complete tests for album endpoints
* (e2e) tests for asset endpoint
* fix: asset upload/import dto validation
* (e2e) tests for statistics asset endpoint
* fix wrong describe text
* (e2e) tests for people with faces
* (e2e) clean up person tests
* (e2e) tests for partner sharing endpoints
* (e2e) tests for link sharing
* (e2e) tests for the asset time bucket endpoint
* fix minor issues
* remove access.core.spec.ts
* chore: wording
* chore: organize test api files
* chore: fix test describe
* implement feedback
* fix race condition in album tests
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* feat(web): show original uploader in shared album photo details
* feat: send owner in asset by id response
* chore: open api
* fix: linting
* fix: change to Shared By
* openapi
* openapi
* api
* styling
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
This commit changes the album.getByAssetId API to also consider
albums that have been shared with the current user.
This way when the user is browing their timeline and clicks to show
the asset details they will see if the asset appears in not only their
own albums but also albums shared with them.
* custom `IsOptional`
* added link to source
* formatting
* Update server/src/domain/domain.util.ts
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* nullable birth date endpoint
* made `nullable` a property
* formatting
* removed unused dto
* updated decorator arg
* fixed album e2e tests
* add null tests for auth e2e
* add null test for person e2e
* fixed tests
* added null test for user e2e
* removed unusued import
* log key in test name
* chore: add note about mobile not being able to use the endpoint
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* consolidated endpoints, added live configuration
* added ml settings to server
* added settings dashboard
* updated deps, fixed typos
* simplified modelconfig
updated tests
* Added ml setting accordion for admin page
updated tests
* merge `clipText` and `clipVision`
* added face distance setting
clarified setting
* add clip mode in request, dropdown for face models
* polished ml settings
updated descriptions
* update clip field on error
* removed unused import
* add description for image classification threshold
* pin safetensors for arm wheel
updated poetry lock
* moved dto
* set model type only in ml repository
* revert form-data package install
use fetch instead of axios
* added slotted description with link
updated facial recognition description
clarified effect of disabling tasks
* validation before model load
* removed unnecessary getconfig call
* added migration
* updated api
updated api
updated api
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* implement method to read config file
* getConfig returns config file if present
* return isConfigFile for http requests
* disable elements if config file is used, show message if config file is set, copy existing config to clipboard
* fix allowing partial configuration files
* add new env variable to docs
* fix tests
* minor refactoring, address review
* adapt config type in frontend
* remove unnecessary imports
* move config file reading to system-config repo
* add documentation
* fix code formatting in system settings page
* add validator for config file
* fix formatting in docs
* update generated files
* throw error when trying to update config. e.g. via cli or api
* switch to feature flags for isConfigFile
* refactoring
* refactor: config file
* chore: open api
* feat: always show copy/export buttons
* fix: default flags
* refactor: copy to clipboard
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* Person birth date (data layer)
* Person birth date (data layer)
* Person birth date (service layer)
* Person birth date (service layer, API)
* Person birth date (service layer, API)
* Person birth date (UI) (wip)
* Person birth date (UI) (wip)
* Person birth date (UI) (wip)
* Person birth date (UI) (wip)
* UI: Use "date of birth" everywhere
* UI: better modal dialog
Similar to the API key modal.
* UI: set date of birth from people page
* Use typed events for modal dispatcher
* Date of birth tests (wip)
* Regenerate API
* Code formatting
* Fix Svelte typing
* Fix Svelte typing
* Fix person model [skip ci]
* Minor refactoring [skip ci]
* Typed event dispatcher [skip ci]
* Refactor typed event dispatcher [skip ci]
* Fix unchanged birthdate check [skip ci]
* Remove unnecessary custom transformer [skip ci]
* PersonUpdate: call search index update job only when needed
* Regenerate API
* Code formatting
* Fix tests
* Fix DTO
* Regenerate API
* chore: verbiage and view mode
* feat: show current age
* test: person e2e
* fix: show name for birth date selection
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* fix(server): Does not assign lat/lon if they are at 0,0 #2991
* Adds migration file to fix null island rows
* Removed down migration
* Leave empty down function
* feat: server changes for album timeline
* feat(web): album timeline view
* chore: open api
* chore: remove archive action
* fix: favorite for non-owners
* feat(web,server): user preference for time-based memories
* chore: open api
* dev: mobile
* fix: update
* mobile work
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: Alex Tran <Alex.Tran@conductix.com>
* feat(server/web): webp thumbnail size configurable
* update api
* add ui and fix test
* lint
* setting for jpeg size
* feat: coerce to number
* api
* jpeg resolution
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* feat(server): add album description
* chore: open api
* fix: tests
* show and edit description on the web
* fix test
* remove unused code
* type event
* format fix
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* refactor: time buckets
* feat(web): use new time bucket api
* feat(web): use asset grid in archive/favorites
* chore: open api
* chore: clean up uuid validation
* refactor(web): move memory lane to photos page
* Update web/src/routes/(user)/archive/+page.svelte
Co-authored-by: Sergey Kondrikov <sergey.kondrikov@gmail.com>
* fix: hide archived photos on main timeline
* fix: select exif info
---------
Co-authored-by: Sergey Kondrikov <sergey.kondrikov@gmail.com>
* added transcode configs for nvenc,qsv and vaapi
* updated dev docker compose
* added software fallback
* working vaapi
* minor fixes and added tests
* updated api
* compile libvips
* move hwaccel settings to `hwaccel.yml`
* changed default dockerfile, moved `readdir` call
* removed unused import
* minor cleanup
* fix for arm build
* added documentation, minor fixes
* added intel driver
* updated docs
styling
* uppercase codec and api names
* formatting
* added tests
* updated docs
* removed semicolons
* added link to `hwaccel.yml`
* added newlines
* added `hwaccel` section to docker-compose.prod.yml
* ensure mesa drivers are installed
* switch to mimalloc for sharp
* moved build version and sha256 to json
* let libmfx set the render device
* possible fix for vp9 on qsv
* updated tests
* formatting
* review suggestions
* semicolon
* moved `LD_PRELOAD` to start script
* switched to jellyfin's ffmpeg package
* fixed dockerfile
* use cqp instead of icq for qsv vp9
* updated dockerfile
* added sha256sum for other platforms
* fixtures
* refactor: add/remove album assets
* chore: open api
* feat: remove owned assets from album
* refactor: move to bulk id req/res dto
* chore: open api
* chore: merge main
* dev: mobile work
* fix: adding asset from web not sync with mobile
* remove print statement
---------
Co-authored-by: Alex Tran <Alex.Tran@conductix.com>
* fix: hide faces
* remove unused variable
* fix: work even if one fails
* better style for hidden people
* add hide face in the menu dropdown
* add buttons to toggle visibility for all faces
* add server test
* close modal with escape key
* fix: explore page
* improve show & hide faces modal
* keep name on people card
* simplify layout
* sticky app bar in show-hide page
* fix format
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* feat(server): Google Pixel motion photos
Add support for motion photos taken on Pixel phones. They have the exif
property 'MotionPhoto' set to 1, and an embedded mp4 file appended to
the JPEG file.
The implementation works like this:
- on metadata extraction, if a live photo is detected, examine the
metadata to determine where in the file the embedded MP4 is.
- extract this MP4 and write it next to the JPEG.
- link it using the existing mechanism for live photos.
There is a "MotionPhotoPresentationTimestampUs" exif property, which we
don't do anything with - I imagine that it refers to the timepoint in
the video that the photo was taken at, but it probably warrants more
investigation.
* fix format
* fix test
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* add profile-image-cropper component
* add dom-to-image library
* add store to update user profile picture when set
* dom-to-image
* remove console.logs, add svelte binding
* fix format, unused vars
* change caching of profile image
* set hash after profile image change
* remove unnecessary store
* remove unecesarry changes
* set types/dom-to-image as devDependency
* remove unecessary type declarations
use handleError
* remove error notification
which is already handled by handleError
* Revert "set types/dom-to-image as devDependency"
This reverts commit ca8b3ed1bb.
* add types do dev dependencies
* use on:close instead of on:close={()=>...}
* add newline
* sort imports
* bind photo-viewer imgElement directly, not working
* remove console.log, fix binding
* make imgElement optional
* fix element as optional prop
* fix type
* check for transparency
* small changes
* fix img.decode
* add bg, remove publicsharedkey
* fix omit publicSharedKey
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Fix: enable transcoding of audioless videos
* Fix: enable transcoding of audioless videos & typing
* Fix: enable transcoding of audioless videos & formatting
* fix: do not always transcode if there is no audio stream
* refactored `getFfmpegOptions`
refactor transcoding, make separate service
* fixed enum casing
* use `Logger` instead of `console.log`
* review suggestions
* use enum for `getHandler`
* fixed formatting
* Update server/src/domain/media/media.util.ts
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* Update server/src/domain/media/media.util.ts
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* More specific imports, renamed codec classes
* simplified code
* removed unused import
* added tests
* added base implementation for bitrate and threads
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* asset mimetype instead of application/octet-stream
* use thumbnail mimetype instead
* narrowed openapi spec
* thumbnail format validation
* JPEG fallback, `getThumbnailPath` returns format
* return content type in `getThumbnailPath`
* moved `format` validation to dto
* removed unused import
* moved fallback warning
* add migration
* verify running migration populate new value
* implemented service
* generate api
* FE works
* FR Works
* fix test
* fix test fixture
* fix test
* fix test
* consolidate api
* fix test
* added test
* pr feedback
* refactor
* click ont humbnail to show feature selection as well
* WIP: Added immich cli tool to `immich-server` image
* WIP: Added doc entry to show it is preinstalled
* WIP: Moved immich upload cli to `immich` and default to `immich-admin`
* WIP: undid previous commit
* WIP: Updated server docs with new `immich-admin` command
The omission of additional cache-control directives implied the resource could
be stored in shared/public caches, which is not desirable.
In addition, the no-transform directive will ensure content is not
unintentionally mangled.
Fixes: #3014
* just check file extension for XMP instead of mimetype
* use path to get extension instead of regex
* single quotes
* remove unused import
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Added read-only flag for assets, endpoint to trigger file import vs upload
* updated fixtures with new property
* if upload is 'read-only', ensure there is no existing asset at the designated originalPath
* added test for file import as well as detecting existing image at read-only destination location
* Added storage service test for a case where it should not move read-only assets
* upload doesn't need the read-only flag available, just importing
* default isReadOnly on import endpoint to true
* formatting fixes
* create-asset dto needs isReadOnly, so set it to false by default on create, updated api generation
* updated code to reflect changes in MR
* fixed read stream promise return type
* new index for originalPath, check for existing path on import, reglardless of user, to prevent duplicates
* refactor: import asset
* chore: open api
* chore: tests
* Added externalPath support for individual users, updated UI to allow this to be set by admin
* added missing var for externalPath in ui
* chore: open api
* fix: compilation issues
* fix: server test
* built api, fixed user-response dto to include externalPath
* reverted accidental commit
* bad commit of duplicate externalPath in user response dto
* fixed tests to include externalPath on expected result
* fix: unit tests
* centralized supported filetypes, perform file type checking of asset and sidecar during file import process
* centralized supported filetype check method to keep regex DRY
* fixed typo
* combined migrations into one
* update api
* Removed externalPath from shared-link code, added column to admin user page whether external paths / import is enabled or not
* update mimetype
* Fixed detect correct mimetype
* revert asset-upload config
* reverted domain.constant
* refactor
* fix mime-type issue
* fix format
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
The NGINX gzip module does not compress responses with a status of 201, which is
a major issue specifically for the /api/asset/time-bucket endpoint where
responses can be upwards of 5Mi. The size of the response is dramatically
reduced with gzip to 500Ki in some cases.
https://trac.nginx.org/nginx/ticket/471https://trac.nginx.org/nginx/ticket/394
The signature of these endpoints should be GET rather than POST anyway, but that
is a bigger discussion.
* Allow upload of AVIF and x-canon-cr2 mime types
* Allow generic RAW file mime type image/x-dcraw
* Another place to uploading avif and cr2
* Determine mime type for .avif and .cr2 files correctly
* Update asset-upload.config.spec.ts for CR2 and AVIF files
* More changes for AVIF & CR2 files
Found some other places where avif and cr2 should be mentioned.
* Merge in upstream changes
* Allow uploading and using most of the formats that libraw supports
* Add raw files to allowable mobile uploads
* Update asset-upload.config.spec.ts
Fix errant commas.
* Update asset-utils.ts
Remove duplicate entry in hash table.
* Fix missing k25 mime type in server upload check.
Fix prettier formatting message in web file-uploader.
* fix test
---------
Co-authored-by: Elliot Lee <sopwith@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* using pydantic BaseSetting
* ML API takes image file as input
* keeping image in memory
* reducing duplicate code
* using bytes instead of UploadFile & other small code improvements
* removed form-multipart, using HTTP body
* format code
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* add thumbhash: server generation and web impl
* move logic to infra & use byta in db
* remove unnecesary logs
* update generated API and simplify thumbhash gen
* fix check errors
* removed unnecessary library and css tag
* style edits
* syntax mistake
* update server test, change thumbhash job name
* fix tests
* Update server/src/domain/asset/response-dto/asset-response.dto.ts
Co-authored-by: Thomas <9749173+uhthomas@users.noreply.github.com>
* add unit test, change migration date
* change to official thumbhash impl
* update call method to not use eval
* "generate missing" looks for thumbhash
* improve queue & improve syntax
* update syntax again
* update tests
* fix thumbhash generation
* consolidate queueing to avoid duplication
* cover all types of incorrect thumbnail cases
* split out jest tasks
* put back thumbnail duration loading for images without thumbhash
* Remove stray package.json
---------
Co-authored-by: Luke McCarthy <mail@lukehmcc.com>
Co-authored-by: Thomas <9749173+uhthomas@users.noreply.github.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
Given #2668 introduced support for imagemagick and libraw, this should no
longer be necessary which allow for reduced code footprint and complexity.
Fixes: #2744
* use imagemagick and libraw for raw image support
imagemagick and libraw have generally good support for raw images, including
Sony's ARW format. These tools should also allow Immich to support many more
image formats in future without any major code changes.
https://www.libraw.org/supported-cameras
I've tested and verified this change with .ARW files and other standard formats.
Fixes: #2156
* Add additional type for awr
* pr feedback
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Add on this day
* add query for x year
* dev: add query
* dev: front end
* dev: styling
* styling
* more styling
* add new page
* navigating
* navigate back and forth
* styling
* show gallery
* fix test
* fix test
* show previous and next title
* fix test
* show up down scrolling button
* more styling
* styling
* fix app bar
* fix height of next/previous
* autoplay
* auto play
* refactor
* refactor
* refactor
* show date
* Navigate
* finish
* pr feedback
It's perfectly valid to have an email address without a TLD, for instance:
- test@localhost
- test@svc-in-same-k8s-namespace
- test@internal-corp
Fixes#2667
This is required to support raw images as Alpine 3.18 included fixes to imagemagick.
Related: #2156
In addtion, the images have stricter tags and are pinned with a digest. The
manifest list digest can be found using:
```sh
❯ docker buildx imagetools inspect node:18.16.0-alpine3.18
```
* Implement justified layout for timeline
* Add withoutThumbs field to GetTimelineLayotDto
* Back to rough estimation of initial buckets height
* Remove getTimelineLayout endpoint
* Estimate rough viewport height better
* Fix shift/jump issues while scrolling up
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* updated dockerfile, added typing, packaging
apply env change
* added arm64 support
* added ml version pump, second try for arm64
* added linting config to pyproject.toml
* renamed ml input field
* fixed linter config
* fixed dev docker compose
* feat(server): dynamic job concurrency
* styling and add setting info to top of the job list
* regenerate api
* remove DETECT_OBJECT job
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* refactor: tags
* chore: open api
* chore: unused import
* feat: add/remove/get tag assets
* chore: open api
* chore: finish tag tests for add/remove assets