* slideshow
slideshow for main screen
Added control buttons
update
close detail panel window sif opened
format
5 seconds
remove unused files
handle video player
format
* fix: restrict slideshow to timeline views
---------
Co-authored-by: Jason Rasmussen <jrasm91@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>
* feat(web): add link to external map in leaflet popup
Sometimes it's useful to open a geo location to an external map
application to not have to copy the coordinates manually.
Here I put a link to OpenStreetMap because it's what I personally use.
But I known some people would want to use something different. We could
instead link to geohacks (eg. https://geohack.toolforge.org/geohack.php?params=048.861085_N_0002.313158_E_globe:Earth)
or make it a configurable param.
* chore: cleanup
---------
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>
* Album view option for cover or list view
* Dropdown can now receive list of icons to display with selected option
* Formatting
* Use table element with formatting similar to other pages
* Make table rows clickable with hover styling
* Also make row navigateable using keyboard without mouse
* Formatting
* Define DropdownOption interface
* Album view mode type definition for typescript support in if statements
* format
* fix typing
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* 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>
* feat(web): ✨ Rounded corners on selected assets
Add rounded corner on selected items and fix circle icon transparent background on selection
* refactor: Ran prettier to fix formatting issues
* 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>
* set photoviewer 100% width, fixes transparent ede
* remove unnecessary class
* format fix
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.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>
* fix(web): cannot use semicolon on the search bar
* fix(web): cannot use semicolon on the search bar
* remove console log
* fix: disable hotkey when search is enable
* format
* fix event listener removal
The dependency on rxjs has been removed in favour of iterators as it's clearer
and the nature of the workload is inherently non-reactive. The uncaught error
when the list of files is empty has also been implicitly fixed by this change.
Fixes: #3300
* 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>
* trying to update to svelte 4
* update dependencies
* remove global transition
* suppress wrning
* chore: install from github
* revert material icon change
* Supress a11y warning
* update
* remove coverage test on web
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* 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>
* fix(web): previous/next asset navigation
* Apply suggestions from code review
Co-authored-by: Thomas <9749173+uhthomas@users.noreply.github.com>
* Call setViewingAsset once
* Make code more readable
* Avoid recursive call
* Simplify return statement
* Set position of the bucket to Unknown
---------
Co-authored-by: Thomas <9749173+uhthomas@users.noreply.github.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* 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
* chore(web): replace window.confirm by ConfirmDialogues and cleanup existing ones
* fix(web): linter and svelte-check issues
* fix(web): rephrase some confirm dialogs
* fix(web): run prettier
* fix(web): merge with last version and run prettier again
* fix(web): run prettier
* add event to trigger uploadhandler
* add dragndrop store
to handle upload in album-viewer and individuel-shared-viewer
(only on shares)
* fix handleUploadAssets no parameter
* fix format
* fix(web): aspect ratio for photos with Rotate 270 CW orientation
* Remove checks assuming we can have only numeric values
* Remove the -90 value check for the orientation
* Add comment to numeric values of the orientation tag
Previously, we'd drop the m: from non-clip searches entirely. This
behavior incorrectly represents the page's status (results from
non-clip search but query implies a clip search). Also, any follow-up
searches change to clip searches, which feels like a jarring UX if you
have to add m: every time in a 'search-session'.
* 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>
* Add album to search result page
* Update web/src/routes/(user)/search/+page.svelte
Co-authored-by: Thomas <9749173+uhthomas@users.noreply.github.com>
* Update web/src/routes/(user)/search/+page.svelte
Co-authored-by: Thomas <9749173+uhthomas@users.noreply.github.com>
* change font weight
* hide context menu in this view
---------
Co-authored-by: Thomas <9749173+uhthomas@users.noreply.github.com>
* 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>
* 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>
The bars are 2 pixels tall, which can be tricky to click. Additional padding
increases the height to 16 pixels, without changing how it looks, and makes for
much easier clicking.
In addition, remove the onDestroy lifecycle for the tween as it's not
necessary. It was a relic from using animation frames.
* chore(deps): update web
* fixed svelte-check being a nuisance
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
It look like Svelte has a concept of 'tweening' for writing animations, which should reduce the complexity of the animation code.
Thanks to @probablykasper for finding this.
A lot of the logic has been rewritten for reactivity, which further reduces
complexity.
The current implementation mixes intervals and animation frames, which is a
little convoluted. The use of intervals means that the animation is not going
to be smooth and may have strange behaviour when the window is moved to the
background. It's possible that the current animation frames could pile up and
run all at once which would be undesirable.
Moving everything into animation frames means the code is simpler and easier to
reason about. It should also be more performant and less buggy.
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* 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
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
```
Insta360 "raw" formats `insv` and `insp` are actually
mp4 (video) and jpeg (picture) respectively.
However, we don't want user to rename the original files,
because they follow Insta360 convention, which is required
by Insta360 Studio.
* Add select all to photos
* Add selection of favorites
* Add select all button to albums
* Add select all to archive
* Add select all to search
* try to fix identation
* Revert "try to fix identation"
This reverts commit 40c727b74a.
* try to fix identation
* try to fix identation
* try to fix identation
* try to fix identation
* fix bucketposition
* Run prettier
---------
Co-authored-by: Yonggan <yonggan@obco.pro>
* Truncate date group title
* Precalculate justified layout width
* Add title to date group title to show when truncated
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* 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>
* 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
* feat: return asset checksum
* chore: generate open api
* chore: coverage
* feat(server): support base64 hashes in bulk upload check:
* chore: generate open api
* feat(mobile): partner sharing
* getAllAssets for other users
* i18n
* fix tests
* try to fix web tests
* shared with/by confusion
* error logging
* guard against outdated server version
* initial commit for XMP sidecar support
* Added support for 'missing' metadata files to include those without sidecar files, now detects sidecar files in the filesystem for media already ingested but the sidecar was created afterwards
* didn't mean to commit default log level during testing
* new sidecar logic for video metadata as well
* Added xml mimetype for sidecars only
* don't need capture group for this regex
* wrong default value reverted
* simplified the move here - keep it in the same try catch since the outcome is to move the media back anyway
* simplified setter logic
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* simplified logic per suggestions
* sidecar is now its own queue with a discover and sync, updated UI for the new job queueing
* queue a sidecar job for every asset based on discovery or sync, though the logic is almost identical aside from linking the sidecar
* now queue sidecar jobs for each assset, though logic is mostly the same between discovery and sync
* simplified logic of filename extraction and asset instantiation
* not sure how that got deleted..
* updated code per suggestions and comments in the PR
* stat was not being used, removed the variable set
* better type checking, using in-scope variables for exif getter instead of passing in every time
* removed commented out test
* ran and resolved all lints, formats, checks, and tests
* resolved suggested change in PR
* made getExifProperty more dynamic with multiple possible args for fallbacks, fixed typo, used generic in function for better type checking
* better error handling and moving files back to positions on move or save failure
* regenerated api
* format fixes
* Added XMP documentation
* documentation typo
* Merged in main
* missed merge conflict
* more changes due to a merge
* Resolving conflicts
* added icon for sidecar jobs
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Modify controller DTOs
* Can check duplicates on server side
* Remove deviceassetid and deviceid
* Remove device ids from file uploader
* Add db migration for removed device ids
* Don't sanitize checksum
* Convert asset checksum to string
* Make checksum not optional for asset
* Use enums when rejecting duplicates
* Cleanup
* Return of the device id, but optional
* Don't use deviceId for upload folder
* Use checksum in thumb path
* Only use asset id in thumb path
* Openapi generation
* Put deviceAssetId back in asset response dto
* Add missing checksum in test fixture
* Add another missing checksum in test fixture
* Cleanup asset repository
* Add back previous /exists endpoint
* Require checksum to not be null
* Correctly set deviceId in db
* Remove index
* Fix compilation errors
* Make device id nullabel in asset response dto
* Reduce PR scope
* Revert asset service
* Reorder imports
* Reorder imports
* Reduce PR scope
* Reduce PR scope
* Reduce PR scope
* Reduce PR scope
* Reduce PR scope
* Update openapi
* Reduce PR scope
* refactor: asset bulk upload check
* chore: regenreate open-api
* chore: fix tests
* chore: tests
* update migrations and regenerate api
* Feat: use checksum in web file uploader
* Change to wasm-crypto
* Use crypto api for checksumming in web uploader
* Minor cleanup of file upload
* feat(web): pause and resume jobs
* Make device asset id not nullable again
* Cleanup
* Device id not nullable in response dto
* Update API specs
* Bump api specs
* Remove old TODO comment
* Remove NOT NULL constraint on checksum index
* Fix requested pubspec changes
* Remove unneeded import
* Update server/apps/immich/src/api-v1/asset/asset.service.ts
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
* Update server/apps/immich/src/api-v1/asset/asset-repository.ts
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
* Remove unneeded check
* Update server/apps/immich/src/api-v1/asset/asset-repository.ts
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
* Remove hashing in the web uploader
* Cleanup file uploader
* Remove varchar from asset entity fields
* Return 200 from bulk upload check
* Put device asset id back into asset repository
* Merge migrations
* Revert pubspec lock
* Update openapi specs
* Merge upstream changes
* Fix failing asset service tests
* Fix formatting issue
* Cleanup migrations
* Remove newline from pubspec
* Revert newline
* Checkout main version
* Revert again
* Only return AssetCheck
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
A default entrypoint and command make it just a bit easier to use the images as
there is no longer a need for an explicit entrypoint. The exception is the
server image, which still requires the shell script to be specified.
* chore: update to node 18 and alpine 3.17
Signed-off-by: martin <martin.labat92@gmail.com>
* chore: fix sharp version
Signed-off-by: martin <martin.labat92@gmail.com>
* chore(server): use vips-dev
Signed-off-by: martin <martin.labat92@gmail.com>
* update checkDiskUsage
Signed-off-by: martin <martin.labat92@gmail.com>
* fix: use vips-heif instead of libheif
Signed-off-by: martin <martin.labat92@gmail.com>
* fix: use vips instead of vips-cpp
Signed-off-by: martin <martin.labat92@gmail.com>
* fix: ensure vips installation
Signed-off-by: martin <martin.labat92@gmail.com>
---------
Signed-off-by: martin <martin.labat92@gmail.com>
* fix(web): unable to change person name
* name changed
* chore: strongly-typed dispatcher
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* fix(web): use correct favicon sizes
Signed-off-by: martin <martin.labat92@gmail.com>
* fix: format
Signed-off-by: martin <martin.labat92@gmail.com>
---------
Signed-off-by: martin <martin.labat92@gmail.com>