Compare commits

...

75 Commits

Author SHA1 Message Date
Zack Pollard
675c64a22f wip: fix the mess that is the mobile database 2024-07-30 00:12:43 +01:00
Zack Pollard
d3aacbe74b refactor: authentication provider always try network calls and only fail if 401 or no local user 2024-07-29 19:02:04 +01:00
Zack Pollard
41aefffe09 chore: bump flutter sdk path for vscode 2024-07-29 19:01:09 +01:00
Alex
090762f9dd fix(mobile): refactor splash screen to not require online connection 2024-07-29 10:52:53 -05:00
Jared L
3225e33fc1 feat(server): significantly improve Australian reverse geocoding accuracy (#11370)
chore(geocoding): ingest australia PPLXs
2024-07-29 10:59:53 -04:00
Weblate (bot)
85ab916ecf chore(web): update translations (#11416)
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ca/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/cs/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/de/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/es/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/it/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ko/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ru/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/vi/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_SIMPLIFIED/
Translation: Immich/immich

Co-authored-by: CraftWorks <weblate@craftworks.top>
Co-authored-by: Enoé Mugnaschi <enmuro@gmail.com>
Co-authored-by: Junghyuk Kwon <kwon@junghy.uk>
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
Co-authored-by: Shawn <xiaxinx@gmail.com>
Co-authored-by: chapvic <victor@chapaev.org>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: nachtpfoetchen <nachtpfoetchen@posteo.de>
Co-authored-by: tddaij <xdaint@gmail.com>
Co-authored-by: waclaw66 <waclaw66@seznam.cz>
Co-authored-by: 李奕寯 <eugenelego88@gmail.com>
2024-07-29 14:48:44 +00:00
Michel Heusschen
7445dad0dd fix(web): timeline group date formatting (#11392)
* fix(web): timeline group date formatting

* add isValid check

* remove duplicate type
2024-07-29 10:42:55 -04:00
Michel Heusschen
0237f9baa3 feat(web): more localized number formatting (#11401) 2024-07-29 10:38:27 -04:00
Michel Heusschen
2e059bfbfd fix(web): avoid nesting buttons inside links (#11425) 2024-07-29 10:36:10 -04:00
renovate[bot]
7bb7f63d57 chore(deps): update dependency node to v20.16.0 (#11421)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-29 10:33:01 -04:00
renovate[bot]
66a5a5718f chore(deps): update terraform cloudflare to v4.38.0 (#11423)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-29 10:32:27 -04:00
Alex
ddc4d2f927 fix(mobile): client TLS on ios (#11415) 2024-07-28 17:32:53 -05:00
Weblate (bot)
0beeb61f5c chore(web): update translations (#11365)
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ar/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/bg/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/cs/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/de/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/en_devel/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/es/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/fr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/he/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/hu/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ja/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ko/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ro/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ru/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sr_Cyrl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sr_Latn/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/tr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/uk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_SIMPLIFIED/
Translation: Immich/immich

Co-authored-by: AlrightIDidIt <fimofuni.igamunu@gotgel.org>
Co-authored-by: AxGD <guillermeaxel@yahoo.fr>
Co-authored-by: Bartłomiej Ruk <bartek04041993@gmail.com>
Co-authored-by: Bezruchenko Simon <worcposj44@gmail.com>
Co-authored-by: ChoosenMEME <timjankowski259@gmail.com>
Co-authored-by: ConfusedAlex <alex@confusedalex.dev>
Co-authored-by: Coooolfan <coolfan1024@outlook.com>
Co-authored-by: Coxcopi70f00b67b61542fe <hn_vogel@gmx.net>
Co-authored-by: Denis Pacquier <denis.pacquier@gmail.com>
Co-authored-by: Eric Cornish <ao475129@gmail.com>
Co-authored-by: Fredrik Ekdahl <fekdahl@gmail.com>
Co-authored-by: Gilgwath <gilgwath@protonmail.com>
Co-authored-by: Jakub <jakubula.jm@gmail.com>
Co-authored-by: Jordy H <jordy@hoebergen.net>
Co-authored-by: Junghyuk Kwon <kwon@junghy.uk>
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
Co-authored-by: Miki Mrvos <medolino2009@gmail.com>
Co-authored-by: NikiTricky <niki.sto2010@gmail.com>
Co-authored-by: Sabin Oana <sabin.oana@gmail.com>
Co-authored-by: Sam Smith <ja49619@gmail.com>
Co-authored-by: Shawn <xiaxinx@gmail.com>
Co-authored-by: Sylvain Pichon <service@spichon.fr>
Co-authored-by: Varga Bence Levente <varga.bence.levente@protonmail.com>
Co-authored-by: Victor Sueiro <kiwicaja@gmail.com>
Co-authored-by: Xo <xocodokie@users.noreply.hosted.weblate.org>
Co-authored-by: aarhor <aaron.horstmann9916@gmail.com>
Co-authored-by: chapvic <victor@chapaev.org>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: krzemyk <krzemyk.official@proton.me>
Co-authored-by: nazo6 <git@nazo6.dev>
Co-authored-by: waclaw66 <waclaw66@seznam.cz>
Co-authored-by: yusufbarisk <yusufbarisk2004@gmail.com>
Co-authored-by: 李奕寯 <eugenelego88@gmail.com>
2024-07-28 20:53:04 +00:00
waclaw66
a321db9f48 fix(web): translation leftovers (#11412)
fix: new album
2024-07-28 15:43:25 -05:00
Matthew Momjian
827136fc8b docs: file custom location (#11413)
* file custom location

* fix microservices
2024-07-28 15:43:09 -05:00
Matthew Momjian
088eea88e0 docs: how to change PG PW (#11414)
* guide to change PG PW

* fix
2024-07-28 15:42:42 -05:00
Yuvraj P
15503784c8 feat(mobile): adds crop and rotate to mobile (#10989)
* Added Crop Feature

* Using LayoutBuilder Fix

* Using Immich Colors

* Using Immich Text Theme

* Chnaging dynamic datatype to nullable

* Fix for the retrivel of the image from the cropscreen

* Using Hooks State

* Small edits

* Finals edits

* Saving to the mobile

* Commented final code

* Commented final code

* Comments and AutoRoute

* Fix AutoRoute Final

* Naming tools and Action when made no edits

* Updating timeline after edit

* chore: lint

* format

* Light Mode Compatible

* fix duplicate page name

* Fix Routing

* Hiding the Button

* lint

* remove unused code

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2024-07-28 15:41:14 -05:00
Jonathan Jogenfors
bc8e236598 chore(server): make vite-tsconfig-paths a dev dependency instead (#11404) 2024-07-27 21:50:35 +02:00
Michel Heusschen
909bd43e65 fix(web): slideshow settings title (#11396) 2024-07-27 10:46:19 -05:00
Alex
3330885bcc chore(server): email template minor styling (#11387) 2024-07-26 21:58:48 -05:00
Jan
e1ac73718c feat(web): Duplicate-Page shortcut changes (#11183)
* duplicate page assign other shortcut keys, add 'open image' shortcut

* add shortcut info page to duplicates with own list of keys

* edit translations, add translationkeys

* format fix

* remove typo

---------

Co-authored-by: Zack Pollard <zackpollard@ymail.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2024-07-26 21:47:51 +00:00
Ben
a78eeb9b9c feat(web): search bar keyboard accessibility (#11323)
* feat(web): search bar keyboard accessibility

* fix: adjust aria attributes

* fix: safari announcing the correct option count

* minor adjustments

- CircleIconButton disabled cursor
- more generic selection handler

* fix: more subtle border color in dark mode

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2024-07-26 16:45:15 -05:00
martin
86b3e3ee13 fix(web): responsive design when selecting assets in an album (#11169)
fix: responsive design when selecting assets in an album
2024-07-26 16:33:20 -05:00
waclaw66
4b2bc8e4ce fix(mobile): search filter translation + fixes (#11141)
translation + fixes
2024-07-26 16:32:19 -05:00
renovate[bot]
f92aee204e chore(deps): update dependency @types/picomatch to v3 (#11096)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-26 16:29:25 -05:00
renovate[bot]
7fd2b7965c chore(deps): update docker.io/redis:6.2-alpine docker digest to e3b17ba (#11302)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-26 16:28:34 -05:00
renovate[bot]
32ba6e3e3f chore(deps): update dependency byte-size to v9 (#11356)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-26 16:27:09 -05:00
Jonathan Jogenfors
0a6e5e0ec1 fix(server): make vitest pick up edited files (#11385)
fix vitest on file edit
2024-07-26 16:26:38 -05:00
Jonathan Jogenfors
65a4f86154 chore: bump vitest to 1.6.0 (#11386)
bump vitest to 1.6.0
2024-07-26 16:26:17 -05:00
ayykamp
147c6e3600 chore(web): improve responsiveness in Album and Shared Album pages on small devices (#11055)
* style: better responsiveness on album and shared album pages

* revert right margin changes

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2024-07-26 21:06:08 +00:00
Nicolò
ee6f1a010c chore(server): clean mail-templates and add tailwind style (#11296)
With this commit I wanted to complete the react-mail
 structure by properly define the templates styles by
 including tailwind css framework.

The framework is extended by both react-mail and
 tailwindcss-preset-email. Those packages help the rendering
 for various email clients.

If in future there is the necessity to target specific mail
 clients the package `tailwindcss-email-variants` and
 `tailwindcss-mso` can help too. The latter has some
 workarounds for the Ms Outlook that is still lacking
 a lot of the CSS3 funcitonality.
 to target

Signed-off-by: hitech95 <nicveronese@gmail.com>
2024-07-26 15:41:11 -05:00
renovate[bot]
a444ea7361 chore(deps): update dependency flutter to v3.22.3 (#11301)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-26 15:39:33 -05:00
Alex
59b809012f chore(mobile): post release task (#11382) 2024-07-26 15:38:41 -05:00
Ben
c037a8b8fa fix(web): easier alt text translation for other languages (#11124)
* fix(web): alt text translation for non-English languages

* fix: refactor to use full translation key names

* fix: calling the translation function directly
2024-07-26 13:48:40 -05:00
Michel Heusschen
ce15cf6065 fix(web): buy immich translations (#11379) 2024-07-26 13:41:59 -05:00
Alex The Bot
04340b3a62 Version v1.110.0 2024-07-26 15:38:20 +00:00
Alex
ef7a6bb246 chore(web): change license wording and other things (#11309) 2024-07-26 10:34:35 -05:00
Alex
bc20710c6d chore(mobile): Translations update (#11373)
chore(mobile): translation update
2024-07-26 10:31:10 -05:00
Zack Pollard
a63490a23b feat: use immich hosted map tiles (#11332) 2024-07-26 15:41:09 +01:00
Nicolò
a3799b3053 feat(server): add IP trust list for reverse proxy (#11286)
* feat(server): add IP trust list for reverse proxy

Signed-off-by: hitech95 <nicveronese@gmail.com>

* feat(docs): add documentation of `IMMICH_TRUSTED_PROXIES` env

Signed-off-by: hitech95 <nicveronese@gmail.com>

---------

Signed-off-by: hitech95 <nicveronese@gmail.com>
2024-07-26 09:23:58 -05:00
Yun Jiang
ea5d6780f2 feat(mobile): Adding setting in mobile app to TLS client certificate (#10860)
* feat(mobile): Adding setting in mobile app to import TLS client certificate and private key

* Formating dart source code to pass dart format test

* Adding missed required trailing commas to pass dart static analysis

* update lock file

* variable names

---------

Co-authored-by: Yun Jiang <yjiang@roku.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2024-07-26 13:59:02 +00:00
Saschl
62ac9bb7cd fix(mobile): native share functionality on iPad (#11294)
* pass context to share method

* use correct context

* fix: multiselection and logs sharing

* fix: lint
2024-07-26 08:43:59 -05:00
Michel Heusschen
86a658b891 fix(mobile): negative coordinate input (#11292)
* fix(mobile): negative coordinate input

* format
2024-07-26 08:37:29 -05:00
aviv926
536628ad95 docs: Add missing info to asset types and storage locations (#11358)
first
2024-07-26 08:34:36 -05:00
Jordy
2c7db0122d fix(mobile): changed "x jaren" to "x jaar" in dutch app translations (#11371)
changed "x jaren" to "x jaar"
2024-07-26 08:29:59 -05:00
Stephen Smith
ade2901259 feat(server): Allow activating non-admin user with server license (#11206)
* feat(server): allow server license to activate a user

* feat(web): send server+client licenses to user activation when non-admin

* chore(server): update test to allow server license to activate user

* fix(web): correctly load user to determine where to save license
2024-07-25 23:27:44 -05:00
imakida
d180373ec1 fix: "acess" should be "access" (#11363) 2024-07-26 03:36:01 +00:00
Weblate (bot)
c2a65d8fac chore(web): update translations (#11165)
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ar/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/bg/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ca/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/cs/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/da/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/de/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/en_devel/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/es/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/fa/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/fi/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/fr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/he/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/hi/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/hr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/hu/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/id/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/it/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ja/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ko/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/lt/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ro/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ru/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sr_Cyrl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sr_Latn/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/th/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/tr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/uk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/vi/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_SIMPLIFIED/
Translation: Immich/immich

Co-authored-by: Alex <alex@guldager.one>
Co-authored-by: Alexandr Zhytnyk <oper.kh@gmail.com>
Co-authored-by: AlrightIDidIt <fimofuni.igamunu@gotgel.org>
Co-authored-by: António Santos <antoniomsantos99@gmail.com>
Co-authored-by: Arkady Titenko <pgp-noreply@rkd.dev>
Co-authored-by: Aurora <arci@anche.no>
Co-authored-by: Bezruchenko Simon <worcposj44@gmail.com>
Co-authored-by: CanbiZ <mickey.leskowitz@gmail.com>
Co-authored-by: Coooolfan <coolfan1024@outlook.com>
Co-authored-by: Denis Pacquier <denis.pacquier@gmail.com>
Co-authored-by: Digital <github@crni.xyz>
Co-authored-by: Eero Jääskeläinen <eero.jaaskelainen@gmail.com>
Co-authored-by: Emerson Guimaraes <emersonrosa13@proton.me>
Co-authored-by: Filip Bredborg <fbredborg@gmail.com>
Co-authored-by: Fredrik Ekdahl <fekdahl@gmail.com>
Co-authored-by: Jaksa <jaks@hotmail.de>
Co-authored-by: Joar von Arndt <joarxpablo@gmail.com>
Co-authored-by: Julien SORIN <julien.sorin@hotmail.fr>
Co-authored-by: Junghyuk Kwon <kwon@junghy.uk>
Co-authored-by: Lauritz Tieste <lauritz6000000@gmail.com>
Co-authored-by: Linerly <linerly@proton.me>
Co-authored-by: Lukas Miskovsky <miskovskylukas@gmail.com>
Co-authored-by: MATTENN <at.mattenn@gmail.com>
Co-authored-by: Majid <abtin.php@gmail.com>
Co-authored-by: Manar Aldroubi <droubi@gmail.com>
Co-authored-by: Mansour Javaher <info@mansour.co.nz>
Co-authored-by: Marko <anony253@live.com>
Co-authored-by: Martin Dechev <dechev86@gmail.com>
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
Co-authored-by: Mike <mike.tgv@gmail.com>
Co-authored-by: Miki Mrvos <medolino2009@gmail.com>
Co-authored-by: Mingyu Kim <mingyu@mingyu.co.kr>
Co-authored-by: Oton <oms.moreira@outlook.com>
Co-authored-by: PPNplus <ppnplus@protonmail.com>
Co-authored-by: Pheggas <petko252@gmail.com>
Co-authored-by: PolarisYHNL <polarisyhnl@yeah.net>
Co-authored-by: Ponas <le.slab124@aleeas.com>
Co-authored-by: Quang Dang <dangminhquang.r@gmail.com>
Co-authored-by: RaduTek <radutux13@gmail.com>
Co-authored-by: Riku Viitanen <riku.viitanen@protonmail.com>
Co-authored-by: Rolando Grave <roland@graved.ch>
Co-authored-by: Rookie Nguyễn <nguyenquocthang2004@gmail.com>
Co-authored-by: Sam Smith <ja49619@gmail.com>
Co-authored-by: Shawn <xiaxinx@gmail.com>
Co-authored-by: Sophie <mail@sopht.li>
Co-authored-by: Thế Anh Hoàng <the.anh.ls@gmail.com>
Co-authored-by: Timothy <timothy@benker.cc>
Co-authored-by: Varga Bence Levente <varga.bence.levente@protonmail.com>
Co-authored-by: Vikram Pratap Singh <vicky18189@gmail.com>
Co-authored-by: Vincenzo Nunziata <vinciosdev@gmail.com>
Co-authored-by: Xo <xocodokie@users.noreply.hosted.weblate.org>
Co-authored-by: Yusuf Kenan Demiray <yusken2009@gmail.com>
Co-authored-by: aarhor <aaron.horstmann9916@gmail.com>
Co-authored-by: blomusti <m.f.varkara@gmail.com>
Co-authored-by: chapvic <victor@chapaev.org>
Co-authored-by: dvbthien <dvbthien@dvbthien.onmicrosoft.com>
Co-authored-by: eav5jhl0 <eav5jhl0@users.noreply.hosted.weblate.org>
Co-authored-by: fenix_vd <mrfenixvd@yandex.ru>
Co-authored-by: fuzfyy <egeozce35@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: grgergo <gergo_g@proton.me>
Co-authored-by: mitakskia <spammitakskia@gmail.com>
Co-authored-by: waclaw66 <waclaw66@seznam.cz>
Co-authored-by: Àlex Bravo <alexbravobosch@gmail.com>
Co-authored-by: Вячеслав Лукьяненко <madeinchuguev@gmail.com>
Co-authored-by: 李奕寯 <eugenelego88@gmail.com>
2024-07-25 19:28:48 -04:00
Michel Heusschen
8e6bc13540 feat: people infinite scroll (#11326)
* feat: people infinite scroll

* add infinite scroll to show & hide modal

* update unit tests

* show total people count instead of currently loaded

* update personsearchdto
2024-07-25 15:59:28 -04:00
renovate[bot]
152421e288 chore(deps): update redis:6.2-alpine docker digest to e3b17ba (#11303)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-25 15:20:11 -04:00
aviv926
72a8bbb874 docs: add product key to roadmap (#11351)
* add license to roadmap

* fix

* Supporter Badge

* fix
2024-07-25 19:16:56 +00:00
Zack Pollard
b8d2d38bd1 chore(docs): compress homepage screenshots, 10x smaller (#11347) 2024-07-25 14:50:00 +01:00
Jason Rasmussen
9f6ef92f0b fix(deps): exiftool-vendored (#11338) 2024-07-24 17:38:22 -04:00
renovate[bot]
9e60c107ca chore(deps): update node (#11322)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-24 16:13:24 -04:00
renovate[bot]
2179f83d63 chore(deps): update machine-learning (#11310)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-23 12:53:47 -04:00
renovate[bot]
b259095899 chore(deps): update node (#11300)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-23 08:22:15 -04:00
renovate[bot]
145ace0fa1 chore(deps): update base-image to v20240723 (major) (#11311)
chore(deps): update base-image to v20240723

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-23 08:21:35 -04:00
Michel Heusschen
7d3db11a5c feat(web): coordinate input for asset location (#11291) 2024-07-23 08:01:10 -04:00
Michel Heusschen
8725656fd2 fix(server): DateTimeOriginal overwrite issue with sidecar file (#11306)
* fix(server): DateTimeOriginal overwrite issue with sidecar file

* update unit test
2024-07-23 07:59:46 -04:00
renovate[bot]
6394b4a9a3 chore(deps): update machine-learning (#11299)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-22 22:05:16 -04:00
Nikhil Taneja
d0b3dd888b docs: corrected container port for immich_microservices (#11170) 2024-07-22 13:55:59 +00:00
Michel Heusschen
849bc6e3aa fix(server): correct openapi response type for getServerLicense() (#11261)
* fix(server): correct openapi response type for getServerLicense()

* return 404 error when license doesn't exist

* update e2e test
2024-07-22 08:50:45 -05:00
dependabot[bot]
3d7a9d79da chore(deps): bump docker/build-push-action from 6.3.0 to 6.5.0 (#11282)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-22 14:45:25 +01:00
dependabot[bot]
f7cc9517ba chore(deps): bump docker/setup-qemu-action from 3.1.0 to 3.2.0 (#11283)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-22 14:45:14 +01:00
dependabot[bot]
73305feb5b chore(deps): bump docker/setup-buildx-action from 3.4.0 to 3.5.0 (#11284)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-22 14:45:00 +01:00
Michel Heusschen
950cd5d996 fix(web): use fixed position for download and upload panel (#11279) 2024-07-22 08:40:43 -04:00
renovate[bot]
b53bd8c525 fix(deps): update machine-learning (#10740)
* fix(deps): update machine-learning

* update openvino options, cuda

* update openvino build

* fix indentation

* update minimum nvidia driver

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
2024-07-21 19:30:24 -04:00
Michel Heusschen
8b773a2b2e fix(server): exif description whitespace handling (#11249)
* fix(server): exif description whitespace handling

* remove trim optional chaining
2024-07-21 19:01:14 -04:00
Daniel Dietzler
1e8806854d docs: 40k stars! (#11265)
40k stars!
2024-07-21 16:19:17 -05:00
Mert
9d2d556200 feat(server): accepted video containers (#11274)
* add accepted container config

* update api

* mp4 option makes no sense

* add to transcoding settings

* wording

* updated spec config

* formatting
2024-07-21 21:14:23 +00:00
Daniel Dietzler
7ecdcb3bc0 fix(server): static mail attachment extension (#11254)
* fix: static file extension

* chore: unit tests
2024-07-20 19:00:46 -04:00
Fynn Petersen-Frey
54488b1016 feat(ml): improved ARM-NN support (#11233) 2024-07-20 15:59:27 -04:00
Alex
7c3326b662 chore(mobile): post release task (#11220) 2024-07-19 15:10:29 +00:00
Fynn Petersen-Frey
745b16e4b4 feat(mobile): remove asset from album in gallery view (#11184)
Co-authored-by: Alex <alex.tran1502@gmail.com>
2024-07-19 10:07:36 -05:00
Alex
a469fe44a1 chore(docs): change some wording (#11201) 2024-07-18 16:52:45 -04:00
271 changed files with 15913 additions and 8366 deletions

View File

@@ -56,10 +56,10 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@v3.1.0 uses: docker/setup-qemu-action@v3.2.0
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3.4.0 uses: docker/setup-buildx-action@v3.5.0
- name: Login to GitHub Container Registry - name: Login to GitHub Container Registry
uses: docker/login-action@v3 uses: docker/login-action@v3
@@ -88,7 +88,7 @@ jobs:
type=raw,value=latest,enable=${{ github.event_name == 'release' }} type=raw,value=latest,enable=${{ github.event_name == 'release' }}
- name: Build and push image - name: Build and push image
uses: docker/build-push-action@v6.3.0 uses: docker/build-push-action@v6.5.0
with: with:
file: cli/Dockerfile file: cli/Dockerfile
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64

View File

@@ -63,10 +63,10 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@v3.1.0 uses: docker/setup-qemu-action@v3.2.0
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3.4.0 uses: docker/setup-buildx-action@v3.5.0
- name: Login to Docker Hub - name: Login to Docker Hub
# Only push to Docker Hub when making a release # Only push to Docker Hub when making a release
@@ -115,7 +115,7 @@ jobs:
fi fi
- name: Build and push image - name: Build and push image
uses: docker/build-push-action@v6.3.0 uses: docker/build-push-action@v6.5.0
with: with:
context: ${{ matrix.context }} context: ${{ matrix.context }}
file: ${{ matrix.file }} file: ${{ matrix.file }}

View File

@@ -1 +1 @@
20.15.1 20.16.0

View File

@@ -1,4 +1,4 @@
FROM node:20.15.1-alpine3.20@sha256:34b7aa411056c85dbf71d240d26516949b3f72b318d796c26b57caaa1df5639a as core FROM node:20.16.0-alpine3.20@sha256:aada767bf3e4b4a1437642b81db7d8bb99a6dba27627088e4608772f1f02ebc0 as core
WORKDIR /usr/src/open-api/typescript-sdk WORKDIR /usr/src/open-api/typescript-sdk
COPY open-api/typescript-sdk/package*.json open-api/typescript-sdk/tsconfig*.json ./ COPY open-api/typescript-sdk/package*.json open-api/typescript-sdk/tsconfig*.json ./

25
cli/package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "@immich/cli", "name": "@immich/cli",
"version": "2.2.11", "version": "2.2.12",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@immich/cli", "name": "@immich/cli",
"version": "2.2.11", "version": "2.2.12",
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"dependencies": { "dependencies": {
"fast-glob": "^3.3.2", "fast-glob": "^3.3.2",
@@ -22,11 +22,11 @@
"@types/cli-progress": "^3.11.0", "@types/cli-progress": "^3.11.0",
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/mock-fs": "^4.13.1", "@types/mock-fs": "^4.13.1",
"@types/node": "^20.14.10", "@types/node": "^20.14.12",
"@typescript-eslint/eslint-plugin": "^7.0.0", "@typescript-eslint/eslint-plugin": "^7.0.0",
"@typescript-eslint/parser": "^7.0.0", "@typescript-eslint/parser": "^7.0.0",
"@vitest/coverage-v8": "^1.2.2", "@vitest/coverage-v8": "^1.2.2",
"byte-size": "^8.1.1", "byte-size": "^9.0.0",
"cli-progress": "^3.12.0", "cli-progress": "^3.12.0",
"commander": "^12.0.0", "commander": "^12.0.0",
"eslint": "^8.56.0", "eslint": "^8.56.0",
@@ -49,14 +49,14 @@
}, },
"../open-api/typescript-sdk": { "../open-api/typescript-sdk": {
"name": "@immich/sdk", "name": "@immich/sdk",
"version": "1.109.2", "version": "1.110.0",
"dev": true, "dev": true,
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"dependencies": { "dependencies": {
"@oazapfts/runtime": "^1.0.2" "@oazapfts/runtime": "^1.0.2"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20.14.10", "@types/node": "^20.14.12",
"typescript": "^5.3.3" "typescript": "^5.3.3"
} }
}, },
@@ -1164,9 +1164,9 @@
} }
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.14.10", "version": "20.14.12",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz",
"integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", "integrity": "sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -1669,10 +1669,11 @@
} }
}, },
"node_modules/byte-size": { "node_modules/byte-size": {
"version": "8.1.1", "version": "9.0.0",
"resolved": "https://registry.npmjs.org/byte-size/-/byte-size-8.1.1.tgz", "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-9.0.0.tgz",
"integrity": "sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==", "integrity": "sha512-xrJ8Hki7eQ6xew55mM6TG9zHI852OoAHcPfduWWtR6yxk2upTuIZy13VioRBDyHReHDdbeDPifUboeNkK/sXXA==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">=12.17" "node": ">=12.17"
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "@immich/cli", "name": "@immich/cli",
"version": "2.2.11", "version": "2.2.12",
"description": "Command Line Interface (CLI) for Immich", "description": "Command Line Interface (CLI) for Immich",
"type": "module", "type": "module",
"exports": "./dist/index.js", "exports": "./dist/index.js",
@@ -18,11 +18,11 @@
"@types/cli-progress": "^3.11.0", "@types/cli-progress": "^3.11.0",
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/mock-fs": "^4.13.1", "@types/mock-fs": "^4.13.1",
"@types/node": "^20.14.10", "@types/node": "^20.14.12",
"@typescript-eslint/eslint-plugin": "^7.0.0", "@typescript-eslint/eslint-plugin": "^7.0.0",
"@typescript-eslint/parser": "^7.0.0", "@typescript-eslint/parser": "^7.0.0",
"@vitest/coverage-v8": "^1.2.2", "@vitest/coverage-v8": "^1.2.2",
"byte-size": "^8.1.1", "byte-size": "^9.0.0",
"cli-progress": "^3.12.0", "cli-progress": "^3.12.0",
"commander": "^12.0.0", "commander": "^12.0.0",
"eslint": "^8.56.0", "eslint": "^8.56.0",
@@ -64,6 +64,6 @@
"lodash-es": "^4.17.21" "lodash-es": "^4.17.21"
}, },
"volta": { "volta": {
"node": "20.15.1" "node": "20.16.0"
} }
} }

View File

@@ -2,37 +2,37 @@
# Manual edits may be lost in future updates. # Manual edits may be lost in future updates.
provider "registry.opentofu.org/cloudflare/cloudflare" { provider "registry.opentofu.org/cloudflare/cloudflare" {
version = "4.37.0" version = "4.38.0"
constraints = "4.37.0" constraints = "4.38.0"
hashes = [ hashes = [
"h1:0gOI8arnh2CTcHfGH8iwAe6qz2BRSytmbOiNXZjnrHc=", "h1:+27KAHKHBDvv3dqyJv5vhtdKQZJzoZXoMqIyronlHNw=",
"h1:0h0qRJYPHL92Dx3NYZO2WJ21cxyZGEoldzw9aYhPnew=", "h1:/uV9RgOUhkxElkHhWs8fs5ZbX9vj6RCBfP0oJO0JF30=",
"h1:6ri7vZ1MLtQbooicIO4catyIuRq4LHAsIcgd3vGq3AE=", "h1:1DNAdMugJJOAWD/XYiZenYYZLy7fw2ctjT4YZmkRCVQ=",
"h1:7BwVaqxSD9VsmLzs6jDJBJvHPq0dz4I8rCeJAK63Dc4=", "h1:1wn4PmCLdT7mvd74JkCGmJDJxTQDkcxc+1jNbmwnMHA=",
"h1:8tVm+BJvzI14pRbEyt00AvH6oIyqiLRZQ9KxcBeSDhE=", "h1:BIHB4fBxHg2bA9KbL92njhyctxKC8b6hNDp60y5QBss=",
"h1:FTll1M9rPA7RxEyLB6etQqaqynWWl3WkiwJtHMjPr3Y=", "h1:HCQpvKPsMsR4HO5eDqt+Kao7T7CYeEH7KZIO7xMcC6M=",
"h1:L7ysGftn0fstXMjCt3/XEz2giRdEwBsGrdvi4Zw8uzM=", "h1:HTomuzocukpNLwtWzeSF3yteCVsyVKbwKmN66u9iPac=",
"h1:PsbAKy7LdSpwZMJZ7bO3lI04hLDTlXke/LCkrKXYwwE=", "h1:YDxsUBhBAwHSXLzVwrSlSBOwv1NvLyry7s5SfCV7VqQ=",
"h1:Sjkpr8CKs0rXGcdis5q4Kbqmo5mmosgirnQi65G4sM8=", "h1:dchVhxo+Acd1l2RuZ88tW9lWj4422QMfgtxKvKCjYrw=",
"h1:YxJRQdVSzMZR5Ce5M3Gs1SPutXpednxuRwtSSiReHDY=", "h1:eypa+P4ZpsEGMPFuCE+6VkRefu0TZRFmVBOpK+PDOPY=",
"h1:bJrJeBKWEwt4hGQ+3VJR69dsqHORovE8LzuQt9+NTug=", "h1:f3yjse2OsRZj7ZhR7BLintJMlI4fpyt8HyDP/zcEavw=",
"h1:hPC7Vk0ZGXCDJ1y5dOepVo1c0PoUulnJUarrMv4gQIQ=", "h1:mSJ7xj8K+xcnEmGg7lH0jjzyQb157wH94ULTAlIV+HQ=",
"h1:joMURZCLUJ2eSlj645xqHWKYbRBYqvajCkhaz7qzi8g=", "h1:tt+2J2Ze8VIdDq2Hr6uHlTJzAMBRpErBwTYx0uD5ilE=",
"h1:uqo0WgG5lCcG8+gf99VnsKKbJMM1urNZq1FbAT6u3S0=", "h1:uQW8SKxmulqrAisO+365mIf2FueINAp5PY28bqCPCug=",
"zh:012a6c3e8bf4aca0ebe0884e15bd42fd018659193f2159d5d2bf9948a9be1bc4", "zh:171ab67cccceead4514fafb2d39e4e708a90cce79000aaf3c29aab7ed4457071",
"zh:079666c0a079237af46ed19ffc4143655ee0e8920a274868e44fbc3db88f346d", "zh:18aa7228447baaaefc49a43e8eff970817a7491a63d8937e796357a3829dd979",
"zh:08e7ff86f6848f3109d59ad46f8c0987178eff2f70c8ef03f2d44ae68e42dfb3", "zh:2cbaab6092e81ba6f41fa60a50f14e980c8ec327ee11d0b21f16a478be4b7567",
"zh:1ce8a499fdf8f484f7d18ec91566bc0759b07d0ca710990cd60d32b222e416b1", "zh:53b8e49c06f5b31a8c681f8c0669cf43e78abe71657b8182a221d096bb514965",
"zh:348e72338095bffccf7c46c7e6b9d0e063a22d9ae761061b0b31dea1aad22cd9", "zh:6037cfc60b4b647aabae155fcb46d649ed7c650e0287f05db52b2068f1e27c8a",
"zh:47d39343dea1ef469a2c8e51c8d5993687af427a132da5379796fec27acb5710", "zh:62460982ce1a869eebfca675603fbbd50416cf6b69459fb855bfbe5ae2b97607",
"zh:4cdf8e9579f9af3c72270088fc6e22208f0f91fd4382bc4a860d16040c86917b", "zh:65f6f3a8470917b6398baa5eb4f74b3932b213eac7c0202798bfad6fd1ee17df",
"zh:4fbebb21ecebc7e5ac0ea9e341c5dbea3094fc0579e4dc5b40bfe693164e022e",
"zh:778578dda7dd98576a3fe228132c8b60f646f4cf113638c94f1c40e2b11c027c",
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f", "zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
"zh:894071f0f42571f820918d1a4316704923e29c5b2392704c1cbd063a04a641b8", "zh:8b5cebe64bf04105a49178a165b6a8800a9a33bae6767143a47fe4977755f805",
"zh:8d11dd73dd499c74d89f77a7e1b3d4a077ac88b0c9c3412e9a6a1b4efe17d107", "zh:a5596635db0993ee3c3060fbc2227d91b239466e96d2d82642625a5aa2486988",
"zh:991e088be8381a73872cd33bb659e9dd69d7ab1f1f8d89b3cd17ffe59dffc65f", "zh:b3a9c63038441f13c311fd4b2c7e69e571445e5a7365a20c7cc9046b7e6c8aba",
"zh:9c0848b9c7e6799c9ffcf3afa70ad94a027f3e15a94679d56790714de0b072c5", "zh:b585e7e4d7648a540b14b9182819214896ca9337729eeb1f2034833b17db754d",
"zh:ad71ae800065ffc24b94d994250136ae8a9f6da704cf91b0dc9e14989e947369", "zh:d2c3c545318ac8542369e9fc8228e29ee585febdf203a450fad3e0eded71ce02",
"zh:e95dd2d6c3525073af47d47b763cb81b6a51b20cabf76f789c69328922da9ecf",
"zh:eee6e590b36d6c6168a7daae8afa74a8721fd7aa9f62a710f04a311975100722",
] ]
} }

View File

@@ -5,7 +5,7 @@ terraform {
required_providers { required_providers {
cloudflare = { cloudflare = {
source = "cloudflare/cloudflare" source = "cloudflare/cloudflare"
version = "4.37.0" version = "4.38.0"
} }
} }
} }

View File

@@ -2,37 +2,37 @@
# Manual edits may be lost in future updates. # Manual edits may be lost in future updates.
provider "registry.opentofu.org/cloudflare/cloudflare" { provider "registry.opentofu.org/cloudflare/cloudflare" {
version = "4.37.0" version = "4.38.0"
constraints = "4.37.0" constraints = "4.38.0"
hashes = [ hashes = [
"h1:0gOI8arnh2CTcHfGH8iwAe6qz2BRSytmbOiNXZjnrHc=", "h1:+27KAHKHBDvv3dqyJv5vhtdKQZJzoZXoMqIyronlHNw=",
"h1:0h0qRJYPHL92Dx3NYZO2WJ21cxyZGEoldzw9aYhPnew=", "h1:/uV9RgOUhkxElkHhWs8fs5ZbX9vj6RCBfP0oJO0JF30=",
"h1:6ri7vZ1MLtQbooicIO4catyIuRq4LHAsIcgd3vGq3AE=", "h1:1DNAdMugJJOAWD/XYiZenYYZLy7fw2ctjT4YZmkRCVQ=",
"h1:7BwVaqxSD9VsmLzs6jDJBJvHPq0dz4I8rCeJAK63Dc4=", "h1:1wn4PmCLdT7mvd74JkCGmJDJxTQDkcxc+1jNbmwnMHA=",
"h1:8tVm+BJvzI14pRbEyt00AvH6oIyqiLRZQ9KxcBeSDhE=", "h1:BIHB4fBxHg2bA9KbL92njhyctxKC8b6hNDp60y5QBss=",
"h1:FTll1M9rPA7RxEyLB6etQqaqynWWl3WkiwJtHMjPr3Y=", "h1:HCQpvKPsMsR4HO5eDqt+Kao7T7CYeEH7KZIO7xMcC6M=",
"h1:L7ysGftn0fstXMjCt3/XEz2giRdEwBsGrdvi4Zw8uzM=", "h1:HTomuzocukpNLwtWzeSF3yteCVsyVKbwKmN66u9iPac=",
"h1:PsbAKy7LdSpwZMJZ7bO3lI04hLDTlXke/LCkrKXYwwE=", "h1:YDxsUBhBAwHSXLzVwrSlSBOwv1NvLyry7s5SfCV7VqQ=",
"h1:Sjkpr8CKs0rXGcdis5q4Kbqmo5mmosgirnQi65G4sM8=", "h1:dchVhxo+Acd1l2RuZ88tW9lWj4422QMfgtxKvKCjYrw=",
"h1:YxJRQdVSzMZR5Ce5M3Gs1SPutXpednxuRwtSSiReHDY=", "h1:eypa+P4ZpsEGMPFuCE+6VkRefu0TZRFmVBOpK+PDOPY=",
"h1:bJrJeBKWEwt4hGQ+3VJR69dsqHORovE8LzuQt9+NTug=", "h1:f3yjse2OsRZj7ZhR7BLintJMlI4fpyt8HyDP/zcEavw=",
"h1:hPC7Vk0ZGXCDJ1y5dOepVo1c0PoUulnJUarrMv4gQIQ=", "h1:mSJ7xj8K+xcnEmGg7lH0jjzyQb157wH94ULTAlIV+HQ=",
"h1:joMURZCLUJ2eSlj645xqHWKYbRBYqvajCkhaz7qzi8g=", "h1:tt+2J2Ze8VIdDq2Hr6uHlTJzAMBRpErBwTYx0uD5ilE=",
"h1:uqo0WgG5lCcG8+gf99VnsKKbJMM1urNZq1FbAT6u3S0=", "h1:uQW8SKxmulqrAisO+365mIf2FueINAp5PY28bqCPCug=",
"zh:012a6c3e8bf4aca0ebe0884e15bd42fd018659193f2159d5d2bf9948a9be1bc4", "zh:171ab67cccceead4514fafb2d39e4e708a90cce79000aaf3c29aab7ed4457071",
"zh:079666c0a079237af46ed19ffc4143655ee0e8920a274868e44fbc3db88f346d", "zh:18aa7228447baaaefc49a43e8eff970817a7491a63d8937e796357a3829dd979",
"zh:08e7ff86f6848f3109d59ad46f8c0987178eff2f70c8ef03f2d44ae68e42dfb3", "zh:2cbaab6092e81ba6f41fa60a50f14e980c8ec327ee11d0b21f16a478be4b7567",
"zh:1ce8a499fdf8f484f7d18ec91566bc0759b07d0ca710990cd60d32b222e416b1", "zh:53b8e49c06f5b31a8c681f8c0669cf43e78abe71657b8182a221d096bb514965",
"zh:348e72338095bffccf7c46c7e6b9d0e063a22d9ae761061b0b31dea1aad22cd9", "zh:6037cfc60b4b647aabae155fcb46d649ed7c650e0287f05db52b2068f1e27c8a",
"zh:47d39343dea1ef469a2c8e51c8d5993687af427a132da5379796fec27acb5710", "zh:62460982ce1a869eebfca675603fbbd50416cf6b69459fb855bfbe5ae2b97607",
"zh:4cdf8e9579f9af3c72270088fc6e22208f0f91fd4382bc4a860d16040c86917b", "zh:65f6f3a8470917b6398baa5eb4f74b3932b213eac7c0202798bfad6fd1ee17df",
"zh:4fbebb21ecebc7e5ac0ea9e341c5dbea3094fc0579e4dc5b40bfe693164e022e",
"zh:778578dda7dd98576a3fe228132c8b60f646f4cf113638c94f1c40e2b11c027c",
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f", "zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
"zh:894071f0f42571f820918d1a4316704923e29c5b2392704c1cbd063a04a641b8", "zh:8b5cebe64bf04105a49178a165b6a8800a9a33bae6767143a47fe4977755f805",
"zh:8d11dd73dd499c74d89f77a7e1b3d4a077ac88b0c9c3412e9a6a1b4efe17d107", "zh:a5596635db0993ee3c3060fbc2227d91b239466e96d2d82642625a5aa2486988",
"zh:991e088be8381a73872cd33bb659e9dd69d7ab1f1f8d89b3cd17ffe59dffc65f", "zh:b3a9c63038441f13c311fd4b2c7e69e571445e5a7365a20c7cc9046b7e6c8aba",
"zh:9c0848b9c7e6799c9ffcf3afa70ad94a027f3e15a94679d56790714de0b072c5", "zh:b585e7e4d7648a540b14b9182819214896ca9337729eeb1f2034833b17db754d",
"zh:ad71ae800065ffc24b94d994250136ae8a9f6da704cf91b0dc9e14989e947369", "zh:d2c3c545318ac8542369e9fc8228e29ee585febdf203a450fad3e0eded71ce02",
"zh:e95dd2d6c3525073af47d47b763cb81b6a51b20cabf76f789c69328922da9ecf",
"zh:eee6e590b36d6c6168a7daae8afa74a8721fd7aa9f62a710f04a311975100722",
] ]
} }

View File

@@ -5,7 +5,7 @@ terraform {
required_providers { required_providers {
cloudflare = { cloudflare = {
source = "cloudflare/cloudflare" source = "cloudflare/cloudflare"
version = "4.37.0" version = "4.38.0"
} }
} }
} }

View File

@@ -94,7 +94,7 @@ services:
redis: redis:
container_name: immich_redis container_name: immich_redis
image: redis:6.2-alpine@sha256:328fe6a5822256d065debb36617a8169dbfbd77b797c525288e465f56c1d392b image: redis:6.2-alpine@sha256:e3b17ba9479deec4b7d1eeec1548a253acc5374d68d3b27937fcfe4df8d18c7e
healthcheck: healthcheck:
test: redis-cli ping || exit 1 test: redis-cli ping || exit 1

View File

@@ -33,6 +33,8 @@ services:
dockerfile: Dockerfile dockerfile: Dockerfile
args: args:
- DEVICE=cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - DEVICE=cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference
ports:
- 3003:3003
volumes: volumes:
- model-cache:/cache - model-cache:/cache
env_file: env_file:
@@ -41,7 +43,7 @@ services:
redis: redis:
container_name: immich_redis container_name: immich_redis
image: redis:6.2-alpine@sha256:328fe6a5822256d065debb36617a8169dbfbd77b797c525288e465f56c1d392b image: redis:6.2-alpine@sha256:e3b17ba9479deec4b7d1eeec1548a253acc5374d68d3b27937fcfe4df8d18c7e
healthcheck: healthcheck:
test: redis-cli ping || exit 1 test: redis-cli ping || exit 1
restart: always restart: always

View File

@@ -43,7 +43,7 @@ services:
redis: redis:
container_name: immich_redis container_name: immich_redis
image: docker.io/redis:6.2-alpine@sha256:328fe6a5822256d065debb36617a8169dbfbd77b797c525288e465f56c1d392b image: docker.io/redis:6.2-alpine@sha256:e3b17ba9479deec4b7d1eeec1548a253acc5374d68d3b27937fcfe4df8d18c7e
healthcheck: healthcheck:
test: redis-cli ping || exit 1 test: redis-cli ping || exit 1
restart: always restart: always

View File

@@ -1 +1 @@
20.15.1 20.16.0

View File

@@ -80,7 +80,7 @@ If your instance has more than 4 users, it is more cost-effective to buy the **S
### 3. What do I do if I don't pay? ### 3. What do I do if I don't pay?
You can continue using Immich for an unlimited trial period. You can continue using Immich without any restriction.
### 4. Will there be any paywalled features? ### 4. Will there be any paywalled features?

View File

@@ -1,6 +1,7 @@
--- ---
title: Immich Update - July 2024 title: Immich Update - July 2024
authors: [alextran] authors: [alextran]
date: 2024-07-01T00:00
tags: [update, v1.106.0] tags: [update, v1.106.0]
--- ---

View File

@@ -149,9 +149,21 @@ for more info read the [release notes](https://github.com/immich-app/immich/rele
- Preview images (small thumbnails and large previews) for each asset and thumbnails for recognized faces. - Preview images (small thumbnails and large previews) for each asset and thumbnails for recognized faces.
- Stored in `UPLOAD_LOCATION/thumbs/<userID>`. - Stored in `UPLOAD_LOCATION/thumbs/<userID>`.
- **Encoded Assets:** - **Encoded Assets:**
- Videos that have been re-encoded from the original for wider compatibility. The original is not removed. - Videos that have been re-encoded from the original for wider compatibility. The original is not removed.
- Stored in `UPLOAD_LOCATION/encoded-video/<userID>`. - Stored in `UPLOAD_LOCATION/encoded-video/<userID>`.
- **Postgres**
- The Immich database containing all the information to allow the system to function properly.
**Note:** This folder will only appear to users who have made the changes mentioned in [v1.102.0](https://github.com/immich-app/immich/discussions/8930) (an optional, non-mandatory change) or who started with this version.
- Stored in `UPLOAD_LOCATION/postgres`.
:::danger
A backup of this folder does not constitute a backup of your database!
Follow the instructions listed [here](/docs/administration/backup-and-restore#database) to learn how to perform a proper backup.
:::
</TabItem> </TabItem>
<TabItem value="Storage Template On" label="Storage Template On"> <TabItem value="Storage Template On" label="Storage Template On">
@@ -187,8 +199,19 @@ When you turn off the storage template engine, it will leave the assets in `UPLO
- Files uploaded through mobile apps. - Files uploaded through mobile apps.
- Temporarily located in `UPLOAD_LOCATION/upload/<userID>`. - Temporarily located in `UPLOAD_LOCATION/upload/<userID>`.
- Transferred to `UPLOAD_LOCATION/library/<userID>` upon successful upload. - Transferred to `UPLOAD_LOCATION/library/<userID>` upon successful upload.
- **Postgres**
- The Immich database containing all the information to allow the system to function properly.
**Note:** This folder will only appear to users who have made the changes mentioned in [v1.102.0](https://github.com/immich-app/immich/discussions/8930) (an optional, non-mandatory change) or who started with this version.
- Stored in `UPLOAD_LOCATION/postgres`.
:::danger
A backup of this folder does not constitute a backup of your database!
Follow the instructions listed [here](/docs/administration/backup-and-restore#database) to learn how to perform a proper backup.
:::
</TabItem> </TabItem>
</Tabs> </Tabs>
:::danger :::danger

View File

@@ -24,7 +24,7 @@ This environment includes the services below. Additional details are available i
- Web app - [`/web`](https://github.com/immich-app/immich/tree/main/web) - Web app - [`/web`](https://github.com/immich-app/immich/tree/main/web)
- Machine learning - [`/machine-learning`](https://github.com/immich-app/immich/tree/main/machine-learning) - Machine learning - [`/machine-learning`](https://github.com/immich-app/immich/tree/main/machine-learning)
- Redis - Redis
- PostgreSQL development database with exposed port `5432` so you can use any database client to acess it - PostgreSQL development database with exposed port `5432` so you can use any database client to access it
All the services are packaged to run as with single Docker Compose command. All the services are packaged to run as with single Docker Compose command.

View File

@@ -36,7 +36,7 @@ Face detection sends the generated preview image to the machine learning service
## How Facial Recognition Works ## How Facial Recognition Works
The facial recognition algorithm we use is derived from DBSCAN, a popular clustering algorithm. It essentially treats each detected face as a point in a graph and aims to group points that are close to each other. The facial recognition algorithm we use is derived from [DBSCAN](https://www.youtube.com/watch?v=RDZUdRSDOok), a popular clustering algorithm. It essentially treats each detected face as a point in a graph and aims to group points that are close to each other.
:::note :::note
An important concept is whether something is a _core point_. A core point has a minimum number of points around it within a certain distance. A non-core point can only be assigned to a cluster if it can reach a core point; a non-core point can't be used to extend a cluster even if it's part of one. In Immich, the _Minimum Recognized Faces_ setting controls the threshold to be considered a core point. An important concept is whether something is a _core point_. A core point has a minimum number of points around it within a certain distance. A non-core point can only be assigned to a cluster if it can reach a core point; a non-core point can't be used to extend a cluster even if it's part of one. In Immich, the _Minimum Recognized Faces_ setting controls the threshold to be considered a core point.

View File

@@ -32,12 +32,13 @@ You do not need to redo any machine learning jobs after enabling hardware accele
- Where and how you can get this file depends on device and vendor, but typically, the device vendor also supplies these - Where and how you can get this file depends on device and vendor, but typically, the device vendor also supplies these
- The `hwaccel.ml.yml` file assumes the path to it is `/usr/lib/libmali.so`, so update accordingly if it is elsewhere - The `hwaccel.ml.yml` file assumes the path to it is `/usr/lib/libmali.so`, so update accordingly if it is elsewhere
- The `hwaccel.ml.yml` file assumes an additional file `/lib/firmware/mali_csffw.bin`, so update accordingly if your device's driver does not require this file - The `hwaccel.ml.yml` file assumes an additional file `/lib/firmware/mali_csffw.bin`, so update accordingly if your device's driver does not require this file
- Optional: Configure your `.env` file, see [environment variables](/docs/install/environment-variables) for ARM NN specific settings
#### CUDA #### CUDA
- The GPU must have compute capability 5.2 or greater. - The GPU must have compute capability 5.2 or greater.
- The server must have the official NVIDIA driver installed. - The server must have the official NVIDIA driver installed.
- The installed driver must be >= 535 (it must support CUDA 12.2). - The installed driver must be >= 545 (it must support CUDA 12.3.2).
- On Linux (except for WSL2), you also need to have [NVIDIA Container Toolkit][nvct] installed. - On Linux (except for WSL2), you also need to have [NVIDIA Container Toolkit][nvct] installed.
#### OpenVINO #### OpenVINO

View File

@@ -66,7 +66,7 @@ The provided file is just a starting point. There are a ton of ways to configure
After bringing down the containers with `docker compose down` and back up with `docker compose up -d`, a Prometheus instance will now collect metrics from the immich server and microservices containers. Note that we didn't need to expose any new ports for these containers - the communication is handled in the internal Docker network. After bringing down the containers with `docker compose down` and back up with `docker compose up -d`, a Prometheus instance will now collect metrics from the immich server and microservices containers. Note that we didn't need to expose any new ports for these containers - the communication is handled in the internal Docker network.
:::note :::note
To see exactly what metrics are made available, you can additionally add `8081:8081` to the server container's ports and `8082:8081` to the microservices container's ports. Visiting the `/metrics` endpoint for these services will show the same raw data that Prometheus collects. To see exactly what metrics are made available, you can additionally add `8081:8081` to the server container's ports and `8082:8082` to the microservices container's ports. Visiting the `/metrics` endpoint for these services will show the same raw data that Prometheus collects.
::: :::
### Usage ### Usage

View File

@@ -13,14 +13,14 @@ In our `.env` file, we will define variables that will help us in the future whe
# Custom location where your uploaded, thumbnails, and transcoded video files are stored # Custom location where your uploaded, thumbnails, and transcoded video files are stored
- UPLOAD_LOCATION=./library - UPLOAD_LOCATION=./library
+ UPLOAD_LOCATION=/custom/location/on/your/system/immich/immich_files + UPLOAD_LOCATION=/custom/path/immich/immich_files
+ THUMB_LOCATION=/custom/location/on/your/system/immich/thumbs + THUMB_LOCATION=/custom/path/immich/thumbs
+ ENCODED_VIDEO_LOCATION=/custom/location/on/your/system/immich/encoded-video + ENCODED_VIDEO_LOCATION=/custom/path/immich/encoded-video
+ PROFILE_LOCATION=/custom/location/on/your/system/immich/profile + PROFILE_LOCATION=/custom/path/immich/profile
... ...
``` ```
After defining the locations for these files, we will edit the `docker-compose.yml` file accordingly and add the new variables to the `immich-server` and `immich-microservices` containers. After defining the locations for these files, we will edit the `docker-compose.yml` file accordingly and add the new variables to the `immich-server` container.
```diff title="docker-compose.yml" ```diff title="docker-compose.yml"
services: services:
@@ -29,16 +29,6 @@ services:
- ${UPLOAD_LOCATION}:/usr/src/app/upload - ${UPLOAD_LOCATION}:/usr/src/app/upload
+ - ${THUMB_LOCATION}:/usr/src/app/upload/thumbs + - ${THUMB_LOCATION}:/usr/src/app/upload/thumbs
+ - ${ENCODED_VIDEO_LOCATION}:/usr/src/app/upload/encoded-video + - ${ENCODED_VIDEO_LOCATION}:/usr/src/app/upload/encoded-video
+ - ${PROFILE_LOCATION}:/usr/src/app/upload/profile
- /etc/localtime:/etc/localtime:ro
...
immich-microservices:
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
+ - ${THUMB_LOCATION}:/usr/src/app/upload/thumbs
+ - ${ENCODED_VIDEO_LOCATION}:/usr/src/app/upload/encoded-video
+ - ${PROFILE_LOCATION}:/usr/src/app/upload/profile + - ${PROFILE_LOCATION}:/usr/src/app/upload/profile
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
``` ```
@@ -46,7 +36,6 @@ services:
Restart Immich to register the changes. Restart Immich to register the changes.
``` ```
docker compose down
docker compose up -d docker compose up -d
``` ```

View File

@@ -5,7 +5,7 @@ Keep in mind that mucking around in the database might set the moon on fire. Avo
::: :::
:::tip :::tip
Run `docker exec -it immich_postgres psql immich <DB_USERNAME>` to connect to the database via the container directly. Run `docker exec -it immich_postgres psql --dbname=immich --username=<DB_USERNAME>` to connect to the database via the container directly.
(Replace `<DB_USERNAME>` with the value from your [`.env` file](/docs/install/environment-variables#database)). (Replace `<DB_USERNAME>` with the value from your [`.env` file](/docs/install/environment-variables#database)).
::: :::
@@ -106,3 +106,9 @@ SELECT "key", "value" FROM "system_metadata" WHERE "key" = 'system-config';
```sql title="Delete person and unset it for the faces it was associated with" ```sql title="Delete person and unset it for the faces it was associated with"
DELETE FROM "person" WHERE "name" = 'PersonNameHere'; DELETE FROM "person" WHERE "name" = 'PersonNameHere';
``` ```
## Postgres internal
```sql title="Change DB_PASSWORD"
ALTER USER <DB_USERNAME> WITH ENCRYPTED PASSWORD 'newpasswordhere';
```

View File

@@ -50,6 +50,7 @@ Regardless of filesystem, it is not recommended to use a network share for your
| `IMMICH_API_METRICS_PORT` | Port for the OTEL metrics | `8081` | server | api | | `IMMICH_API_METRICS_PORT` | Port for the OTEL metrics | `8081` | server | api |
| `IMMICH_MICROSERVICES_METRICS_PORT` | Port for the OTEL metrics | `8082` | server | microservices | | `IMMICH_MICROSERVICES_METRICS_PORT` | Port for the OTEL metrics | `8082` | server | microservices |
| `IMMICH_PROCESS_INVALID_IMAGES` | When `true`, generate thumbnails for invalid images | | server | microservices | | `IMMICH_PROCESS_INVALID_IMAGES` | When `true`, generate thumbnails for invalid images | | server | microservices |
| `IMMICH_TRUSTED_PROXIES` | List of comma separated IPs set as trusted proxies | | server | api |
\*1: With the default `WORKDIR` of `/usr/src/app`, this path will resolve to `/usr/src/app/upload`. \*1: With the default `WORKDIR` of `/usr/src/app`, this path will resolve to `/usr/src/app/upload`.
It only need to be set if the Immich deployment method is changing. It only need to be set if the Immich deployment method is changing.
@@ -156,18 +157,21 @@ Redis (Sentinel) URL example JSON before encoding:
## Machine Learning ## Machine Learning
| Variable | Description | Default | Containers | | Variable | Description | Default | Containers |
| :----------------------------------------------- | :------------------------------------------------------------------- | :-----------------------------------: | :--------------- | | :----------------------------------------------- | :-------------------------------------------------------------------------------------------------- | :-----------------------------------: | :--------------- |
| `MACHINE_LEARNING_MODEL_TTL` | Inactivity time (s) before a model is unloaded (disabled if \<= 0) | `300` | machine learning | | `MACHINE_LEARNING_MODEL_TTL` | Inactivity time (s) before a model is unloaded (disabled if \<= 0) | `300` | machine learning |
| `MACHINE_LEARNING_MODEL_TTL_POLL_S` | Interval (s) between checks for the model TTL (disabled if \<= 0) | `10` | machine learning | | `MACHINE_LEARNING_MODEL_TTL_POLL_S` | Interval (s) between checks for the model TTL (disabled if \<= 0) | `10` | machine learning |
| `MACHINE_LEARNING_CACHE_FOLDER` | Directory where models are downloaded | `/cache` | machine learning | | `MACHINE_LEARNING_CACHE_FOLDER` | Directory where models are downloaded | `/cache` | machine learning |
| `MACHINE_LEARNING_REQUEST_THREADS`<sup>\*1</sup> | Thread count of the request thread pool (disabled if \<= 0) | number of CPU cores | machine learning | | `MACHINE_LEARNING_REQUEST_THREADS`<sup>\*1</sup> | Thread count of the request thread pool (disabled if \<= 0) | number of CPU cores | machine learning |
| `MACHINE_LEARNING_MODEL_INTER_OP_THREADS` | Number of parallel model operations | `1` | machine learning | | `MACHINE_LEARNING_MODEL_INTER_OP_THREADS` | Number of parallel model operations | `1` | machine learning |
| `MACHINE_LEARNING_MODEL_INTRA_OP_THREADS` | Number of threads for each model operation | `2` | machine learning | | `MACHINE_LEARNING_MODEL_INTRA_OP_THREADS` | Number of threads for each model operation | `2` | machine learning |
| `MACHINE_LEARNING_WORKERS`<sup>\*2</sup> | Number of worker processes to spawn | `1` | machine learning | | `MACHINE_LEARNING_WORKERS`<sup>\*2</sup> | Number of worker processes to spawn | `1` | machine learning |
| `MACHINE_LEARNING_WORKER_TIMEOUT` | Maximum time (s) of unresponsiveness before a worker is killed | `120` (`300` if using OpenVINO image) | machine learning | | `MACHINE_LEARNING_WORKER_TIMEOUT` | Maximum time (s) of unresponsiveness before a worker is killed | `120` (`300` if using OpenVINO image) | machine learning |
| `MACHINE_LEARNING_PRELOAD__CLIP` | Name of a CLIP model to be preloaded and kept in cache | | machine learning | | `MACHINE_LEARNING_PRELOAD__CLIP` | Name of a CLIP model to be preloaded and kept in cache | | machine learning |
| `MACHINE_LEARNING_PRELOAD__FACIAL_RECOGNITION` | Name of a facial recognition model to be preloaded and kept in cache | | machine learning | | `MACHINE_LEARNING_PRELOAD__FACIAL_RECOGNITION` | Name of a facial recognition model to be preloaded and kept in cache | | machine learning |
| `MACHINE_LEARNING_ANN` | Enable ARM-NN hardware acceleration if supported | `True` | machine learning |
| `MACHINE_LEARNING_ANN_FP16_TURBO` | Execute operations in FP16 precision: increasing speed, reducing precision (applies only to ARM-NN) | `False` | machine learning |
| `MACHINE_LEARNING_ANN_TUNING_LEVEL` | ARM-NN GPU tuning level (1: rapid, 2: normal, 3: exhaustive) | `2` | machine learning |
\*1: It is recommended to begin with this parameter when changing the concurrency levels of the machine learning service and then tune the other ones. \*1: It is recommended to begin with this parameter when changing the concurrency levels of the machine learning service and then tune the other ones.

View File

@@ -56,6 +56,6 @@
"node": ">=20" "node": ">=20"
}, },
"volta": { "volta": {
"node": "20.15.1" "node": "20.16.0"
} }
} }

View File

@@ -41,7 +41,7 @@ function HomepageHeader() {
Discord Discord
</Link> </Link>
</div> </div>
<img src="/img/immich-screenshots.png" alt="screenshots" width={'70%'} /> <img src="/img/immich-screenshots.webp" alt="screenshots" width={'70%'} />
<div className="flex flex-col sm:flex-row place-items-center place-content-center mt-4 gap-1"> <div className="flex flex-col sm:flex-row place-items-center place-content-center mt-4 gap-1">
<div className="h-24"> <div className="h-24">
<a href="https://play.google.com/store/apps/details?id=app.alextran.immich"> <a href="https://play.google.com/store/apps/details?id=app.alextran.immich">

View File

@@ -66,12 +66,16 @@ import {
mdiVectorCombine, mdiVectorCombine,
mdiVideo, mdiVideo,
mdiWeb, mdiWeb,
mdiLicense,
} from '@mdi/js'; } from '@mdi/js';
import Layout from '@theme/Layout'; import Layout from '@theme/Layout';
import React from 'react'; import React from 'react';
import { Item, Timeline } from '../components/timeline'; import { Item, Timeline } from '../components/timeline';
const releases = { const releases = {
// TODO
'v1.110.0': new Date(2024, 5, 11),
'v1.109.0': new Date(2024, 6, 18),
'v1.106.1': new Date(2024, 5, 11), 'v1.106.1': new Date(2024, 5, 11),
'v1.104.0': new Date(2024, 4, 13), 'v1.104.0': new Date(2024, 4, 13),
'v1.103.0': new Date(2024, 3, 29), 'v1.103.0': new Date(2024, 3, 29),
@@ -220,6 +224,20 @@ const roadmap: Item[] = [
]; ];
const milestones: Item[] = [ const milestones: Item[] = [
{
icon: mdiStar,
iconColor: 'gold',
title: '40,000 Stars',
description: 'Reached 40K Stars on GitHub!',
getDateLabel: withLanguage(new Date(2024, 6, 21)),
},
withRelease({
icon: mdiLicense,
iconColor: 'gold',
title: 'Supporter Badge',
description: 'The option to buy Immich to support its development!',
release: 'v1.109.0',
}),
withRelease({ withRelease({
icon: mdiHistory, icon: mdiHistory,
title: 'Versioned documentation', title: 'Versioned documentation',
@@ -236,7 +254,7 @@ const milestones: Item[] = [
withRelease({ withRelease({
icon: mdiContentDuplicate, icon: mdiContentDuplicate,
title: 'Similar image detection', title: 'Similar image detection',
description: 'Detect duplicate assets that arent exactly identical', description: "Detect duplicate assets that aren't exactly identical",
release: 'v1.106.1', release: 'v1.106.1',
}), }),
withRelease({ withRelease({

View File

@@ -1,4 +1,8 @@
[ [
{
"label": "v1.110.0",
"url": "https://v1.110.0.archive.immich.app"
},
{ {
"label": "v1.109.2", "label": "v1.109.2",
"url": "https://v1.109.2.archive.immich.app" "url": "https://v1.109.2.archive.immich.app"

BIN
docs/static/img/immich-screenshots.webp vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

View File

@@ -1 +1 @@
20.15.1 20.16.0

View File

@@ -35,7 +35,7 @@ services:
- 2283:3001 - 2283:3001
redis: redis:
image: redis:6.2-alpine@sha256:328fe6a5822256d065debb36617a8169dbfbd77b797c525288e465f56c1d392b image: redis:6.2-alpine@sha256:e3b17ba9479deec4b7d1eeec1548a253acc5374d68d3b27937fcfe4df8d18c7e
database: database:
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0 image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0

24
e2e/package-lock.json generated
View File

@@ -1,19 +1,19 @@
{ {
"name": "immich-e2e", "name": "immich-e2e",
"version": "1.109.2", "version": "1.110.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "immich-e2e", "name": "immich-e2e",
"version": "1.109.2", "version": "1.110.0",
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"devDependencies": { "devDependencies": {
"@immich/cli": "file:../cli", "@immich/cli": "file:../cli",
"@immich/sdk": "file:../open-api/typescript-sdk", "@immich/sdk": "file:../open-api/typescript-sdk",
"@playwright/test": "^1.44.1", "@playwright/test": "^1.44.1",
"@types/luxon": "^3.4.2", "@types/luxon": "^3.4.2",
"@types/node": "^20.14.10", "@types/node": "^20.14.12",
"@types/oidc-provider": "^8.5.1", "@types/oidc-provider": "^8.5.1",
"@types/pg": "^8.11.0", "@types/pg": "^8.11.0",
"@types/pngjs": "^6.0.4", "@types/pngjs": "^6.0.4",
@@ -37,12 +37,12 @@
"supertest": "^7.0.0", "supertest": "^7.0.0",
"typescript": "^5.3.3", "typescript": "^5.3.3",
"utimes": "^5.2.1", "utimes": "^5.2.1",
"vitest": "^1.3.0" "vitest": "^1.6.0"
} }
}, },
"../cli": { "../cli": {
"name": "@immich/cli", "name": "@immich/cli",
"version": "2.2.11", "version": "2.2.12",
"dev": true, "dev": true,
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"dependencies": { "dependencies": {
@@ -59,11 +59,11 @@
"@types/cli-progress": "^3.11.0", "@types/cli-progress": "^3.11.0",
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/mock-fs": "^4.13.1", "@types/mock-fs": "^4.13.1",
"@types/node": "^20.14.10", "@types/node": "^20.14.12",
"@typescript-eslint/eslint-plugin": "^7.0.0", "@typescript-eslint/eslint-plugin": "^7.0.0",
"@typescript-eslint/parser": "^7.0.0", "@typescript-eslint/parser": "^7.0.0",
"@vitest/coverage-v8": "^1.2.2", "@vitest/coverage-v8": "^1.2.2",
"byte-size": "^8.1.1", "byte-size": "^9.0.0",
"cli-progress": "^3.12.0", "cli-progress": "^3.12.0",
"commander": "^12.0.0", "commander": "^12.0.0",
"eslint": "^8.56.0", "eslint": "^8.56.0",
@@ -86,14 +86,14 @@
}, },
"../open-api/typescript-sdk": { "../open-api/typescript-sdk": {
"name": "@immich/sdk", "name": "@immich/sdk",
"version": "1.109.2", "version": "1.110.0",
"dev": true, "dev": true,
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"dependencies": { "dependencies": {
"@oazapfts/runtime": "^1.0.2" "@oazapfts/runtime": "^1.0.2"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20.14.10", "@types/node": "^20.14.12",
"typescript": "^5.3.3" "typescript": "^5.3.3"
} }
}, },
@@ -1413,9 +1413,9 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.14.10", "version": "20.14.12",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz",
"integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", "integrity": "sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {

View File

@@ -1,6 +1,6 @@
{ {
"name": "immich-e2e", "name": "immich-e2e",
"version": "1.109.2", "version": "1.110.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"type": "module", "type": "module",
@@ -23,7 +23,7 @@
"@immich/sdk": "file:../open-api/typescript-sdk", "@immich/sdk": "file:../open-api/typescript-sdk",
"@playwright/test": "^1.44.1", "@playwright/test": "^1.44.1",
"@types/luxon": "^3.4.2", "@types/luxon": "^3.4.2",
"@types/node": "^20.14.10", "@types/node": "^20.14.12",
"@types/oidc-provider": "^8.5.1", "@types/oidc-provider": "^8.5.1",
"@types/pg": "^8.11.0", "@types/pg": "^8.11.0",
"@types/pngjs": "^6.0.4", "@types/pngjs": "^6.0.4",
@@ -47,9 +47,9 @@
"supertest": "^7.0.0", "supertest": "^7.0.0",
"typescript": "^5.3.3", "typescript": "^5.3.3",
"utimes": "^5.2.1", "utimes": "^5.2.1",
"vitest": "^1.3.0" "vitest": "^1.6.0"
}, },
"volta": { "volta": {
"node": "20.15.1" "node": "20.16.0"
} }
} }

View File

@@ -472,6 +472,44 @@ describe('/asset', () => {
expect(status).toEqual(200); expect(status).toEqual(200);
}); });
it('should update date time original when sidecar file contains DateTimeOriginal', async () => {
const sidecarData = `<?xpacket begin='?' id='W5M0MpCehiHzreSzNTczkc9d'?>
<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 12.40'>
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
<rdf:Description rdf:about=''
xmlns:exif='http://ns.adobe.com/exif/1.0/'>
<exif:ExifVersion>0220</exif:ExifVersion> <exif:DateTimeOriginal>2024-07-11T10:32:52Z</exif:DateTimeOriginal>
<exif:GPSVersionID>2.3.0.0</exif:GPSVersionID>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end='w'?>`;
const { id } = await utils.createAsset(user1.accessToken, {
sidecarData: {
bytes: Buffer.from(sidecarData),
filename: 'example.xmp',
},
});
await utils.waitForQueueFinish(admin.accessToken, 'metadataExtraction');
const assetInfo = await utils.getAssetInfo(user1.accessToken, id);
expect(assetInfo.exifInfo?.dateTimeOriginal).toBe('2024-07-11T10:32:52.000Z');
const { status, body } = await request(app)
.put(`/assets/${id}`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ dateTimeOriginal: '2023-11-19T18:11:00.000-07:00' });
expect(body).toMatchObject({
id,
exifInfo: expect.objectContaining({
dateTimeOriginal: '2023-11-20T01:11:00.000Z',
}),
});
expect(status).toEqual(200);
});
it('should reject invalid gps coordinates', async () => { it('should reject invalid gps coordinates', async () => {
for (const test of [ for (const test of [
{ latitude: 12 }, { latitude: 12 },
@@ -1099,7 +1137,7 @@ describe('/asset', () => {
type: AssetTypeEnum.Image, type: AssetTypeEnum.Image,
originalFileName: '14bit-uncompressed-(3_2).arw', originalFileName: '14bit-uncompressed-(3_2).arw',
resized: true, resized: true,
fileCreatedAt: '2016-01-08T15:08:01.000Z', fileCreatedAt: '2016-01-08T14:08:01.000Z',
exifInfo: { exifInfo: {
make: 'SONY', make: 'SONY',
model: 'ILCE-7M2', model: 'ILCE-7M2',
@@ -1111,7 +1149,7 @@ describe('/asset', () => {
iso: 100, iso: 100,
lensModel: 'E 25mm F2', lensModel: 'E 25mm F2',
fileSizeInByte: 49_512_448, fileSizeInByte: 49_512_448,
dateTimeOriginal: '2016-01-08T15:08:01.000Z', dateTimeOriginal: '2016-01-08T14:08:01.000Z',
latitude: null, latitude: null,
longitude: null, longitude: null,
orientation: '1', orientation: '1',

View File

@@ -65,6 +65,7 @@ describe('/people', () => {
expect(status).toBe(200); expect(status).toBe(200);
expect(body).toEqual({ expect(body).toEqual({
hasNextPage: false,
total: 3, total: 3,
hidden: 1, hidden: 1,
people: [ people: [
@@ -80,6 +81,7 @@ describe('/people', () => {
expect(status).toBe(200); expect(status).toBe(200);
expect(body).toEqual({ expect(body).toEqual({
hasNextPage: false,
total: 3, total: 3,
hidden: 1, hidden: 1,
people: [ people: [
@@ -88,6 +90,21 @@ describe('/people', () => {
], ],
}); });
}); });
it('should support pagination', async () => {
const { status, body } = await request(app)
.get('/people')
.set('Authorization', `Bearer ${admin.accessToken}`)
.query({ withHidden: true, page: 2, size: 1 });
expect(status).toBe(200);
expect(body).toEqual({
hasNextPage: true,
total: 3,
hidden: 1,
people: [expect.objectContaining({ name: 'visible_person' })],
});
});
}); });
describe('GET /people/:id', () => { describe('GET /people/:id', () => {

View File

@@ -254,7 +254,7 @@ describe('/server', () => {
.set('Authorization', `Bearer ${admin.accessToken}`) .set('Authorization', `Bearer ${admin.accessToken}`)
.send(serverLicense); .send(serverLicense);
const { status } = await request(app).get('/server/license').set('Authorization', `Bearer ${admin.accessToken}`); const { status } = await request(app).get('/server/license').set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200); expect(status).toBe(404);
}); });
}); });

View File

@@ -50,7 +50,7 @@ type CommandResponse = { stdout: string; stderr: string; exitCode: number | null
type EventType = 'assetUpload' | 'assetUpdate' | 'assetDelete' | 'userDelete' | 'assetHidden'; type EventType = 'assetUpload' | 'assetUpdate' | 'assetDelete' | 'userDelete' | 'assetHidden';
type WaitOptions = { event: EventType; id?: string; total?: number; timeout?: number }; type WaitOptions = { event: EventType; id?: string; total?: number; timeout?: number };
type AdminSetupOptions = { onboarding?: boolean }; type AdminSetupOptions = { onboarding?: boolean };
type AssetData = { bytes?: Buffer; filename: string }; type FileData = { bytes?: Buffer; filename: string };
const dbUrl = 'postgres://postgres:postgres@127.0.0.1:5433/immich'; const dbUrl = 'postgres://postgres:postgres@127.0.0.1:5433/immich';
export const baseUrl = 'http://127.0.0.1:2283'; export const baseUrl = 'http://127.0.0.1:2283';
@@ -291,7 +291,10 @@ export const utils = {
createAsset: async ( createAsset: async (
accessToken: string, accessToken: string,
dto?: Partial<Omit<AssetMediaCreateDto, 'assetData'>> & { assetData?: AssetData }, dto?: Partial<Omit<AssetMediaCreateDto, 'assetData' | 'sidecarData'>> & {
assetData?: FileData;
sidecarData?: FileData;
},
) => { ) => {
const _dto = { const _dto = {
deviceAssetId: 'test-1', deviceAssetId: 'test-1',
@@ -313,6 +316,10 @@ export const utils = {
.attach('assetData', assetData, filename) .attach('assetData', assetData, filename)
.set('Authorization', `Bearer ${accessToken}`); .set('Authorization', `Bearer ${accessToken}`);
if (dto?.sidecarData?.bytes) {
void builder.attach('sidecarData', dto.sidecarData.bytes, dto.sidecarData.filename);
}
for (const [key, value] of Object.entries(_dto)) { for (const [key, value] of Object.entries(_dto)) {
void builder.field(key, String(value)); void builder.field(key, String(value));
} }
@@ -325,7 +332,7 @@ export const utils = {
replaceAsset: async ( replaceAsset: async (
accessToken: string, accessToken: string,
assetId: string, assetId: string,
dto?: Partial<Omit<AssetMediaCreateDto, 'assetData'>> & { assetData?: AssetData }, dto?: Partial<Omit<AssetMediaCreateDto, 'assetData'>> & { assetData?: FileData },
) => { ) => {
const _dto = { const _dto = {
deviceAssetId: 'test-1', deviceAssetId: 'test-1',

View File

@@ -13,7 +13,7 @@ test.describe('Registration', () => {
test('admin registration', async ({ page }) => { test('admin registration', async ({ page }) => {
// welcome // welcome
await page.goto('/'); await page.goto('/');
await page.getByRole('button', { name: 'Getting Started' }).click(); await page.getByRole('link', { name: 'Getting Started' }).click();
// register // register
await expect(page).toHaveTitle(/Admin Registration/); await expect(page).toHaveTitle(/Admin Registration/);

View File

@@ -1,10 +1,8 @@
ARG DEVICE=cpu ARG DEVICE=cpu
FROM python:3.11-bookworm@sha256:7bec1574675e7fd9e3a540a03cd7d6811c59ca261bd300cd665369d8f435298a as builder-cpu FROM python:3.11-bookworm@sha256:ef4b550f029a76b94f8e6cc6e4a8ed0e870fc6c5af1c4e9d77faaea50f41f6cd as builder-cpu
FROM openvino/ubuntu22_runtime:2023.3.0@sha256:176646df619032ea6c10faf842867119c393e7497b7f88b5e307e932a0fd5aa8 as builder-openvino FROM builder-cpu as builder-openvino
USER root
RUN apt-get update && apt-get install -y --no-install-recommends python3-dev
FROM builder-cpu as builder-cuda FROM builder-cpu as builder-cuda
@@ -13,7 +11,7 @@ FROM builder-cpu as builder-armnn
ENV ARMNN_PATH=/opt/armnn ENV ARMNN_PATH=/opt/armnn
COPY ann /opt/ann COPY ann /opt/ann
RUN mkdir /opt/armnn && \ RUN mkdir /opt/armnn && \
curl -SL "https://github.com/ARM-software/armnn/releases/download/v23.11/ArmNN-linux-aarch64.tar.gz" | tar -zx -C /opt/armnn && \ curl -SL "https://github.com/ARM-software/armnn/releases/download/v24.05/ArmNN-linux-aarch64.tar.gz" | tar -zx -C /opt/armnn && \
cd /opt/ann && \ cd /opt/ann && \
sh build.sh sh build.sh
@@ -36,15 +34,17 @@ RUN python3 -m venv /opt/venv
COPY poetry.lock pyproject.toml ./ COPY poetry.lock pyproject.toml ./
RUN poetry install --sync --no-interaction --no-ansi --no-root --with ${DEVICE} --without dev RUN poetry install --sync --no-interaction --no-ansi --no-root --with ${DEVICE} --without dev
FROM python:3.11-slim-bookworm@sha256:17ec9dc2367aa748559d0212f34665ec4df801129de32db705ea34654b5bc77a as prod-cpu FROM python:3.11-slim-bookworm@sha256:ee317183d292ee6ed30e90bc325043ca3f7d2e8c79ac5019575490b5256ae244 as prod-cpu
FROM openvino/ubuntu22_runtime:2023.3.0@sha256:176646df619032ea6c10faf842867119c393e7497b7f88b5e307e932a0fd5aa8 as prod-openvino FROM prod-cpu as prod-openvino
USER root
# TODO: remove this once the image has the fix for https://github.com/intel/compute-runtime/issues/710
ENV NEOReadDebugKeys=1 \
OverrideGpuAddressSpace=48
FROM nvidia/cuda:12.2.2-cudnn8-runtime-ubuntu22.04@sha256:2d913b09e6be8387e1a10976933642c73c840c0b735f0bf3c28d97fc9bc422e0 as prod-cuda COPY scripts/configure-apt.sh ./
RUN ./configure-apt.sh && \
apt-get update && \
apt-get install -t unstable --no-install-recommends -yqq intel-opencl-icd && \
rm configure-apt.sh
FROM nvidia/cuda:12.3.2-cudnn9-runtime-ubuntu22.04@sha256:fa44193567d1908f7ca1f3abf8623ce9c63bc8cba7bcfdb32702eb04d326f7a8 as prod-cuda
COPY --from=builder-cuda /usr/local/bin/python3 /usr/local/bin/python3 COPY --from=builder-cuda /usr/local/bin/python3 /usr/local/bin/python3
COPY --from=builder-cuda /usr/local/lib/python3.11 /usr/local/lib/python3.11 COPY --from=builder-cuda /usr/local/lib/python3.11 /usr/local/lib/python3.11
@@ -54,7 +54,7 @@ FROM prod-cpu as prod-armnn
ENV LD_LIBRARY_PATH=/opt/armnn ENV LD_LIBRARY_PATH=/opt/armnn
RUN apt-get update && apt-get install -y --no-install-recommends ocl-icd-libopencl1 mesa-opencl-icd && \ RUN apt-get update && apt-get install -y --no-install-recommends ocl-icd-libopencl1 mesa-opencl-icd libgomp1 && \
rm -rf /var/lib/apt/lists/* && \ rm -rf /var/lib/apt/lists/* && \
mkdir --parents /etc/OpenCL/vendors && \ mkdir --parents /etc/OpenCL/vendors && \
echo "/usr/lib/libmali.so" > /etc/OpenCL/vendors/mali.icd && \ echo "/usr/lib/libmali.so" > /etc/OpenCL/vendors/mali.icd && \
@@ -71,13 +71,15 @@ COPY --from=builder-armnn \
/opt/armnn/ /opt/armnn/
FROM prod-${DEVICE} as prod FROM prod-${DEVICE} as prod
ARG DEVICE
RUN apt-get update && \ RUN apt-get update && \
apt-get install -y --no-install-recommends tini libmimalloc2.0 && \ apt-get install -y --no-install-recommends tini $(if ! [ "$DEVICE" = "openvino" ]; then echo "libmimalloc2.0"; fi) && \
apt-get autoremove -yqq && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
WORKDIR /usr/src/app WORKDIR /usr/src/app
ARG DEVICE
ENV TRANSFORMERS_CACHE=/cache \ ENV TRANSFORMERS_CACHE=/cache \
PYTHONDONTWRITEBYTECODE=1 \ PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \ PYTHONUNBUFFERED=1 \

View File

@@ -48,21 +48,22 @@ public:
bool saveCachedNetwork, bool saveCachedNetwork,
const char *cachedNetworkPath) const char *cachedNetworkPath)
{ {
INetworkPtr network = loadModel(modelPath); NetworkId netId = -2;
IOptimizedNetworkPtr optNet = OptimizeNetwork(network.get(), fastMath, fp16, saveCachedNetwork, cachedNetworkPath); while (netId == -2)
const IOInfos infos = getIOInfos(optNet.get());
NetworkId netId;
mutex.lock();
Status status = runtime->LoadNetwork(netId, std::move(optNet));
mutex.unlock();
if (status != Status::Success)
{ {
return -1; try
{
netId = loadInternal(modelPath, fastMath, fp16, saveCachedNetwork, cachedNetworkPath);
}
catch (InvalidArgumentException e)
{
// fp16 models do not support the forced fp16-turbo (runtime fp32->fp16 conversion)
if (fp16)
fp16 = false;
else
netId = -1;
}
} }
spinLock.lock();
ioInfos[netId] = infos;
mutexes.emplace(netId, std::make_unique<std::mutex>());
spinLock.unlock();
return netId; return netId;
} }
@@ -117,6 +118,8 @@ public:
Ann(int tuningLevel, const char *tuningFile) Ann(int tuningLevel, const char *tuningFile)
{ {
IRuntime::CreationOptions runtimeOptions; IRuntime::CreationOptions runtimeOptions;
runtimeOptions.m_ProfilingOptions.m_EnableProfiling = false;
runtimeOptions.m_ProfilingOptions.m_TimelineEnabled = false;
BackendOptions backendOptions{"GpuAcc", BackendOptions backendOptions{"GpuAcc",
{ {
{"TuningLevel", tuningLevel}, {"TuningLevel", tuningLevel},
@@ -133,6 +136,30 @@ public:
}; };
private: private:
int loadInternal(const char *modelPath,
bool fastMath,
bool fp16,
bool saveCachedNetwork,
const char *cachedNetworkPath)
{
NetworkId netId = -1;
INetworkPtr network = loadModel(modelPath);
IOptimizedNetworkPtr optNet = OptimizeNetwork(network.get(), fastMath, fp16, saveCachedNetwork, cachedNetworkPath);
const IOInfos infos = getIOInfos(optNet.get());
mutex.lock();
Status status = runtime->LoadNetwork(netId, std::move(optNet));
mutex.unlock();
if (status != Status::Success)
{
return -1;
}
spinLock.lock();
ioInfos[netId] = infos;
mutexes.emplace(netId, std::make_unique<std::mutex>());
spinLock.unlock();
return netId;
}
INetworkPtr loadModel(const char *modelPath) INetworkPtr loadModel(const char *modelPath)
{ {
const auto path = std::string(modelPath); const auto path = std::string(modelPath);
@@ -172,6 +199,8 @@ private:
options.SetReduceFp32ToFp16(fp16); options.SetReduceFp32ToFp16(fp16);
options.SetShapeInferenceMethod(shapeInferenceMethod); options.SetShapeInferenceMethod(shapeInferenceMethod);
options.SetAllowExpandedDims(allowExpandedDims); options.SetAllowExpandedDims(allowExpandedDims);
options.SetDebugToFileEnabled(false);
options.SetProfilingEnabled(false);
BackendOptions gpuAcc("GpuAcc", {{"FastMathEnabled", fastMath}}); BackendOptions gpuAcc("GpuAcc", {{"FastMathEnabled", fastMath}});
if (cachedNetworkPath) if (cachedNetworkPath)
@@ -232,8 +261,8 @@ private:
IRuntime *runtime; IRuntime *runtime;
std::map<NetworkId, IOInfos> ioInfos; std::map<NetworkId, IOInfos> ioInfos;
std::map<NetworkId, std::unique_ptr<std::mutex>> mutexes; // mutex per network to not execute the same the same network concurrently std::map<NetworkId, std::unique_ptr<std::mutex>> mutexes; // mutex per network to not execute the same the same network concurrently
std::mutex mutex; // global mutex for load/unload calls to the runtime std::mutex mutex; // global mutex for load/unload calls to the runtime
SpinLock spinLock; // fast spin lock to guard access to the ioInfos and mutexes maps SpinLock spinLock; // fast spin lock to guard access to the ioInfos and mutexes maps
}; };
extern "C" void *init(int logLevel, int tuningLevel, const char *tuningFile) extern "C" void *init(int logLevel, int tuningLevel, const char *tuningFile)

View File

@@ -120,6 +120,8 @@ class Ann(metaclass=_Singleton):
save_cached_network, save_cached_network,
cached_network_path.encode() if cached_network_path is not None else None, cached_network_path.encode() if cached_network_path is not None else None,
) )
if net_id < 0:
raise ValueError("Cannot load model!")
self.input_shapes[net_id] = tuple( self.input_shapes[net_id] = tuple(
self.shape(net_id, input=True, index=i) for i in range(self.tensors(net_id, input=True)) self.shape(net_id, input=True, index=i) for i in range(self.tensors(net_id, input=True))

View File

@@ -30,6 +30,8 @@ class Settings(BaseSettings):
model_inter_op_threads: int = 0 model_inter_op_threads: int = 0
model_intra_op_threads: int = 0 model_intra_op_threads: int = 0
ann: bool = True ann: bool = True
ann_fp16_turbo: bool = False
ann_tuning_level: int = 2
preload: PreloadModelData | None = None preload: PreloadModelData | None = None
class Config: class Config:

View File

@@ -47,8 +47,8 @@ def pil_to_cv2(image: Image.Image) -> NDArray[np.uint8]:
def decode_pil(image_bytes: bytes | IO[bytes] | Image.Image) -> Image.Image: def decode_pil(image_bytes: bytes | IO[bytes] | Image.Image) -> Image.Image:
if isinstance(image_bytes, Image.Image): if isinstance(image_bytes, Image.Image):
return image_bytes return image_bytes
image = Image.open(BytesIO(image_bytes) if isinstance(image_bytes, bytes) else image_bytes) image: Image.Image = Image.open(BytesIO(image_bytes) if isinstance(image_bytes, bytes) else image_bytes)
image.load() # type: ignore image.load()
if not image.mode == "RGB": if not image.mode == "RGB":
image = image.convert("RGB") image = image.convert("RGB")
return image return image

View File

@@ -20,12 +20,13 @@ class AnnSession:
def __init__(self, model_path: Path, cache_dir: Path = settings.cache_folder) -> None: def __init__(self, model_path: Path, cache_dir: Path = settings.cache_folder) -> None:
self.model_path = model_path self.model_path = model_path
self.cache_dir = cache_dir self.cache_dir = cache_dir
self.ann = Ann(tuning_level=3, tuning_file=(cache_dir / "gpu-tuning.ann").as_posix()) self.ann = Ann(tuning_level=settings.ann_tuning_level, tuning_file=(cache_dir / "gpu-tuning.ann").as_posix())
log.info("Loading ANN model %s ...", model_path) log.info("Loading ANN model %s ...", model_path)
self.model = self.ann.load( self.model = self.ann.load(
model_path.as_posix(), model_path.as_posix(),
cached_network_path=model_path.with_suffix(".anncache").as_posix(), cached_network_path=model_path.with_suffix(".anncache").as_posix(),
fp16=settings.ann_fp16_turbo,
) )
log.info("Loaded ANN model with ID %d", self.model) log.info("Loaded ANN model with ID %d", self.model)

View File

@@ -83,17 +83,21 @@ class OrtSession:
@property @property
def _provider_options_default(self) -> list[dict[str, Any]]: def _provider_options_default(self) -> list[dict[str, Any]]:
options = [] provider_options = []
for provider in self.providers: for provider in self.providers:
match provider: match provider:
case "CPUExecutionProvider" | "CUDAExecutionProvider": case "CPUExecutionProvider" | "CUDAExecutionProvider":
option = {"arena_extend_strategy": "kSameAsRequested"} options = {"arena_extend_strategy": "kSameAsRequested"}
case "OpenVINOExecutionProvider": case "OpenVINOExecutionProvider":
option = {"device_type": "GPU_FP32", "cache_dir": (self.model_path.parent / "openvino").as_posix()} options = {
"device_type": "GPU",
"precision": "FP32",
"cache_dir": (self.model_path.parent / "openvino").as_posix(),
}
case _: case _:
option = {} options = {}
options.append(option) provider_options.append(options)
return options return provider_options
@property @property
def sess_options(self) -> ort.SessionOptions: def sess_options(self) -> ort.SessionOptions:

View File

@@ -212,7 +212,7 @@ class TestOrtSession:
session = OrtSession(model_path, providers=["OpenVINOExecutionProvider", "CPUExecutionProvider"]) session = OrtSession(model_path, providers=["OpenVINOExecutionProvider", "CPUExecutionProvider"])
assert session.provider_options == [ assert session.provider_options == [
{"device_type": "GPU_FP32", "cache_dir": "/cache/ViT-B-32__openai/openvino"}, {"device_type": "GPU", "precision": "FP32", "cache_dir": "/cache/ViT-B-32__openai/openvino"},
{"arena_extend_strategy": "kSameAsRequested"}, {"arena_extend_strategy": "kSameAsRequested"},
] ]
@@ -268,9 +268,9 @@ class TestAnnSession:
AnnSession(model_path, cache_dir) AnnSession(model_path, cache_dir)
ann_session.assert_called_once_with(tuning_level=3, tuning_file=(cache_dir / "gpu-tuning.ann").as_posix()) ann_session.assert_called_once_with(tuning_level=2, tuning_file=(cache_dir / "gpu-tuning.ann").as_posix())
ann_session.return_value.load.assert_called_once_with( ann_session.return_value.load.assert_called_once_with(
model_path.as_posix(), cached_network_path=model_path.with_suffix(".anncache").as_posix() model_path.as_posix(), cached_network_path=model_path.with_suffix(".anncache").as_posix(), fp16=False
) )
info.assert_has_calls( info.assert_has_calls(
[ [

View File

@@ -1,4 +1,4 @@
FROM mambaorg/micromamba:bookworm-slim@sha256:333f7598ff2c2400fb10bfe057709c68b7daab5d847143af85abcf224a07271a as builder FROM mambaorg/micromamba:bookworm-slim@sha256:94d6837f023c0fc0bb68782dd2a984ff7fe0e21ea7e533056c9b8ca060e31de2 as builder
ENV TRANSFORMERS_CACHE=/cache \ ENV TRANSFORMERS_CACHE=/cache \
PYTHONDONTWRITEBYTECODE=1 \ PYTHONDONTWRITEBYTECODE=1 \

View File

@@ -680,13 +680,13 @@ test = ["pytest (>=6)"]
[[package]] [[package]]
name = "fastapi-slim" name = "fastapi-slim"
version = "0.111.0" version = "0.111.1"
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "fastapi_slim-0.111.0-py3-none-any.whl", hash = "sha256:6e4b04a555496e5a2590031fcae3ef8e364ad4901b340033e2e1d8136471aca2"}, {file = "fastapi_slim-0.111.1-py3-none-any.whl", hash = "sha256:ac29948dcbf84cc78d68ed2c4df4e695ac265cf53c339e5794008476e9befbbb"},
{file = "fastapi_slim-0.111.0.tar.gz", hash = "sha256:100720e4362ec4de97dee83a579b970e79fb5bf48073b37c9ce9b0e63dda4bec"}, {file = "fastapi_slim-0.111.1.tar.gz", hash = "sha256:f799a60658f56c49fe3842eb534730fabe1168731c0b407b98a042c8d57be39d"},
] ]
[package.dependencies] [package.dependencies]
@@ -696,7 +696,7 @@ typing-extensions = ">=4.8.0"
[package.extras] [package.extras]
all = ["email_validator (>=2.0.0)", "fastapi-cli (>=0.0.2)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] all = ["email_validator (>=2.0.0)", "fastapi-cli (>=0.0.2)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
standard = ["email_validator (>=2.0.0)", "fastapi-cli (>=0.0.2)", "httpx (>=0.23.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.7)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] standard = ["email_validator (>=2.0.0)", "fastapi-cli (>=0.0.2)", "httpx (>=0.23.0)", "jinja2 (>=2.11.2)", "python-multipart (>=0.0.7)", "uvicorn[standard] (>=0.12.0)"]
[[package]] [[package]]
name = "filelock" name = "filelock"
@@ -1236,13 +1236,13 @@ socks = ["socksio (==1.*)"]
[[package]] [[package]]
name = "huggingface-hub" name = "huggingface-hub"
version = "0.23.4" version = "0.24.0"
description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub"
optional = false optional = false
python-versions = ">=3.8.0" python-versions = ">=3.8.0"
files = [ files = [
{file = "huggingface_hub-0.23.4-py3-none-any.whl", hash = "sha256:3a0b957aa87150addf0cc7bd71b4d954b78e749850e1e7fb29ebbd2db64ca037"}, {file = "huggingface_hub-0.24.0-py3-none-any.whl", hash = "sha256:7ad92edefb93d8145c061f6df8d99df2ff85f8379ba5fac8a95aca0642afa5d7"},
{file = "huggingface_hub-0.23.4.tar.gz", hash = "sha256:35d99016433900e44ae7efe1c209164a5a81dbbcd53a52f99c281dcd7ce22431"}, {file = "huggingface_hub-0.24.0.tar.gz", hash = "sha256:6c7092736b577d89d57b3cdfea026f1b0dc2234ae783fa0d59caf1bf7d52dfa7"},
] ]
[package.dependencies] [package.dependencies]
@@ -1255,17 +1255,17 @@ tqdm = ">=4.42.1"
typing-extensions = ">=3.7.4.3" typing-extensions = ">=3.7.4.3"
[package.extras] [package.extras]
all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
cli = ["InquirerPy (==0.3.4)"] cli = ["InquirerPy (==0.3.4)"]
dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"]
hf-transfer = ["hf-transfer (>=0.1.4)"] hf-transfer = ["hf-transfer (>=0.1.4)"]
inference = ["aiohttp", "minijinja (>=1.0)"] inference = ["aiohttp", "minijinja (>=1.0)"]
quality = ["mypy (==1.5.1)", "ruff (>=0.3.0)"] quality = ["mypy (==1.5.1)", "ruff (>=0.5.0)"]
tensorflow = ["graphviz", "pydot", "tensorflow"] tensorflow = ["graphviz", "pydot", "tensorflow"]
tensorflow-testing = ["keras (<3.0)", "tensorflow"] tensorflow-testing = ["keras (<3.0)", "tensorflow"]
testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"]
torch = ["safetensors", "torch"] torch = ["safetensors[torch]", "torch"]
typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"]
[[package]] [[package]]
@@ -1530,13 +1530,13 @@ test = ["pytest (>=7.4)", "pytest-cov (>=4.1)"]
[[package]] [[package]]
name = "locust" name = "locust"
version = "2.29.0" version = "2.29.1"
description = "Developer-friendly load testing framework" description = "Developer-friendly load testing framework"
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
files = [ files = [
{file = "locust-2.29.0-py3-none-any.whl", hash = "sha256:aa9d94d3604ed9f2aab3248460d91e55d3de980a821dffdf8658b439b049d03f"}, {file = "locust-2.29.1-py3-none-any.whl", hash = "sha256:8b15daab44cdf50eef1860a32bb30969423e3795247115e5a37446da3240c6d6"},
{file = "locust-2.29.0.tar.gz", hash = "sha256:649c99ce49d00720a3084c0109547035ad9021222835386599a8b545d31ebe51"}, {file = "locust-2.29.1.tar.gz", hash = "sha256:2e0628a59e2689a50cb4735a9a43709e30f2da7ed276c15d877c5325507f44b1"},
] ]
[package.dependencies] [package.dependencies]
@@ -1555,6 +1555,7 @@ requests = [
{version = ">=2.26.0", markers = "python_version <= \"3.11\""}, {version = ">=2.26.0", markers = "python_version <= \"3.11\""},
] ]
tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.11\""}
Werkzeug = ">=2.0.0" Werkzeug = ">=2.0.0"
[[package]] [[package]]
@@ -1793,44 +1794,44 @@ files = [
[[package]] [[package]]
name = "mypy" name = "mypy"
version = "1.10.0" version = "1.11.0"
description = "Optional static typing for Python" description = "Optional static typing for Python"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "mypy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da1cbf08fb3b851ab3b9523a884c232774008267b1f83371ace57f412fe308c2"}, {file = "mypy-1.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3824187c99b893f90c845bab405a585d1ced4ff55421fdf5c84cb7710995229"},
{file = "mypy-1.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12b6bfc1b1a66095ab413160a6e520e1dc076a28f3e22f7fb25ba3b000b4ef99"}, {file = "mypy-1.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:96f8dbc2c85046c81bcddc246232d500ad729cb720da4e20fce3b542cab91287"},
{file = "mypy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e36fb078cce9904c7989b9693e41cb9711e0600139ce3970c6ef814b6ebc2b2"}, {file = "mypy-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a5d8d8dd8613a3e2be3eae829ee891b6b2de6302f24766ff06cb2875f5be9c6"},
{file = "mypy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b0695d605ddcd3eb2f736cd8b4e388288c21e7de85001e9f85df9187f2b50f9"}, {file = "mypy-1.11.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:72596a79bbfb195fd41405cffa18210af3811beb91ff946dbcb7368240eed6be"},
{file = "mypy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:cd777b780312ddb135bceb9bc8722a73ec95e042f911cc279e2ec3c667076051"}, {file = "mypy-1.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:35ce88b8ed3a759634cb4eb646d002c4cef0a38f20565ee82b5023558eb90c00"},
{file = "mypy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3be66771aa5c97602f382230165b856c231d1277c511c9a8dd058be4784472e1"}, {file = "mypy-1.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:98790025861cb2c3db8c2f5ad10fc8c336ed2a55f4daf1b8b3f877826b6ff2eb"},
{file = "mypy-1.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b2cbaca148d0754a54d44121b5825ae71868c7592a53b7292eeb0f3fdae95ee"}, {file = "mypy-1.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:25bcfa75b9b5a5f8d67147a54ea97ed63a653995a82798221cca2a315c0238c1"},
{file = "mypy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ec404a7cbe9fc0e92cb0e67f55ce0c025014e26d33e54d9e506a0f2d07fe5de"}, {file = "mypy-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bea2a0e71c2a375c9fa0ede3d98324214d67b3cbbfcbd55ac8f750f85a414e3"},
{file = "mypy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e22e1527dc3d4aa94311d246b59e47f6455b8729f4968765ac1eacf9a4760bc7"}, {file = "mypy-1.11.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2b3d36baac48e40e3064d2901f2fbd2a2d6880ec6ce6358825c85031d7c0d4d"},
{file = "mypy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:a87dbfa85971e8d59c9cc1fcf534efe664d8949e4c0b6b44e8ca548e746a8d53"}, {file = "mypy-1.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:d8e2e43977f0e09f149ea69fd0556623919f816764e26d74da0c8a7b48f3e18a"},
{file = "mypy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a781f6ad4bab20eef8b65174a57e5203f4be627b46291f4589879bf4e257b97b"}, {file = "mypy-1.11.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1d44c1e44a8be986b54b09f15f2c1a66368eb43861b4e82573026e04c48a9e20"},
{file = "mypy-1.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b808e12113505b97d9023b0b5e0c0705a90571c6feefc6f215c1df9381256e30"}, {file = "mypy-1.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cea3d0fb69637944dd321f41bc896e11d0fb0b0aa531d887a6da70f6e7473aba"},
{file = "mypy-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f55583b12156c399dce2df7d16f8a5095291354f1e839c252ec6c0611e86e2e"}, {file = "mypy-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a83ec98ae12d51c252be61521aa5731f5512231d0b738b4cb2498344f0b840cd"},
{file = "mypy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cf18f9d0efa1b16478c4c129eabec36148032575391095f73cae2e722fcf9d5"}, {file = "mypy-1.11.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7b73a856522417beb78e0fb6d33ef89474e7a622db2653bc1285af36e2e3e3d"},
{file = "mypy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc6ac273b23c6b82da3bb25f4136c4fd42665f17f2cd850771cb600bdd2ebeda"}, {file = "mypy-1.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:f2268d9fcd9686b61ab64f077be7ffbc6fbcdfb4103e5dd0cc5eaab53a8886c2"},
{file = "mypy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9fd50226364cd2737351c79807775136b0abe084433b55b2e29181a4c3c878c0"}, {file = "mypy-1.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:940bfff7283c267ae6522ef926a7887305945f716a7704d3344d6d07f02df850"},
{file = "mypy-1.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f90cff89eea89273727d8783fef5d4a934be2fdca11b47def50cf5d311aff727"}, {file = "mypy-1.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:14f9294528b5f5cf96c721f231c9f5b2733164e02c1c018ed1a0eff8a18005ac"},
{file = "mypy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcfc70599efde5c67862a07a1aaf50e55bce629ace26bb19dc17cece5dd31ca4"}, {file = "mypy-1.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7b54c27783991399046837df5c7c9d325d921394757d09dbcbf96aee4649fe9"},
{file = "mypy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:075cbf81f3e134eadaf247de187bd604748171d6b79736fa9b6c9685b4083061"}, {file = "mypy-1.11.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:65f190a6349dec29c8d1a1cd4aa71284177aee5949e0502e6379b42873eddbe7"},
{file = "mypy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:3f298531bca95ff615b6e9f2fc0333aae27fa48052903a0ac90215021cdcfa4f"}, {file = "mypy-1.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:dbe286303241fea8c2ea5466f6e0e6a046a135a7e7609167b07fd4e7baf151bf"},
{file = "mypy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa7ef5244615a2523b56c034becde4e9e3f9b034854c93639adb667ec9ec2976"}, {file = "mypy-1.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:104e9c1620c2675420abd1f6c44bab7dd33cc85aea751c985006e83dcd001095"},
{file = "mypy-1.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3236a4c8f535a0631f85f5fcdffba71c7feeef76a6002fcba7c1a8e57c8be1ec"}, {file = "mypy-1.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f006e955718ecd8d159cee9932b64fba8f86ee6f7728ca3ac66c3a54b0062abe"},
{file = "mypy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2b5cdbb5dd35aa08ea9114436e0d79aceb2f38e32c21684dcf8e24e1e92821"}, {file = "mypy-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:becc9111ca572b04e7e77131bc708480cc88a911adf3d0239f974c034b78085c"},
{file = "mypy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92f93b21c0fe73dc00abf91022234c79d793318b8a96faac147cd579c1671746"}, {file = "mypy-1.11.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6801319fe76c3f3a3833f2b5af7bd2c17bb93c00026a2a1b924e6762f5b19e13"},
{file = "mypy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:28d0e038361b45f099cc086d9dd99c15ff14d0188f44ac883010e172ce86c38a"}, {file = "mypy-1.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:c1a184c64521dc549324ec6ef7cbaa6b351912be9cb5edb803c2808a0d7e85ac"},
{file = "mypy-1.10.0-py3-none-any.whl", hash = "sha256:f8c083976eb530019175aabadb60921e73b4f45736760826aa1689dda8208aee"}, {file = "mypy-1.11.0-py3-none-any.whl", hash = "sha256:56913ec8c7638b0091ef4da6fcc9136896914a9d60d54670a75880c3e5b99ace"},
{file = "mypy-1.10.0.tar.gz", hash = "sha256:3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131"}, {file = "mypy-1.11.0.tar.gz", hash = "sha256:93743608c7348772fdc717af4aeee1997293a1ad04bc0ea6efa15bf65385c538"},
] ]
[package.dependencies] [package.dependencies]
mypy-extensions = ">=1.0.0" mypy-extensions = ">=1.0.0"
tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
typing-extensions = ">=4.1.0" typing-extensions = ">=4.6.0"
[package.extras] [package.extras]
dmypy = ["psutil (>=4.0)"] dmypy = ["psutil (>=4.0)"]
@@ -1869,47 +1870,47 @@ test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"]
[[package]] [[package]]
name = "numpy" name = "numpy"
version = "1.26.3" version = "1.26.4"
description = "Fundamental package for array computing in Python" description = "Fundamental package for array computing in Python"
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
files = [ files = [
{file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"},
{file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"},
{file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"},
{file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"},
{file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"},
{file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"},
{file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"},
{file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"},
{file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"},
{file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"},
{file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"},
{file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"},
{file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"},
{file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"},
{file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"},
{file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"},
{file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"},
{file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"},
{file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"},
{file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"},
{file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"},
{file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"},
{file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"},
{file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"},
{file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"},
{file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"},
{file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"},
{file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"},
{file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"},
{file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"},
{file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"},
{file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"},
{file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"},
{file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"},
{file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"},
{file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"},
] ]
[[package]] [[package]]
@@ -1961,69 +1962,69 @@ reference = ["Pillow", "google-re2"]
[[package]] [[package]]
name = "onnxruntime" name = "onnxruntime"
version = "1.18.0" version = "1.18.1"
description = "ONNX Runtime is a runtime accelerator for Machine Learning models" description = "ONNX Runtime is a runtime accelerator for Machine Learning models"
optional = false optional = false
python-versions = "*" python-versions = "*"
files = [ files = [
{file = "onnxruntime-1.18.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:5a3b7993a5ecf4a90f35542a4757e29b2d653da3efe06cdd3164b91167bbe10d"}, {file = "onnxruntime-1.18.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:29ef7683312393d4ba04252f1b287d964bd67d5e6048b94d2da3643986c74d80"},
{file = "onnxruntime-1.18.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15b944623b2cdfe7f7945690bfb71c10a4531b51997c8320b84e7b0bb59af902"}, {file = "onnxruntime-1.18.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc706eb1df06ddf55776e15a30519fb15dda7697f987a2bbda4962845e3cec05"},
{file = "onnxruntime-1.18.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e61ce5005118064b1a0ed73ebe936bc773a102f067db34108ea6c64dd62a179"}, {file = "onnxruntime-1.18.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7de69f5ced2a263531923fa68bbec52a56e793b802fcd81a03487b5e292bc3a"},
{file = "onnxruntime-1.18.0-cp310-cp310-win32.whl", hash = "sha256:a4fc8a2a526eb442317d280610936a9f73deece06c7d5a91e51570860802b93f"}, {file = "onnxruntime-1.18.1-cp310-cp310-win32.whl", hash = "sha256:221e5b16173926e6c7de2cd437764492aa12b6811f45abd37024e7cf2ae5d7e3"},
{file = "onnxruntime-1.18.0-cp310-cp310-win_amd64.whl", hash = "sha256:71ed219b768cab004e5cd83e702590734f968679bf93aa488c1a7ffbe6e220c3"}, {file = "onnxruntime-1.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:75211b619275199c861ee94d317243b8a0fcde6032e5a80e1aa9ded8ab4c6060"},
{file = "onnxruntime-1.18.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:3d24bd623872a72a7fe2f51c103e20fcca2acfa35d48f2accd6be1ec8633d960"}, {file = "onnxruntime-1.18.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:f26582882f2dc581b809cfa41a125ba71ad9e715738ec6402418df356969774a"},
{file = "onnxruntime-1.18.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f15e41ca9b307a12550bfd2ec93f88905d9fba12bab7e578f05138ad0ae10d7b"}, {file = "onnxruntime-1.18.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef36f3a8b768506d02be349ac303fd95d92813ba3ba70304d40c3cd5c25d6a4c"},
{file = "onnxruntime-1.18.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f45ca2887f62a7b847d526965686b2923efa72538c89b7703c7b3fe970afd59"}, {file = "onnxruntime-1.18.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:170e711393e0618efa8ed27b59b9de0ee2383bd2a1f93622a97006a5ad48e434"},
{file = "onnxruntime-1.18.0-cp311-cp311-win32.whl", hash = "sha256:9e24d9ecc8781323d9e2eeda019b4b24babc4d624e7d53f61b1fe1a929b0511a"}, {file = "onnxruntime-1.18.1-cp311-cp311-win32.whl", hash = "sha256:9b6a33419b6949ea34e0dc009bc4470e550155b6da644571ecace4b198b0d88f"},
{file = "onnxruntime-1.18.0-cp311-cp311-win_amd64.whl", hash = "sha256:f8608398976ed18aef450d83777ff6f77d0b64eced1ed07a985e1a7db8ea3771"}, {file = "onnxruntime-1.18.1-cp311-cp311-win_amd64.whl", hash = "sha256:5c1380a9f1b7788da742c759b6a02ba771fe1ce620519b2b07309decbd1a2fe1"},
{file = "onnxruntime-1.18.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:f1d79941f15fc40b1ee67738b2ca26b23e0181bf0070b5fb2984f0988734698f"}, {file = "onnxruntime-1.18.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:31bd57a55e3f983b598675dfc7e5d6f0877b70ec9864b3cc3c3e1923d0a01919"},
{file = "onnxruntime-1.18.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e8caf3a8565c853a22d323a3eebc2a81e3de7591981f085a4f74f7a60aab2d"}, {file = "onnxruntime-1.18.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9e03c4ba9f734500691a4d7d5b381cd71ee2f3ce80a1154ac8f7aed99d1ecaa"},
{file = "onnxruntime-1.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:498d2b8380635f5e6ebc50ec1b45f181588927280f32390fb910301d234f97b8"}, {file = "onnxruntime-1.18.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:781aa9873640f5df24524f96f6070b8c550c66cb6af35710fd9f92a20b4bfbf6"},
{file = "onnxruntime-1.18.0-cp312-cp312-win32.whl", hash = "sha256:ba7cc0ce2798a386c082aaa6289ff7e9bedc3dee622eef10e74830cff200a72e"}, {file = "onnxruntime-1.18.1-cp312-cp312-win32.whl", hash = "sha256:3a2d9ab6254ca62adbb448222e630dc6883210f718065063518c8f93a32432be"},
{file = "onnxruntime-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:1fa175bd43f610465d5787ae06050c81f7ce09da2bf3e914eb282cb8eab363ef"}, {file = "onnxruntime-1.18.1-cp312-cp312-win_amd64.whl", hash = "sha256:ad93c560b1c38c27c0275ffd15cd7f45b3ad3fc96653c09ce2931179982ff204"},
{file = "onnxruntime-1.18.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:0284c579c20ec8b1b472dd190290a040cc68b6caec790edb960f065d15cf164a"}, {file = "onnxruntime-1.18.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:3b55dc9d3c67626388958a3eb7ad87eb7c70f75cb0f7ff4908d27b8b42f2475c"},
{file = "onnxruntime-1.18.0-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d47353d036d8c380558a5643ea5f7964d9d259d31c86865bad9162c3e916d1f6"}, {file = "onnxruntime-1.18.1-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f80dbcfb6763cc0177a31168b29b4bd7662545b99a19e211de8c734b657e0669"},
{file = "onnxruntime-1.18.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:885509d2b9ba4b01f08f7fa28d31ee54b6477953451c7ccf124a84625f07c803"}, {file = "onnxruntime-1.18.1-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1ff2c61a16d6c8631796c54139bafea41ee7736077a0fc64ee8ae59432f5c58"},
{file = "onnxruntime-1.18.0-cp38-cp38-win32.whl", hash = "sha256:8614733de3695656411d71fc2f39333170df5da6c7efd6072a59962c0bc7055c"}, {file = "onnxruntime-1.18.1-cp38-cp38-win32.whl", hash = "sha256:219855bd272fe0c667b850bf1a1a5a02499269a70d59c48e6f27f9c8bcb25d02"},
{file = "onnxruntime-1.18.0-cp38-cp38-win_amd64.whl", hash = "sha256:47af3f803752fce23ea790fd8d130a47b2b940629f03193f780818622e856e7a"}, {file = "onnxruntime-1.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:afdf16aa607eb9a2c60d5ca2d5abf9f448e90c345b6b94c3ed14f4fb7e6a2d07"},
{file = "onnxruntime-1.18.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:9153eb2b4d5bbab764d0aea17adadffcfc18d89b957ad191b1c3650b9930c59f"}, {file = "onnxruntime-1.18.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:128df253ade673e60cea0955ec9d0e89617443a6d9ce47c2d79eb3f72a3be3de"},
{file = "onnxruntime-1.18.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c7fd86eca727c989bb8d9c5104f3c45f7ee45f445cc75579ebe55d6b99dfd7c"}, {file = "onnxruntime-1.18.1-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9839491e77e5c5a175cab3621e184d5a88925ee297ff4c311b68897197f4cde9"},
{file = "onnxruntime-1.18.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac67a4de9c1326c4d87bcbfb652c923039b8a2446bb28516219236bec3b494f5"}, {file = "onnxruntime-1.18.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad3187c1faff3ac15f7f0e7373ef4788c582cafa655a80fdbb33eaec88976c66"},
{file = "onnxruntime-1.18.0-cp39-cp39-win32.whl", hash = "sha256:6ffb445816d06497df7a6dd424b20e0b2c39639e01e7fe210e247b82d15a23b9"}, {file = "onnxruntime-1.18.1-cp39-cp39-win32.whl", hash = "sha256:34657c78aa4e0b5145f9188b550ded3af626651b15017bf43d280d7e23dbf195"},
{file = "onnxruntime-1.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:46de6031cb6745f33f7eca9e51ab73e8c66037fb7a3b6b4560887c5b55ab5d5d"}, {file = "onnxruntime-1.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:9c14fd97c3ddfa97da5feef595e2c73f14c2d0ec1d4ecbea99c8d96603c89589"},
] ]
[package.dependencies] [package.dependencies]
coloredlogs = "*" coloredlogs = "*"
flatbuffers = "*" flatbuffers = "*"
numpy = ">=1.21.6" numpy = ">=1.21.6,<2.0"
packaging = "*" packaging = "*"
protobuf = "*" protobuf = "*"
sympy = "*" sympy = "*"
[[package]] [[package]]
name = "onnxruntime-gpu" name = "onnxruntime-gpu"
version = "1.18.0" version = "1.18.1"
description = "ONNX Runtime is a runtime accelerator for Machine Learning models" description = "ONNX Runtime is a runtime accelerator for Machine Learning models"
optional = false optional = false
python-versions = "*" python-versions = "*"
files = [ files = [
{file = "onnxruntime_gpu-1.18.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:039be9a6b7f71c6739e97eec79f4bf240793a7c0c4108a09e0e1a27b4c33dbca"}, {file = "onnxruntime_gpu-1.18.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4e9a52f5d43a84fe29e135da6bf10daa18836c81bed9060a5924efd6afc0d259"},
{file = "onnxruntime_gpu-1.18.0-cp310-cp310-win_amd64.whl", hash = "sha256:afd4bc090b9412ab695cb34c05f4f92f88dbb6bd52d9b38658ad0115c50ff653"}, {file = "onnxruntime_gpu-1.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:e7c1c665e8a11a5cf15369948b04288dc0a6812ad2e6beaff93a3d157c864d9a"},
{file = "onnxruntime_gpu-1.18.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2280f94c6be2717f010a73c30a94c2721af853c6b7110e83afa52d03de6614a8"}, {file = "onnxruntime_gpu-1.18.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1334f802cb1e4e2eb6ceebc4ef71ba44f3ef444d34216baafb940368a7a5d2f5"},
{file = "onnxruntime_gpu-1.18.0-cp311-cp311-win_amd64.whl", hash = "sha256:9e3b4e9a0171e53a71001805b9b0e1a98cbad5a413d795c0e132b0f058b386d6"}, {file = "onnxruntime_gpu-1.18.1-cp311-cp311-win_amd64.whl", hash = "sha256:0ffcc711e89b80c935d5172544f8a605b11525fc1e6f0e78ee79e2c28956e2d9"},
{file = "onnxruntime_gpu-1.18.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:546fbf2dcb7a2830ca69bde0c38665a88a9454e923ebb76bedf85eaed33a6f4a"}, {file = "onnxruntime_gpu-1.18.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbb1a6c986b2392eebaebc43e198a1614e3f7d2c191725002dbfa0dceb24454b"},
{file = "onnxruntime_gpu-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:24146aa670c45734d9b8583cd78bd790363bc8695a3808d129ec913186064e4c"}, {file = "onnxruntime_gpu-1.18.1-cp312-cp312-win_amd64.whl", hash = "sha256:bee352929e6eec2ff4e11e323a025ed8bd5eac24795005bc502ac740971fa7bd"},
{file = "onnxruntime_gpu-1.18.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:75884c51c2aa47c349de3b5485df7f9573e1b89c607dd55984d3fe40615ef002"}, {file = "onnxruntime_gpu-1.18.1-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:76d307a849a863d0457869febe4b2fd2fc07c7f26385c7339d17066312fa6be0"},
{file = "onnxruntime_gpu-1.18.0-cp38-cp38-win_amd64.whl", hash = "sha256:f3b00a7443252dbfbd18ff72bcc2f44066fad9128eaa29bff8b315a834241701"}, {file = "onnxruntime_gpu-1.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:b7498d6c64a03558308ce6d7d14dab306ea90d1204b563890c4d2d26c1b520f0"},
{file = "onnxruntime_gpu-1.18.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:14f53bd74ad21c61fee55eca988758e5eec4c39450040c8986ec3a960cb127a8"}, {file = "onnxruntime_gpu-1.18.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a1d8113cb4b8a51b195fae91cfeb6849728462a4b46aaf51b6764c44e54f81f"},
{file = "onnxruntime_gpu-1.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:aea5c02b3a0ee6682214a61a2a0467773401b075afdcb41dc2ef595f41c2d185"}, {file = "onnxruntime_gpu-1.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:fc1d2544a39f5db64c5b8a0c24d0b934d7d64682e6d70763eb2cc726b1fd6c3f"},
] ]
[package.dependencies] [package.dependencies]
coloredlogs = "*" coloredlogs = "*"
flatbuffers = "*" flatbuffers = "*"
numpy = ">=1.21.6" numpy = ">=1.21.6,<2.0"
packaging = "*" packaging = "*"
protobuf = "*" protobuf = "*"
sympy = "*" sympy = "*"
@@ -2035,22 +2036,22 @@ reference = "cuda12"
[[package]] [[package]]
name = "onnxruntime-openvino" name = "onnxruntime-openvino"
version = "1.17.1" version = "1.18.0"
description = "ONNX Runtime is a runtime accelerator for Machine Learning models" description = "ONNX Runtime is a runtime accelerator for Machine Learning models"
optional = false optional = false
python-versions = "*" python-versions = "*"
files = [ files = [
{file = "onnxruntime_openvino-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ed693011b472f9a617b2d5c4785d5fa1e1b77f7cb2b02e47b899534ec6c6396"}, {file = "onnxruntime_openvino-1.18.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:565b874d21bcd48126da7d62f57db019f5ec0e1f82ae9b0740afa2ad91f8d331"},
{file = "onnxruntime_openvino-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:5152b5e56e83e022ced2986700d68dd8ba7b1466761725ce774f679c5710ab87"}, {file = "onnxruntime_openvino-1.18.0-cp310-cp310-win_amd64.whl", hash = "sha256:7f1931060f710a6c8e32121bb73044c4772ef5925802fc8776d3fe1e87ab3f75"},
{file = "onnxruntime_openvino-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ce3b1aa06d6b8b732d314d217028ec4735de5806215c44d3bdbcad03b9260d5"}, {file = "onnxruntime_openvino-1.18.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb1723d386f70a8e26398d983ebe35d2c25ba56e9cdb382670ebbf1f5139f8ba"},
{file = "onnxruntime_openvino-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:21133a701bb07ea19e01f48b8c23beee575f2e879f49173843f275d7c91a625a"}, {file = "onnxruntime_openvino-1.18.0-cp311-cp311-win_amd64.whl", hash = "sha256:874a1e263dd86674593e5a879257650b06a8609c4d5768c3d8ed8dc4ae874b9c"},
{file = "onnxruntime_openvino-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76824dac3c392ad4b812f29c18be2055ab3bba2e3c111e44baae847b33d5b081"}, {file = "onnxruntime_openvino-1.18.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:597eb18f3de7ead69b08a242d74c4573b28bbfba40ca2a1a40f75bf7a834808e"},
] ]
[package.dependencies] [package.dependencies]
coloredlogs = "*" coloredlogs = "*"
flatbuffers = "*" flatbuffers = "*"
numpy = ">=1.25.2" numpy = ">=1.26.4"
packaging = "*" packaging = "*"
protobuf = "*" protobuf = "*"
sympy = "*" sympy = "*"
@@ -2081,57 +2082,62 @@ numpy = [
[[package]] [[package]]
name = "orjson" name = "orjson"
version = "3.10.5" version = "3.10.6"
description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "orjson-3.10.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932"}, {file = "orjson-3.10.6-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:fb0ee33124db6eaa517d00890fc1a55c3bfe1cf78ba4a8899d71a06f2d6ff5c7"},
{file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1"}, {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c1c4b53b24a4c06547ce43e5fee6ec4e0d8fe2d597f4647fc033fd205707365"},
{file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6"}, {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eadc8fd310edb4bdbd333374f2c8fec6794bbbae99b592f448d8214a5e4050c0"},
{file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63"}, {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61272a5aec2b2661f4fa2b37c907ce9701e821b2c1285d5c3ab0207ebd358d38"},
{file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c"}, {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57985ee7e91d6214c837936dc1608f40f330a6b88bb13f5a57ce5257807da143"},
{file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96"}, {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:633a3b31d9d7c9f02d49c4ab4d0a86065c4a6f6adc297d63d272e043472acab5"},
{file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b"}, {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1c680b269d33ec444afe2bdc647c9eb73166fa47a16d9a75ee56a374f4a45f43"},
{file = "orjson-3.10.5-cp310-none-win32.whl", hash = "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2"}, {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f759503a97a6ace19e55461395ab0d618b5a117e8d0fbb20e70cfd68a47327f2"},
{file = "orjson-3.10.5-cp310-none-win_amd64.whl", hash = "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228"}, {file = "orjson-3.10.6-cp310-none-win32.whl", hash = "sha256:95a0cce17f969fb5391762e5719575217bd10ac5a189d1979442ee54456393f3"},
{file = "orjson-3.10.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40"}, {file = "orjson-3.10.6-cp310-none-win_amd64.whl", hash = "sha256:df25d9271270ba2133cc88ee83c318372bdc0f2cd6f32e7a450809a111efc45c"},
{file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a"}, {file = "orjson-3.10.6-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b1ec490e10d2a77c345def52599311849fc063ae0e67cf4f84528073152bb2ba"},
{file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38"}, {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d43d3feb8f19d07e9f01e5b9be4f28801cf7c60d0fa0d279951b18fae1932b"},
{file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1"}, {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3045267e98fe749408eee1593a142e02357c5c99be0802185ef2170086a863"},
{file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5"}, {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c27bc6a28ae95923350ab382c57113abd38f3928af3c80be6f2ba7eb8d8db0b0"},
{file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f"}, {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d27456491ca79532d11e507cadca37fb8c9324a3976294f68fb1eff2dc6ced5a"},
{file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa"}, {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05ac3d3916023745aa3b3b388e91b9166be1ca02b7c7e41045da6d12985685f0"},
{file = "orjson-3.10.5-cp311-none-win32.whl", hash = "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04"}, {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1335d4ef59ab85cab66fe73fd7a4e881c298ee7f63ede918b7faa1b27cbe5212"},
{file = "orjson-3.10.5-cp311-none-win_amd64.whl", hash = "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c"}, {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4bbc6d0af24c1575edc79994c20e1b29e6fb3c6a570371306db0993ecf144dc5"},
{file = "orjson-3.10.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f"}, {file = "orjson-3.10.6-cp311-none-win32.whl", hash = "sha256:450e39ab1f7694465060a0550b3f6d328d20297bf2e06aa947b97c21e5241fbd"},
{file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268"}, {file = "orjson-3.10.6-cp311-none-win_amd64.whl", hash = "sha256:227df19441372610b20e05bdb906e1742ec2ad7a66ac8350dcfd29a63014a83b"},
{file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e"}, {file = "orjson-3.10.6-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ea2977b21f8d5d9b758bb3f344a75e55ca78e3ff85595d248eee813ae23ecdfb"},
{file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969"}, {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6f3d167d13a16ed263b52dbfedff52c962bfd3d270b46b7518365bcc2121eed"},
{file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b"}, {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f710f346e4c44a4e8bdf23daa974faede58f83334289df80bc9cd12fe82573c7"},
{file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211"}, {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7275664f84e027dcb1ad5200b8b18373e9c669b2a9ec33d410c40f5ccf4b257e"},
{file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3"}, {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0943e4c701196b23c240b3d10ed8ecd674f03089198cf503105b474a4f77f21f"},
{file = "orjson-3.10.5-cp312-none-win32.whl", hash = "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2"}, {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:446dee5a491b5bc7d8f825d80d9637e7af43f86a331207b9c9610e2f93fee22a"},
{file = "orjson-3.10.5-cp312-none-win_amd64.whl", hash = "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5"}, {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:64c81456d2a050d380786413786b057983892db105516639cb5d3ee3c7fd5148"},
{file = "orjson-3.10.5-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01"}, {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:960db0e31c4e52fa0fc3ecbaea5b2d3b58f379e32a95ae6b0ebeaa25b93dfd34"},
{file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26"}, {file = "orjson-3.10.6-cp312-none-win32.whl", hash = "sha256:a6ea7afb5b30b2317e0bee03c8d34c8181bc5a36f2afd4d0952f378972c4efd5"},
{file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6"}, {file = "orjson-3.10.6-cp312-none-win_amd64.whl", hash = "sha256:874ce88264b7e655dde4aeaacdc8fd772a7962faadfb41abe63e2a4861abc3dc"},
{file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d"}, {file = "orjson-3.10.6-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:66680eae4c4e7fc193d91cfc1353ad6d01b4801ae9b5314f17e11ba55e934183"},
{file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e"}, {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caff75b425db5ef8e8f23af93c80f072f97b4fb3afd4af44482905c9f588da28"},
{file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9"}, {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3722fddb821b6036fd2a3c814f6bd9b57a89dc6337b9924ecd614ebce3271394"},
{file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b"}, {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2c116072a8533f2fec435fde4d134610f806bdac20188c7bd2081f3e9e0133f"},
{file = "orjson-3.10.5-cp38-none-win32.whl", hash = "sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4"}, {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6eeb13218c8cf34c61912e9df2de2853f1d009de0e46ea09ccdf3d757896af0a"},
{file = "orjson-3.10.5-cp38-none-win_amd64.whl", hash = "sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09"}, {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:965a916373382674e323c957d560b953d81d7a8603fbeee26f7b8248638bd48b"},
{file = "orjson-3.10.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807"}, {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03c95484d53ed8e479cade8628c9cea00fd9d67f5554764a1110e0d5aa2de96e"},
{file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"}, {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e060748a04cccf1e0a6f2358dffea9c080b849a4a68c28b1b907f272b5127e9b"},
{file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a"}, {file = "orjson-3.10.6-cp38-none-win32.whl", hash = "sha256:738dbe3ef909c4b019d69afc19caf6b5ed0e2f1c786b5d6215fbb7539246e4c6"},
{file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139"}, {file = "orjson-3.10.6-cp38-none-win_amd64.whl", hash = "sha256:d40f839dddf6a7d77114fe6b8a70218556408c71d4d6e29413bb5f150a692ff7"},
{file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214"}, {file = "orjson-3.10.6-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:697a35a083c4f834807a6232b3e62c8b280f7a44ad0b759fd4dce748951e70db"},
{file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595"}, {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd502f96bf5ea9a61cbc0b2b5900d0dd68aa0da197179042bdd2be67e51a1e4b"},
{file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86"}, {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f215789fb1667cdc874c1b8af6a84dc939fd802bf293a8334fce185c79cd359b"},
{file = "orjson-3.10.5-cp39-none-win32.whl", hash = "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47"}, {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2debd8ddce948a8c0938c8c93ade191d2f4ba4649a54302a7da905a81f00b56"},
{file = "orjson-3.10.5-cp39-none-win_amd64.whl", hash = "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7"}, {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5410111d7b6681d4b0d65e0f58a13be588d01b473822483f77f513c7f93bd3b2"},
{file = "orjson-3.10.5.tar.gz", hash = "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d"}, {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb1f28a137337fdc18384079fa5726810681055b32b92253fa15ae5656e1dddb"},
{file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bf2fbbce5fe7cd1aa177ea3eab2b8e6a6bc6e8592e4279ed3db2d62e57c0e1b2"},
{file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:79b9b9e33bd4c517445a62b90ca0cc279b0f1f3970655c3df9e608bc3f91741a"},
{file = "orjson-3.10.6-cp39-none-win32.whl", hash = "sha256:30b0a09a2014e621b1adf66a4f705f0809358350a757508ee80209b2d8dae219"},
{file = "orjson-3.10.6-cp39-none-win_amd64.whl", hash = "sha256:49e3bc615652617d463069f91b867a4458114c5b104e13b7ae6872e5f79d0844"},
{file = "orjson-3.10.6.tar.gz", hash = "sha256:e54b63d0a7c6c54a5f5f726bc93a2078111ef060fec4ecbf34c5db800ca3b3a7"},
] ]
[[package]] [[package]]
@@ -2158,84 +2164,95 @@ files = [
[[package]] [[package]]
name = "pillow" name = "pillow"
version = "10.3.0" version = "10.4.0"
description = "Python Imaging Library (Fork)" description = "Python Imaging Library (Fork)"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"},
{file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"},
{file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"},
{file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"},
{file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"},
{file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"},
{file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"},
{file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"},
{file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"},
{file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"},
{file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"},
{file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"},
{file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"},
{file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"},
{file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"},
{file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"},
{file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"},
{file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"},
{file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"},
{file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"},
{file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"},
{file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"},
{file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"},
{file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"},
{file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"},
{file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"},
{file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"},
{file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"},
{file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"},
{file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"},
{file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"},
{file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"},
{file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"},
{file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"},
{file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"},
{file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"},
{file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"},
{file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"},
{file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"},
{file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"},
{file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"},
{file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"},
{file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"},
{file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"},
{file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"},
{file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"},
{file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"},
{file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"},
{file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"},
{file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"},
{file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"},
{file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"},
{file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"},
{file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"},
{file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"},
{file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"},
{file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"},
{file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"},
{file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"},
{file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"},
{file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"},
{file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"},
{file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"},
{file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"},
{file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"},
{file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"},
] ]
[package.extras] [package.extras]
docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"]
fpx = ["olefile"] fpx = ["olefile"]
mic = ["olefile"] mic = ["olefile"]
tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"]
@@ -2471,13 +2488,13 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments
[[package]] [[package]]
name = "pytest-asyncio" name = "pytest-asyncio"
version = "0.23.7" version = "0.23.8"
description = "Pytest support for asyncio" description = "Pytest support for asyncio"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "pytest_asyncio-0.23.7-py3-none-any.whl", hash = "sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b"}, {file = "pytest_asyncio-0.23.8-py3-none-any.whl", hash = "sha256:50265d892689a5faefb84df80819d1ecef566eb3549cf915dfb33569359d1ce2"},
{file = "pytest_asyncio-0.23.7.tar.gz", hash = "sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268"}, {file = "pytest_asyncio-0.23.8.tar.gz", hash = "sha256:759b10b33a6dc61cce40a8bd5205e302978bbbcc00e279a8b61d9a6a3c82e4d3"},
] ]
[package.dependencies] [package.dependencies]
@@ -2810,28 +2827,29 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"]
[[package]] [[package]]
name = "ruff" name = "ruff"
version = "0.4.10" version = "0.5.4"
description = "An extremely fast Python linter and code formatter, written in Rust." description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "ruff-0.4.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5c2c4d0859305ac5a16310eec40e4e9a9dec5dcdfbe92697acd99624e8638dac"}, {file = "ruff-0.5.4-py3-none-linux_armv6l.whl", hash = "sha256:82acef724fc639699b4d3177ed5cc14c2a5aacd92edd578a9e846d5b5ec18ddf"},
{file = "ruff-0.4.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a79489607d1495685cdd911a323a35871abfb7a95d4f98fc6f85e799227ac46e"}, {file = "ruff-0.5.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:da62e87637c8838b325e65beee485f71eb36202ce8e3cdbc24b9fcb8b99a37be"},
{file = "ruff-0.4.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1dd1681dfa90a41b8376a61af05cc4dc5ff32c8f14f5fe20dba9ff5deb80cd6"}, {file = "ruff-0.5.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e98ad088edfe2f3b85a925ee96da652028f093d6b9b56b76fc242d8abb8e2059"},
{file = "ruff-0.4.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c75c53bb79d71310dc79fb69eb4902fba804a81f374bc86a9b117a8d077a1784"}, {file = "ruff-0.5.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c55efbecc3152d614cfe6c2247a3054cfe358cefbf794f8c79c8575456efe19"},
{file = "ruff-0.4.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18238c80ee3d9100d3535d8eb15a59c4a0753b45cc55f8bf38f38d6a597b9739"}, {file = "ruff-0.5.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9b85eaa1f653abd0a70603b8b7008d9e00c9fa1bbd0bf40dad3f0c0bdd06793"},
{file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d8f71885bce242da344989cae08e263de29752f094233f932d4f5cfb4ef36a81"}, {file = "ruff-0.5.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cf497a47751be8c883059c4613ba2f50dd06ec672692de2811f039432875278"},
{file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:330421543bd3222cdfec481e8ff3460e8702ed1e58b494cf9d9e4bf90db52b9d"}, {file = "ruff-0.5.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:09c14ed6a72af9ccc8d2e313d7acf7037f0faff43cde4b507e66f14e812e37f7"},
{file = "ruff-0.4.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e9b6fb3a37b772628415b00c4fc892f97954275394ed611056a4b8a2631365e"}, {file = "ruff-0.5.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:628f6b8f97b8bad2490240aa84f3e68f390e13fabc9af5c0d3b96b485921cd60"},
{file = "ruff-0.4.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f54c481b39a762d48f64d97351048e842861c6662d63ec599f67d515cb417f6"}, {file = "ruff-0.5.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3520a00c0563d7a7a7c324ad7e2cde2355733dafa9592c671fb2e9e3cd8194c1"},
{file = "ruff-0.4.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:67fe086b433b965c22de0b4259ddfe6fa541c95bf418499bedb9ad5fb8d1c631"}, {file = "ruff-0.5.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93789f14ca2244fb91ed481456f6d0bb8af1f75a330e133b67d08f06ad85b516"},
{file = "ruff-0.4.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:acfaaab59543382085f9eb51f8e87bac26bf96b164839955f244d07125a982ef"}, {file = "ruff-0.5.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:029454e2824eafa25b9df46882f7f7844d36fd8ce51c1b7f6d97e2615a57bbcc"},
{file = "ruff-0.4.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3cea07079962b2941244191569cf3a05541477286f5cafea638cd3aa94b56815"}, {file = "ruff-0.5.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9492320eed573a13a0bc09a2957f17aa733fff9ce5bf00e66e6d4a88ec33813f"},
{file = "ruff-0.4.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:338a64ef0748f8c3a80d7f05785930f7965d71ca260904a9321d13be24b79695"}, {file = "ruff-0.5.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a6e1f62a92c645e2919b65c02e79d1f61e78a58eddaebca6c23659e7c7cb4ac7"},
{file = "ruff-0.4.10-py3-none-win32.whl", hash = "sha256:ffe3cd2f89cb54561c62e5fa20e8f182c0a444934bf430515a4b422f1ab7b7ca"}, {file = "ruff-0.5.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:768fa9208df2bec4b2ce61dbc7c2ddd6b1be9fb48f1f8d3b78b3332c7d71c1ff"},
{file = "ruff-0.4.10-py3-none-win_amd64.whl", hash = "sha256:67f67cef43c55ffc8cc59e8e0b97e9e60b4837c8f21e8ab5ffd5d66e196e25f7"}, {file = "ruff-0.5.4-py3-none-win32.whl", hash = "sha256:e1e7393e9c56128e870b233c82ceb42164966f25b30f68acbb24ed69ce9c3a4e"},
{file = "ruff-0.4.10-py3-none-win_arm64.whl", hash = "sha256:dd1fcee327c20addac7916ca4e2653fbbf2e8388d8a6477ce5b4e986b68ae6c0"}, {file = "ruff-0.5.4-py3-none-win_amd64.whl", hash = "sha256:58b54459221fd3f661a7329f177f091eb35cf7a603f01d9eb3eb11cc348d38c4"},
{file = "ruff-0.4.10.tar.gz", hash = "sha256:3aa4f2bc388a30d346c56524f7cacca85945ba124945fe489952aadb6b5cd804"}, {file = "ruff-0.5.4-py3-none-win_arm64.whl", hash = "sha256:bd53da65f1085fb5b307c38fd3c0829e76acf7b2a912d8d79cadcdb4875c1eb7"},
{file = "ruff-0.5.4.tar.gz", hash = "sha256:2795726d5f71c4f4e70653273d1c23a8182f07dd8e48c12de5d867bfb7557eed"},
] ]
[[package]] [[package]]

View File

@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "machine-learning" name = "machine-learning"
version = "1.109.2" version = "1.110.0"
description = "" description = ""
authors = ["Hau Tran <alex.tran1502@gmail.com>"] authors = ["Hau Tran <alex.tran1502@gmail.com>"]
readme = "README.md" readme = "README.md"

View File

@@ -0,0 +1,13 @@
#!/usr/bin/env bash
set -e
sed -i -e's/ main/ main contrib non-free non-free-firmware/g' /etc/apt/sources.list.d/debian.sources
sed -i -e's/ bookworm-updates/ bookworm-updates sid/g' /etc/apt/sources.list.d/debian.sources
# default priority is 500, so we set unstable to 450 to prefer stable packages
cat > /etc/apt/preferences.d/preferences << EOL
Package: *
Pin: release a=unstable
Pin-Priority: 450
EOL

View File

@@ -1,3 +1,3 @@
{ {
"flutter": "3.22.2" "flutter": "3.22.3"
} }

View File

@@ -1,5 +1,5 @@
{ {
"dart.flutterSdkPath": ".fvm/versions/3.22.1", "dart.flutterSdkPath": ".fvm/versions/3.22.3",
"search.exclude": { "search.exclude": {
"**/.fvm": true "**/.fvm": true
}, },

View File

@@ -35,8 +35,8 @@ platform :android do
task: 'bundle', task: 'bundle',
build_type: 'Release', build_type: 'Release',
properties: { properties: {
"android.injected.version.code" => 150, "android.injected.version.code" => 151,
"android.injected.version.name" => "1.109.2", "android.injected.version.name" => "1.110.0",
} }
) )
upload_to_play_store(skip_upload_apk: true, skip_upload_images: true, skip_upload_screenshots: true, aab: '../build/app/outputs/bundle/release/app-release.aab') upload_to_play_store(skip_upload_apk: true, skip_upload_images: true, skip_upload_screenshots: true, aab: '../build/app/outputs/bundle/release/app-release.aab')

View File

@@ -3,6 +3,8 @@
"action_common_cancel": "Cancel", "action_common_cancel": "Cancel",
"action_common_clear": "Clear", "action_common_clear": "Clear",
"action_common_confirm": "Confirm", "action_common_confirm": "Confirm",
"action_common_save": "Save",
"action_common_select": "Select",
"action_common_update": "Update", "action_common_update": "Update",
"add_to_album_bottom_sheet_added": "Added to {album}", "add_to_album_bottom_sheet_added": "Added to {album}",
"add_to_album_bottom_sheet_already_exists": "Already in {album}", "add_to_album_bottom_sheet_already_exists": "Already in {album}",
@@ -146,6 +148,7 @@
"common_create_new_album": "Create new album", "common_create_new_album": "Create new album",
"common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.", "common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.",
"common_shared": "Shared", "common_shared": "Shared",
"contextual_search": "Sunrise on the beach",
"control_bottom_app_bar_add_to_album": "Add to album", "control_bottom_app_bar_add_to_album": "Add to album",
"control_bottom_app_bar_album_info": "{} items", "control_bottom_app_bar_album_info": "{} items",
"control_bottom_app_bar_album_info_shared": "{} items · Shared", "control_bottom_app_bar_album_info_shared": "{} items · Shared",
@@ -203,6 +206,7 @@
"experimental_settings_title": "Experimental", "experimental_settings_title": "Experimental",
"favorites_page_no_favorites": "No favorite assets found", "favorites_page_no_favorites": "No favorite assets found",
"favorites_page_title": "Favorites", "favorites_page_title": "Favorites",
"filename_search": "File name or extension",
"haptic_feedback_switch": "Enable haptic feedback", "haptic_feedback_switch": "Enable haptic feedback",
"haptic_feedback_title": "Haptic Feedback", "haptic_feedback_title": "Haptic Feedback",
"header_settings_add_header_tip": "Add Header", "header_settings_add_header_tip": "Add Header",
@@ -230,6 +234,8 @@
"image_viewer_page_state_provider_download_started": "Download Started", "image_viewer_page_state_provider_download_started": "Download Started",
"image_viewer_page_state_provider_download_success": "Download Success", "image_viewer_page_state_provider_download_success": "Download Success",
"image_viewer_page_state_provider_share_error": "Share Error", "image_viewer_page_state_provider_share_error": "Share Error",
"invalid_date": "Invalid date",
"invalid_date_format": "Invalid date format",
"library_page_albums": "Albums", "library_page_albums": "Albums",
"library_page_archive": "Archive", "library_page_archive": "Archive",
"library_page_device_albums": "Albums on Device", "library_page_device_albums": "Albums on Device",
@@ -311,6 +317,7 @@
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping", "multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping", "multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"no_assets_to_show": "No assets to show", "no_assets_to_show": "No assets to show",
"no_name": "No name",
"notification_permission_dialog_cancel": "Cancel", "notification_permission_dialog_cancel": "Cancel",
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.", "notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
"notification_permission_dialog_settings": "Settings", "notification_permission_dialog_settings": "Settings",
@@ -354,17 +361,30 @@
"scaffold_body_error_occurred": "Error occurred", "scaffold_body_error_occurred": "Error occurred",
"search_bar_hint": "Search your photos", "search_bar_hint": "Search your photos",
"search_filter_apply": "Apply filter", "search_filter_apply": "Apply filter",
"search_filter_camera": "Camera",
"search_filter_camera_make": "Make", "search_filter_camera_make": "Make",
"search_filter_camera_model": "Model", "search_filter_camera_model": "Model",
"search_filter_camera_title": "Select camera type",
"search_filter_date": "Date",
"search_filter_date_interval": "{start} to {end}",
"search_filter_date_title": "Select a date range",
"search_filter_display_option_archive": "Archive", "search_filter_display_option_archive": "Archive",
"search_filter_display_option_favorite": "Favorite", "search_filter_display_option_favorite": "Favorite",
"search_filter_display_option_not_in_album": "Not in album", "search_filter_display_option_not_in_album": "Not in album",
"search_filter_display_options": "Display Options",
"search_filter_display_options_title": "Display options",
"search_filter_location": "Location",
"search_filter_location_city": "City", "search_filter_location_city": "City",
"search_filter_location_country": "Country", "search_filter_location_country": "Country",
"search_filter_location_state": "State", "search_filter_location_state": "State",
"search_filter_location_title": "Select location",
"search_filter_media_type": "Media Type",
"search_filter_media_type_all": "All", "search_filter_media_type_all": "All",
"search_filter_media_type_image": "Image", "search_filter_media_type_image": "Image",
"search_filter_media_type_title": "Select media type",
"search_filter_media_type_video": "Video", "search_filter_media_type_video": "Video",
"search_filter_people": "People",
"search_filter_people_title": "Select people",
"search_page_categories": "Categories", "search_page_categories": "Categories",
"search_page_favorites": "Favorites", "search_page_favorites": "Favorites",
"search_page_motion_photos": "Motion Photos", "search_page_motion_photos": "Motion Photos",
@@ -418,15 +438,18 @@
"setting_notifications_total_progress_subtitle": "Overall upload progress (done/total assets)", "setting_notifications_total_progress_subtitle": "Overall upload progress (done/total assets)",
"setting_notifications_total_progress_title": "Show background backup total progress", "setting_notifications_total_progress_title": "Show background backup total progress",
"setting_pages_app_bar_settings": "Settings", "setting_pages_app_bar_settings": "Settings",
"settings_require_restart": "Please restart Immich to apply this setting",
"setting_video_viewer_looping_subtitle": "Enable to automatically loop a video in the detail viewer.", "setting_video_viewer_looping_subtitle": "Enable to automatically loop a video in the detail viewer.",
"setting_video_viewer_looping_title": "Looping", "setting_video_viewer_looping_title": "Looping",
"setting_video_viewer_title": "Videos", "setting_video_viewer_title": "Videos",
"settings_require_restart": "Please restart Immich to apply this setting",
"share_add": "Add", "share_add": "Add",
"share_add_photos": "Add photos", "share_add_photos": "Add photos",
"share_add_title": "Add a title", "share_add_title": "Add a title",
"share_assets_selected": "{} selected", "share_assets_selected": "{} selected",
"share_create_album": "Create album", "share_create_album": "Create album",
"share_dialog_preparing": "Preparing...",
"share_done": "Done",
"share_invite": "Invite to album",
"shared_album_activities_input_disable": "Comment is disabled", "shared_album_activities_input_disable": "Comment is disabled",
"shared_album_activities_input_hint": "Say something", "shared_album_activities_input_hint": "Say something",
"shared_album_activity_remove_content": "Do you want to delete this activity?", "shared_album_activity_remove_content": "Do you want to delete this activity?",
@@ -438,7 +461,6 @@
"shared_album_section_people_action_remove_user": "Remove user from album", "shared_album_section_people_action_remove_user": "Remove user from album",
"shared_album_section_people_owner_label": "Owner", "shared_album_section_people_owner_label": "Owner",
"shared_album_section_people_title": "PEOPLE", "shared_album_section_people_title": "PEOPLE",
"share_dialog_preparing": "Preparing...",
"shared_link_app_bar_title": "Shared Links", "shared_link_app_bar_title": "Shared Links",
"shared_link_clipboard_copied_massage": "Copied to clipboard", "shared_link_clipboard_copied_massage": "Copied to clipboard",
"shared_link_clipboard_text": "Link: {}\nPassword: {}", "shared_link_clipboard_text": "Link: {}\nPassword: {}",
@@ -484,14 +506,12 @@
"shared_link_info_chip_upload": "Upload", "shared_link_info_chip_upload": "Upload",
"shared_link_manage_links": "Manage Shared links", "shared_link_manage_links": "Manage Shared links",
"shared_link_public_album": "Public album", "shared_link_public_album": "Public album",
"share_done": "Done",
"share_invite": "Invite to album",
"sharing_page_album": "Shared albums", "sharing_page_album": "Shared albums",
"sharing_page_description": "Create shared albums to share photos and videos with people in your network.", "sharing_page_description": "Create shared albums to share photos and videos with people in your network.",
"sharing_page_empty_list": "EMPTY LIST", "sharing_page_empty_list": "EMPTY LIST",
"sharing_silver_appbar_create_shared_album": "New shared album", "sharing_silver_appbar_create_shared_album": "New shared album",
"sharing_silver_appbar_shared_links": "Shared links",
"sharing_silver_appbar_share_partner": "Share with partner", "sharing_silver_appbar_share_partner": "Share with partner",
"sharing_silver_appbar_shared_links": "Shared links",
"tab_controller_nav_library": "Library", "tab_controller_nav_library": "Library",
"tab_controller_nav_photos": "Photos", "tab_controller_nav_photos": "Photos",
"tab_controller_nav_search": "Search", "tab_controller_nav_search": "Search",
@@ -531,5 +551,19 @@
"version_announcement_overlay_title": "New Server Version Available \uD83C\uDF89", "version_announcement_overlay_title": "New Server Version Available \uD83C\uDF89",
"viewer_remove_from_stack": "Remove from Stack", "viewer_remove_from_stack": "Remove from Stack",
"viewer_stack_use_as_main_asset": "Use as Main Asset", "viewer_stack_use_as_main_asset": "Use as Main Asset",
"viewer_unstack": "Un-Stack" "viewer_unstack": "Un-Stack",
} "header_settings_header_name_input": "Header name",
"header_settings_header_value_input": "Header value",
"header_settings_page_title": "Proxy Headers",
"header_settings_add_header_tip": "Add Header",
"header_settings_field_validator_msg": "Value cannot be empty",
"client_cert_title": "SSL Client Certificate",
"client_cert_subtitle": "Supports PKCS12 (.p12, .pfx) format only. Certificate Import/Remove is available only before login",
"client_cert_import": "Import",
"client_cert_remove": "Remove",
"client_cert_remove_msg": "Client certificate is removed",
"client_cert_import_success_msg": "Client certificate is imported",
"client_cert_invalid_msg": "Invalid certificate file or wrong password",
"client_cert_dialog_msg_confirm": "OK",
"client_cert_enter_password": "Enter Password"
}

View File

@@ -205,7 +205,7 @@
"favorites_page_title": "Favoritos", "favorites_page_title": "Favoritos",
"haptic_feedback_switch": "Activar respuesta háptica", "haptic_feedback_switch": "Activar respuesta háptica",
"haptic_feedback_title": "Respuesta Háptica", "haptic_feedback_title": "Respuesta Háptica",
"header_settings_add_header_tip": "Add Header", "header_settings_add_header_tip": "Añadir cabecera",
"header_settings_field_validator_msg": "Value cannot be empty", "header_settings_field_validator_msg": "Value cannot be empty",
"header_settings_header_name_input": "Header name", "header_settings_header_name_input": "Header name",
"header_settings_header_value_input": "Header value", "header_settings_header_value_input": "Header value",
@@ -304,8 +304,8 @@
"memories_check_back_tomorrow": "Vuelve mañana para más recuerdos", "memories_check_back_tomorrow": "Vuelve mañana para más recuerdos",
"memories_start_over": "Empezar de nuevo", "memories_start_over": "Empezar de nuevo",
"memories_swipe_to_close": "Desliza para cerrar", "memories_swipe_to_close": "Desliza para cerrar",
"memories_year_ago": "A year ago", "memories_year_ago": "Hace un año",
"memories_years_ago": "{} years ago", "memories_years_ago": "Hace {} años",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Foto en Movimiento", "motion_photos_page_title": "Foto en Movimiento",
"multiselect_grid_edit_date_time_err_read_only": "No se puede cambiar la fecha del archivo(s) de solo lectura, omitiendo", "multiselect_grid_edit_date_time_err_read_only": "No se puede cambiar la fecha del archivo(s) de solo lectura, omitiendo",
@@ -402,7 +402,7 @@
"setting_image_viewer_original_title": "Cargar imagen original", "setting_image_viewer_original_title": "Cargar imagen original",
"setting_image_viewer_preview_subtitle": "Activar para cargar una imagen de resolución media. Deshabilitar para cargar directamente la imagen original o usar una miniatura.", "setting_image_viewer_preview_subtitle": "Activar para cargar una imagen de resolución media. Deshabilitar para cargar directamente la imagen original o usar una miniatura.",
"setting_image_viewer_preview_title": "Cargar imagen de previsualización", "setting_image_viewer_preview_title": "Cargar imagen de previsualización",
"setting_image_viewer_title": "Images", "setting_image_viewer_title": "Imágenes",
"setting_languages_apply": "Aplicar", "setting_languages_apply": "Aplicar",
"setting_languages_title": "Idiomas", "setting_languages_title": "Idiomas",
"setting_notifications_notify_failures_grace_period": "Notificar fallos de copia de seguridad en segundo plano: {}", "setting_notifications_notify_failures_grace_period": "Notificar fallos de copia de seguridad en segundo plano: {}",
@@ -420,12 +420,12 @@
"setting_pages_app_bar_settings": "Ajustes", "setting_pages_app_bar_settings": "Ajustes",
"settings_require_restart": "Por favor, reinicia Immich para aplicar este ajuste", "settings_require_restart": "Por favor, reinicia Immich para aplicar este ajuste",
"setting_video_viewer_looping_subtitle": "Enable to automatically loop a video in the detail viewer.", "setting_video_viewer_looping_subtitle": "Enable to automatically loop a video in the detail viewer.",
"setting_video_viewer_looping_title": "Looping", "setting_video_viewer_looping_title": "Bucle",
"setting_video_viewer_title": "Videos", "setting_video_viewer_title": "Vídeos",
"share_add": "Agregar", "share_add": "Agregar",
"share_add_photos": "Agregar fotos", "share_add_photos": "Agregar fotos",
"share_add_title": "Agregar un título", "share_add_title": "Agregar un título",
"share_assets_selected": "{} selected", "share_assets_selected": "{} seleccionados",
"share_create_album": "Crear álbum", "share_create_album": "Crear álbum",
"shared_album_activities_input_disable": "Los comentarios están deshabilitados", "shared_album_activities_input_disable": "Los comentarios están deshabilitados",
"shared_album_activities_input_hint": "Comenta algo", "shared_album_activities_input_hint": "Comenta algo",

View File

@@ -1,5 +1,5 @@
{ {
"action_common_back": "חזור", "action_common_back": "חזרה",
"action_common_cancel": "ביטול", "action_common_cancel": "ביטול",
"action_common_clear": "נקה", "action_common_clear": "נקה",
"action_common_confirm": "אישור", "action_common_confirm": "אישור",
@@ -7,11 +7,11 @@
"add_to_album_bottom_sheet_added": "נוסף ל {album}", "add_to_album_bottom_sheet_added": "נוסף ל {album}",
"add_to_album_bottom_sheet_already_exists": "כבר ב {album}", "add_to_album_bottom_sheet_already_exists": "כבר ב {album}",
"advanced_settings_log_level_title": "רמת תיעוד אירועים: {}", "advanced_settings_log_level_title": "רמת תיעוד אירועים: {}",
"advanced_settings_prefer_remote_subtitle": "חלק מהמכשירים הם אייטים מאד לטעון תמונות ממוזערות מנכסים שבמכשיר. הפעל הגדרה זו כדי לטעון תמונות מרוחקות במקום.", "advanced_settings_prefer_remote_subtitle": "חלק מהמכשירים הם איטיים מאד לטעון תמונות ממוזערות מנכסים שבמכשיר. הפעל הגדרה זו כדי לטעון תמונות מרוחקות במקום",
"advanced_settings_prefer_remote_title": "העדף תמונות מרוחקות", "advanced_settings_prefer_remote_title": "העדף תמונות מרוחקות",
"advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request", "advanced_settings_proxy_headers_subtitle": "הגדר כותרות פרוקסי שהיישום צריך לשלוח עם כל בקשת רשת",
"advanced_settings_proxy_headers_title": "Proxy Headers", "advanced_settings_proxy_headers_title": "כותרות פרוקסי",
"advanced_settings_self_signed_ssl_subtitle": "מדלג על אימות תעודת SSL עבור נקודת הקצה של השרת. דרוש עבור תעודות בחתימה עצמית.", "advanced_settings_self_signed_ssl_subtitle": "מדלג על אימות תעודת SSL עבור נקודת הקצה של השרת. דרוש עבור תעודות בחתימה עצמית",
"advanced_settings_self_signed_ssl_title": "התר תעודות SSL בחתימה עצמית", "advanced_settings_self_signed_ssl_title": "התר תעודות SSL בחתימה עצמית",
"advanced_settings_tile_subtitle": "הגדרות משתמש מתקדם", "advanced_settings_tile_subtitle": "הגדרות משתמש מתקדם",
"advanced_settings_tile_title": "מתקדם", "advanced_settings_tile_title": "מתקדם",
@@ -22,9 +22,9 @@
"album_thumbnail_card_item": "פריט 1", "album_thumbnail_card_item": "פריט 1",
"album_thumbnail_card_items": "{} פריטים", "album_thumbnail_card_items": "{} פריטים",
"album_thumbnail_card_shared": " · משותף", "album_thumbnail_card_shared": " · משותף",
"album_thumbnail_owned": "בבעלותך", "album_thumbnail_owned": "בבעלות",
"album_thumbnail_shared_by": "משותף על ידי {}", "album_thumbnail_shared_by": "משותף על ידי {}",
"album_viewer_appbar_delete_confirm": "האם אתה בטוח שברצונך למחוק את האלבום מהחשבון שלך?", "album_viewer_appbar_delete_confirm": "האם את/ה בטוח שברצונך למחוק את האלבום הזה מהחשבון שלך?",
"album_viewer_appbar_share_delete": "מחק אלבום", "album_viewer_appbar_share_delete": "מחק אלבום",
"album_viewer_appbar_share_err_delete": "מחיקת אלבום נכשלה", "album_viewer_appbar_share_err_delete": "מחיקת אלבום נכשלה",
"album_viewer_appbar_share_err_leave": "עזיבת האלבום נכשלה", "album_viewer_appbar_share_err_leave": "עזיבת האלבום נכשלה",
@@ -40,7 +40,7 @@
"app_bar_signout_dialog_ok": "כן", "app_bar_signout_dialog_ok": "כן",
"app_bar_signout_dialog_title": "התנתק", "app_bar_signout_dialog_title": "התנתק",
"archive_page_no_archived_assets": "לא נמצאו נכסים בארכיון", "archive_page_no_archived_assets": "לא נמצאו נכסים בארכיון",
"archive_page_title": "בארכיון ({})", "archive_page_title": "ארכיון ({})",
"asset_action_delete_err_read_only": "לא ניתן למחוק נכס(ים) לקריאה בלבד, מדלג", "asset_action_delete_err_read_only": "לא ניתן למחוק נכס(ים) לקריאה בלבד, מדלג",
"asset_action_share_err_offline": "לא ניתן להשיג נכס(ים) לא מקוונ(ים), מדלג ", "asset_action_share_err_offline": "לא ניתן להשיג נכס(ים) לא מקוונ(ים), מדלג ",
"asset_list_group_by_sub_title": "קבץ לפי", "asset_list_group_by_sub_title": "קבץ לפי",
@@ -52,75 +52,75 @@
"asset_list_layout_sub_title": "פריסה", "asset_list_layout_sub_title": "פריסה",
"asset_list_settings_subtitle": "הגדרות תבנית רשת תמונות", "asset_list_settings_subtitle": "הגדרות תבנית רשת תמונות",
"asset_list_settings_title": "רשת תמונות", "asset_list_settings_title": "רשת תמונות",
"asset_viewer_settings_title": "אפשרויות הצגת תמונות", "asset_viewer_settings_title": "מציג הנכסים",
"backup_album_selection_page_albums_device": "אלבומים במכשיר ({})", "backup_album_selection_page_albums_device": "אלבומים במכשיר ({})",
"backup_album_selection_page_albums_tap": "הקש כדי לכלול, הקש פעמיים כדי להחריג", "backup_album_selection_page_albums_tap": "הקש כדי לכלול, הקש פעמיים כדי להחריג",
"backup_album_selection_page_assets_scatter": "נכסים יכולים להתפזר על פני אלבומים מרובים. לפיכך, ניתן לכלול או להחריג אלבומים במהלך תהליך הגיבוי.", "backup_album_selection_page_assets_scatter": "נכסים יכולים להתפזר על פני אלבומים מרובים. לפיכך, ניתן לכלול או להחריג אלבומים במהלך תהליך הגיבוי",
"backup_album_selection_page_select_albums": "בחר/י אלבומים", "backup_album_selection_page_select_albums": "בחירת אלבומים",
"backup_album_selection_page_selection_info": "פרטי בחירה", "backup_album_selection_page_selection_info": "פרטי בחירה",
"backup_album_selection_page_total_assets": "סה״כ נכסים ייחודיים", "backup_album_selection_page_total_assets": "סה״כ נכסים ייחודיים",
"backup_all": "הכל", "backup_all": "הכל",
"backup_background_service_backup_failed_message": "נכשל בגיבוי נכסים. מנסה שוב...", "backup_background_service_backup_failed_message": "נכשל בגיבוי נכסים. מנסה שוב...",
"backup_background_service_connection_failed_message": "נכשל בהתחברות לשרת. מנסה שוב...", "backup_background_service_connection_failed_message": "נכשל בהתחברות לשרת. מנסה שוב...",
"backup_background_service_current_upload_notification": גבה {}", "backup_background_service_current_upload_notification": עלה {}",
"backup_background_service_default_notification": "מחפש נכסים חדשים...", "backup_background_service_default_notification": "מחפש נכסים חדשים...",
"backup_background_service_error_title": "שגיאת גיבוי", "backup_background_service_error_title": "שגיאת גיבוי",
"backup_background_service_in_progress_notification": "מגבה את הנכסים שלך...", "backup_background_service_in_progress_notification": "מגבה את הנכסים שלך...",
"backup_background_service_upload_failure_notification": "נכשל בגיבוי {}", "backup_background_service_upload_failure_notification": "נכשל להעלות {}",
"backup_controller_page_albums": "אלבומים לגיבוי", "backup_controller_page_albums": "אלבומים לגיבוי",
"backup_controller_page_background_app_refresh_disabled_content": "אפשר רענון אפליקציה ברקע בהגדרות > כללי > רענון אפליקציה ברקע כדי להשתמש בגיבוי ברקע.", "backup_controller_page_background_app_refresh_disabled_content": "אפשר רענון אפליקציה ברקע בהגדרות > כללי > רענון אפליקציה ברקע כדי להשתמש בגיבוי ברקע",
"backup_controller_page_background_app_refresh_disabled_title": "רענון אפליקציה ברקע מושבת", "backup_controller_page_background_app_refresh_disabled_title": "רענון אפליקציה ברקע מושבת",
"backup_controller_page_background_app_refresh_enable_button_text": "לך להגדרות", "backup_controller_page_background_app_refresh_enable_button_text": "לך להגדרות",
"backup_controller_page_background_battery_info_link": "הראה לי איך", "backup_controller_page_background_battery_info_link": "הראה לי איך",
"backup_controller_page_background_battery_info_message": "עבור חווית גיבוי ברקע הטובה ביותר, נא להשבית את כל מיטובי הסוללה המגבילים פעילות ברקע עבור Immich.\n\nמכיוון שזה תלוי מכשיר, בבקשה חפש/י את המידע הנדרש עבור יצרן המכשיר שלך.", "backup_controller_page_background_battery_info_message": "עבור חווית גיבוי ברקע הטובה ביותר, נא להשבית את כל מיטובי הסוללה המגבילים פעילות ברקע עבור היישום.\n\nמכיוון שזה תלוי מכשיר, בבקשה חפש/י את המידע הנדרש עבור יצרן המכשיר שלך.",
"backup_controller_page_background_battery_info_ok": "בסדר", "backup_controller_page_background_battery_info_ok": "בסדר",
"backup_controller_page_background_battery_info_title": "מיטובי סוללה", "backup_controller_page_background_battery_info_title": "מיטובי סוללה",
"backup_controller_page_background_charging": "רק בטעינה", "backup_controller_page_background_charging": "רק בטעינה",
"backup_controller_page_background_configure_error": "נכשל בהגדרת תצורת שירות הרקע", "backup_controller_page_background_configure_error": "נכשל בהגדרת תצורת שירות הרקע",
"backup_controller_page_background_delay": "דחה גיבוי נכסים חדשים: {}", "backup_controller_page_background_delay": "דחה גיבוי נכסים חדשים: {}",
"backup_controller_page_background_description": "הפעל את השירות רקע כדי לגבות באופן אוטומטי כל נכס חדש גם מבלי לפתוח את היישום", "backup_controller_page_background_description": "הפעל את השירות רקע כדי לגבות באופן אוטומטי כל נכס חדש מבלי להצטרך לפתוח את היישום",
"backup_controller_page_background_is_off": "גיבוי אוטומטי ברקע כבוי", "backup_controller_page_background_is_off": "גיבוי אוטומטי ברקע כבוי",
"backup_controller_page_background_is_on": "גיבוי אוטומטי ברקע מופעל", "backup_controller_page_background_is_on": "גיבוי אוטומטי ברקע מופעל",
"backup_controller_page_background_turn_off": "כבה שירות גיבוי ברקע", "backup_controller_page_background_turn_off": "כבה שירות גיבוי ברקע",
"backup_controller_page_background_turn_on": "הפעל שירות גיבוי ברקע", "backup_controller_page_background_turn_on": "הפעל שירות גיבוי ברקע",
"backup_controller_page_background_wifi": "רק ברשת אלחוטית", "backup_controller_page_background_wifi": "רק ברשת אלחוטית",
"backup_controller_page_backup": "גיבוי", "backup_controller_page_backup": "גיבוי",
"backup_controller_page_backup_selected": "נבחרו:", "backup_controller_page_backup_selected": "נבחרו: ",
"backup_controller_page_backup_sub": "תמונות וסרטונים מגובים", "backup_controller_page_backup_sub": "תמונות וסרטונים מגובים",
"backup_controller_page_cancel": "ביטול", "backup_controller_page_cancel": "ביטול",
"backup_controller_page_created": "נוצר ב: {}", "backup_controller_page_created": "נוצר ב: {}",
"backup_controller_page_desc_backup": "הפעל גיבוי בתוך היישום כדי להעלות באופן אוטומטי נכסים חדשים לשרת כשפותחים את היישום.", "backup_controller_page_desc_backup": "הפעל גיבוי חזית כדי להעלות באופן אוטומטי נכסים חדשים לשרת כשפותחים את היישום",
"backup_controller_page_excluded": "הוחרגו:", "backup_controller_page_excluded": "הוחרגו: ",
"backup_controller_page_failed": "נכשל ({})", "backup_controller_page_failed": "נכשל ({})",
"backup_controller_page_filename": "שם קובץ: {} [{}]", "backup_controller_page_filename": "שם קובץ: {} [{}]",
"backup_controller_page_id": "מזהה: {}", "backup_controller_page_id": "מזהה: {}",
"backup_controller_page_info": "פרטי גיבוי", "backup_controller_page_info": "פרטי גיבוי",
"backup_controller_page_none_selected": "לא נבחרו", "backup_controller_page_none_selected": "אין בחירה",
"backup_controller_page_remainder": "בהמתנה לגיבוי", "backup_controller_page_remainder": "בהמתנה לגיבוי",
"backup_controller_page_remainder_sub": "תמונות וסרטונים שנותרו לגבות מתוך בחירה", "backup_controller_page_remainder_sub": "תמונות וסרטונים הנותרים לגיבוי מתוך בחירה",
"backup_controller_page_select": "בחר", "backup_controller_page_select": "בחר",
"backup_controller_page_server_storage": "אחסון שרת", "backup_controller_page_server_storage": "אחסון שרת",
"backup_controller_page_start_backup": "התחל גיבוי", "backup_controller_page_start_backup": "התחל גיבוי",
"backup_controller_page_status_off": "גיבוי בתוך היישום אוטומטי כבוי", "backup_controller_page_status_off": "גיבוי חזית אוטומטי כבוי",
"backup_controller_page_status_on": "גיבוי בתוך היישום אוטומטי מופעל", "backup_controller_page_status_on": "גיבוי חזית אוטומטי מופעל",
"backup_controller_page_storage_format": "{} מתוך {} נוצלו", "backup_controller_page_storage_format": "{} מתוך {} נוצלו",
"backup_controller_page_to_backup": "אלבומים לגבות", "backup_controller_page_to_backup": "אלבומים לגבות",
"backup_controller_page_total": "סה״כ", "backup_controller_page_total": "סה״כ",
"backup_controller_page_total_sub": "כל התמונות והסרטונים הייחודיים מאלבומים שנבחרו", "backup_controller_page_total_sub": "כל התמונות והסרטונים הייחודיים מאלבומים שנבחרו",
"backup_controller_page_turn_off": "כיבוי גיבוי בתוך היישום", "backup_controller_page_turn_off": "כיבוי גיבוי חזית",
"backup_controller_page_turn_on": "הפעל גיבוי בתוך היישום", "backup_controller_page_turn_on": "הפעל גיבוי חזית",
"backup_controller_page_uploading_file_info": "מידע על הקובץ", "backup_controller_page_uploading_file_info": עלה מידע על הקובץ",
"backup_err_only_album": "לא ניתן להסיר את האלבום", "backup_err_only_album": "לא ניתן להסיר את האלבום היחיד",
"backup_info_card_assets": "נכסים", "backup_info_card_assets": "נכסים",
"backup_manual_cancelled": "בוטל", "backup_manual_cancelled": "בוטל",
"backup_manual_failed": "נכשל", "backup_manual_failed": "נכשל",
"backup_manual_in_progress": "העלאה כבר בתהליך. לנסות אחרי זמן מה", "backup_manual_in_progress": "העלאה כבר בתהליך. נסה אחרי זמן מה",
"backup_manual_success": "הצלחה", "backup_manual_success": "הצלחה",
"backup_manual_title": "מצב העלאה", "backup_manual_title": "מצב העלאה",
"backup_options_page_title": "אפשרויות גיבוי", "backup_options_page_title": "אפשרויות גיבוי",
"cache_settings_album_thumbnails": "תמונות ממוזערות של דף ספרייה ({} נכסים)", "cache_settings_album_thumbnails": "תמונות ממוזערות של דף ספרייה ({} נכסים)",
"cache_settings_clear_cache_button": קה מטמון", "cache_settings_clear_cache_button": יקוי מטמון",
"cache_settings_clear_cache_button_title": "מנקה את המטמון של היישום. זה ישפיע באופן משמעותי על הביצועים של היישום עד שהמטמון נבנה מחדש.", "cache_settings_clear_cache_button_title": "מנקה את המטמון של היישום. זה ישפיע באופן משמעותי על הביצועים של היישום עד שהמטמון נבנה מחדש",
"cache_settings_duplicated_assets_clear_button": "נקה", "cache_settings_duplicated_assets_clear_button": "נקה",
"cache_settings_duplicated_assets_subtitle": "תמונות וסרטונים שנמצאים ברשימה השחורה של היישום", "cache_settings_duplicated_assets_subtitle": "תמונות וסרטונים שנמצאים ברשימה השחורה של היישום",
"cache_settings_duplicated_assets_title": "נכסים משוכפלים ({})", "cache_settings_duplicated_assets_title": "נכסים משוכפלים ({})",
@@ -131,7 +131,7 @@
"cache_settings_statistics_shared": "תמונות ממוזערות של אלבום משותף", "cache_settings_statistics_shared": "תמונות ממוזערות של אלבום משותף",
"cache_settings_statistics_thumbnail": "תמונות ממוזערות", "cache_settings_statistics_thumbnail": "תמונות ממוזערות",
"cache_settings_statistics_title": "שימוש במטמון", "cache_settings_statistics_title": "שימוש במטמון",
"cache_settings_subtitle": "שלוט בהתנהגות שמירת המטמון של היישום הנייד Immich", "cache_settings_subtitle": "שלוט בהתנהגות שמירת המטמון של היישום הנייד",
"cache_settings_thumbnail_size": "גודל מטמון תמונה ממוזערת ({} נכסים)", "cache_settings_thumbnail_size": "גודל מטמון תמונה ממוזערת ({} נכסים)",
"cache_settings_tile_subtitle": "שלוט בהתנהגות האחסון המקומי", "cache_settings_tile_subtitle": "שלוט בהתנהגות האחסון המקומי",
"cache_settings_tile_title": "אחסון מקומי", "cache_settings_tile_title": "אחסון מקומי",
@@ -144,40 +144,40 @@
"common_add_to_album": "הוסף לאלבום", "common_add_to_album": "הוסף לאלבום",
"common_change_password": "שנה סיסמה", "common_change_password": "שנה סיסמה",
"common_create_new_album": "צור אלבום חדש", "common_create_new_album": "צור אלבום חדש",
"common_server_error": "נא לבדוק את חיבור הרשת שלך, תוודא/י שהשרת נגיש ושגרסאות אפליקציה/שרת תואמות.", "common_server_error": "נא לבדוק את חיבור הרשת שלך, תוודא/י שהשרת נגיש ושגרסאות אפליקציה/שרת תואמות",
"common_shared": "משותף", "common_shared": "משותף",
"control_bottom_app_bar_add_to_album": "הוסף לאלבום", "control_bottom_app_bar_add_to_album": "הוסף לאלבום",
"control_bottom_app_bar_album_info": "{} פריטים", "control_bottom_app_bar_album_info": "{} פריטים",
"control_bottom_app_bar_album_info_shared": "{} פריטים · משותפים", "control_bottom_app_bar_album_info_shared": "{} פריטים · משותפים",
"control_bottom_app_bar_archive": "העבר לארכיון", "control_bottom_app_bar_archive": "ארכיון",
"control_bottom_app_bar_create_new_album": "צור אלבום חדש", "control_bottom_app_bar_create_new_album": "צור אלבום חדש",
"control_bottom_app_bar_delete": "מחק", "control_bottom_app_bar_delete": "מחק",
"control_bottom_app_bar_delete_from_immich": "מחק מ Immich", "control_bottom_app_bar_delete_from_immich": "מחק מהשרת",
"control_bottom_app_bar_delete_from_local": "מחק מהמכשיר", "control_bottom_app_bar_delete_from_local": "מחק מהמכשיר",
"control_bottom_app_bar_edit_location": "ערוך מיקום", "control_bottom_app_bar_edit_location": "ערוך מיקום",
"control_bottom_app_bar_edit_time": "ערוך תאריך & זמן", "control_bottom_app_bar_edit_time": "ערוך תאריך & זמן",
"control_bottom_app_bar_favorite": "מועדף", "control_bottom_app_bar_favorite": "הוסף למועדפים",
"control_bottom_app_bar_share": "שתף", "control_bottom_app_bar_share": "שתף",
"control_bottom_app_bar_share_to": "שתף עם", "control_bottom_app_bar_share_to": "שתף עם",
"control_bottom_app_bar_stack": "קבץ תמונות", "control_bottom_app_bar_stack": "ערימה",
"control_bottom_app_bar_trash_from_immich": "העבר לאשפה", "control_bottom_app_bar_trash_from_immich": "העבר לאשפה",
"control_bottom_app_bar_unarchive": "הוצא מארכיון", "control_bottom_app_bar_unarchive": "הוצא מארכיון",
"control_bottom_app_bar_unfavorite": "הסר ממועדפים", "control_bottom_app_bar_unfavorite": "הסר ממועדפים",
"control_bottom_app_bar_upload": "העלאה", "control_bottom_app_bar_upload": "העלאה",
"create_album_page_untitled": "ללא כותרת", "create_album_page_untitled": "ללא כותרת",
"create_shared_album_page_create": "צור", "create_shared_album_page_create": "יצירה",
"create_shared_album_page_share": "שתף", "create_shared_album_page_share": "שתף",
"create_shared_album_page_share_add_assets": "הוסף נכסים", "create_shared_album_page_share_add_assets": "הוסף נכסים",
"create_shared_album_page_share_select_photos": "בחר/י תמונות", "create_shared_album_page_share_select_photos": "בחירת תמונות",
"curated_location_page_title": "מקומות", "curated_location_page_title": "מקומות",
"curated_object_page_title": "דברים", "curated_object_page_title": "דברים",
"daily_title_text_date": "E, MMM dd", "daily_title_text_date": "E, MMM dd",
"daily_title_text_date_year": "E, MMM dd, yyyy", "daily_title_text_date_year": "E, MMM dd, yyyy",
"date_format": "E, LLL d, y • h:mm a", "date_format": "E, LLL d, y • h:mm a",
"delete_dialog_alert": "הפריטים האלה ימחקו לצמיתות מ Immich ומהמכשיר שלך", "delete_dialog_alert": "הפריטים האלה ימחקו לצמיתות מהשרת ומהמכשיר שלך",
"delete_dialog_alert_local": "הפריטים האלה יוסרו לצמיתות מהמכשיר שלך אבל עדיין יהיו זמינים בשרת ה Immich", "delete_dialog_alert_local": "הפריטים האלה יוסרו לצמיתות מהמכשיר שלך אבל עדיין יהיו זמינים בשרת",
"delete_dialog_alert_local_non_backed_up": "חלק מהפריטים לא מגובים ל Immich ויוסרו לצמיתות מהמכשיר שלך", "delete_dialog_alert_local_non_backed_up": "חלק מהפריטים לא מגובים לשרת ויוסרו לצמיתות מהמכשיר שלך",
"delete_dialog_alert_remote": "הפריטים האלה ימחקו לצמיתות משרת ה Immich", "delete_dialog_alert_remote": "הפריטים האלה ימחקו לצמיתות מהשרת",
"delete_dialog_cancel": "ביטול", "delete_dialog_cancel": "ביטול",
"delete_dialog_ok": "מחק", "delete_dialog_ok": "מחק",
"delete_dialog_ok_force": "מחק בכל זאת", "delete_dialog_ok_force": "מחק בכל זאת",
@@ -203,18 +203,18 @@
"experimental_settings_title": "נסיוני", "experimental_settings_title": "נסיוני",
"favorites_page_no_favorites": "לא נמצאו נכסים מועדפים", "favorites_page_no_favorites": "לא נמצאו נכסים מועדפים",
"favorites_page_title": "מועדפים", "favorites_page_title": "מועדפים",
"haptic_feedback_switch": "הפעל משוב ברטט", "haptic_feedback_switch": "אפשר משוב ברטט",
"haptic_feedback_title": "משוב ברטט", "haptic_feedback_title": "משוב ברטט",
"header_settings_add_header_tip": "הוסף כותרת", "header_settings_add_header_tip": "הוסף כותרת",
"header_settings_field_validator_msg": "ערך אינו יכול להיות ריק", "header_settings_field_validator_msg": "ערך אינו יכול להיות ריק",
"header_settings_header_name_input": "שם כותרת", "header_settings_header_name_input": "שם כותרת",
"header_settings_header_value_input": "ערך כותרת", "header_settings_header_value_input": "ערך כותרת",
"header_settings_page_title": "Proxy Headers", "header_settings_page_title": "כותרות פרוקסי",
"headers_settings_tile_subtitle": "Define proxy headers the app should send with each network request", "headers_settings_tile_subtitle": "הגדר כותרות פרוקסי שהיישום צריך לשלוח עם כל בקשת רשת",
"headers_settings_tile_title": "Custom proxy headers", "headers_settings_tile_title": "כותרות פרוקסי מותאמות",
"home_page_add_to_album_conflicts": "{added} נכסים נוספו לאלבום {album}. {failed} נכסים כבר נמצאים באלבום.", "home_page_add_to_album_conflicts": "{added} נכסים נוספו לאלבום {album}. {failed} נכסים כבר נמצאים באלבום",
"home_page_add_to_album_err_local": "לא ניתן להוסיף נכסים מקומיים לאלבום עדיין, מדלג", "home_page_add_to_album_err_local": "לא ניתן להוסיף נכסים מקומיים לאלבום עדיין, מדלג",
"home_page_add_to_album_success": "{added} נכסים נוספו לאלבום {album}.", "home_page_add_to_album_success": "{added} נכסים נוספו לאלבום {album}",
"home_page_album_err_partner": "לא ניתן להוסיף נכסי שותף לאלבום עדיין, מדלג", "home_page_album_err_partner": "לא ניתן להוסיף נכסי שותף לאלבום עדיין, מדלג",
"home_page_archive_err_local": "לא ניתן להעביר לארכיון נכסים מקומיים עדיין, מדלג", "home_page_archive_err_local": "לא ניתן להעביר לארכיון נכסים מקומיים עדיין, מדלג",
"home_page_archive_err_partner": "לא ניתן להעביר לארכיון נכסי שותף, מדלג", "home_page_archive_err_partner": "לא ניתן להעביר לארכיון נכסי שותף, מדלג",
@@ -223,24 +223,24 @@
"home_page_delete_remote_err_local": "נכסים מקומיים נבחרו מרחוק למחיקה, מדלג", "home_page_delete_remote_err_local": "נכסים מקומיים נבחרו מרחוק למחיקה, מדלג",
"home_page_favorite_err_local": "לא ניתן להוסיף למועדפים נכסים מקומיים עדיין, מדלג", "home_page_favorite_err_local": "לא ניתן להוסיף למועדפים נכסים מקומיים עדיין, מדלג",
"home_page_favorite_err_partner": "לא ניתן להוסיף למועדפים נכסי שותף עדיין, מדלג", "home_page_favorite_err_partner": "לא ניתן להוסיף למועדפים נכסי שותף עדיין, מדלג",
"home_page_first_time_notice": "אם זאת הפעם הראשונה שאת/ה משתמש/ת ביישום, נא לוודא לבחור אלבומ(ים) לגיבוי כך שציר הזמן יוכל לאכלס תמונות וסרטונים באלבומ(ים).", "home_page_first_time_notice": "אם זאת הפעם הראשונה שאת/ה משתמש/ת ביישום, נא להקפיד לבחור אלבומ(ים) לגיבוי כך שציר הזמן יוכל לאכלס תמונות וסרטונים באלבומ(ים)",
"home_page_share_err_local": "לא ניתן לשתף נכסים מקומיים על ידי קישור, מדלג", "home_page_share_err_local": "לא ניתן לשתף נכסים מקומיים על ידי קישור, מדלג",
"home_page_upload_err_limit": "יכול רק להעלות מקסימום של 30 נכסים בכל פעם, מדלג", "home_page_upload_err_limit": "ניתן להעלות רק מקסימום של 30 נכסים בכל פעם, מדלג",
"image_viewer_page_state_provider_download_error": "שגיאת הורדה", "image_viewer_page_state_provider_download_error": "שגיאת הורדה",
"image_viewer_page_state_provider_download_started": "ההורדה החלה", "image_viewer_page_state_provider_download_started": "ההורדה החלה",
"image_viewer_page_state_provider_download_success": "הצלחת הורדה", "image_viewer_page_state_provider_download_success": "הצלחת הורדה",
"image_viewer_page_state_provider_share_error": "שיתוף שגיאה", "image_viewer_page_state_provider_share_error": "שיתוף שגיאה",
"library_page_albums": "אלבומים", "library_page_albums": "אלבומים",
"library_page_archive": "בארכיון", "library_page_archive": "ארכיון",
"library_page_device_albums": "אלבומים במכשיר", "library_page_device_albums": "אלבומים במכשיר",
"library_page_favorites": "מועדפים", "library_page_favorites": "מועדפים",
"library_page_new_album": "אלבום חדש", "library_page_new_album": "אלבום חדש",
"library_page_sharing": "משתף", "library_page_sharing": "שיתוף",
"library_page_sort_asset_count": "מספר נכסים", "library_page_sort_asset_count": "מספר נכסים",
"library_page_sort_created": "תאריך יצירה", "library_page_sort_created": "תאריך יצירה",
"library_page_sort_last_modified": "שונה לאחרונה", "library_page_sort_last_modified": "שונה לאחרונה",
"library_page_sort_most_oldest_photo": "תמונה הכי ישנה", "library_page_sort_most_oldest_photo": "תמונה הכי ישנה",
"library_page_sort_most_recent_photo": "התמונה הישנה ביותר", "library_page_sort_most_recent_photo": "תמונה אחרונה ביותר",
"library_page_sort_title": "כותרת אלבום", "library_page_sort_title": "כותרת אלבום",
"location_picker_choose_on_map": "בחר על מפה", "location_picker_choose_on_map": "בחר על מפה",
"location_picker_latitude": "קו רוחב", "location_picker_latitude": "קו רוחב",
@@ -250,28 +250,28 @@
"location_picker_longitude_error": "הזן קו אורך חוקי", "location_picker_longitude_error": "הזן קו אורך חוקי",
"location_picker_longitude_hint": "הזן את קו האורך שלך כאן", "location_picker_longitude_hint": "הזן את קו האורך שלך כאן",
"login_disabled": "כניסה למערכת הושבתה", "login_disabled": "כניסה למערכת הושבתה",
"login_form_api_exception": "חריגת API. נא לבדוק את כתובת הURL של השרת ולנסות שוב.", "login_form_api_exception": "חריגת API. נא לבדוק את כתובת השרת ולנסות שוב",
"login_form_back_button_text": "חזור", "login_form_back_button_text": "חזרה",
"login_form_button_text": "התחברות", "login_form_button_text": "התחברות",
"login_form_email_hint": "yourmail@email.com", "login_form_email_hint": "yourmail@email.com",
"login_form_endpoint_hint": "http://כתובת-השרת-שלך:פורט/API", "login_form_endpoint_hint": "http://your-server-ip:port/API",
"login_form_endpoint_url": "כתובת נקודת קצה השרת", "login_form_endpoint_url": "כתובת נקודת קצה השרת",
"login_form_err_http": "נא לציין //:htttp או //:https", "login_form_err_http": "נא לציין //:htttp או //:https",
"login_form_err_invalid_email": "דוא\"ל שגוי", "login_form_err_invalid_email": "דוא\"ל שגוי",
"login_form_err_invalid_url": "כתובת לא חוקית", "login_form_err_invalid_url": "כתובת לא חוקית",
"login_form_err_leading_whitespace": "רווח לבן מוביל", "login_form_err_leading_whitespace": "רווח לבן מוביל",
"login_form_err_trailing_whitespace": "רווח לבן נגרר", "login_form_err_trailing_whitespace": "רווח לבן נגרר",
"login_form_failed_get_oauth_server_config": "שגיאה בהתחברות באמצעות OAuth, בדוק את כתובת URL של השרת", "login_form_failed_get_oauth_server_config": "שגיאה בהתחברות באמצעות OAuth, בדוק את כתובת השרת",
"login_form_failed_get_oauth_server_disable": "תכונת OAuth לא זמינה בשרת זה", "login_form_failed_get_oauth_server_disable": "תכונת OAuth לא זמינה בשרת זה",
"login_form_failed_login": "שגיאה בכניסה למערכת, בדוק את כתובת השרת, דוא\"ל וסיסמה", "login_form_failed_login": "שגיאה בכניסה למערכת, בדוק את כתובת השרת, דוא\"ל וסיסמה",
"login_form_handshake_exception": "ארעה חריגת לחיצת יד עם השרת. אפשר תמיכה בתעודה בחתימה עצמית בהגדרות אם את/ה משתמש/ת בתעודה בחתימה עצמית.", "login_form_handshake_exception": ירעה חריגת לחיצת יד עם השרת. אפשר תמיכה בתעודה בחתימה עצמית בהגדרות אם את/ה משתמש/ת בתעודה בחתימה עצמית",
"login_form_label_email": "דוא\"ל", "login_form_label_email": "דוא\"ל",
"login_form_label_password": "סיסמה", "login_form_label_password": "סיסמה",
"login_form_next_button": "הבא", "login_form_next_button": "הבא",
"login_form_password_hint": "סיסמה", "login_form_password_hint": "סיסמה",
"login_form_save_login": "הישאר/י מחובר/ת", "login_form_save_login": "הישאר/י מחובר/ת",
"login_form_server_empty": "הכנס כתובת שרת.", "login_form_server_empty": "הכנס כתובת שרת",
"login_form_server_error": "לא היה ניתן להתחבר לשרת.", "login_form_server_error": "לא היה ניתן להתחבר לשרת",
"login_password_changed_error": "הייתה שגיאה בעדכון הסיסמה שלך", "login_password_changed_error": "הייתה שגיאה בעדכון הסיסמה שלך",
"login_password_changed_success": "סיסמה עודכנה בהצלחה", "login_password_changed_success": "סיסמה עודכנה בהצלחה",
"map_assets_in_bound": "{} תמונה", "map_assets_in_bound": "{} תמונה",
@@ -292,25 +292,25 @@
"map_settings_date_range_option_year": "שנה אחרונה", "map_settings_date_range_option_year": "שנה אחרונה",
"map_settings_date_range_option_years": "{} שנים אחרונות", "map_settings_date_range_option_years": "{} שנים אחרונות",
"map_settings_dialog_cancel": "ביטול", "map_settings_dialog_cancel": "ביטול",
"map_settings_dialog_save": "שמור", "map_settings_dialog_save": "שמירה",
"map_settings_dialog_title": "הגדרות מפה", "map_settings_dialog_title": "הגדרות מפה",
"map_settings_include_show_archived": "כלול ארכיון", "map_settings_include_show_archived": "כלול ארכיון",
"map_settings_include_show_partners": "הצג שותפים במפה", "map_settings_include_show_partners": "כלול שותפים",
"map_settings_only_relative_range": "טווח תאריכים", "map_settings_only_relative_range": "טווח תאריכים",
"map_settings_only_show_favorites": "הצג מועדפים בלבד", "map_settings_only_show_favorites": "הצג מועדפים בלבד",
"map_settings_theme_settings": "ערכת נושא למפה", "map_settings_theme_settings": "ערכת נושא למפה",
"map_zoom_to_see_photos": "הקטן את התצוגה כדי לראות תמונות", "map_zoom_to_see_photos": "הקטן את התצוגה כדי לראות תמונות",
"memories_all_caught_up": "ראית הכל", "memories_all_caught_up": "ראית הכל",
"memories_check_back_tomorrow": "זיכרונות חדשים יופיעו מחר", "memories_check_back_tomorrow": "חזור מחר לעוד זכרונות",
"memories_start_over": "התחל מחדש", "memories_start_over": "התחל מחדש",
"memories_swipe_to_close": "החלק למעלה לסגירה", "memories_swipe_to_close": "החלק למעלה כדי לסגור",
"memories_year_ago": "לפני שנה", "memories_year_ago": "לפני שנה",
"memories_years_ago": "לפני {} שנים", "memories_years_ago": "לפני {} שנים",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "תמונות עם תנועה", "motion_photos_page_title": "תמונות עם תנועה",
"multiselect_grid_edit_date_time_err_read_only": "לא ניתן לערוך תאריך של נכס(ים) לקריאה בלבד, מדלג", "multiselect_grid_edit_date_time_err_read_only": "לא ניתן לערוך תאריך של נכס(ים) לקריאה בלבד, מדלג",
"multiselect_grid_edit_gps_err_read_only": "לא ניתן לערוך מיקום של נכס(ים) לקריאה בלבד, מדלג", "multiselect_grid_edit_gps_err_read_only": "לא ניתן לערוך מיקום של נכס(ים) לקריאה בלבד, מדלג",
"no_assets_to_show": "אין תמונות להצגה", "no_assets_to_show": "אין נכסים להציג",
"notification_permission_dialog_cancel": "ביטול", "notification_permission_dialog_cancel": "ביטול",
"notification_permission_dialog_content": "כדי לאפשר התראות, לך להגדרות ובחר התר", "notification_permission_dialog_content": "כדי לאפשר התראות, לך להגדרות ובחר התר",
"notification_permission_dialog_settings": "הגדרות", "notification_permission_dialog_settings": "הגדרות",
@@ -323,48 +323,48 @@
"partner_page_empty_message": "התמונות שלך עדיין לא משותפות עם אף שותף", "partner_page_empty_message": "התמונות שלך עדיין לא משותפות עם אף שותף",
"partner_page_no_more_users": "אין עוד משתמשים להוסיף", "partner_page_no_more_users": "אין עוד משתמשים להוסיף",
"partner_page_partner_add_failed": "הוספת שותף נכשלה", "partner_page_partner_add_failed": "הוספת שותף נכשלה",
"partner_page_select_partner": "בחר/י שותף", "partner_page_select_partner": "בחירת שותף",
"partner_page_shared_to_title": "משותף עם", "partner_page_shared_to_title": "משותף עם",
"partner_page_stop_sharing_content": "{} לא יוכל יותר לגשת לתמונות שלך", "partner_page_stop_sharing_content": "{} לא יוכל יותר לגשת לתמונות שלך",
"partner_page_stop_sharing_title": "להפסיק לשתף את התמונות שלך?", "partner_page_stop_sharing_title": "להפסיק לשתף את התמונות שלך?",
"partner_page_title": "שותף", "partner_page_title": "שותף",
"permission_onboarding_back": "חזור", "permission_onboarding_back": "חזרה",
"permission_onboarding_continue_anyway": "המשך בכל זאת", "permission_onboarding_continue_anyway": "המשך בכל זאת",
"permission_onboarding_get_started": "להתחיל", "permission_onboarding_get_started": "להתחיל",
"permission_onboarding_go_to_settings": "לך להגדרות", "permission_onboarding_go_to_settings": "לך להגדרות",
"permission_onboarding_grant_permission": "הענק הרשאה", "permission_onboarding_grant_permission": "הענק הרשאה",
"permission_onboarding_log_out": "התנתק", "permission_onboarding_log_out": "התנתק",
"permission_onboarding_permission_denied": "הרשאה נדחתה. כדי להשתמש בImmich, הענק הרשאה לתמונות וסרטונים בהגדרות.", "permission_onboarding_permission_denied": "הרשאה נדחתה. כדי להשתמש ביישום, הענק הרשאה לתמונות וסרטונים בהגדרות",
"permission_onboarding_permission_granted": "ההרשאה ניתנה! את/ה מוכנ/ה.", "permission_onboarding_permission_granted": "ההרשאה ניתנה! את/ה מוכנ/ה",
"permission_onboarding_permission_limited": "הרשאה מוגבלת. כדי לתת לImmich לגבות ולנהל את כל אוסף הגלריה שלך, הענק הרשאה לתמונות וסרטונים בהגדרות.", "permission_onboarding_permission_limited": "הרשאה מוגבלת. כדי לתת ליישום לגבות ולנהל את כל אוסף הגלריה שלך, הענק הרשאה לתמונות וסרטונים בהגדרות",
"permission_onboarding_request": "Immich דורש הרשאה כדי לראות את התמונות והסרטונים שלך.", "permission_onboarding_request": "היישום דורש הרשאה כדי לראות את התמונות והסרטונים שלך",
"preferences_settings_title": "העדפות", "preferences_settings_title": "העדפות",
"profile_drawer_app_logs": "לוגים", "profile_drawer_app_logs": "יומן",
"profile_drawer_client_out_of_date_major": "האפליקציה לנייד אינה עדכנית. נא לעדכן לגרסה האחרונה.", "profile_drawer_client_out_of_date_major": "האפליקציה לנייד היא מיושנת. נא לעדכן לגרסה הראשית האחרונה",
"profile_drawer_client_out_of_date_minor": "האפליקציה לנייד אינה עדכנית. נא לעדכן לגרסה האחרונה.", "profile_drawer_client_out_of_date_minor": "האפליקציה לנייד היא מיושנת. נא לעדכן לגרסה המשנית האחרונה",
"profile_drawer_client_server_up_to_date": "גרסת האפליקציה והשרת מעודכנים", "profile_drawer_client_server_up_to_date": "הלקוח והשרת הם מעודכנים",
"profile_drawer_documentation": "תיעוד", "profile_drawer_documentation": "תיעוד",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_server_out_of_date_major": "השרת אינו עדכני. נא לעדכן לגרסה האחרונה.", "profile_drawer_server_out_of_date_major": "השרת אינו מעודכן. נא לעדכן לגרסה הראשית האחרונה",
"profile_drawer_server_out_of_date_minor": "השרת אינו מעודכן. נא לעדכן לגרסה האחרונה.", "profile_drawer_server_out_of_date_minor": "השרת אינו מעודכן. נא לעדכן לגרסה המשנית האחרונה",
"profile_drawer_settings": "הגדרות", "profile_drawer_settings": "הגדרות",
"profile_drawer_sign_out": "יציאה", "profile_drawer_sign_out": "יציאה",
"profile_drawer_trash": "אשפה", "profile_drawer_trash": "אשפה",
"recently_added_page_title": "נוסף לאחרונה", "recently_added_page_title": "נוסף לאחרונה",
"scaffold_body_error_occurred": "אירעה שגיאה", "scaffold_body_error_occurred": "אירעה שגיאה",
"search_bar_hint": "חפש/י בתמונות שלך", "search_bar_hint": "חפש/י בתמונות שלך",
"search_filter_apply": "סינון", "search_filter_apply": "החל סינון",
"search_filter_camera_make": "נוצר ע\"י", "search_filter_camera_make": "תוצרת",
"search_filter_camera_model": "דגם", "search_filter_camera_model": "דגם",
"search_filter_display_option_archive": "ארכיון", "search_filter_display_option_archive": "ארכיון",
"search_filter_display_option_favorite": עודף", "search_filter_display_option_favorite": "מועדף",
"search_filter_display_option_not_in_album": "לא באלבום", "search_filter_display_option_not_in_album": "לא באלבום",
"search_filter_location_city": "עיר", "search_filter_location_city": "עיר",
"search_filter_location_country": "עיר", "search_filter_location_country": "ארץ",
"search_filter_location_state": "מדינה", "search_filter_location_state": "מדינה",
"search_filter_media_type_all": "הכל", "search_filter_media_type_all": "הכל",
"search_filter_media_type_image": "תמונה", "search_filter_media_type_image": "תמונה",
"search_filter_media_type_video": "וידיאו", "search_filter_media_type_video": "סרטון",
"search_page_categories": "קטגוריות", "search_page_categories": "קטגוריות",
"search_page_favorites": "מועדפים", "search_page_favorites": "מועדפים",
"search_page_motion_photos": "תמונות עם תנועה", "search_page_motion_photos": "תמונות עם תנועה",
@@ -397,20 +397,20 @@
"server_info_box_latest_release": "גרסה עדכנית ביותר", "server_info_box_latest_release": "גרסה עדכנית ביותר",
"server_info_box_server_url": "כתובת שרת", "server_info_box_server_url": "כתובת שרת",
"server_info_box_server_version": "גרסת שרת", "server_info_box_server_version": "גרסת שרת",
"setting_image_viewer_help": "מציג הפרטים טוען את התמונה הממוזערת הקטנה קודם, לאחר מכן טוען את התצוגה המקדימה בגודל בינוני (אם מופעלת), לבסוף טוען את המקורית (אם מופעלת).", "setting_image_viewer_help": "מציג הפרטים טוען את התמונה הממוזערת הקטנה קודם, לאחר מכן טוען את התצוגה המקדימה בגודל בינוני (אם מופעלת), לבסוף טוען את המקורית (אם מופעלת)",
"setting_image_viewer_original_subtitle": "אפשר לטעון את התמונה המקורית ברזלוציה מלאה (גדולה!). השבת כדי להקטין שימוש בנתונים (גם בשרת וגם בזיכרון המטמון שבמכשיר).", "setting_image_viewer_original_subtitle": "אפשר לטעון את התמונה המקורית ברזלוציה מלאה (גדולה!). השבת כדי להקטין שימוש בנתונים (גם בשרת וגם בזיכרון המטמון שבמכשיר)",
"setting_image_viewer_original_title": "טען תמונה מקורית", "setting_image_viewer_original_title": "טען תמונה מקורית",
"setting_image_viewer_preview_subtitle": "אפשר לטעון תמונה ברזלוציה בינונית. השבת כדי או לטעון את המקורית או רק להשתמש בתמונה הממוזערת.", "setting_image_viewer_preview_subtitle": "אפשר לטעון תמונה ברזלוציה בינונית. השבת כדי או לטעון את המקורית או רק להשתמש בתמונה הממוזערת",
"setting_image_viewer_preview_title": "טען תמונת תצוגה מקדימה", "setting_image_viewer_preview_title": "טען תמונת תצוגה מקדימה",
"setting_image_viewer_title": "תמונות", "setting_image_viewer_title": "תמונות",
"setting_languages_apply": "החל", "setting_languages_apply": "החל",
"setting_languages_title": "שפות", "setting_languages_title": "שפות",
"setting_notifications_notify_failures_grace_period": "הודיע על כשלים בגיבוי ברקע: {}", "setting_notifications_notify_failures_grace_period": "הודע על כשלים בגיבוי ברקע: {}",
"setting_notifications_notify_hours": "{} שעות", "setting_notifications_notify_hours": "{} שעות",
"setting_notifications_notify_immediately": "באופן מיידי", "setting_notifications_notify_immediately": "באופן מיידי",
"setting_notifications_notify_minutes": "{} דקות", "setting_notifications_notify_minutes": "{} דקות",
"setting_notifications_notify_never": "אף פעם", "setting_notifications_notify_never": "אף פעם",
"setting_notifications_notify_seconds": "{} שניות", "setting_notifications_notify_seconds": "{} שניות",
"setting_notifications_single_progress_subtitle": "מידע מפורט על התקדמות העלאה לכל נכס", "setting_notifications_single_progress_subtitle": "מידע מפורט על התקדמות העלאה לכל נכס",
"setting_notifications_single_progress_title": "הראה פרטי התקדמות גיבוי ברקע", "setting_notifications_single_progress_title": "הראה פרטי התקדמות גיבוי ברקע",
"setting_notifications_subtitle": "התאם את העדפות ההתראה שלך", "setting_notifications_subtitle": "התאם את העדפות ההתראה שלך",
@@ -418,9 +418,9 @@
"setting_notifications_total_progress_subtitle": "התקדמות העלאה כללית (בוצע/סה״כ נכסים)", "setting_notifications_total_progress_subtitle": "התקדמות העלאה כללית (בוצע/סה״כ נכסים)",
"setting_notifications_total_progress_title": "הראה סה״כ התקדמות גיבוי ברקע", "setting_notifications_total_progress_title": "הראה סה״כ התקדמות גיבוי ברקע",
"setting_pages_app_bar_settings": "הגדרות", "setting_pages_app_bar_settings": "הגדרות",
"settings_require_restart": "אנא הפעל מחדש את Immich כדי להחיל הגדרה זו", "settings_require_restart": "אנא הפעל מחדש את היישום כדי להחיל הגדרה זו",
"setting_video_viewer_looping_subtitle": "אפשר וידיאו ברצף אוטומטית בחלון המידע", "setting_video_viewer_looping_subtitle": "אפשר הפעלה חוזרת אוטומטית של סרטון במציג הפרטים",
"setting_video_viewer_looping_title": "לולאה", "setting_video_viewer_looping_title": "הפעלה חוזרת",
"setting_video_viewer_title": "סרטונים", "setting_video_viewer_title": "סרטונים",
"share_add": "הוסף", "share_add": "הוסף",
"share_add_photos": "הוסף תמונות", "share_add_photos": "הוסף תמונות",
@@ -428,7 +428,7 @@
"share_assets_selected": "{} נבחרו", "share_assets_selected": "{} נבחרו",
"share_create_album": "צור אלבום", "share_create_album": "צור אלבום",
"shared_album_activities_input_disable": "התגובה מושבתת", "shared_album_activities_input_disable": "התגובה מושבתת",
"shared_album_activities_input_hint": "הגב/י משהו", "shared_album_activities_input_hint": "תגיד/י משהו",
"shared_album_activity_remove_content": "האם ברצונך למחוק את הפעילות הזאת?", "shared_album_activity_remove_content": "האם ברצונך למחוק את הפעילות הזאת?",
"shared_album_activity_remove_title": "מחיקת פעילות", "shared_album_activity_remove_title": "מחיקת פעילות",
"shared_album_activity_setting_subtitle": "אפשר לאחרים להגיב", "shared_album_activity_setting_subtitle": "אפשר לאחרים להגיב",
@@ -444,7 +444,7 @@
"shared_link_clipboard_text": "קישור: {}\nסיסמה: {}", "shared_link_clipboard_text": "קישור: {}\nסיסמה: {}",
"shared_link_create_app_bar_title": "צור קישור לשיתוף", "shared_link_create_app_bar_title": "צור קישור לשיתוף",
"shared_link_create_error": "שגיאה ביצירת קישור משותף", "shared_link_create_error": "שגיאה ביצירת קישור משותף",
"shared_link_create_info": "תן לכל אחד עם הקישור לראות את התמונות שנבחרו", "shared_link_create_info": "אפשר לכל אחד עם הקישור לראות את התמונות שנבחרו",
"shared_link_create_submit_button": "צור קישור", "shared_link_create_submit_button": "צור קישור",
"shared_link_edit_allow_download": "התר למשתמש ציבורי להוריד", "shared_link_edit_allow_download": "התר למשתמש ציבורי להוריד",
"shared_link_edit_allow_upload": "התר למשתמש ציבורי להעלות", "shared_link_edit_allow_upload": "התר למשתמש ציבורי להעלות",
@@ -452,7 +452,7 @@
"shared_link_edit_change_expiry": "שנה זמן תפוגה", "shared_link_edit_change_expiry": "שנה זמן תפוגה",
"shared_link_edit_description": "תיאור", "shared_link_edit_description": "תיאור",
"shared_link_edit_description_hint": "הכנס את תיאור השיתוף", "shared_link_edit_description_hint": "הכנס את תיאור השיתוף",
"shared_link_edit_expire_after": "יפוג אחרי", "shared_link_edit_expire_after": "פג לאחר",
"shared_link_edit_expire_after_option_day": "1 יום", "shared_link_edit_expire_after_option_day": "1 יום",
"shared_link_edit_expire_after_option_days": "{} ימים", "shared_link_edit_expire_after_option_days": "{} ימים",
"shared_link_edit_expire_after_option_hour": "1 שעה", "shared_link_edit_expire_after_option_hour": "1 שעה",
@@ -484,10 +484,10 @@
"shared_link_info_chip_upload": "העלאה", "shared_link_info_chip_upload": "העלאה",
"shared_link_manage_links": "ניהול קישורים משותפים", "shared_link_manage_links": "ניהול קישורים משותפים",
"shared_link_public_album": "אלבום ציבורי", "shared_link_public_album": "אלבום ציבורי",
"share_done": "בוצע", "share_done": "סיום",
"share_invite": "הזמן לאלבום", "share_invite": "הזמן לאלבום",
"sharing_page_album": "אלבומים משותפים", "sharing_page_album": "אלבומים משותפים",
"sharing_page_description": "צור אלבומים משותפים כדי לשתף תמונות וסרטונים עם אנשים ברשת שלך.", "sharing_page_description": "צור אלבומים משותפים כדי לשתף תמונות וסרטונים עם אנשים ברשת שלך",
"sharing_page_empty_list": "רשימה ריקה", "sharing_page_empty_list": "רשימה ריקה",
"sharing_silver_appbar_create_shared_album": "אלבום משותף חדש", "sharing_silver_appbar_create_shared_album": "אלבום משותף חדש",
"sharing_silver_appbar_shared_links": "קישורים משותפים", "sharing_silver_appbar_shared_links": "קישורים משותפים",
@@ -496,10 +496,10 @@
"tab_controller_nav_photos": "תמונות", "tab_controller_nav_photos": "תמונות",
"tab_controller_nav_search": "חיפוש", "tab_controller_nav_search": "חיפוש",
"tab_controller_nav_sharing": "שיתוף", "tab_controller_nav_sharing": "שיתוף",
"theme_setting_asset_list_storage_indicator_title": "הראה מחוון אחסון על גבי התמונות", "theme_setting_asset_list_storage_indicator_title": "הראה מחוון אחסון על אריחי נכסים",
"theme_setting_asset_list_tiles_per_row_title": "מספר נכסים בכל שורה ({})", "theme_setting_asset_list_tiles_per_row_title": "מספר נכסים בכל שורה ({})",
"theme_setting_dark_mode_switch": "מצב כהה", "theme_setting_dark_mode_switch": "מצב כהה",
"theme_setting_image_viewer_quality_subtitle": "התאם את האיכות של תצוגת התמונות המפורטת", "theme_setting_image_viewer_quality_subtitle": "התאם את האיכות של מציג פרטי התמונות",
"theme_setting_image_viewer_quality_title": "איכות מציג תמונות", "theme_setting_image_viewer_quality_title": "איכות מציג תמונות",
"theme_setting_system_theme_switch": "אוטומטי (עקוב אחרי הגדרת מערכת)", "theme_setting_system_theme_switch": "אוטומטי (עקוב אחרי הגדרת מערכת)",
"theme_setting_theme_subtitle": "בחר/י את הגדרת ערכת הנושא של היישום", "theme_setting_theme_subtitle": "בחר/י את הגדרת ערכת הנושא של היישום",
@@ -510,7 +510,7 @@
"trash_page_delete": "מחק", "trash_page_delete": "מחק",
"trash_page_delete_all": "מחק הכל", "trash_page_delete_all": "מחק הכל",
"trash_page_empty_trash_btn": "רוקן אשפה", "trash_page_empty_trash_btn": "רוקן אשפה",
"trash_page_empty_trash_dialog_content": "האם ברצונך לרוקן את הנכסים שבאשפה? הפריטים האלה ימחקו לצמיתות מImmmich", "trash_page_empty_trash_dialog_content": "האם ברצונך לרוקן את הנכסים שבאשפה? הפריטים האלה ימחקו לצמיתות מהשרת",
"trash_page_empty_trash_dialog_ok": "בסדר", "trash_page_empty_trash_dialog_ok": "בסדר",
"trash_page_info": "פריטים באשפה ימחקו לצמיתות לאחר {} ימים", "trash_page_info": "פריטים באשפה ימחקו לצמיתות לאחר {} ימים",
"trash_page_no_assets": "אין נכסים באשפה", "trash_page_no_assets": "אין נכסים באשפה",
@@ -522,12 +522,12 @@
"upload_dialog_cancel": "ביטול", "upload_dialog_cancel": "ביטול",
"upload_dialog_info": "האם ברצונך לגבות את הנכס(ים) שנבחרו לשרת?", "upload_dialog_info": "האם ברצונך לגבות את הנכס(ים) שנבחרו לשרת?",
"upload_dialog_ok": "העלאה", "upload_dialog_ok": "העלאה",
"upload_dialog_title": "העלה נכס", "upload_dialog_title": "העלאת נכס",
"version_announcement_overlay_ack": "אשר", "version_announcement_overlay_ack": "אשר",
"version_announcement_overlay_release_notes": "הערות פרסום", "version_announcement_overlay_release_notes": "הערות פרסום",
"version_announcement_overlay_text_1": "הי חבר/ה, יש מהדורה חדשה של", "version_announcement_overlay_text_1": "הי חבר/ה, יש מהדורה חדשה של",
"version_announcement_overlay_text_2": "אנא קח/י את הזמן שלך לבקר ב", "version_announcement_overlay_text_2": "אנא קח/י את הזמן שלך לבקר ב ",
"version_announcement_overlay_text_3": " ותוודא/י שמבנה ה docker-compose וה env. שלך עדכניים כדי למנוע תצורות שגויות, במיוחד אם את/ה משתמש/ת ב WatchTower או כל מנגנון שמטפל בעדכון יישום השרת שלך באופן אוטומטי.", "version_announcement_overlay_text_3": " ולוודא שמבנה ה docker-compose וה env. שלך עדכני כדי למנוע תצורות שגויות, במיוחד אם את/ה משתמש/ת ב WatchTower או בכל מנגנון שמטפל בעדכון יישום השרת שלך באופן אוטומטי",
"version_announcement_overlay_title": "גרסת שרת חדשה זמינה \uD83C\uDF89", "version_announcement_overlay_title": "גרסת שרת חדשה זמינה \uD83C\uDF89",
"viewer_remove_from_stack": "הסר מערימה", "viewer_remove_from_stack": "הסר מערימה",
"viewer_stack_use_as_main_asset": "השתמש כנכס ראשי", "viewer_stack_use_as_main_asset": "השתמש כנכס ראשי",

View File

@@ -4,10 +4,10 @@
"action_common_clear": "지우기", "action_common_clear": "지우기",
"action_common_confirm": "확인", "action_common_confirm": "확인",
"action_common_update": "업데이트", "action_common_update": "업데이트",
"add_to_album_bottom_sheet_added": "{album}에 추가", "add_to_album_bottom_sheet_added": "{album}에 추가되었습니다.",
"add_to_album_bottom_sheet_already_exists": "{album}에 이미 존재", "add_to_album_bottom_sheet_already_exists": "{album}에 이미 존재하는 항목입니다.",
"advanced_settings_log_level_title": "로그 레벨: {}", "advanced_settings_log_level_title": "로그 레벨: {}",
"advanced_settings_prefer_remote_subtitle": "일부 기기의 경우, 기기 내의 섬네일을 로드하는 속도가 매우 느립니다. 서버 이미지를 대신 로드하려면 이 설정을 활성화하세요.", "advanced_settings_prefer_remote_subtitle": "일부 기기의 경우 기기 내의 섬네일을 로드하는 속도가 매우 느립니다. 서버 이미지를 대신 로드하려면 이 설정을 활성화하세요.",
"advanced_settings_prefer_remote_title": "서버 이미지 선호", "advanced_settings_prefer_remote_title": "서버 이미지 선호",
"advanced_settings_proxy_headers_subtitle": "각 네트워크 요청을 보낼 때 Immich가 사용할 프록시 헤더를 정의합니다.", "advanced_settings_proxy_headers_subtitle": "각 네트워크 요청을 보낼 때 Immich가 사용할 프록시 헤더를 정의합니다.",
"advanced_settings_proxy_headers_title": "프록시 헤더", "advanced_settings_proxy_headers_title": "프록시 헤더",
@@ -21,14 +21,14 @@
"album_info_card_backup_album_included": "포함됨", "album_info_card_backup_album_included": "포함됨",
"album_thumbnail_card_item": "1개 항목", "album_thumbnail_card_item": "1개 항목",
"album_thumbnail_card_items": "{}개 항목", "album_thumbnail_card_items": "{}개 항목",
"album_thumbnail_card_shared": " · 공유", "album_thumbnail_card_shared": " · 공유",
"album_thumbnail_owned": "소유함", "album_thumbnail_owned": "소유함",
"album_thumbnail_shared_by": "{} 공유", "album_thumbnail_shared_by": "{}님이 공유",
"album_viewer_appbar_delete_confirm": "이 앨범을 삭제하시겠습니까?", "album_viewer_appbar_delete_confirm": "이 앨범을 삭제하시겠습니까?",
"album_viewer_appbar_share_delete": "앨범 삭제", "album_viewer_appbar_share_delete": "앨범 삭제",
"album_viewer_appbar_share_err_delete": "앨범을 삭제하지 못했습니다.", "album_viewer_appbar_share_err_delete": "앨범을 삭제하지 못했습니다.",
"album_viewer_appbar_share_err_leave": "앨범에서 나가지 못했습니다.", "album_viewer_appbar_share_err_leave": "앨범에서 나가지 못했습니다.",
"album_viewer_appbar_share_err_remove": "앨범에서 선택한 항목을 제거하지 못했습니다.", "album_viewer_appbar_share_err_remove": "앨범에서 항목을 제거하지 못했습니다.",
"album_viewer_appbar_share_err_title": "앨범 이름을 변경하지 못했습니다.", "album_viewer_appbar_share_err_title": "앨범 이름을 변경하지 못했습니다.",
"album_viewer_appbar_share_leave": "앨범 나가기", "album_viewer_appbar_share_leave": "앨범 나가기",
"album_viewer_appbar_share_remove": "앨범에서 제거", "album_viewer_appbar_share_remove": "앨범에서 제거",
@@ -41,12 +41,12 @@
"app_bar_signout_dialog_title": "로그아웃", "app_bar_signout_dialog_title": "로그아웃",
"archive_page_no_archived_assets": "보관된 항목 없음", "archive_page_no_archived_assets": "보관된 항목 없음",
"archive_page_title": "보관함 ({})", "archive_page_title": "보관함 ({})",
"asset_action_delete_err_read_only": "읽기 전용 콘텐츠를 삭제할 수 없습니다. 건너뜁니다.", "asset_action_delete_err_read_only": "읽기 전용 항목은 삭제할 수 없습니다. 건너뜁니다.",
"asset_action_share_err_offline": "오프라인 콘텐츠를 불러올 수 없습니다. 건너뜁니다.", "asset_action_share_err_offline": "누락된 항목을 불러올 수 없습니다. 건너뜁니다.",
"asset_list_group_by_sub_title": "다음으로 그룹화", "asset_list_group_by_sub_title": "다음으로 그룹화",
"asset_list_layout_settings_dynamic_layout_title": "동적 레이아웃", "asset_list_layout_settings_dynamic_layout_title": "동적 레이아웃",
"asset_list_layout_settings_group_automatically": "자동", "asset_list_layout_settings_group_automatically": "자동",
"asset_list_layout_settings_group_by": "다음으로 콘텐츠 그룹화", "asset_list_layout_settings_group_by": "다음으로 그룹화",
"asset_list_layout_settings_group_by_month": "월", "asset_list_layout_settings_group_by_month": "월",
"asset_list_layout_settings_group_by_month_day": "월 + 일", "asset_list_layout_settings_group_by_month_day": "월 + 일",
"asset_list_layout_sub_title": "레이아웃", "asset_list_layout_sub_title": "레이아웃",
@@ -60,14 +60,14 @@
"backup_album_selection_page_selection_info": "선택한 앨범 ", "backup_album_selection_page_selection_info": "선택한 앨범 ",
"backup_album_selection_page_total_assets": "전체 항목", "backup_album_selection_page_total_assets": "전체 항목",
"backup_all": "모두", "backup_all": "모두",
"backup_background_service_backup_failed_message": "콘텐츠를 백업하지 못했습니다. 다시 시도하는 중...", "backup_background_service_backup_failed_message": "백업하지 못했습니다. 다시 시도하는 중...",
"backup_background_service_connection_failed_message": "서버에 연결하지 못했습니다. 다시 시도하는 중...", "backup_background_service_connection_failed_message": "서버에 연결하지 못했습니다. 다시 시도하는 중...",
"backup_background_service_current_upload_notification": "{} 업로드 중", "backup_background_service_current_upload_notification": "{} 업로드 중",
"backup_background_service_default_notification": "새 콘텐츠를 확인하고 있습니다...", "backup_background_service_default_notification": "백업할 항목을 확인하는 중...",
"backup_background_service_error_title": "백업 오류", "backup_background_service_error_title": "백업 오류",
"backup_background_service_in_progress_notification": "콘텐츠를 백업하고 있습니다...", "backup_background_service_in_progress_notification": "선택한 항목을 백업하는 중...",
"backup_background_service_upload_failure_notification": "{} 업로드 실패", "backup_background_service_upload_failure_notification": "{} 업로드 실패",
"backup_controller_page_albums": "백업 앨범", "backup_controller_page_albums": "백업 대상 앨범",
"backup_controller_page_background_app_refresh_disabled_content": "백그라운드 백업을 사용하려면 설정 > 일반 > 백그라운드 앱 새로 고침에서 백그라운드 앱 새로 고침을 활성화하세요.", "backup_controller_page_background_app_refresh_disabled_content": "백그라운드 백업을 사용하려면 설정 > 일반 > 백그라운드 앱 새로 고침에서 백그라운드 앱 새로 고침을 활성화하세요.",
"backup_controller_page_background_app_refresh_disabled_title": "백그라운드 새로 고침 비활성화됨", "backup_controller_page_background_app_refresh_disabled_title": "백그라운드 새로 고침 비활성화됨",
"backup_controller_page_background_app_refresh_enable_button_text": "설정으로 이동", "backup_controller_page_background_app_refresh_enable_button_text": "설정으로 이동",
@@ -83,38 +83,38 @@
"backup_controller_page_background_is_on": "자동 백그라운드 백업이 활성화되었습니다.", "backup_controller_page_background_is_on": "자동 백그라운드 백업이 활성화되었습니다.",
"backup_controller_page_background_turn_off": "백그라운드 서비스 비활성화", "backup_controller_page_background_turn_off": "백그라운드 서비스 비활성화",
"backup_controller_page_background_turn_on": "백그라운드 서비스 활성화", "backup_controller_page_background_turn_on": "백그라운드 서비스 활성화",
"backup_controller_page_background_wifi": "Wi-Fi를 통해서만 백업", "backup_controller_page_background_wifi": "Wi-Fi에서만",
"backup_controller_page_backup": "백업", "backup_controller_page_backup": "백업",
"backup_controller_page_backup_selected": "선택: ", "backup_controller_page_backup_selected": "선택: ",
"backup_controller_page_backup_sub": "백업된 사진 및 동영상", "backup_controller_page_backup_sub": "백업된 사진 및 동영상",
"backup_controller_page_cancel": "취소", "backup_controller_page_cancel": "취소",
"backup_controller_page_created": "만든 날짜: {}", "backup_controller_page_created": "생성일: {}",
"backup_controller_page_desc_backup": "새 콘텐츠를 서버에 자동으로 백업하려면 백업을 활성화하세요.", "backup_controller_page_desc_backup": "앱을 열 때 새 항목을 서버에 자동으로 업로드하려면 포그라운드 백업을 활성화하세요.",
"backup_controller_page_excluded": "제외: ", "backup_controller_page_excluded": "제외: ",
"backup_controller_page_failed": "실패 ({})", "backup_controller_page_failed": "실패 ({})",
"backup_controller_page_filename": "파일명: {} [{}]", "backup_controller_page_filename": "파일명: {} [{}]",
"backup_controller_page_id": "ID: {}", "backup_controller_page_id": "ID: {}",
"backup_controller_page_info": "백업 정보", "backup_controller_page_info": "백업 정보",
"backup_controller_page_none_selected": "선택한 항목 없", "backup_controller_page_none_selected": "선택한 항목습니다.",
"backup_controller_page_remainder": "남은 항목", "backup_controller_page_remainder": "남은 항목",
"backup_controller_page_remainder_sub": "선택한 항목 중 백업해야 할 남은 사진 및 동영상", "backup_controller_page_remainder_sub": "백업할 사진 및 동영상",
"backup_controller_page_select": "선택", "backup_controller_page_select": "선택",
"backup_controller_page_server_storage": "서버 스토리지", "backup_controller_page_server_storage": "서버 스토리지",
"backup_controller_page_start_backup": "백업 시작", "backup_controller_page_start_backup": "백업 시작",
"backup_controller_page_status_off": "자동 백업이 비활성화되었습니다.", "backup_controller_page_status_off": "자동 백업이 비활성화되었습니다.",
"backup_controller_page_status_on": "자동 백업이 활성화되었습니다.", "backup_controller_page_status_on": "자동 백업이 활성화되었습니다.",
"backup_controller_page_storage_format": "{} 사용 중, 전체 {}", "backup_controller_page_storage_format": "{} 사용 중, 전체 {}",
"backup_controller_page_to_backup": "백업 앨범 목록", "backup_controller_page_to_backup": "백업 대상 앨범 목록",
"backup_controller_page_total": "전체", "backup_controller_page_total": "전체",
"backup_controller_page_total_sub": "선택한 앨범의 모든 사진 및 동영상", "backup_controller_page_total_sub": "선택한 앨범의 모든 사진 및 동영상",
"backup_controller_page_turn_off": "백업 비활성화", "backup_controller_page_turn_off": "백업 비활성화",
"backup_controller_page_turn_on": "백업 활성화", "backup_controller_page_turn_on": "백업 활성화",
"backup_controller_page_uploading_file_info": "파일 정보 업로드 중", "backup_controller_page_uploading_file_info": "파일 정보 업로드 중",
"backup_err_only_album": "유일한 앨범은 제거할 수 없습니다.", "backup_err_only_album": "유일한 앨범은 제거할 수 없습니다.",
"backup_info_card_assets": "콘텐츠", "backup_info_card_assets": "항목",
"backup_manual_cancelled": "취소됨", "backup_manual_cancelled": "취소됨",
"backup_manual_failed": "실패", "backup_manual_failed": "실패",
"backup_manual_in_progress": "업로드가 이미 진행 중입니다. 잠시 후 시도하세요.", "backup_manual_in_progress": "업로드가 이미 진행 중입니다. 잠시 후 다시 시도하세요.",
"backup_manual_success": "성공", "backup_manual_success": "성공",
"backup_manual_title": "업로드 상태", "backup_manual_title": "업로드 상태",
"backup_options_page_title": "백업 옵션", "backup_options_page_title": "백업 옵션",
@@ -122,11 +122,11 @@
"cache_settings_clear_cache_button": "캐시 지우기", "cache_settings_clear_cache_button": "캐시 지우기",
"cache_settings_clear_cache_button_title": "앱 캐시를 지웁니다. 이 작업은 캐시가 다시 생성될 때까지 앱 성능에 상당한 영향을 미칠 수 있습니다.", "cache_settings_clear_cache_button_title": "앱 캐시를 지웁니다. 이 작업은 캐시가 다시 생성될 때까지 앱 성능에 상당한 영향을 미칠 수 있습니다.",
"cache_settings_duplicated_assets_clear_button": "지우기", "cache_settings_duplicated_assets_clear_button": "지우기",
"cache_settings_duplicated_assets_subtitle": "앱의 제외 대상인 사진 및 동영상", "cache_settings_duplicated_assets_subtitle": "업로드되지 않는 사진 및 동영상",
"cache_settings_duplicated_assets_title": "중복 항목 ({})", "cache_settings_duplicated_assets_title": "중복 항목 ({})",
"cache_settings_image_cache_size": "이미지 캐시 크기 ({})", "cache_settings_image_cache_size": "이미지 캐시 크기 ({})",
"cache_settings_statistics_album": "라이브러리 섬네일", "cache_settings_statistics_album": "라이브러리 섬네일",
"cache_settings_statistics_assets": "{} 항목 ({})", "cache_settings_statistics_assets": "항목 {}개 ({})",
"cache_settings_statistics_full": "전체 이미지", "cache_settings_statistics_full": "전체 이미지",
"cache_settings_statistics_shared": "공유 앨범 섬네일", "cache_settings_statistics_shared": "공유 앨범 섬네일",
"cache_settings_statistics_thumbnail": "섬네일", "cache_settings_statistics_thumbnail": "섬네일",
@@ -137,43 +137,43 @@
"cache_settings_tile_title": "로컬 스토리지", "cache_settings_tile_title": "로컬 스토리지",
"cache_settings_title": "캐시 설정", "cache_settings_title": "캐시 설정",
"change_password_form_confirm_password": "현재 비밀번호 입력", "change_password_form_confirm_password": "현재 비밀번호 입력",
"change_password_form_description": "안녕하세요. {name}님,\n\n시스템에 처음으로 로그인거나, 비밀번호 변경 요청이 있었습니다. 아래에 새 비밀번호를 입력해주세요.", "change_password_form_description": "안녕하세요 {name}님,\n\n 로그인거나, 비밀번호가 초기화되어 비밀번호를 설정해야 합니다. 아래에 새 비밀번호를 입력해주세요.",
"change_password_form_new_password": "새 비밀번호 입력", "change_password_form_new_password": "새 비밀번호 입력",
"change_password_form_password_mismatch": "비밀번호가 일치하지 않습니다.", "change_password_form_password_mismatch": "비밀번호가 일치하지 않습니다.",
"change_password_form_reenter_new_password": "새 비밀번호 확인", "change_password_form_reenter_new_password": "새 비밀번호 확인",
"common_add_to_album": "앨범에 추가", "common_add_to_album": "앨범에 추가",
"common_change_password": "비밀번호 변경", "common_change_password": "비밀번호 변경",
"common_create_new_album": "앨범 생성", "common_create_new_album": "앨범 생성",
"common_server_error": "네트워크 연결 상태를 확인하고, 서버에 접속할 수 있는지, 앱/서버 버전이 호환되는지 확인해주세요.", "common_server_error": "네트워크 연결 상태를 확인하고, 서버에 접속할 수 있는지, 앱/서버 버전이 호환되는지 확인해주세요.",
"common_shared": "공유됨", "common_shared": "공유됨",
"control_bottom_app_bar_add_to_album": "앨범에 추가", "control_bottom_app_bar_add_to_album": "앨범에 추가",
"control_bottom_app_bar_album_info": "{}개 항목", "control_bottom_app_bar_album_info": "{}개 항목",
"control_bottom_app_bar_album_info_shared": "{}개 항목 · 공유됨", "control_bottom_app_bar_album_info_shared": "{}개 항목 · 공유됨",
"control_bottom_app_bar_archive": "보관", "control_bottom_app_bar_archive": "보관",
"control_bottom_app_bar_create_new_album": "앨범 생성", "control_bottom_app_bar_create_new_album": "앨범 생성",
"control_bottom_app_bar_delete": "삭제", "control_bottom_app_bar_delete": "삭제",
"control_bottom_app_bar_delete_from_immich": "Immich에서 삭제", "control_bottom_app_bar_delete_from_immich": "Immich에서 삭제",
"control_bottom_app_bar_delete_from_local": "기기에서 삭제", "control_bottom_app_bar_delete_from_local": "기기에서 삭제",
"control_bottom_app_bar_edit_location": "위치 편집", "control_bottom_app_bar_edit_location": "위치 편집",
"control_bottom_app_bar_edit_time": "날짜 및 시간 편집", "control_bottom_app_bar_edit_time": "날짜 및 시간 변경",
"control_bottom_app_bar_favorite": "즐겨찾기", "control_bottom_app_bar_favorite": "즐겨찾기",
"control_bottom_app_bar_share": "공유", "control_bottom_app_bar_share": "공유",
"control_bottom_app_bar_share_to": "공유 대상", "control_bottom_app_bar_share_to": "공유 대상",
"control_bottom_app_bar_stack": "스택", "control_bottom_app_bar_stack": "스택",
"control_bottom_app_bar_trash_from_immich": "휴지통으로 이동", "control_bottom_app_bar_trash_from_immich": "휴지통",
"control_bottom_app_bar_unarchive": "보관 해제", "control_bottom_app_bar_unarchive": "보관 해제",
"control_bottom_app_bar_unfavorite": "즐겨찾기 해제", "control_bottom_app_bar_unfavorite": "즐겨찾기 해제",
"control_bottom_app_bar_upload": "업로드", "control_bottom_app_bar_upload": "업로드",
"create_album_page_untitled": "제목 없음", "create_album_page_untitled": "제목 없음",
"create_shared_album_page_create": "생성", "create_shared_album_page_create": "생성",
"create_shared_album_page_share": "공유", "create_shared_album_page_share": "공유",
"create_shared_album_page_share_add_assets": "콘텐츠 추가", "create_shared_album_page_share_add_assets": "항목 추가",
"create_shared_album_page_share_select_photos": "사진 선택", "create_shared_album_page_share_select_photos": "사진 선택",
"curated_location_page_title": "장소", "curated_location_page_title": "장소",
"curated_object_page_title": "사물", "curated_object_page_title": "사물",
"daily_title_text_date": "E, M월 d일", "daily_title_text_date": "M월 d일 EEEE",
"daily_title_text_date_year": "E, M월 d일, yyyy", "daily_title_text_date_year": "yyyy년 M월 d일 EEEE",
"date_format": "yyyy년 M월 d일, EEEE • a h:mm", "date_format": "yyyy년 M월 d일 EEEE • a h:mm",
"delete_dialog_alert": "선택한 항목이 Immich 및 기기에서 영구적으로 삭제됩니다.", "delete_dialog_alert": "선택한 항목이 Immich 및 기기에서 영구적으로 삭제됩니다.",
"delete_dialog_alert_local": "선택한 항목이 이 기기에서 영구적으로 삭제됩니다. Immich 서버에서는 계속 사용할 수 있습니다.", "delete_dialog_alert_local": "선택한 항목이 이 기기에서 영구적으로 삭제됩니다. Immich 서버에서는 계속 사용할 수 있습니다.",
"delete_dialog_alert_local_non_backed_up": "일부 항목은 Immich에 백업되지 않으며 기기에서 영구적으로 삭제됩니다.", "delete_dialog_alert_local_non_backed_up": "일부 항목은 Immich에 백업되지 않으며 기기에서 영구적으로 삭제됩니다.",
@@ -181,13 +181,13 @@
"delete_dialog_cancel": "취소", "delete_dialog_cancel": "취소",
"delete_dialog_ok": "삭제", "delete_dialog_ok": "삭제",
"delete_dialog_ok_force": "무시하고 삭제", "delete_dialog_ok_force": "무시하고 삭제",
"delete_dialog_title": "영구 삭제", "delete_dialog_title": "영구적으로 삭제",
"delete_local_dialog_ok_backed_up_only": "백업된 항목만 삭제", "delete_local_dialog_ok_backed_up_only": "백업된 항목만 삭제",
"delete_local_dialog_ok_force": "무시하고 삭제", "delete_local_dialog_ok_force": "무시하고 삭제",
"delete_shared_link_dialog_content": "이 공유 링크를 삭제하시겠습니까?", "delete_shared_link_dialog_content": "이 공유 링크를 삭제하시겠습니까?",
"delete_shared_link_dialog_title": "공유 링크 삭제", "delete_shared_link_dialog_title": "공유 링크 삭제",
"description_input_hint_text": "설명 추가...", "description_input_hint_text": "설명 추가...",
"description_input_submit_error": "설명을 업데이트하는 중 문제가 발생했습니다. 자세한 내용은 로그를 확인하세요.", "description_input_submit_error": "설명을 변경하는 중 문제가 발생했습니다. 자세한 내용은 로그를 참조하세요.",
"edit_date_time_dialog_date_time": "날짜 및 시간", "edit_date_time_dialog_date_time": "날짜 및 시간",
"edit_date_time_dialog_timezone": "시간대", "edit_date_time_dialog_timezone": "시간대",
"edit_location_dialog_title": "위치", "edit_location_dialog_title": "위치",
@@ -206,35 +206,35 @@
"haptic_feedback_switch": "햅틱 피드백 활성화", "haptic_feedback_switch": "햅틱 피드백 활성화",
"haptic_feedback_title": "햅틱 피드백", "haptic_feedback_title": "햅틱 피드백",
"header_settings_add_header_tip": "헤더 추가", "header_settings_add_header_tip": "헤더 추가",
"header_settings_field_validator_msg": "값은 비워둘 수 없습니다", "header_settings_field_validator_msg": "값은 비워둘 수 없습니다.",
"header_settings_header_name_input": "헤더 이름", "header_settings_header_name_input": "헤더 이름",
"header_settings_header_value_input": "헤더 값", "header_settings_header_value_input": "헤더 값",
"header_settings_page_title": "프록시 헤더", "header_settings_page_title": "프록시 헤더",
"headers_settings_tile_subtitle": "각 네트워크 요청을 보낼 때 사용할 프록시 헤더를 정의합니다.", "headers_settings_tile_subtitle": "각 네트워크 요청을 보낼 때 사용할 프록시 헤더를 정의합니다.",
"headers_settings_tile_title": "사용자 정의 프록시 헤더", "headers_settings_tile_title": "사용자 정의 프록시 헤더",
"home_page_add_to_album_conflicts": "{album} 앨범에 {added} 항목을 추가습니다. {failed} 이미 앨범에 있는 항목입니다.", "home_page_add_to_album_conflicts": "{album} 앨범에 항목 {added}개가 추가되었습니다. 항목 {failed}개는 앨범에 이미 존재합니다.",
"home_page_add_to_album_err_local": "아직 로컬 콘텐츠를 앨범에 추가할 수 없습니다. 건너뜁니다.", "home_page_add_to_album_err_local": "기기의 항목은 앨범에 추가할 수 없습니다. 건너뜁니다.",
"home_page_add_to_album_success": "{album} 앨범에 {added} 항목을 추가습니다.", "home_page_add_to_album_success": "{album} 앨범에 항목 {added}개가 추가되었습니다.",
"home_page_album_err_partner": "아직 앨범에 파트너의 콘텐츠를 추가할 수 없습니다. 건너뜁니다.", "home_page_album_err_partner": "파트너의 항목은 앨범에 추가할 수 없습니다. 건너뜁니다.",
"home_page_archive_err_local": "아직 로컬 콘텐츠를 보관할 수 없습니다. 건너뜁니다.", "home_page_archive_err_local": "기기의 항목은 보관할 수 없습니다. 건너뜁니다.",
"home_page_archive_err_partner": "파트너의 콘텐츠는 보관할 수 없습니다. 건너뜁니다.", "home_page_archive_err_partner": "보관함으로 파트너의 항목은 이동할 수 없습니다. 건너뜁니다.",
"home_page_building_timeline": "타임라인 구성 중", "home_page_building_timeline": "타임라인 구성 중",
"home_page_delete_err_partner": "파트너의 콘텐츠는 삭제할 수 없습니다. 건너뜁니다.", "home_page_delete_err_partner": "파트너의 항목은 삭제할 수 없습니다. 건너뜁니다.",
"home_page_delete_remote_err_local": "서버에서 삭제된 항목입니다. 건너뜁니다.", "home_page_delete_remote_err_local": "서버에서 삭제된 항목입니다. 건너뜁니다.",
"home_page_favorite_err_local": "아직 로컬 콘텐츠를 즐겨찾기에 추가할 수 없습니다. 건너뜁니다.", "home_page_favorite_err_local": "기기의 항목은 즐겨찾기에 추가할 수 없습니다. 건너뜁니다.",
"home_page_favorite_err_partner": "아직 즐겨찾기에 파트너의 콘텐츠를 추가할 수 없습니다. 건너뜁니다.", "home_page_favorite_err_partner": "파트너의 항목은 즐겨찾기에 추가할 수 없습니다. 건너뜁니다.",
"home_page_first_time_notice": "앱을 처음 사용하는 경우 타임라인에 앨범의 사진과 동영상을 채울 수 있도록 백업할 앨범을 선택하세요.", "home_page_first_time_notice": "앱을 처음 사용하는 경우 타임라인에 앨범의 사진과 동영상을 채울 수 있도록 백업할 앨범을 선택하세요.",
"home_page_share_err_local": "로컬 콘텐츠는 링크를 통해 공유할 수 없습니다. 건너뜁니다.", "home_page_share_err_local": "기기의 항목은 링크로 공유할 수 없습니다. 건너뜁니다.",
"home_page_upload_err_limit": "한 번에 최대 30개의 콘텐츠만 업로드할 수 있습니다", "home_page_upload_err_limit": "한 번에 최대 30개의 항목만 업로드할 수 있습니다.",
"image_viewer_page_state_provider_download_error": "다운로드 오류", "image_viewer_page_state_provider_download_error": "다운로드 오류",
"image_viewer_page_state_provider_download_started": "다운로드 시작됨", "image_viewer_page_state_provider_download_started": "다운로드 시작됨",
"image_viewer_page_state_provider_download_success": "다운로드 완료", "image_viewer_page_state_provider_download_success": "다운로드 완료",
"image_viewer_page_state_provider_share_error": "공유 오류", "image_viewer_page_state_provider_share_error": "공유 오류",
"library_page_albums": "앨범", "library_page_albums": "앨범",
"library_page_archive": "보관", "library_page_archive": "보관",
"library_page_device_albums": "기기의 앨범", "library_page_device_albums": "기기의 앨범",
"library_page_favorites": "즐겨찾기", "library_page_favorites": "즐겨찾기",
"library_page_new_album": "앨범", "library_page_new_album": "앨범 생성",
"library_page_sharing": "공유", "library_page_sharing": "공유",
"library_page_sort_asset_count": "항목 수", "library_page_sort_asset_count": "항목 수",
"library_page_sort_created": "만든 날짜", "library_page_sort_created": "만든 날짜",
@@ -256,46 +256,46 @@
"login_form_email_hint": "youremail@email.com", "login_form_email_hint": "youremail@email.com",
"login_form_endpoint_hint": "https://your-server-ip:port/api", "login_form_endpoint_hint": "https://your-server-ip:port/api",
"login_form_endpoint_url": "서버 엔드포인트 URL", "login_form_endpoint_url": "서버 엔드포인트 URL",
"login_form_err_http": "엔드포인트는 http:// 또는 https://로 시작해야 합니다.", "login_form_err_http": "http:// 또는 https://로 시작해야 합니다.",
"login_form_err_invalid_email": "잘못된 이메일입니다.", "login_form_err_invalid_email": "유효하지 않은 이메일",
"login_form_err_invalid_url": "잘못된 URL입니다.", "login_form_err_invalid_url": "잘못된 URL입니다.",
"login_form_err_leading_whitespace": "이메일 앞에 공백 있습니다.", "login_form_err_leading_whitespace": "앞에 공백 문자가 있습니다.",
"login_form_err_trailing_whitespace": "이메일 뒤에 공백 있습니다.", "login_form_err_trailing_whitespace": "뒤에 공백 문자가 있습니다.",
"login_form_failed_get_oauth_server_config": "OAuth 로그인 중 문제 발생, 서버 URL을 확인해주세요.", "login_form_failed_get_oauth_server_config": "OAuth 로그인 중 문제 발생, 서버 URL을 확인해주세요.",
"login_form_failed_get_oauth_server_disable": "이 서버는 OAuth 기능을 지원하지 않습니다.", "login_form_failed_get_oauth_server_disable": "이 서버는 OAuth 기능을 지원하지 않습니다.",
"login_form_failed_login": "로그인 오류, 서버 URL, 이메일 및 비밀번호를 확인하세요.", "login_form_failed_login": "로그인 오류. 서버 URL, 이메일 및 비밀번호를 확인하세요.",
"login_form_handshake_exception": "서버와 통신 중 인증서 예외가 발생했습니다. 자체 서명된 인증서를 사용 중이라면, 설정에서 자체 서명된 인증서 허용을 활성화하세요.", "login_form_handshake_exception": "서버와 통신 중 인증서 예외가 발생했습니다. 자체 서명된 인증서를 사용 중이라면, 설정에서 자체 서명된 인증서 허용을 활성화하세요.",
"login_form_label_email": "이메일", "login_form_label_email": "이메일",
"login_form_label_password": "비밀번호", "login_form_label_password": "비밀번호",
"login_form_next_button": "다음", "login_form_next_button": "다음",
"login_form_password_hint": "비밀번호", "login_form_password_hint": "비밀번호",
"login_form_save_login": "로그인 상태 유지", "login_form_save_login": "로그인 유지",
"login_form_server_empty": "서버 URL을 입력하세요.", "login_form_server_empty": "서버 URL을 입력하세요.",
"login_form_server_error": "서버에 연결할 수 없습니다.", "login_form_server_error": "서버에 연결할 수 없습니다.",
"login_password_changed_error": "비밀번호 변경 중 문제가 발생했습니다.", "login_password_changed_error": "비밀번호 변경하던 중 문제가 발생했습니다.",
"login_password_changed_success": "비밀번호가 변경되었습니다.", "login_password_changed_success": "비밀번호가 변경되었습니다.",
"map_assets_in_bound": "{} 사진", "map_assets_in_bound": "사진 {}개",
"map_assets_in_bounds": "{} 사진", "map_assets_in_bounds": "사진 {}개",
"map_cannot_get_user_location": "위치를 불러올 수 없습니다.", "map_cannot_get_user_location": "사용자의 위치를 불러올 수 없습니다.",
"map_location_dialog_cancel": "아니오", "map_location_dialog_cancel": "아니오",
"map_location_dialog_yes": "예", "map_location_dialog_yes": "예",
"map_location_picker_page_use_location": "이 위치 사용", "map_location_picker_page_use_location": "이 위치 사용",
"map_location_service_disabled_content": "현재 위치의 콘텐츠를 표시하려면 위치 서비스를 활성화해야 합니다. 지금 활성화하시겠습니까?", "map_location_service_disabled_content": "현재 위치의 항목을 표시하려면 위치 서비스를 활성화해야 합니다. 지금 활성화하시겠습니까?",
"map_location_service_disabled_title": "위치 서비스 비활성화됨", "map_location_service_disabled_title": "위치 서비스 비활성화됨",
"map_no_assets_in_bounds": "이 영역에 사진 없음", "map_no_assets_in_bounds": "이 영역에 사진 없음",
"map_no_location_permission_content": "현재 위치의 콘텐츠를 표시하려면 위치 권한이 필요합니다. 지금 허용하시겠습니까?", "map_no_location_permission_content": "현재 위치의 항목을 표시하려면 위치 권한이 필요합니다. 지금 허용하시겠습니까?",
"map_no_location_permission_title": "위치 권한 거부됨", "map_no_location_permission_title": "위치 권한 거부됨",
"map_settings_dark_mode": "다크 모드", "map_settings_dark_mode": "다크 모드",
"map_settings_date_range_option_all": "모두", "map_settings_date_range_option_all": "모두",
"map_settings_date_range_option_day": "지난 24시간", "map_settings_date_range_option_day": "지난 24시간",
"map_settings_date_range_option_days": "지난 {}일", "map_settings_date_range_option_days": "지난 {}일",
"map_settings_date_range_option_year": "지난 ", "map_settings_date_range_option_year": "지난 1년",
"map_settings_date_range_option_years": "지난 {}년", "map_settings_date_range_option_years": "지난 {}년",
"map_settings_dialog_cancel": "취소", "map_settings_dialog_cancel": "취소",
"map_settings_dialog_save": "저장", "map_settings_dialog_save": "저장",
"map_settings_dialog_title": "지도 설정", "map_settings_dialog_title": "지도 설정",
"map_settings_include_show_archived": "보관된 항목 포함", "map_settings_include_show_archived": "보관된 항목 포함",
"map_settings_include_show_partners": "파트너 포함", "map_settings_include_show_partners": "파트너가 공유한 항목 포함",
"map_settings_only_relative_range": "날짜 범위", "map_settings_only_relative_range": "날짜 범위",
"map_settings_only_show_favorites": "즐겨찾기만 표시", "map_settings_only_show_favorites": "즐겨찾기만 표시",
"map_settings_theme_settings": "지도 테마", "map_settings_theme_settings": "지도 테마",
@@ -306,10 +306,10 @@
"memories_swipe_to_close": "위로 밀어서 닫기", "memories_swipe_to_close": "위로 밀어서 닫기",
"memories_year_ago": "1년 전", "memories_year_ago": "1년 전",
"memories_years_ago": "{}년 전", "memories_years_ago": "{}년 전",
"monthly_title_text_date_format": "y년 M월", "monthly_title_text_date_format": "yyyy년 M월",
"motion_photos_page_title": "모션 포토", "motion_photos_page_title": "모션 포토",
"multiselect_grid_edit_date_time_err_read_only": "읽기 전용 콘텐츠의 날짜는 편집할 수 없습니다. 건너뜁니다.", "multiselect_grid_edit_date_time_err_read_only": "읽기 전용 항목의 날짜는 변경할 수 없습니다. 건너뜁니다.",
"multiselect_grid_edit_gps_err_read_only": "읽기 전용 미디어의 위치는 편집할 수 없습니다. 건너뜁니다.", "multiselect_grid_edit_gps_err_read_only": "읽기 전용 항목의 위치는 변경할 수 없습니다. 건너뜁니다.",
"no_assets_to_show": "표시할 항목 없음", "no_assets_to_show": "표시할 항목 없음",
"notification_permission_dialog_cancel": "취소", "notification_permission_dialog_cancel": "취소",
"notification_permission_dialog_content": "알림을 활성화하려면 설정에서 알림 권한을 허용하세요.", "notification_permission_dialog_content": "알림을 활성화하려면 설정에서 알림 권한을 허용하세요.",
@@ -317,16 +317,16 @@
"notification_permission_list_tile_content": "알림을 활성화하기 위해 권한을 부여하세요.", "notification_permission_list_tile_content": "알림을 활성화하기 위해 권한을 부여하세요.",
"notification_permission_list_tile_enable_button": "알림 활성화", "notification_permission_list_tile_enable_button": "알림 활성화",
"notification_permission_list_tile_title": "알림 권한", "notification_permission_list_tile_title": "알림 권한",
"partner_list_user_photos": "{user}의 사진", "partner_list_user_photos": "{user}의 사진",
"partner_list_view_all": "모두 보기", "partner_list_view_all": "모두 보기",
"partner_page_add_partner": "파트너 추가", "partner_page_add_partner": "파트너 추가",
"partner_page_empty_message": "사진이 아직 어떤 파트너와도 공유되지 않았습니다.", "partner_page_empty_message": "사진이 아직 어떤 파트너와도 공유되지 않았습니다.",
"partner_page_no_more_users": "더 이상 추가할 사용자 없", "partner_page_no_more_users": "더 이상 추가할 사용자습니다.",
"partner_page_partner_add_failed": "파트너를 추가할 수 없습니다.", "partner_page_partner_add_failed": "파트너를 추가하지 못했습니다.",
"partner_page_select_partner": "파트너 선택", "partner_page_select_partner": "파트너 선택",
"partner_page_shared_to_title": "공유 대상", "partner_page_shared_to_title": "공유 대상",
"partner_page_stop_sharing_content": "더 이상 당신의 사진에 {}가 접근할 수 없습니다.", "partner_page_stop_sharing_content": "더 이상 {}님이 사진에 접근할 수 없습니다.",
"partner_page_stop_sharing_title": "사진 공유를 중단하시겠습니까?", "partner_page_stop_sharing_title": "공유를 중단하시겠습니까?",
"partner_page_title": "파트너", "partner_page_title": "파트너",
"permission_onboarding_back": "뒤로", "permission_onboarding_back": "뒤로",
"permission_onboarding_continue_anyway": "무시하고 진행", "permission_onboarding_continue_anyway": "무시하고 진행",
@@ -335,34 +335,34 @@
"permission_onboarding_grant_permission": "권한 부여", "permission_onboarding_grant_permission": "권한 부여",
"permission_onboarding_log_out": "로그아웃", "permission_onboarding_log_out": "로그아웃",
"permission_onboarding_permission_denied": "권한이 없습니다. Immich를 사용하려면 설정에서 사진 및 동영상 권한을 부여하세요.", "permission_onboarding_permission_denied": "권한이 없습니다. Immich를 사용하려면 설정에서 사진 및 동영상 권한을 부여하세요.",
"permission_onboarding_permission_granted": "권한이 부여되었습니다! 모든 준비가 완료되었습니다.", "permission_onboarding_permission_granted": "권한이 부여되었습니다! 준비가 완료되었습니다.",
"permission_onboarding_permission_limited": "권한이 없습니다. Immich에서 갤러리 전체 항목을 백업하고 관리하려면 설정에서 사진 및 동영상 권한을 부여하세요.", "permission_onboarding_permission_limited": "권한이 없습니다. Immich가 전체 갤러리 컬렉션을 백업하고 관리할 수 있도록 하려면 설정에서 사진 및 동영상 권한을 부여하세요.",
"permission_onboarding_request": "Immich는 사진 및 동영상 권한이 필요합니다.", "permission_onboarding_request": "사진 및 동영상 권한이 필요합니다.",
"preferences_settings_title": "설정", "preferences_settings_title": "설정",
"profile_drawer_app_logs": "로그", "profile_drawer_app_logs": "로그",
"profile_drawer_client_out_of_date_major": "모바일 앱이 최신 버전이 아닙니다. 최신 메이저 버전으로 업데이트하세요.", "profile_drawer_client_out_of_date_major": "모바일 앱이 최신 버전이 아닙니다. 최신 버전으로 업데이트하세요.",
"profile_drawer_client_out_of_date_minor": "모바일 앱이 최신 버전이 아닙니다. 최신 마이너 버전으로 업데이트하세요.", "profile_drawer_client_out_of_date_minor": "모바일 앱이 최신 버전이 아닙니다. 최신 버전으로 업데이트하세요.",
"profile_drawer_client_server_up_to_date": "앱과 서버가 최신 버전입니다.", "profile_drawer_client_server_up_to_date": "모바일 앱과 서버가 최신 버전입니다.",
"profile_drawer_documentation": "공식 문서", "profile_drawer_documentation": "공식 문서",
"profile_drawer_github": "Github", "profile_drawer_github": "Github",
"profile_drawer_server_out_of_date_major": "서버가 최신 버전이 아닙니다. 최신 메이저 버전으로 업데이트하세요.", "profile_drawer_server_out_of_date_major": "서버가 최신 버전이 아닙니다. 최신 버전으로 업데이트하세요.",
"profile_drawer_server_out_of_date_minor": "서버가 최신 버전이 아닙니다. 최신 마이너 버전으로 업데이트하세요.", "profile_drawer_server_out_of_date_minor": "서버가 최신 버전이 아닙니다. 최신 버전으로 업데이트하세요.",
"profile_drawer_settings": "설정", "profile_drawer_settings": "설정",
"profile_drawer_sign_out": "로그아웃", "profile_drawer_sign_out": "로그아웃",
"profile_drawer_trash": "휴지통", "profile_drawer_trash": "휴지통",
"recently_added_page_title": "최근 추가", "recently_added_page_title": "최근 추가",
"scaffold_body_error_occurred": "문제 발생", "scaffold_body_error_occurred": "문제 발생했습니다.",
"search_bar_hint": "사진 검색", "search_bar_hint": "사진 검색",
"search_filter_apply": "필터 적용", "search_filter_apply": "필터 적용",
"search_filter_camera_make": "제조사", "search_filter_camera_make": "제조사",
"search_filter_camera_model": "모델", "search_filter_camera_model": "모델",
"search_filter_display_option_archive": "보관함", "search_filter_display_option_archive": "보관함",
"search_filter_display_option_favorite": "즐겨찾기", "search_filter_display_option_favorite": "즐겨찾기",
"search_filter_display_option_not_in_album": "어떤 앨범에 없음", "search_filter_display_option_not_in_album": "앨범에 없음",
"search_filter_location_city": "도시", "search_filter_location_city": "도시",
"search_filter_location_country": "국가", "search_filter_location_country": "국가",
"search_filter_location_state": "지역", "search_filter_location_state": "지역",
"search_filter_media_type_all": "전체", "search_filter_media_type_all": "모두",
"search_filter_media_type_image": "이미지", "search_filter_media_type_image": "이미지",
"search_filter_media_type_video": "동영상", "search_filter_media_type_video": "동영상",
"search_page_categories": "분류", "search_page_categories": "분류",
@@ -375,9 +375,9 @@
"search_page_person_add_name_dialog_hint": "이름", "search_page_person_add_name_dialog_hint": "이름",
"search_page_person_add_name_dialog_save": "저장", "search_page_person_add_name_dialog_save": "저장",
"search_page_person_add_name_dialog_title": "이름 추가", "search_page_person_add_name_dialog_title": "이름 추가",
"search_page_person_add_name_subtitle": "검색을 통해 이름으로 빠르게 찾기", "search_page_person_add_name_subtitle": "이름으로 검색하여 빠르게 찾기",
"search_page_person_add_name_title": "이름 추가", "search_page_person_add_name_title": "이름 추가",
"search_page_person_edit_name": "이름 편집", "search_page_person_edit_name": "이름 변경",
"search_page_places": "장소", "search_page_places": "장소",
"search_page_recently_added": "최근 추가", "search_page_recently_added": "최근 추가",
"search_page_screenshots": "스크린샷", "search_page_screenshots": "스크린샷",
@@ -385,8 +385,8 @@
"search_page_things": "사물", "search_page_things": "사물",
"search_page_videos": "동영상", "search_page_videos": "동영상",
"search_page_view_all_button": "모두 보기", "search_page_view_all_button": "모두 보기",
"search_page_your_activity": "나의 활동", "search_page_your_activity": "활동",
"search_page_your_map": "나의 지도", "search_page_your_map": " 지도",
"search_result_page_new_search_hint": "새 검색", "search_result_page_new_search_hint": "새 검색",
"search_suggestion_list_smart_search_hint_1": "스마트 검색이 기본적으로 활성화되어 있습니다. 메타데이터로 검색하려면 다음 구문을 사용하세요.", "search_suggestion_list_smart_search_hint_1": "스마트 검색이 기본적으로 활성화되어 있습니다. 메타데이터로 검색하려면 다음 구문을 사용하세요.",
"search_suggestion_list_smart_search_hint_2": "m:your-search-term", "search_suggestion_list_smart_search_hint_2": "m:your-search-term",
@@ -399,16 +399,16 @@
"server_info_box_server_version": "서버 버전", "server_info_box_server_version": "서버 버전",
"setting_image_viewer_help": "상세 보기는 먼저 작은 크기의 섬네일을 불러오며, 활성화된 경우 중간 크기의 이미지와 원본을 불러옵니다.", "setting_image_viewer_help": "상세 보기는 먼저 작은 크기의 섬네일을 불러오며, 활성화된 경우 중간 크기의 이미지와 원본을 불러옵니다.",
"setting_image_viewer_original_subtitle": "원본 해상도 이미지(고화질)를 로드합니다. 데이터 사용량을 줄이려면 비활성화하세요.", "setting_image_viewer_original_subtitle": "원본 해상도 이미지(고화질)를 로드합니다. 데이터 사용량을 줄이려면 비활성화하세요.",
"setting_image_viewer_original_title": "원본 이미지 선호", "setting_image_viewer_original_title": "원본 이미지 표시",
"setting_image_viewer_preview_subtitle": "중간 크기의 이미지를 불러오려면 활성화하세요. 항상 원본을 불러오거나 섬네일만 불러오려면 비활성화하세요.", "setting_image_viewer_preview_subtitle": "중간 크기의 이미지를 불러오려면 활성화하세요. 항상 원본을 불러오거나 섬네일만 불러오려면 비활성화하세요.",
"setting_image_viewer_preview_title": "미리 보기 이미지 불러오기", "setting_image_viewer_preview_title": "미리 보기 이미지 불러오기",
"setting_image_viewer_title": "이미지", "setting_image_viewer_title": "이미지",
"setting_languages_apply": "적용", "setting_languages_apply": "적용",
"setting_languages_title": "언어", "setting_languages_title": "언어",
"setting_notifications_notify_failures_grace_period": "백그라운드 백업 실패 알림: {}", "setting_notifications_notify_failures_grace_period": "백그라운드 백업 실패 알림: {}",
"setting_notifications_notify_hours": "{}시간 ", "setting_notifications_notify_hours": "{}시간 ",
"setting_notifications_notify_immediately": "즉시", "setting_notifications_notify_immediately": "즉시",
"setting_notifications_notify_minutes": "{}분 ", "setting_notifications_notify_minutes": "{}분 ",
"setting_notifications_notify_never": "알리지 않음", "setting_notifications_notify_never": "알리지 않음",
"setting_notifications_notify_seconds": "{}초", "setting_notifications_notify_seconds": "{}초",
"setting_notifications_single_progress_subtitle": "각 항목의 세부 업로드 정보 표시", "setting_notifications_single_progress_subtitle": "각 항목의 세부 업로드 정보 표시",
@@ -427,28 +427,28 @@
"share_add_title": "앨범 제목 입력", "share_add_title": "앨범 제목 입력",
"share_assets_selected": "{}개 선택됨", "share_assets_selected": "{}개 선택됨",
"share_create_album": "앨범 생성", "share_create_album": "앨범 생성",
"shared_album_activities_input_disable": "댓글 기능이 비활성화", "shared_album_activities_input_disable": "댓글이 비활성화되었습니다",
"shared_album_activities_input_hint": "무엇이든 말해보세요", "shared_album_activities_input_hint": "댓글을 입력하세요",
"shared_album_activity_remove_content": "이 활동을 삭제하시겠습니까?", "shared_album_activity_remove_content": "이 반응을 삭제하시겠습니까?",
"shared_album_activity_remove_title": "활동 삭제", "shared_album_activity_remove_title": "반응 삭제",
"shared_album_activity_setting_subtitle": "다른 사람들의 반응 허용", "shared_album_activity_setting_subtitle": "다른 사용자의 반응 허용",
"shared_album_activity_setting_title": "댓글 & 좋아요", "shared_album_activity_setting_title": "댓글 좋아요",
"shared_album_section_people_action_error": "앨범에서 나가기/제거 중 문제가 발생했습니다.", "shared_album_section_people_action_error": "앨범에서 나가기/제거 중 문제가 발생했습니다.",
"shared_album_section_people_action_leave": "앨범에서 사용자 제거", "shared_album_section_people_action_leave": "앨범에서 사용자 제거",
"shared_album_section_people_action_remove_user": "앨범에서 사용자 제거", "shared_album_section_people_action_remove_user": "앨범에서 사용자 제거",
"shared_album_section_people_owner_label": "소유자", "shared_album_section_people_owner_label": "소유자",
"shared_album_section_people_title": "인물", "shared_album_section_people_title": "사용자",
"share_dialog_preparing": "준비 중...", "share_dialog_preparing": "준비 중...",
"shared_link_app_bar_title": "공유 링크", "shared_link_app_bar_title": "공유 링크",
"shared_link_clipboard_copied_massage": "클립보드에 복사되었습니다.", "shared_link_clipboard_copied_massage": "클립보드에 복사되었습니다.",
"shared_link_clipboard_text": "링크: {}\n비밀번호: {}", "shared_link_clipboard_text": "링크: {}\n비밀번호: {}",
"shared_link_create_app_bar_title": "공유 링크 생성", "shared_link_create_app_bar_title": "공유 링크 생성",
"shared_link_create_error": "공유 링크 생성 중 문제가 발생했습니다.", "shared_link_create_error": "공유 링크 생성 중 문제가 발생했습니다.",
"shared_link_create_info": "링크가 있는 모든 사람이 선택한 사진을 볼 수 있게 하기", "shared_link_create_info": "링크가 있는 경우 누구나 선택한 사진을 볼 수 있습니다.",
"shared_link_create_submit_button": "링크 생성", "shared_link_create_submit_button": "링크 생성",
"shared_link_edit_allow_download": "모든 사용자의 다운로드 허용", "shared_link_edit_allow_download": "모든 사용자의 다운로드 허용",
"shared_link_edit_allow_upload": "모든 사용자의 업로드 허용", "shared_link_edit_allow_upload": "모든 사용자의 업로드 허용",
"shared_link_edit_app_bar_title": "링크 수정", "shared_link_edit_app_bar_title": "링크 편집",
"shared_link_edit_change_expiry": "만료 시간 변경", "shared_link_edit_change_expiry": "만료 시간 변경",
"shared_link_edit_description": "설명", "shared_link_edit_description": "설명",
"shared_link_edit_description_hint": "공유 링크 설명 입력", "shared_link_edit_description_hint": "공유 링크 설명 입력",
@@ -465,7 +465,7 @@
"shared_link_edit_password": "비밀번호", "shared_link_edit_password": "비밀번호",
"shared_link_edit_password_hint": "공유 비밀번호 입력", "shared_link_edit_password_hint": "공유 비밀번호 입력",
"shared_link_edit_show_meta": "메타데이터 표시", "shared_link_edit_show_meta": "메타데이터 표시",
"shared_link_edit_submit_button": "링크 업데이트", "shared_link_edit_submit_button": "링크 편집",
"shared_link_empty": "생성한 공유 링크가 없습니다.", "shared_link_empty": "생성한 공유 링크가 없습니다.",
"shared_link_error_server_url_fetch": "서버 URL을 불러올 수 없습니다.", "shared_link_error_server_url_fetch": "서버 URL을 불러올 수 없습니다.",
"shared_link_expired": "만료됨", "shared_link_expired": "만료됨",
@@ -487,7 +487,7 @@
"share_done": "완료", "share_done": "완료",
"share_invite": "앨범에 초대", "share_invite": "앨범에 초대",
"sharing_page_album": "공유 앨범", "sharing_page_album": "공유 앨범",
"sharing_page_description": "공유 앨범을 만들어 네트워크에 있는 사람들과 사진 및 동영상을 공유하세요", "sharing_page_description": "공유 앨범을 만들어 주변 사람들과 사진 및 동영상을 공유하세요.",
"sharing_page_empty_list": "공유 앨범 없음", "sharing_page_empty_list": "공유 앨범 없음",
"sharing_silver_appbar_create_shared_album": "공유 앨범 생성", "sharing_silver_appbar_create_shared_album": "공유 앨범 생성",
"sharing_silver_appbar_shared_links": "공유 링크", "sharing_silver_appbar_shared_links": "공유 링크",
@@ -510,7 +510,7 @@
"trash_page_delete": "삭제", "trash_page_delete": "삭제",
"trash_page_delete_all": "모두 삭제", "trash_page_delete_all": "모두 삭제",
"trash_page_empty_trash_btn": "휴지통 비우기", "trash_page_empty_trash_btn": "휴지통 비우기",
"trash_page_empty_trash_dialog_content": "휴지통을 비우시겠습니까? 해당 항목이 Immich에서 영구적으로 삭제되며 되돌릴 수 없습니다.", "trash_page_empty_trash_dialog_content": "휴지통을 비우시겠습니까? 휴지통에 있는 항목이 Immich에서 영구적으로 제거됩니다.",
"trash_page_empty_trash_dialog_ok": "확인", "trash_page_empty_trash_dialog_ok": "확인",
"trash_page_info": "휴지통으로 이동된 항목은 {}일 후 영구적으로 삭제됩니다.", "trash_page_info": "휴지통으로 이동된 항목은 {}일 후 영구적으로 삭제됩니다.",
"trash_page_no_assets": "휴지통이 비어 있음", "trash_page_no_assets": "휴지통이 비어 있음",
@@ -522,12 +522,12 @@
"upload_dialog_cancel": "취소", "upload_dialog_cancel": "취소",
"upload_dialog_info": "선택한 항목을 서버에 백업하시겠습니까?", "upload_dialog_info": "선택한 항목을 서버에 백업하시겠습니까?",
"upload_dialog_ok": "업로드", "upload_dialog_ok": "업로드",
"upload_dialog_title": "콘텐츠 업로드", "upload_dialog_title": "항목 업로드",
"version_announcement_overlay_ack": "확인", "version_announcement_overlay_ack": "확인",
"version_announcement_overlay_release_notes": "릴리스 정보", "version_announcement_overlay_release_notes": "릴리스 노트",
"version_announcement_overlay_text_1": "안녕하세요,", "version_announcement_overlay_text_1": "안녕하세요,",
"version_announcement_overlay_text_2": "새 업데이트가 있습니다.", "version_announcement_overlay_text_2": "새 버전의 Immich를 사용할 수 있습니다.",
"version_announcement_overlay_text_3": "WatchTower 또는 서버 애플리케이션의 자동 업데이트 기능을 사용하는 경우 잘못된 구성을 방지하기 위해 docker-compose 및 .env 설정이 최신 상태인지 확인하세요.", "version_announcement_overlay_text_3": "WatchTower 의 자동 업데이트 기능을 사용하는 경우 의도하지 않은 동작을 방지하기 위해 docker-compose.yml 및 .env 구성이 최신인지 확인하세요.",
"version_announcement_overlay_title": "새 서버 버전 사용 가능 \uD83C\uDF89", "version_announcement_overlay_title": "새 서버 버전 사용 가능 \uD83C\uDF89",
"viewer_remove_from_stack": "스택에서 제거", "viewer_remove_from_stack": "스택에서 제거",
"viewer_stack_use_as_main_asset": "대표 사진으로 설정", "viewer_stack_use_as_main_asset": "대표 사진으로 설정",

View File

@@ -9,8 +9,8 @@
"advanced_settings_log_level_title": "Loggnivå: {}", "advanced_settings_log_level_title": "Loggnivå: {}",
"advanced_settings_prefer_remote_subtitle": "Noen enheter er veldige trege til å hente mikrobilder fra enheten. Aktiver denne innstillingen for å hente de eksternt istedenfor.", "advanced_settings_prefer_remote_subtitle": "Noen enheter er veldige trege til å hente mikrobilder fra enheten. Aktiver denne innstillingen for å hente de eksternt istedenfor.",
"advanced_settings_prefer_remote_title": "Foretrekk eksterne bilder", "advanced_settings_prefer_remote_title": "Foretrekk eksterne bilder",
"advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request", "advanced_settings_proxy_headers_subtitle": "Definer proxy headere som Immich skal benytte ved enhver nettverksrequest ",
"advanced_settings_proxy_headers_title": "Proxy Headers", "advanced_settings_proxy_headers_title": "Proxy headere",
"advanced_settings_self_signed_ssl_subtitle": "Hopper over SSL sertifikatverifikasjon for server-endepunkt. Påkrevet for selvsignerte sertifikater.", "advanced_settings_self_signed_ssl_subtitle": "Hopper over SSL sertifikatverifikasjon for server-endepunkt. Påkrevet for selvsignerte sertifikater.",
"advanced_settings_self_signed_ssl_title": "Tillat selvsignerte SSL sertifikater", "advanced_settings_self_signed_ssl_title": "Tillat selvsignerte SSL sertifikater",
"advanced_settings_tile_subtitle": "Avanserte brukerinnstillinger", "advanced_settings_tile_subtitle": "Avanserte brukerinnstillinger",
@@ -205,13 +205,13 @@
"favorites_page_title": "Favoritter", "favorites_page_title": "Favoritter",
"haptic_feedback_switch": "Aktivert haptisk tilbakemelding", "haptic_feedback_switch": "Aktivert haptisk tilbakemelding",
"haptic_feedback_title": "Haptisk tilbakemelding", "haptic_feedback_title": "Haptisk tilbakemelding",
"header_settings_add_header_tip": "Add Header", "header_settings_add_header_tip": "Legg til header",
"header_settings_field_validator_msg": "Value cannot be empty", "header_settings_field_validator_msg": "Verdi kan ikke være null",
"header_settings_header_name_input": "Header name", "header_settings_header_name_input": "Header navn",
"header_settings_header_value_input": "Header value", "header_settings_header_value_input": "Header verdi",
"header_settings_page_title": "Proxy Headers", "header_settings_page_title": "Proxy headere",
"headers_settings_tile_subtitle": "Define proxy headers the app should send with each network request", "headers_settings_tile_subtitle": "Definer proxy headere som appen skal benytte ved enhver nettverksrequest",
"headers_settings_tile_title": "Custom proxy headers", "headers_settings_tile_title": "Egendefinerte proxy headere",
"home_page_add_to_album_conflicts": "Lagt til {added} objekter til album {album}. {failed} objekter er allerede i albumet.", "home_page_add_to_album_conflicts": "Lagt til {added} objekter til album {album}. {failed} objekter er allerede i albumet.",
"home_page_add_to_album_err_local": "Kan ikke legge til lokale objekter til album enda, hopper over", "home_page_add_to_album_err_local": "Kan ikke legge til lokale objekter til album enda, hopper over",
"home_page_add_to_album_success": "Lagt til {added} objekter til album {album}.", "home_page_add_to_album_success": "Lagt til {added} objekter til album {album}.",

View File

@@ -9,8 +9,8 @@
"advanced_settings_log_level_title": "Log niveau: {}", "advanced_settings_log_level_title": "Log niveau: {}",
"advanced_settings_prefer_remote_subtitle": "Sommige apparaten zijn traag met het laden van afbeeldingen die lokaal zijn opgeslagen op het apparaat. Activeer deze instelling om in plaats daarvan externe afbeeldingen te laden.", "advanced_settings_prefer_remote_subtitle": "Sommige apparaten zijn traag met het laden van afbeeldingen die lokaal zijn opgeslagen op het apparaat. Activeer deze instelling om in plaats daarvan externe afbeeldingen te laden.",
"advanced_settings_prefer_remote_title": "Externe afbeeldingen laden", "advanced_settings_prefer_remote_title": "Externe afbeeldingen laden",
"advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request", "advanced_settings_proxy_headers_subtitle": "Definieer proxy headers die Immich bij elk netwerkverzoek moet verzenden",
"advanced_settings_proxy_headers_title": "Proxy Headers", "advanced_settings_proxy_headers_title": "Proxy headers",
"advanced_settings_self_signed_ssl_subtitle": "Slaat SSL-certificaatverificatie voor de connectie met de server over. Deze optie is vereist voor zelfondertekende certificaten", "advanced_settings_self_signed_ssl_subtitle": "Slaat SSL-certificaatverificatie voor de connectie met de server over. Deze optie is vereist voor zelfondertekende certificaten",
"advanced_settings_self_signed_ssl_title": "Zelfondertekende SSL-certificaten toestaan", "advanced_settings_self_signed_ssl_title": "Zelfondertekende SSL-certificaten toestaan",
"advanced_settings_tile_subtitle": "Geavanceerde gebruikersinstellingen", "advanced_settings_tile_subtitle": "Geavanceerde gebruikersinstellingen",
@@ -205,13 +205,13 @@
"favorites_page_title": "Favorieten", "favorites_page_title": "Favorieten",
"haptic_feedback_switch": "Aanraaktrillingen inschakelen", "haptic_feedback_switch": "Aanraaktrillingen inschakelen",
"haptic_feedback_title": "Aanraaktrillingen", "haptic_feedback_title": "Aanraaktrillingen",
"header_settings_add_header_tip": "Add Header", "header_settings_add_header_tip": "Header toevoegen",
"header_settings_field_validator_msg": "Value cannot be empty", "header_settings_field_validator_msg": "Waarde kan niet leeg zijn",
"header_settings_header_name_input": "Header name", "header_settings_header_name_input": "Header naam",
"header_settings_header_value_input": "Header value", "header_settings_header_value_input": "Header waarde",
"header_settings_page_title": "Proxy Headers", "header_settings_page_title": "Proxy headers",
"headers_settings_tile_subtitle": "Define proxy headers the app should send with each network request", "headers_settings_tile_subtitle": "Definieer proxy headers die de app met elk netwerkverzoek moet verzenden",
"headers_settings_tile_title": "Custom proxy headers", "headers_settings_tile_title": "Aangepaste proxy headers",
"home_page_add_to_album_conflicts": "{added} assets toegevoegd aan album {album}. {failed} assets staan al in het album.", "home_page_add_to_album_conflicts": "{added} assets toegevoegd aan album {album}. {failed} assets staan al in het album.",
"home_page_add_to_album_err_local": "Lokale assets kunnen nog niet aan albums worden toegevoegd, overslaan", "home_page_add_to_album_err_local": "Lokale assets kunnen nog niet aan albums worden toegevoegd, overslaan",
"home_page_add_to_album_success": "{added} assets toegevoegd aan album {album}.", "home_page_add_to_album_success": "{added} assets toegevoegd aan album {album}.",
@@ -305,7 +305,7 @@
"memories_start_over": "Opnieuw beginnen", "memories_start_over": "Opnieuw beginnen",
"memories_swipe_to_close": "Swipe omhoog om te sluiten", "memories_swipe_to_close": "Swipe omhoog om te sluiten",
"memories_year_ago": "Een jaar geleden", "memories_year_ago": "Een jaar geleden",
"memories_years_ago": "{} jaren geleden", "memories_years_ago": "{} jaar geleden",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Bewegende foto's", "motion_photos_page_title": "Bewegende foto's",
"multiselect_grid_edit_date_time_err_read_only": "Kan datum van alleen-lezen asset(s) niet wijzigen, overslaan", "multiselect_grid_edit_date_time_err_read_only": "Kan datum van alleen-lezen asset(s) niet wijzigen, overslaan",

View File

@@ -10,7 +10,7 @@
"advanced_settings_prefer_remote_subtitle": "Niektóre urządzenia bardzo wolno ładują miniatury z zasobów na urządzeniu. Aktywuj to ustawienie, aby ładować zdalne obrazy.", "advanced_settings_prefer_remote_subtitle": "Niektóre urządzenia bardzo wolno ładują miniatury z zasobów na urządzeniu. Aktywuj to ustawienie, aby ładować zdalne obrazy.",
"advanced_settings_prefer_remote_title": "Preferuj obrazy zdalne", "advanced_settings_prefer_remote_title": "Preferuj obrazy zdalne",
"advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request", "advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request",
"advanced_settings_proxy_headers_title": "Proxy Headers", "advanced_settings_proxy_headers_title": "Nagłówki proxy",
"advanced_settings_self_signed_ssl_subtitle": "Pomija weryfikację certyfikatu SSL dla punktu końcowego serwera. Wymagane w przypadku certyfikatów z podpisem własnym.", "advanced_settings_self_signed_ssl_subtitle": "Pomija weryfikację certyfikatu SSL dla punktu końcowego serwera. Wymagane w przypadku certyfikatów z podpisem własnym.",
"advanced_settings_self_signed_ssl_title": "Zezwalaj na certyfikaty SSL z podpisem własnym", "advanced_settings_self_signed_ssl_title": "Zezwalaj na certyfikaty SSL z podpisem własnym",
"advanced_settings_tile_subtitle": "Zaawansowane ustawienia użytkownika", "advanced_settings_tile_subtitle": "Zaawansowane ustawienia użytkownika",
@@ -205,13 +205,13 @@
"favorites_page_title": "Ulubione", "favorites_page_title": "Ulubione",
"haptic_feedback_switch": "Enable haptic feedback", "haptic_feedback_switch": "Enable haptic feedback",
"haptic_feedback_title": "Haptic Feedback", "haptic_feedback_title": "Haptic Feedback",
"header_settings_add_header_tip": "Add Header", "header_settings_add_header_tip": "Dodaj nagłówek",
"header_settings_field_validator_msg": "Value cannot be empty", "header_settings_field_validator_msg": "Wartość nie może być pusta",
"header_settings_header_name_input": "Header name", "header_settings_header_name_input": "Nazwa nagłówka",
"header_settings_header_value_input": "Header value", "header_settings_header_value_input": "Wartość nagłówka",
"header_settings_page_title": "Proxy Headers", "header_settings_page_title": "Nagłówki proxy",
"headers_settings_tile_subtitle": "Define proxy headers the app should send with each network request", "headers_settings_tile_subtitle": "Zdefiniuj nagłówki proxy, które aplikacja powinna wysyłać z każdym żądaniem sieciowym",
"headers_settings_tile_title": "Custom proxy headers", "headers_settings_tile_title": "Niestandardowe nagłówki proxy",
"home_page_add_to_album_conflicts": "Dodano {added} zasoby do albumu {album}. {failed} zasobów jest już w albumie.", "home_page_add_to_album_conflicts": "Dodano {added} zasoby do albumu {album}. {failed} zasobów jest już w albumie.",
"home_page_add_to_album_err_local": "Nie można dodawać zasobów lokalnych do albumów, pomijam", "home_page_add_to_album_err_local": "Nie można dodawać zasobów lokalnych do albumów, pomijam",
"home_page_add_to_album_success": "Dodano {added} zasoby do albumu {album}.", "home_page_add_to_album_success": "Dodano {added} zasoby do albumu {album}.",

View File

@@ -9,8 +9,8 @@
"advanced_settings_log_level_title": "Log level: {}", "advanced_settings_log_level_title": "Log level: {}",
"advanced_settings_prefer_remote_subtitle": "Некоторые устройства очень медленно загружают предпросмотр объектов, находящихся на устройстве. Активируйте эту настройку, чтобы вместо них загружались изображения с сервера.", "advanced_settings_prefer_remote_subtitle": "Некоторые устройства очень медленно загружают предпросмотр объектов, находящихся на устройстве. Активируйте эту настройку, чтобы вместо них загружались изображения с сервера.",
"advanced_settings_prefer_remote_title": "Предпочитать фото на сервере", "advanced_settings_prefer_remote_title": "Предпочитать фото на сервере",
"advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request", "advanced_settings_proxy_headers_subtitle": "Визначте заголовки проксі-сервера, які Immich має надсилати з кожним мережевим запитом.",
"advanced_settings_proxy_headers_title": "Proxy Headers", "advanced_settings_proxy_headers_title": "Прокси-заголовки",
"advanced_settings_self_signed_ssl_subtitle": "Пропускает проверку SSL-сертификата сервера. Требуется для самоподписанных сертификатов.", "advanced_settings_self_signed_ssl_subtitle": "Пропускает проверку SSL-сертификата сервера. Требуется для самоподписанных сертификатов.",
"advanced_settings_self_signed_ssl_title": "Разрешить самоподписанные SSL-сертификаты", "advanced_settings_self_signed_ssl_title": "Разрешить самоподписанные SSL-сертификаты",
"advanced_settings_tile_subtitle": "Расширенные настройки пользователя", "advanced_settings_tile_subtitle": "Расширенные настройки пользователя",
@@ -205,13 +205,13 @@
"favorites_page_title": "Избранное", "favorites_page_title": "Избранное",
"haptic_feedback_switch": "Включить тактильную отдачу", "haptic_feedback_switch": "Включить тактильную отдачу",
"haptic_feedback_title": "Тактильная отдача", "haptic_feedback_title": "Тактильная отдача",
"header_settings_add_header_tip": "Add Header", "header_settings_add_header_tip": "Добавить заголовок",
"header_settings_field_validator_msg": "Value cannot be empty", "header_settings_field_validator_msg": "Значение не может быть пустым",
"header_settings_header_name_input": "Header name", "header_settings_header_name_input": "Имя заголовка",
"header_settings_header_value_input": "Header value", "header_settings_header_value_input": "Значение заголовка",
"header_settings_page_title": "Proxy Headers", "header_settings_page_title": "Прокси-заголовки",
"headers_settings_tile_subtitle": "Define proxy headers the app should send with each network request", "headers_settings_tile_subtitle": "Определите заголовки прокси, которые приложение должно отправлять с каждым сетевым запросом.",
"headers_settings_tile_title": "Custom proxy headers", "headers_settings_tile_title": "Пользовательские заголовки прокси",
"home_page_add_to_album_conflicts": "Добавлено {added} объектов в альбом {album}. Объекты {failed} уже есть в альбоме.", "home_page_add_to_album_conflicts": "Добавлено {added} объектов в альбом {album}. Объекты {failed} уже есть в альбоме.",
"home_page_add_to_album_err_local": "Пока нельзя добавлять локальные объекты в альбомы, пропускаем", "home_page_add_to_album_err_local": "Пока нельзя добавлять локальные объекты в альбомы, пропускаем",
"home_page_add_to_album_success": "Добавлено {added} объектов в альбом {album}.", "home_page_add_to_album_success": "Добавлено {added} объектов в альбом {album}.",

View File

@@ -9,8 +9,8 @@
"advanced_settings_log_level_title": "Nivo dnevnika: {}", "advanced_settings_log_level_title": "Nivo dnevnika: {}",
"advanced_settings_prefer_remote_subtitle": "Nekatere naprave zelo počasi nalagajo sličice iz sredstev v napravi. Aktivirajte to nastavitev, če želite namesto tega naložiti oddaljene slike.", "advanced_settings_prefer_remote_subtitle": "Nekatere naprave zelo počasi nalagajo sličice iz sredstev v napravi. Aktivirajte to nastavitev, če želite namesto tega naložiti oddaljene slike.",
"advanced_settings_prefer_remote_title": "Uporabi raje oddaljene slike", "advanced_settings_prefer_remote_title": "Uporabi raje oddaljene slike",
"advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request", "advanced_settings_proxy_headers_subtitle": "Določi proxy glavo, ki jo naj Immich pošlje ob vsaki mrežni zahtevi",
"advanced_settings_proxy_headers_title": "Proxy Headers", "advanced_settings_proxy_headers_title": "Proxy glave",
"advanced_settings_self_signed_ssl_subtitle": "Preskoči preverjanje potrdila SSL za končno točko strežnika. Zahtevano za samopodpisana potrdila.", "advanced_settings_self_signed_ssl_subtitle": "Preskoči preverjanje potrdila SSL za končno točko strežnika. Zahtevano za samopodpisana potrdila.",
"advanced_settings_self_signed_ssl_title": "Dovoli samopodpisana SSL potrdila", "advanced_settings_self_signed_ssl_title": "Dovoli samopodpisana SSL potrdila",
"advanced_settings_tile_subtitle": "Napredne uporabniške nastavitve", "advanced_settings_tile_subtitle": "Napredne uporabniške nastavitve",
@@ -205,13 +205,13 @@
"favorites_page_title": "Priljubljene", "favorites_page_title": "Priljubljene",
"haptic_feedback_switch": "Uporabi haptičen odziv", "haptic_feedback_switch": "Uporabi haptičen odziv",
"haptic_feedback_title": "Haptičen odziv", "haptic_feedback_title": "Haptičen odziv",
"header_settings_add_header_tip": "Add Header", "header_settings_add_header_tip": "Dodaj glavo",
"header_settings_field_validator_msg": "Value cannot be empty", "header_settings_field_validator_msg": "Vrednost ne sme biti prazna",
"header_settings_header_name_input": "Header name", "header_settings_header_name_input": "Ime glave",
"header_settings_header_value_input": "Header value", "header_settings_header_value_input": "Vrednost glave",
"header_settings_page_title": "Proxy Headers", "header_settings_page_title": "Proxy glave",
"headers_settings_tile_subtitle": "Define proxy headers the app should send with each network request", "headers_settings_tile_subtitle": "Določi proxy glavo, ki jo naj aplikacija pošlje ob vsaki mrežni zahtevi",
"headers_settings_tile_title": "Custom proxy headers", "headers_settings_tile_title": "Proxy glave po meri",
"home_page_add_to_album_conflicts": "Dodanih {added} sredstev v album {album}. {failed} sredstev je že v albumu.", "home_page_add_to_album_conflicts": "Dodanih {added} sredstev v album {album}. {failed} sredstev je že v albumu.",
"home_page_add_to_album_err_local": "Lokalnih sredstev še ni mogoče dodati v albume, preskakujem", "home_page_add_to_album_err_local": "Lokalnih sredstev še ni mogoče dodati v albume, preskakujem",
"home_page_add_to_album_success": "Dodanih {added} sredstev v album {album}.", "home_page_add_to_album_success": "Dodanih {added} sredstev v album {album}.",
@@ -304,8 +304,8 @@
"memories_check_back_tomorrow": "Za več spominov se vrnite jutri", "memories_check_back_tomorrow": "Za več spominov se vrnite jutri",
"memories_start_over": "Začni od začetka", "memories_start_over": "Začni od začetka",
"memories_swipe_to_close": "Podrsaj gor za zapiranje", "memories_swipe_to_close": "Podrsaj gor za zapiranje",
"memories_year_ago": "A year ago", "memories_year_ago": "Leto dni nazaj",
"memories_years_ago": "{} years ago", "memories_years_ago": "{} let nazaj",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Fotografije v gibanju", "motion_photos_page_title": "Fotografije v gibanju",
"multiselect_grid_edit_date_time_err_read_only": "Ni mogoče urediti datuma sredstev samo za branje, preskočim", "multiselect_grid_edit_date_time_err_read_only": "Ni mogoče urediti datuma sredstev samo za branje, preskočim",

View File

@@ -7,14 +7,14 @@
"add_to_album_bottom_sheet_added": "Tillagd till {album}", "add_to_album_bottom_sheet_added": "Tillagd till {album}",
"add_to_album_bottom_sheet_already_exists": "Redan i {album}", "add_to_album_bottom_sheet_already_exists": "Redan i {album}",
"advanced_settings_log_level_title": "Loggnivå: {}", "advanced_settings_log_level_title": "Loggnivå: {}",
"advanced_settings_prefer_remote_subtitle": "Vissa enheter är mycket långsamma på att ladda tumnaglar från resurser på enheten. Aktivera den här inställningen för att ladda bilder från servern istället.", "advanced_settings_prefer_remote_subtitle": "Vissa enheter är mycket långsamma på att ladda miniatyrer från objekt på enheten. Aktivera den här inställningen för att ladda bilder från servern istället.",
"advanced_settings_prefer_remote_title": "Föredra bilder från servern", "advanced_settings_prefer_remote_title": "Föredra bilder från servern",
"advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request", "advanced_settings_proxy_headers_subtitle": "Definiera proxy-heders som Immich ska skicka med i varje närverksanrop",
"advanced_settings_proxy_headers_title": "Proxy Headers", "advanced_settings_proxy_headers_title": "Proxy-headers",
"advanced_settings_self_signed_ssl_subtitle": "Hoppar över SSL-certifikatverifiering för serverändpunkten. Krävs för självsignerade certifikat.", "advanced_settings_self_signed_ssl_subtitle": "Hoppar över SSL-certifikatverifiering för serverändpunkten. Krävs för självsignerade certifikat.",
"advanced_settings_self_signed_ssl_title": "Tillåt självsignerade SSL-certifikat", "advanced_settings_self_signed_ssl_title": "Tillåt självsignerade SSL-certifikat",
"advanced_settings_tile_subtitle": "Avancerade användarinställningar", "advanced_settings_tile_subtitle": "Avancerade användarinställningar",
"advanced_settings_tile_title": "Avancerad", "advanced_settings_tile_title": "Avancerat",
"advanced_settings_troubleshooting_subtitle": "Aktivera funktioner för felsökning", "advanced_settings_troubleshooting_subtitle": "Aktivera funktioner för felsökning",
"advanced_settings_troubleshooting_title": "Felsökning", "advanced_settings_troubleshooting_title": "Felsökning",
"album_info_card_backup_album_excluded": "EXKLUDERAD", "album_info_card_backup_album_excluded": "EXKLUDERAD",
@@ -39,10 +39,10 @@
"app_bar_signout_dialog_content": "Är du säker på att du vill logga ut?", "app_bar_signout_dialog_content": "Är du säker på att du vill logga ut?",
"app_bar_signout_dialog_ok": "Ja", "app_bar_signout_dialog_ok": "Ja",
"app_bar_signout_dialog_title": "Logga ut", "app_bar_signout_dialog_title": "Logga ut",
"archive_page_no_archived_assets": "Inga arkiverade resurser hittade", "archive_page_no_archived_assets": "Inga arkiverade objekt hittade",
"archive_page_title": "Arkivera ({})", "archive_page_title": "Arkiv ({})",
"asset_action_delete_err_read_only": "Kan inte ta bort skrivskyddade resurser, hoppar över", "asset_action_delete_err_read_only": "Kan inte ta bort skrivskyddade objekt, hoppar över",
"asset_action_share_err_offline": "Kan inte hämta offline-resurs(er), hoppar över", "asset_action_share_err_offline": "Kan inte hämta offline-objekt, hoppar över",
"asset_list_group_by_sub_title": "Gruppera på", "asset_list_group_by_sub_title": "Gruppera på",
"asset_list_layout_settings_dynamic_layout_title": "Dynamisk layout", "asset_list_layout_settings_dynamic_layout_title": "Dynamisk layout",
"asset_list_layout_settings_group_automatically": "Automatiskt", "asset_list_layout_settings_group_automatically": "Automatiskt",
@@ -52,7 +52,7 @@
"asset_list_layout_sub_title": "Layout", "asset_list_layout_sub_title": "Layout",
"asset_list_settings_subtitle": "Layoutinställningar för bildrutnät", "asset_list_settings_subtitle": "Layoutinställningar för bildrutnät",
"asset_list_settings_title": "Bildrutnät", "asset_list_settings_title": "Bildrutnät",
"asset_viewer_settings_title": "Resursvisare", "asset_viewer_settings_title": "Objektvisare",
"backup_album_selection_page_albums_device": "Album på enhet ({})", "backup_album_selection_page_albums_device": "Album på enhet ({})",
"backup_album_selection_page_albums_tap": "Tryck en gång för att inkludera, tryck två gånger för att exkludera", "backup_album_selection_page_albums_tap": "Tryck en gång för att inkludera, tryck två gånger för att exkludera",
"backup_album_selection_page_assets_scatter": "Objekt kan vara utspridda över flera album. Därför kan album inkluderas eller exkluderas under säkerhetskopieringsprocessen", "backup_album_selection_page_assets_scatter": "Objekt kan vara utspridda över flera album. Därför kan album inkluderas eller exkluderas under säkerhetskopieringsprocessen",
@@ -61,10 +61,10 @@
"backup_album_selection_page_total_assets": "Antal unika objekt", "backup_album_selection_page_total_assets": "Antal unika objekt",
"backup_all": "Allt", "backup_all": "Allt",
"backup_background_service_backup_failed_message": "Säkerhetskopiering av foton och videor misslyckades. Försöker igen...", "backup_background_service_backup_failed_message": "Säkerhetskopiering av foton och videor misslyckades. Försöker igen...",
"backup_background_service_connection_failed_message": "Anslutningen till servern förlorades. Försöker igen...", "backup_background_service_connection_failed_message": "Anslutning till servern misslyckades. Försöker igen...",
"backup_background_service_current_upload_notification": "Laddar upp {}", "backup_background_service_current_upload_notification": "Laddar upp {}",
"backup_background_service_default_notification": "Söker efter nya objekt...", "backup_background_service_default_notification": "Söker efter nya objekt...",
"backup_background_service_error_title": "Fel i säkerhetskopiering", "backup_background_service_error_title": "Fel vid säkerhetskopiering",
"backup_background_service_in_progress_notification": "Säkerhetskopierar dina foton och videor...", "backup_background_service_in_progress_notification": "Säkerhetskopierar dina foton och videor...",
"backup_background_service_upload_failure_notification": "Kunde inte ladda upp {}", "backup_background_service_upload_failure_notification": "Kunde inte ladda upp {}",
"backup_controller_page_albums": "Säkerhetskopiera album", "backup_controller_page_albums": "Säkerhetskopiera album",
@@ -103,7 +103,7 @@
"backup_controller_page_start_backup": "Starta säkerhetskopiering", "backup_controller_page_start_backup": "Starta säkerhetskopiering",
"backup_controller_page_status_off": "Automatisk säkerhetskopiering är avstängd", "backup_controller_page_status_off": "Automatisk säkerhetskopiering är avstängd",
"backup_controller_page_status_on": "Automatisk säkerhetskopiering är aktiverad", "backup_controller_page_status_on": "Automatisk säkerhetskopiering är aktiverad",
"backup_controller_page_storage_format": "{} av {} brukat", "backup_controller_page_storage_format": "{} av {} använt",
"backup_controller_page_to_backup": "Album att säkerhetskopiera", "backup_controller_page_to_backup": "Album att säkerhetskopiera",
"backup_controller_page_total": "Sammanlagt", "backup_controller_page_total": "Sammanlagt",
"backup_controller_page_total_sub": "Alla unika foton och videor från valda album", "backup_controller_page_total_sub": "Alla unika foton och videor från valda album",
@@ -123,7 +123,7 @@
"cache_settings_clear_cache_button_title": "Rensar appens cacheminne. Detta kommer att avsevärt påverka appens prestanda tills cachen har byggts om.", "cache_settings_clear_cache_button_title": "Rensar appens cacheminne. Detta kommer att avsevärt påverka appens prestanda tills cachen har byggts om.",
"cache_settings_duplicated_assets_clear_button": "RENSA", "cache_settings_duplicated_assets_clear_button": "RENSA",
"cache_settings_duplicated_assets_subtitle": "Foton och videor som är svartlistade av appen", "cache_settings_duplicated_assets_subtitle": "Foton och videor som är svartlistade av appen",
"cache_settings_duplicated_assets_title": "Duplicerade Resurser ({})", "cache_settings_duplicated_assets_title": "Duplicerade Objekt ({})",
"cache_settings_image_cache_size": "Cacheminnets storlek ({} bilder och videor)", "cache_settings_image_cache_size": "Cacheminnets storlek ({} bilder och videor)",
"cache_settings_statistics_album": "Miniatyrbilder för bibliotek", "cache_settings_statistics_album": "Miniatyrbilder för bibliotek",
"cache_settings_statistics_assets": "{} bilder och videor ({})", "cache_settings_statistics_assets": "{} bilder och videor ({})",
@@ -170,14 +170,14 @@
"create_shared_album_page_share_add_assets": "LÄGG TILL OBJEKT", "create_shared_album_page_share_add_assets": "LÄGG TILL OBJEKT",
"create_shared_album_page_share_select_photos": "Välj bilder", "create_shared_album_page_share_select_photos": "Välj bilder",
"curated_location_page_title": "Platser", "curated_location_page_title": "Platser",
"curated_object_page_title": "Saker", "curated_object_page_title": "Objekt",
"daily_title_text_date": "E, dd MMM", "daily_title_text_date": "E, dd MMM",
"daily_title_text_date_year": "E, dd MMM, yyyy", "daily_title_text_date_year": "E, dd MMM, yyyy",
"date_format": "E d. LLL y • hh:mm", "date_format": "E d. LLL y • hh:mm",
"delete_dialog_alert": "Dessa objekt kommer att raderas permanent från Immich och din enhet", "delete_dialog_alert": "Dessa objekt kommer att raderas permanent från Immich och din enhet",
"delete_dialog_alert_local": "Dessa saker kommer att tas bort från din enhet men fortsatt vara tillgängliga på Immich-servern", "delete_dialog_alert_local": "Dessa objekt kommer att tas bort från din enhet men fortsatt vara tillgängliga på Immich-servern",
"delete_dialog_alert_local_non_backed_up": "Några av sakerna har inte säkerhetskopierats till Immich och kommer att tas bort permanent från din enhet.", "delete_dialog_alert_local_non_backed_up": "Några objekt har inte säkerhetskopierats till Immich och kommer att tas bort permanent från din enhet.",
"delete_dialog_alert_remote": "Dessa saker kommer att tas bort permanent från Immich-servern", "delete_dialog_alert_remote": "Dessa objekt kommer att tas bort permanent från Immich-servern",
"delete_dialog_cancel": "Avbryt", "delete_dialog_cancel": "Avbryt",
"delete_dialog_ok": "Radera", "delete_dialog_ok": "Radera",
"delete_dialog_ok_force": "Ta Bort Ändå", "delete_dialog_ok_force": "Ta Bort Ändå",
@@ -201,31 +201,31 @@
"experimental_settings_new_asset_list_title": "Aktivera experimentellt fotorutnät", "experimental_settings_new_asset_list_title": "Aktivera experimentellt fotorutnät",
"experimental_settings_subtitle": "Använd på egen risk!", "experimental_settings_subtitle": "Använd på egen risk!",
"experimental_settings_title": "Experimentellt", "experimental_settings_title": "Experimentellt",
"favorites_page_no_favorites": "Inga favoritresurser hittades", "favorites_page_no_favorites": "Inga favoritobjekt hittades",
"favorites_page_title": "Favoriter", "favorites_page_title": "Favoriter",
"haptic_feedback_switch": "Aktivera haptisk feedback", "haptic_feedback_switch": "Aktivera haptisk feedback",
"haptic_feedback_title": "Haptisk Feedback", "haptic_feedback_title": "Haptisk Feedback",
"header_settings_add_header_tip": "Add Header", "header_settings_add_header_tip": "Lägg Till Header",
"header_settings_field_validator_msg": "Value cannot be empty", "header_settings_field_validator_msg": "Värdet kan inte vara tomt",
"header_settings_header_name_input": "Header name", "header_settings_header_name_input": "Header-namn",
"header_settings_header_value_input": "Header value", "header_settings_header_value_input": "Header-värde",
"header_settings_page_title": "Proxy Headers", "header_settings_page_title": "Proxy-headers",
"headers_settings_tile_subtitle": "Define proxy headers the app should send with each network request", "headers_settings_tile_subtitle": "Definiera proxy-heders som appen ska skicka med i varje närverksanrop",
"headers_settings_tile_title": "Custom proxy headers", "headers_settings_tile_title": "Anpassade proxy-headers",
"home_page_add_to_album_conflicts": "Lade till {added} foton och videor i albumet {album}. {failed} foton och videor finns redan i albumet.", "home_page_add_to_album_conflicts": "Lade till {added} foton och videor i albumet {album}. {failed} foton och videor finns redan i albumet.",
"home_page_add_to_album_err_local": "Kan inte lägga till lokala resurser till album ännu, hoppar över", "home_page_add_to_album_err_local": "Kan inte lägga till lokala objekt till album ännu, hoppar över",
"home_page_add_to_album_success": "Lade till {added} foton och videor i albumet {album}.", "home_page_add_to_album_success": "Lade till {added} foton och videor i albumet {album}.",
"home_page_album_err_partner": "Kan inte lägga till partner-resurser till album ännu, hoppar över", "home_page_album_err_partner": "Kan inte lägga till partner-objekt till album ännu, hoppar över",
"home_page_archive_err_local": "Kan inte arkivera lokala resurser ännu, hoppar över", "home_page_archive_err_local": "Kan inte arkivera lokala objekt ännu, hoppar över",
"home_page_archive_err_partner": "Kan inte arkivera partner-resurs, hoppar över", "home_page_archive_err_partner": "Kan inte arkivera partner-objekt, hoppar över",
"home_page_building_timeline": "Bygger tidslinjen", "home_page_building_timeline": "Bygger tidslinjen",
"home_page_delete_err_partner": "Kan inte ta bort partner-resurs, hoppar över", "home_page_delete_err_partner": "Kan inte ta bort partner-objekt, hoppar över",
"home_page_delete_remote_err_local": "Lokala resurser i urvalet för att ta bort från servern, hoppar över", "home_page_delete_remote_err_local": "Lokala objekt i urvalet för att ta bort från servern, hoppar över",
"home_page_favorite_err_local": "Kan inte favorisera lokala resurser ännu, hoppar över", "home_page_favorite_err_local": "Kan inte favorisera lokala objekt ännu, hoppar över",
"home_page_favorite_err_partner": "Kan inte favorisera partner-resurser ännu, hoppar över", "home_page_favorite_err_partner": "Kan inte favorisera partner-objekt ännu, hoppar över",
"home_page_first_time_notice": "Om det här är första gången du använder appen, välj ett eller flera backup-album så att tidslinjen kan fyllas med foton och videor från albumen.", "home_page_first_time_notice": "Om det här är första gången du använder appen, välj ett eller flera backup-album så att tidslinjen kan fyllas med foton och videor från albumen.",
"home_page_share_err_local": "Kan inte dela lokal resurs via länk, hoppar över", "home_page_share_err_local": "Kan inte dela lokalt objekt via länk, hoppar över",
"home_page_upload_err_limit": "Kan bara ladda upp max 30 resurser åt gången, hoppar över", "home_page_upload_err_limit": "Kan bara ladda upp max 30 objekt åt gången, hoppar över",
"image_viewer_page_state_provider_download_error": "Fel Vid Nedladdning", "image_viewer_page_state_provider_download_error": "Fel Vid Nedladdning",
"image_viewer_page_state_provider_download_started": "Nedladdning Påbörjad", "image_viewer_page_state_provider_download_started": "Nedladdning Påbörjad",
"image_viewer_page_state_provider_download_success": "Nedladdningen Lyckades", "image_viewer_page_state_provider_download_success": "Nedladdningen Lyckades",
@@ -236,7 +236,7 @@
"library_page_favorites": "Favoriter", "library_page_favorites": "Favoriter",
"library_page_new_album": "Nytt album", "library_page_new_album": "Nytt album",
"library_page_sharing": "Delas", "library_page_sharing": "Delas",
"library_page_sort_asset_count": "Antal resurser", "library_page_sort_asset_count": "Antal objekt",
"library_page_sort_created": "Senast skapad", "library_page_sort_created": "Senast skapad",
"library_page_sort_last_modified": "Senast ändrad", "library_page_sort_last_modified": "Senast ändrad",
"library_page_sort_most_oldest_photo": "Äldsta foto", "library_page_sort_most_oldest_photo": "Äldsta foto",
@@ -280,10 +280,10 @@
"map_location_dialog_cancel": "Avbryt", "map_location_dialog_cancel": "Avbryt",
"map_location_dialog_yes": "Ja", "map_location_dialog_yes": "Ja",
"map_location_picker_page_use_location": "Använd den här platsen", "map_location_picker_page_use_location": "Använd den här platsen",
"map_location_service_disabled_content": "Platstjänst måste vara aktiverad för att visa resurser från din nuvarande plats. Vill du aktivera den nu?", "map_location_service_disabled_content": "Platstjänst måste vara aktiverad för att visa objekt från din nuvarande plats. Vill du aktivera den nu?",
"map_location_service_disabled_title": "Platstjänst inaktiverad", "map_location_service_disabled_title": "Platstjänst inaktiverad",
"map_no_assets_in_bounds": "Inga foton i området", "map_no_assets_in_bounds": "Inga foton i området",
"map_no_location_permission_content": "Platsrättighet är nödvändigt för att kunna visa resurser från din nuvarande plats. Vill du tillåta det nu?", "map_no_location_permission_content": "Platsrättighet är nödvändigt för att kunna visa objekt från din nuvarande plats. Vill du tillåta det nu?",
"map_no_location_permission_title": "Platsrättighet nekad", "map_no_location_permission_title": "Platsrättighet nekad",
"map_settings_dark_mode": "Mörkt tema", "map_settings_dark_mode": "Mörkt tema",
"map_settings_date_range_option_all": "Alla", "map_settings_date_range_option_all": "Alla",
@@ -304,13 +304,13 @@
"memories_check_back_tomorrow": "Kom tillbaka imorgon för fler minnen", "memories_check_back_tomorrow": "Kom tillbaka imorgon för fler minnen",
"memories_start_over": "Börja Om", "memories_start_over": "Börja Om",
"memories_swipe_to_close": "Svep upp för att stänga", "memories_swipe_to_close": "Svep upp för att stänga",
"memories_year_ago": "A year ago", "memories_year_ago": "Ett år sedan",
"memories_years_ago": "{} years ago", "memories_years_ago": "{} år sedan",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Rörelsefoton", "motion_photos_page_title": "Rörelsefoton",
"multiselect_grid_edit_date_time_err_read_only": "Kan inte ändra datum på skrivskyddade resurser, hoppar över", "multiselect_grid_edit_date_time_err_read_only": "Kan inte ändra datum på skrivskyddade objekt, hoppar över",
"multiselect_grid_edit_gps_err_read_only": "Kan inte ändra plats på skrivskyddade resurser, hoppar över", "multiselect_grid_edit_gps_err_read_only": "Kan inte ändra plats på skrivskyddade objekt, hoppar över",
"no_assets_to_show": "Inga resurser att visa", "no_assets_to_show": "Inga objekt att visa",
"notification_permission_dialog_cancel": "Avbryt", "notification_permission_dialog_cancel": "Avbryt",
"notification_permission_dialog_content": "För att aktivera notiser, gå till Inställningar och välj tillåt", "notification_permission_dialog_content": "För att aktivera notiser, gå till Inställningar och välj tillåt",
"notification_permission_dialog_settings": "Inställningar", "notification_permission_dialog_settings": "Inställningar",
@@ -382,7 +382,7 @@
"search_page_recently_added": "Nyligen tillagda", "search_page_recently_added": "Nyligen tillagda",
"search_page_screenshots": "Skärmdumpar", "search_page_screenshots": "Skärmdumpar",
"search_page_selfies": "Selfies", "search_page_selfies": "Selfies",
"search_page_things": "Saker", "search_page_things": "Objekt",
"search_page_videos": "Videor", "search_page_videos": "Videor",
"search_page_view_all_button": "Visa alla", "search_page_view_all_button": "Visa alla",
"search_page_your_activity": "Dina aktiviteter", "search_page_your_activity": "Dina aktiviteter",
@@ -393,10 +393,10 @@
"select_additional_user_for_sharing_page_suggestions": "Förslag", "select_additional_user_for_sharing_page_suggestions": "Förslag",
"select_user_for_sharing_page_err_album": "Kunde inte skapa nytt album", "select_user_for_sharing_page_err_album": "Kunde inte skapa nytt album",
"select_user_for_sharing_page_share_suggestions": "Förslag", "select_user_for_sharing_page_share_suggestions": "Förslag",
"server_info_box_app_version": "App version", "server_info_box_app_version": "App-version",
"server_info_box_latest_release": "Senaste Version", "server_info_box_latest_release": "Senaste Version",
"server_info_box_server_url": "Server-URL", "server_info_box_server_url": "Server-URL",
"server_info_box_server_version": "Server version", "server_info_box_server_version": "Server-version",
"setting_image_viewer_help": "Detaljerad vy laddar miniatyrer först. Efter detta laddas den medelstora förhandsgranskningen av bilden (om detta är aktiverat), och visar slutligen originalet (om detta är aktiverat).", "setting_image_viewer_help": "Detaljerad vy laddar miniatyrer först. Efter detta laddas den medelstora förhandsgranskningen av bilden (om detta är aktiverat), och visar slutligen originalet (om detta är aktiverat).",
"setting_image_viewer_original_subtitle": "Aktivera för att ladda originalbilden i full storlek (stor!). Inaktivera för att minska dataanvändningen (både i nätverket och för enhetscache).", "setting_image_viewer_original_subtitle": "Aktivera för att ladda originalbilden i full storlek (stor!). Inaktivera för att minska dataanvändningen (både i nätverket och för enhetscache).",
"setting_image_viewer_original_title": "Ladda originalbilden", "setting_image_viewer_original_title": "Ladda originalbilden",
@@ -510,26 +510,26 @@
"trash_page_delete": "Ta Bort", "trash_page_delete": "Ta Bort",
"trash_page_delete_all": "Ta Bort Alla", "trash_page_delete_all": "Ta Bort Alla",
"trash_page_empty_trash_btn": "Töm papperskorg", "trash_page_empty_trash_btn": "Töm papperskorg",
"trash_page_empty_trash_dialog_content": "Vill du ta bort dina slängda resurser? De kommer att tas bort permanent från Immich", "trash_page_empty_trash_dialog_content": "Vill du ta bort dina slängda objekt? De kommer att tas bort permanent från Immich",
"trash_page_empty_trash_dialog_ok": "Ok", "trash_page_empty_trash_dialog_ok": "Ok",
"trash_page_info": "Saker i papperskorgen tas bort permanent efter {} dagar", "trash_page_info": "Objekt i papperskorgen tas bort permanent efter {} dagar",
"trash_page_no_assets": "Inga slängda resurser", "trash_page_no_assets": "Inga slängda objekt",
"trash_page_restore": "Återställ", "trash_page_restore": "Återställ",
"trash_page_restore_all": "Återställ Alla", "trash_page_restore_all": "Återställ Alla",
"trash_page_select_assets_btn": "Välj resurser", "trash_page_select_assets_btn": "Välj objekt",
"trash_page_select_btn": "Välj", "trash_page_select_btn": "Välj",
"trash_page_title": "Papperskorg ({})", "trash_page_title": "Papperskorg ({})",
"upload_dialog_cancel": "Avbryt", "upload_dialog_cancel": "Avbryt",
"upload_dialog_info": "Vill du säkerhetskopiera de valda resurserna till servern?", "upload_dialog_info": "Vill du säkerhetskopiera de valda objekten till servern?",
"upload_dialog_ok": "Ladda Upp", "upload_dialog_ok": "Ladda Upp",
"upload_dialog_title": "Ladda Upp Resurs", "upload_dialog_title": "Ladda Upp Objekt",
"version_announcement_overlay_ack": "Bekräfta", "version_announcement_overlay_ack": "Bekräfta",
"version_announcement_overlay_release_notes": "versionsinformation", "version_announcement_overlay_release_notes": "versionsinformation",
"version_announcement_overlay_text_1": "Hej vännen, det finns en ny version av", "version_announcement_overlay_text_1": "Hej vännen, det finns en ny version av",
"version_announcement_overlay_text_2": ". Ta gärna din tid att besöka ", "version_announcement_overlay_text_2": ". Ta gärna din tid att besöka ",
"version_announcement_overlay_text_3": " för att se till att din docker-compose och .env-fil är uppdaterad för att undvika felkonfiguration, speciellt om du använder WatchTower eller liknande mekanism som automatiskt uppdaterar din container", "version_announcement_overlay_text_3": " för att se till att din docker-compose och .env-fil är uppdaterad för att undvika felkonfiguration, speciellt om du använder WatchTower eller liknande mekanism som automatiskt uppdaterar din container",
"version_announcement_overlay_title": "Ny serverversion finns tillgänglig \uD83C\uDF89", "version_announcement_overlay_title": "Ny server-version finns tillgänglig \uD83C\uDF89",
"viewer_remove_from_stack": "Ta bort från Stapeln", "viewer_remove_from_stack": "Ta bort från Stapeln",
"viewer_stack_use_as_main_asset": "Använd som Huvudresurs", "viewer_stack_use_as_main_asset": "Använd som Huvudobjekt",
"viewer_unstack": "Stapla Av" "viewer_unstack": "Stapla Av"
} }

View File

@@ -9,8 +9,8 @@
"advanced_settings_log_level_title": "Log level: {}", "advanced_settings_log_level_title": "Log level: {}",
"advanced_settings_prefer_remote_subtitle": "Деякі пристрої вельми повільно завантажують мініатюри із елементів на пристрої. Активуйте для завантаження віддалених мініатюр натомість.", "advanced_settings_prefer_remote_subtitle": "Деякі пристрої вельми повільно завантажують мініатюри із елементів на пристрої. Активуйте для завантаження віддалених мініатюр натомість.",
"advanced_settings_prefer_remote_title": "Перевага віддаленим зображенням", "advanced_settings_prefer_remote_title": "Перевага віддаленим зображенням",
"advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request", "advanced_settings_proxy_headers_subtitle": "Определите заголовки прокси-сервера, которые Immich должен отправлять с каждым сетевым запросом.",
"advanced_settings_proxy_headers_title": "Proxy Headers", "advanced_settings_proxy_headers_title": "Проксі-заголовки",
"advanced_settings_self_signed_ssl_subtitle": "Пропускає перевірку SSL-сертифіката сервера. Потрібне для самопідписаних сертифікатів.", "advanced_settings_self_signed_ssl_subtitle": "Пропускає перевірку SSL-сертифіката сервера. Потрібне для самопідписаних сертифікатів.",
"advanced_settings_self_signed_ssl_title": "Дозволити самопідписані SSL-сертифікати", "advanced_settings_self_signed_ssl_title": "Дозволити самопідписані SSL-сертифікати",
"advanced_settings_tile_subtitle": "Розширені користувацькі налаштування", "advanced_settings_tile_subtitle": "Розширені користувацькі налаштування",
@@ -205,13 +205,13 @@
"favorites_page_title": "Улюблені", "favorites_page_title": "Улюблені",
"haptic_feedback_switch": "Увімкнути тактильну віддачу", "haptic_feedback_switch": "Увімкнути тактильну віддачу",
"haptic_feedback_title": "Тактильна віддача", "haptic_feedback_title": "Тактильна віддача",
"header_settings_add_header_tip": "Add Header", "header_settings_add_header_tip": "Додати заголовок",
"header_settings_field_validator_msg": "Value cannot be empty", "header_settings_field_validator_msg": "Значення не може бути порожнім",
"header_settings_header_name_input": "Header name", "header_settings_header_name_input": "Ім'я заголовку",
"header_settings_header_value_input": "Header value", "header_settings_header_value_input": "Значення заголовку",
"header_settings_page_title": "Proxy Headers", "header_settings_page_title": "Проксі-заголовки",
"headers_settings_tile_subtitle": "Define proxy headers the app should send with each network request", "headers_settings_tile_subtitle": "Визначте заголовки проксі, які програма має надсилати з кожним мережевим запитом.",
"headers_settings_tile_title": "Custom proxy headers", "headers_settings_tile_title": "Користувальницькі заголовки проксі",
"home_page_add_to_album_conflicts": "Додано {added} елементів у альбом {album}. {failed} елементів вже було в альбомі.", "home_page_add_to_album_conflicts": "Додано {added} елементів у альбом {album}. {failed} елементів вже було в альбомі.",
"home_page_add_to_album_err_local": "Неможливо додати локальні елементи до альбомів, пропущено", "home_page_add_to_album_err_local": "Неможливо додати локальні елементи до альбомів, пропущено",
"home_page_add_to_album_success": "Додано {added} елементів у альбом {album}.", "home_page_add_to_album_success": "Додано {added} елементів у альбом {album}.",

View File

@@ -9,8 +9,8 @@
"advanced_settings_log_level_title": "Phân loại nhật ký: {}", "advanced_settings_log_level_title": "Phân loại nhật ký: {}",
"advanced_settings_prefer_remote_subtitle": "Trên một số thiết bị, việc tải hình thu nhỏ từ ảnh trên thiết bị diễn ra chậm. Kích hoạt cài đặt này để tải ảnh từ máy chủ.", "advanced_settings_prefer_remote_subtitle": "Trên một số thiết bị, việc tải hình thu nhỏ từ ảnh trên thiết bị diễn ra chậm. Kích hoạt cài đặt này để tải ảnh từ máy chủ.",
"advanced_settings_prefer_remote_title": "Ưu tiên ảnh từ máy chủ", "advanced_settings_prefer_remote_title": "Ưu tiên ảnh từ máy chủ",
"advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request", "advanced_settings_proxy_headers_subtitle": "Xác định các header của proxy Immich sẽ gửi kèm theo mỗi yêu cầu mạng.",
"advanced_settings_proxy_headers_title": "Proxy Headers", "advanced_settings_proxy_headers_title": "Các header của proxy",
"advanced_settings_self_signed_ssl_subtitle": "Bỏ qua xác minh chứng chỉ SSL cho máy chủ cuối. Yêu cầu cho chứng chỉ tự ký.", "advanced_settings_self_signed_ssl_subtitle": "Bỏ qua xác minh chứng chỉ SSL cho máy chủ cuối. Yêu cầu cho chứng chỉ tự ký.",
"advanced_settings_self_signed_ssl_title": "Cho phép chứng chỉ SSL tự ký", "advanced_settings_self_signed_ssl_title": "Cho phép chứng chỉ SSL tự ký",
"advanced_settings_tile_subtitle": "Cài đặt cho người dùng nâng cao", "advanced_settings_tile_subtitle": "Cài đặt cho người dùng nâng cao",
@@ -205,13 +205,13 @@
"favorites_page_title": "Ảnh yêu thích", "favorites_page_title": "Ảnh yêu thích",
"haptic_feedback_switch": "Bật haptic feedback\n", "haptic_feedback_switch": "Bật haptic feedback\n",
"haptic_feedback_title": "Haptic Feedback\n", "haptic_feedback_title": "Haptic Feedback\n",
"header_settings_add_header_tip": "Add Header", "header_settings_add_header_tip": "Thêm Header",
"header_settings_field_validator_msg": "Value cannot be empty", "header_settings_field_validator_msg": "Trường này không được để trống",
"header_settings_header_name_input": "Header name", "header_settings_header_name_input": "Tên header",
"header_settings_header_value_input": "Header value", "header_settings_header_value_input": "Giá trị header",
"header_settings_page_title": "Proxy Headers", "header_settings_page_title": "Các header của proxy",
"headers_settings_tile_subtitle": "Define proxy headers the app should send with each network request", "headers_settings_tile_subtitle": "Xác định proxy header ứng dụng sẽ gửi kèm theo mỗi yêu cầu mạng.",
"headers_settings_tile_title": "Custom proxy headers", "headers_settings_tile_title": "Tuỳ chỉnh các header của proxy",
"home_page_add_to_album_conflicts": "Đã thêm {added} mục vào album {album}. {failed}\nmục đã có sẵn trong album. ", "home_page_add_to_album_conflicts": "Đã thêm {added} mục vào album {album}. {failed}\nmục đã có sẵn trong album. ",
"home_page_add_to_album_err_local": "Không thể thêm ảnh cục bộ vào album, bỏ qua", "home_page_add_to_album_err_local": "Không thể thêm ảnh cục bộ vào album, bỏ qua",
"home_page_add_to_album_success": "Đã thêm {added} mục vào album {album}", "home_page_add_to_album_success": "Đã thêm {added} mục vào album {album}",
@@ -304,8 +304,8 @@
"memories_check_back_tomorrow": "Hẹn gặp lại bạn vào ngày mai với những kỷ niệm mới!", "memories_check_back_tomorrow": "Hẹn gặp lại bạn vào ngày mai với những kỷ niệm mới!",
"memories_start_over": "Bắt đầu lại", "memories_start_over": "Bắt đầu lại",
"memories_swipe_to_close": "Vuốt để đóng", "memories_swipe_to_close": "Vuốt để đóng",
"memories_year_ago": "A year ago", "memories_year_ago": "Một năm trước",
"memories_years_ago": "{} years ago", "memories_years_ago": "{} năm trước",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Ảnh động", "motion_photos_page_title": "Ảnh động",
"multiselect_grid_edit_date_time_err_read_only": "Không thể chỉnh sửa ngày của ảnh chỉ có quyền đọc, bỏ qua", "multiselect_grid_edit_date_time_err_read_only": "Không thể chỉnh sửa ngày của ảnh chỉ có quyền đọc, bỏ qua",
@@ -402,7 +402,7 @@
"setting_image_viewer_original_title": "Tải ảnh gốc", "setting_image_viewer_original_title": "Tải ảnh gốc",
"setting_image_viewer_preview_subtitle": "Bật để tải ảnh độ phân giải trung bình. Tắt để tải trực tiếp ảnh gốc hoặc chỉ sử dụng hình thu nhỏ.", "setting_image_viewer_preview_subtitle": "Bật để tải ảnh độ phân giải trung bình. Tắt để tải trực tiếp ảnh gốc hoặc chỉ sử dụng hình thu nhỏ.",
"setting_image_viewer_preview_title": "Tải ảnh xem trước", "setting_image_viewer_preview_title": "Tải ảnh xem trước",
"setting_image_viewer_title": "Images", "setting_image_viewer_title": "Hình ảnh",
"setting_languages_apply": "Áp dụng", "setting_languages_apply": "Áp dụng",
"setting_languages_title": "Ngôn ngữ", "setting_languages_title": "Ngôn ngữ",
"setting_notifications_notify_failures_grace_period": "Thông báo sao lưu nền thất bại: {}", "setting_notifications_notify_failures_grace_period": "Thông báo sao lưu nền thất bại: {}",
@@ -419,9 +419,9 @@
"setting_notifications_total_progress_title": "Hiện thị toàn bộ sao lưu nền đang thực hiện", "setting_notifications_total_progress_title": "Hiện thị toàn bộ sao lưu nền đang thực hiện",
"setting_pages_app_bar_settings": "Cài đặt", "setting_pages_app_bar_settings": "Cài đặt",
"settings_require_restart": "Vui lòng khởi động lại Immich để áp dụng cài đặt này", "settings_require_restart": "Vui lòng khởi động lại Immich để áp dụng cài đặt này",
"setting_video_viewer_looping_subtitle": "Enable to automatically loop a video in the detail viewer.", "setting_video_viewer_looping_subtitle": "Bật chế độ lặp lại tự động cho video trong chế độ xem chi tiết.",
"setting_video_viewer_looping_title": "Looping", "setting_video_viewer_looping_title": "Lặp lại",
"setting_video_viewer_title": "Videos", "setting_video_viewer_title": "Video",
"share_add": "Thêm", "share_add": "Thêm",
"share_add_photos": "Thêm ảnh", "share_add_photos": "Thêm ảnh",
"share_add_title": "Thêm tiêu đề", "share_add_title": "Thêm tiêu đề",

View File

@@ -4,6 +4,40 @@ PODS:
- ReachabilitySwift - ReachabilitySwift
- device_info_plus (0.0.1): - device_info_plus (0.0.1):
- Flutter - Flutter
- DKImagePickerController/Core (4.3.9):
- DKImagePickerController/ImageDataManager
- DKImagePickerController/Resource
- DKImagePickerController/ImageDataManager (4.3.9)
- DKImagePickerController/PhotoGallery (4.3.9):
- DKImagePickerController/Core
- DKPhotoGallery
- DKImagePickerController/Resource (4.3.9)
- DKPhotoGallery (0.0.19):
- DKPhotoGallery/Core (= 0.0.19)
- DKPhotoGallery/Model (= 0.0.19)
- DKPhotoGallery/Preview (= 0.0.19)
- DKPhotoGallery/Resource (= 0.0.19)
- SDWebImage
- SwiftyGif
- DKPhotoGallery/Core (0.0.19):
- DKPhotoGallery/Model
- DKPhotoGallery/Preview
- SDWebImage
- SwiftyGif
- DKPhotoGallery/Model (0.0.19):
- SDWebImage
- SwiftyGif
- DKPhotoGallery/Preview (0.0.19):
- DKPhotoGallery/Model
- DKPhotoGallery/Resource
- SDWebImage
- SwiftyGif
- DKPhotoGallery/Resource (0.0.19):
- SDWebImage
- SwiftyGif
- file_picker (0.0.1):
- DKImagePickerController/PhotoGallery
- Flutter
- Flutter (1.0.0) - Flutter (1.0.0)
- flutter_local_notifications (0.0.1): - flutter_local_notifications (0.0.1):
- Flutter - Flutter
@@ -46,6 +80,9 @@ PODS:
- FlutterMacOS - FlutterMacOS
- ReachabilitySwift (5.0.0) - ReachabilitySwift (5.0.0)
- SAMKeychain (1.5.3) - SAMKeychain (1.5.3)
- SDWebImage (5.19.4):
- SDWebImage/Core (= 5.19.4)
- SDWebImage/Core (5.19.4)
- share_plus (0.0.1): - share_plus (0.0.1):
- Flutter - Flutter
- shared_preferences_foundation (0.0.1): - shared_preferences_foundation (0.0.1):
@@ -54,6 +91,7 @@ PODS:
- sqflite (0.0.3): - sqflite (0.0.3):
- Flutter - Flutter
- FMDB (>= 2.7.5) - FMDB (>= 2.7.5)
- SwiftyGif (5.4.5)
- Toast (4.0.0) - Toast (4.0.0)
- url_launcher_ios (0.0.1): - url_launcher_ios (0.0.1):
- Flutter - Flutter
@@ -66,6 +104,7 @@ PODS:
DEPENDENCIES: DEPENDENCIES:
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
- file_picker (from `.symlinks/plugins/file_picker/ios`)
- Flutter (from `Flutter`) - Flutter (from `Flutter`)
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
- flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`) - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`)
@@ -91,10 +130,14 @@ DEPENDENCIES:
SPEC REPOS: SPEC REPOS:
trunk: trunk:
- DKImagePickerController
- DKPhotoGallery
- FMDB - FMDB
- MapLibre - MapLibre
- ReachabilitySwift - ReachabilitySwift
- SAMKeychain - SAMKeychain
- SDWebImage
- SwiftyGif
- Toast - Toast
EXTERNAL SOURCES: EXTERNAL SOURCES:
@@ -102,6 +145,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/connectivity_plus/ios" :path: ".symlinks/plugins/connectivity_plus/ios"
device_info_plus: device_info_plus:
:path: ".symlinks/plugins/device_info_plus/ios" :path: ".symlinks/plugins/device_info_plus/ios"
file_picker:
:path: ".symlinks/plugins/file_picker/ios"
Flutter: Flutter:
:path: Flutter :path: Flutter
flutter_local_notifications: flutter_local_notifications:
@@ -150,6 +195,9 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS: SPEC CHECKSUMS:
connectivity_plus: bf0076dd84a130856aa636df1c71ccaff908fa1d connectivity_plus: bf0076dd84a130856aa636df1c71ccaff908fa1d
device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6 device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086 flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086
flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef
@@ -170,9 +218,11 @@ SPEC CHECKSUMS:
photo_manager: ff695c7a1dd5bc379974953a2b5c0a293f7c4c8a photo_manager: ff695c7a1dd5bc379974953a2b5c0a293f7c4c8a
ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c
SDWebImage: 066c47b573f408f18caa467d71deace7c0f8280d
share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5
shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126
sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
Toast: 91b396c56ee72a5790816f40d3a94dd357abc196 Toast: 91b396c56ee72a5790816f40d3a94dd357abc196
url_launcher_ios: bbd758c6e7f9fd7b5b1d4cde34d2b95fcce5e812 url_launcher_ios: bbd758c6e7f9fd7b5b1d4cde34d2b95fcce5e812
video_player_avfoundation: 02011213dab73ae3687df27ce441fbbcc82b5579 video_player_avfoundation: 02011213dab73ae3687df27ce441fbbcc82b5579

View File

@@ -383,7 +383,7 @@
CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 163; CURRENT_PROJECT_VERSION = 165;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
@@ -525,7 +525,7 @@
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 163; CURRENT_PROJECT_VERSION = 165;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
@@ -553,7 +553,7 @@
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 163; CURRENT_PROJECT_VERSION = 165;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;

View File

@@ -58,11 +58,11 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.108.0</string> <string>1.110.0</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>163</string> <string>165</string>
<key>FLTEnableImpeller</key> <key>FLTEnableImpeller</key>
<true/> <true/>
<key>ITSAppUsesNonExemptEncryption</key> <key>ITSAppUsesNonExemptEncryption</key>

View File

@@ -19,7 +19,7 @@ platform :ios do
desc "iOS Release" desc "iOS Release"
lane :release do lane :release do
increment_version_number( increment_version_number(
version_number: "1.109.2" version_number: "1.110.0"
) )
increment_build_number( increment_build_number(
build_number: latest_testflight_build_number + 1, build_number: latest_testflight_build_number + 1,

View File

@@ -15,13 +15,13 @@ For _fastlane_ installation instructions, see [Installing _fastlane_](https://do
## iOS ## iOS
### ios beta ### ios release
```sh ```sh
[bundle exec] fastlane ios beta [bundle exec] fastlane ios release
``` ```
iOS Beta iOS Release
---- ----

View File

@@ -1,3 +1,6 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:immich_mobile/entities/user.entity.dart'; import 'package:immich_mobile/entities/user.entity.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
@@ -16,6 +19,7 @@ class Store {
/// Initializes the store (call exactly once per app start) /// Initializes the store (call exactly once per app start)
static void init(Isar db) { static void init(Isar db) {
print("Initializing store");
_db = db; _db = db;
_populateCache(); _populateCache();
_db.storeValues.where().build().watch().listen(_onChangeListener); _db.storeValues.where().build().watch().listen(_onChangeListener);
@@ -56,6 +60,9 @@ class Store {
/// Removes the value synchronously from the cache and asynchronously from the DB /// Removes the value synchronously from the cache and asynchronously from the DB
static Future<void> delete<T>(StoreKey<T> key) { static Future<void> delete<T>(StoreKey<T> key) {
if (_cache[key.id] == null) return Future.value(); if (_cache[key.id] == null) return Future.value();
if(key.id == StoreKey.serverEndpoint.id) {
_log.info("Server endpoint changed to null");
}
_cache[key.id] = null; _cache[key.id] = null;
return _db.writeTxn(() => _db.storeValues.delete(key.id)); return _db.writeTxn(() => _db.storeValues.delete(key.id));
} }
@@ -73,12 +80,12 @@ class Store {
/// updates the state if a value is updated in any isolate /// updates the state if a value is updated in any isolate
static void _onChangeListener(List<StoreValue>? data) { static void _onChangeListener(List<StoreValue>? data) {
if (data != null) { if (data != null) {
final dbValues = _db.txnSync(() => _db.storeValues.getAllSync(data.map((e) => e.id).toList()));
for (StoreValue value in data) { for (StoreValue value in data) {
final key = StoreKey.values.firstWhereOrNull((e) => e.id == value.id); final dbValue = dbValues.firstWhere((e) => e?.id == value.id, orElse: () => null)?._extract(StoreKey.values[value.id]);
if (key != null) { _cache[value.id] = dbValue;
_cache[value.id] = value._extract(key); if(value.id == StoreKey.serverEndpoint.id) {
} else { _log.info("Server endpoint changed to ${value.strValue}");
_log.warning("No key available for value id - ${value.id}");
} }
} }
} }
@@ -93,7 +100,8 @@ class StoreValue {
int? intValue; int? intValue;
String? strValue; String? strValue;
T? _extract<T>(StoreKey<T> key) { T? _extract<T>(StoreKey<T>? key) {
if (key == null) return null;
switch (key.type) { switch (key.type) {
case const (int): case const (int):
return intValue as T?; return intValue as T?;
@@ -140,6 +148,36 @@ class StoreValue {
} }
} }
class SSLClientCertStoreVal {
final Uint8List data;
final String? password;
SSLClientCertStoreVal(this.data, this.password);
void save() {
final b64Str = base64Encode(data);
Store.put(StoreKey.sslClientCertData, b64Str);
if (password != null) {
Store.put(StoreKey.sslClientPasswd, password!);
}
}
static SSLClientCertStoreVal? load() {
final b64Str = Store.tryGet<String>(StoreKey.sslClientCertData);
if (b64Str == null) {
return null;
}
final Uint8List certData = base64Decode(b64Str);
final passwd = Store.tryGet<String>(StoreKey.sslClientPasswd);
return SSLClientCertStoreVal(certData, passwd);
}
static void delete() {
Store.delete(StoreKey.sslClientCertData);
Store.delete(StoreKey.sslClientPasswd);
}
}
class StoreKeyNotFoundException implements Exception { class StoreKeyNotFoundException implements Exception {
final StoreKey key; final StoreKey key;
StoreKeyNotFoundException(this.key); StoreKeyNotFoundException(this.key);
@@ -164,6 +202,8 @@ enum StoreKey<T> {
serverEndpoint<String>(12, type: String), serverEndpoint<String>(12, type: String),
autoBackup<bool>(13, type: bool), autoBackup<bool>(13, type: bool),
backgroundBackup<bool>(14, type: bool), backgroundBackup<bool>(14, type: bool),
sslClientCertData<String>(15, type: String),
sslClientPasswd<String>(16, type: String),
// user settings from [AppSettingsEnum] below: // user settings from [AppSettingsEnum] below:
loadPreview<bool>(100, type: bool), loadPreview<bool>(100, type: bool),
loadOriginal<bool>(101, type: bool), loadOriginal<bool>(101, type: bool),

View File

@@ -91,15 +91,19 @@ class AppLogPage extends HookConsumerWidget {
logMessages.value = []; logMessages.value = [];
}, },
), ),
IconButton( Builder(
icon: Icon( builder: (BuildContext iconContext) {
Icons.share_rounded, return IconButton(
color: context.primaryColor, icon: Icon(
semanticLabel: "Share logs", Icons.share_rounded,
size: 20.0, color: context.primaryColor,
), semanticLabel: "Share logs",
onPressed: () { size: 20.0,
immichLogger.shareLogs(); ),
onPressed: () {
immichLogger.shareLogs(iconContext);
},
);
}, },
), ),
], ],

View File

@@ -420,7 +420,7 @@ class GalleryViewerPage extends HookConsumerWidget {
showStack: showStack, showStack: showStack,
stackIndex: stackIndex.value, stackIndex: stackIndex.value,
asset: asset, asset: asset,
assetIndex: currentIndex.value, assetIndex: currentIndex,
showVideoPlayerControls: !asset.isImage && !isMotionPhoto, showVideoPlayerControls: !asset.isImage && !isMotionPhoto,
), ),
], ],

View File

@@ -19,45 +19,22 @@ class SplashScreenPage extends HookConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final apiService = ref.watch(apiServiceProvider); final apiService = ref.watch(apiServiceProvider);
final serverUrl = Store.tryGet(StoreKey.serverUrl); final serverUrl = Store.tryGet(StoreKey.serverUrl);
final endpoint = Store.tryGet(StoreKey.serverEndpoint);
final accessToken = Store.tryGet(StoreKey.accessToken); final accessToken = Store.tryGet(StoreKey.accessToken);
final log = Logger("SplashScreenPage"); final log = Logger("SplashScreenPage");
void performLoggingIn() async { void performLoggingIn() async {
bool isSuccess = false; bool isAuthSuccess = false;
bool deviceIsOffline = false;
if (accessToken != null && serverUrl != null) { if (accessToken != null && serverUrl != null && endpoint != null) {
try { apiService.setEndpoint(endpoint);
// Resolve API server endpoint from user provided serverUrl
await apiService.resolveAndSetEndpoint(serverUrl);
} on ApiException catch (error, stackTrace) {
log.severe(
"Failed to resolve endpoint [ApiException]",
error,
stackTrace,
);
// okay, try to continue anyway if offline
if (error.code == 503) {
deviceIsOffline = true;
log.warning("Device seems to be offline upon launch");
} else {
log.severe("Failed to resolve endpoint", error);
}
} catch (error, stackTrace) {
log.severe(
"Failed to resolve endpoint [Catch All]",
error,
stackTrace,
);
}
try { try {
isSuccess = await ref isAuthSuccess = await ref
.read(authenticationProvider.notifier) .read(authenticationProvider.notifier)
.setSuccessLoginInfo( .setSuccessLoginInfo(
accessToken: accessToken, accessToken: accessToken,
serverUrl: serverUrl, serverUrl: serverUrl,
offlineLogin: deviceIsOffline,
); );
} catch (error, stackTrace) { } catch (error, stackTrace) {
log.severe( log.severe(
@@ -66,29 +43,29 @@ class SplashScreenPage extends HookConsumerWidget {
stackTrace, stackTrace,
); );
} }
} else {
isAuthSuccess = false;
log.severe(
'Missing authentication, server, or endpoint info from the local store',
);
} }
// If the device is offline and there is a currentUser stored locallly if (!isAuthSuccess) {
// Proceed into the app
if (deviceIsOffline && Store.tryGet(StoreKey.currentUser) != null) {
context.replaceRoute(const TabControllerRoute());
} else if (isSuccess) {
// If device was able to login through the internet successfully
final hasPermission =
await ref.read(galleryPermissionNotifier.notifier).hasPermission;
if (hasPermission) {
// Resume backup (if enable) then navigate
ref.watch(backupProvider.notifier).resumeBackup();
}
context.replaceRoute(const TabControllerRoute());
} else {
log.severe( log.severe(
'Unable to login through offline or online methods - logging out completely', 'Unable to login using offline or online methods - Logging out completely',
); );
ref.read(authenticationProvider.notifier).logout(); ref.read(authenticationProvider.notifier).logout();
// User was unable to login through either offline or online methods
context.replaceRoute(const LoginRoute()); context.replaceRoute(const LoginRoute());
return;
}
context.replaceRoute(const TabControllerRoute());
final hasPermission =
await ref.read(galleryPermissionNotifier.notifier).hasPermission;
if (hasPermission) {
// Resume backup (if enable) then navigate
ref.watch(backupProvider.notifier).resumeBackup();
} }
} }

View File

@@ -0,0 +1,203 @@
import 'package:flutter/material.dart';
import 'package:crop_image/crop_image.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:immich_mobile/routing/router.dart';
import 'package:immich_mobile/utils/hooks/crop_controller_hook.dart';
import 'edit.page.dart';
import 'package:auto_route/auto_route.dart';
/// A widget for cropping an image.
/// This widget uses [HookWidget] to manage its lifecycle and state. It allows
/// users to crop an image and then navigate to the [EditImagePage] with the
/// cropped image.
@RoutePage()
class CropImagePage extends HookWidget {
final Image image;
const CropImagePage({super.key, required this.image});
@override
Widget build(BuildContext context) {
final cropController = useCropController();
final aspectRatio = useState<double?>(null);
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).bottomAppBarTheme.color,
leading: CloseButton(color: Theme.of(context).iconTheme.color),
actions: [
IconButton(
icon: Icon(
Icons.done_rounded,
color: Theme.of(context).iconTheme.color,
size: 24,
),
onPressed: () async {
final croppedImage = await cropController.croppedImage();
context.pushRoute(EditImageRoute(image: croppedImage));
},
),
],
),
body: LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
return Column(
children: [
Container(
padding: const EdgeInsets.only(top: 20),
width: double.infinity,
height: constraints.maxHeight * 0.6,
child: CropImage(
controller: cropController,
image: image,
gridColor: Colors.white,
),
),
Expanded(
child: Container(
width: double.infinity,
decoration: BoxDecoration(
color: Theme.of(context).bottomAppBarTheme.color,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(20),
topRight: Radius.circular(20),
),
),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.only(
left: 20,
right: 20,
bottom: 10,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
IconButton(
icon: Icon(
Icons.rotate_left,
color: Theme.of(context).iconTheme.color,
),
onPressed: () {
cropController.rotateLeft();
},
),
IconButton(
icon: Icon(
Icons.rotate_right,
color: Theme.of(context).iconTheme.color,
),
onPressed: () {
cropController.rotateRight();
},
),
],
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
_AspectRatioButton(
cropController: cropController,
aspectRatio: aspectRatio,
ratio: null,
label: 'Free',
),
_AspectRatioButton(
cropController: cropController,
aspectRatio: aspectRatio,
ratio: 1.0,
label: '1:1',
),
_AspectRatioButton(
cropController: cropController,
aspectRatio: aspectRatio,
ratio: 16.0 / 9.0,
label: '16:9',
),
_AspectRatioButton(
cropController: cropController,
aspectRatio: aspectRatio,
ratio: 3.0 / 2.0,
label: '3:2',
),
_AspectRatioButton(
cropController: cropController,
aspectRatio: aspectRatio,
ratio: 7.0 / 5.0,
label: '7:5',
),
],
),
],
),
),
),
),
],
);
},
),
);
}
}
class _AspectRatioButton extends StatelessWidget {
final CropController cropController;
final ValueNotifier<double?> aspectRatio;
final double? ratio;
final String label;
const _AspectRatioButton({
required this.cropController,
required this.aspectRatio,
required this.ratio,
required this.label,
});
@override
Widget build(BuildContext context) {
IconData iconData;
switch (label) {
case 'Free':
iconData = Icons.crop_free_rounded;
break;
case '1:1':
iconData = Icons.crop_square_rounded;
break;
case '16:9':
iconData = Icons.crop_16_9_rounded;
break;
case '3:2':
iconData = Icons.crop_3_2_rounded;
break;
case '7:5':
iconData = Icons.crop_7_5_rounded;
break;
default:
iconData = Icons.crop_free_rounded;
}
return Column(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
icon: Icon(
iconData,
color: aspectRatio.value == ratio
? Colors.indigo
: Theme.of(context).iconTheme.color,
),
onPressed: () {
aspectRatio.value = ratio;
cropController.aspectRatio = ratio;
},
),
Text(label, style: Theme.of(context).textTheme.bodyMedium),
],
);
}
}

View File

@@ -0,0 +1,158 @@
import 'dart:io';
import 'dart:typed_data';
import 'dart:async';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:immich_mobile/entities/asset.entity.dart';
import 'package:immich_mobile/widgets/common/immich_image.dart';
import 'package:immich_mobile/widgets/common/immich_toast.dart';
import 'package:auto_route/auto_route.dart';
import 'package:immich_mobile/routing/router.dart';
import 'package:photo_manager/photo_manager.dart';
import 'package:immich_mobile/providers/album/album.provider.dart';
/// A stateless widget that provides functionality for editing an image.
///
/// This widget allows users to edit an image provided either as an [Asset] or
/// directly as an [Image]. It ensures that exactly one of these is provided.
///
/// It also includes a conversion method to convert an [Image] to a [Uint8List] to save the image on the user's phone
/// They automatically navigate to the [HomePage] with the edited image saved and they eventually get backed up to the server.
@immutable
@RoutePage()
class EditImagePage extends ConsumerWidget {
final Asset? asset;
final Image? image;
const EditImagePage({
super.key,
this.image,
this.asset,
}) : assert(
(image != null && asset == null) || (image == null && asset != null),
'Must supply one of asset or image',
);
Future<Uint8List> _imageToUint8List(Image image) async {
final Completer<Uint8List> completer = Completer();
image.image.resolve(const ImageConfiguration()).addListener(
ImageStreamListener(
(ImageInfo info, bool _) {
info.image
.toByteData(format: ImageByteFormat.png)
.then((byteData) {
if (byteData != null) {
completer.complete(byteData.buffer.asUint8List());
} else {
completer.completeError('Failed to convert image to bytes');
}
});
},
onError: (exception, stackTrace) =>
completer.completeError(exception),
),
);
return completer.future;
}
@override
Widget build(BuildContext context, WidgetRef ref) {
final ImageProvider provider = (asset != null)
? ImmichImage.imageProvider(asset: asset!)
: (image != null)
? image!.image
: throw Exception('Invalid image source type');
final Image imageWidget = (asset != null)
? Image(image: ImmichImage.imageProvider(asset: asset!))
: (image != null)
? image!
: throw Exception('Invalid image source type');
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).appBarTheme.backgroundColor,
leading: IconButton(
icon: Icon(
Icons.close_rounded,
color: Theme.of(context).iconTheme.color,
size: 24,
),
onPressed: () =>
Navigator.of(context).popUntil((route) => route.isFirst),
),
actions: <Widget>[
if (image != null)
TextButton(
onPressed: () async {
try {
final Uint8List imageData = await _imageToUint8List(image!);
ImmichToast.show(
durationInSecond: 3,
context: context,
msg: 'Image Saved!',
gravity: ToastGravity.CENTER,
);
await PhotoManager.editor
.saveImage(imageData, title: "_edited.jpg");
await ref.read(albumProvider.notifier).getDeviceAlbums();
Navigator.of(context).popUntil((route) => route.isFirst);
} catch (e) {
ImmichToast.show(
durationInSecond: 6,
context: context,
msg: 'Error: ${e.toString()}',
gravity: ToastGravity.BOTTOM,
);
}
},
child: Text(
'Save to gallery',
style: Theme.of(context).textTheme.displayMedium,
),
),
],
),
body: Column(
children: <Widget>[
Expanded(
child: Image(image: provider),
),
Container(
height: 80,
color: Theme.of(context).bottomAppBarTheme.color,
),
],
),
bottomNavigationBar: Container(
height: 80,
margin: const EdgeInsets.only(bottom: 20, right: 10, left: 10, top: 10),
decoration: BoxDecoration(
color: Theme.of(context).bottomAppBarTheme.color,
borderRadius: BorderRadius.circular(30),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
IconButton(
icon: Icon(
Platform.isAndroid
? Icons.crop_rotate_rounded
: Icons.crop_rotate_rounded,
color: Theme.of(context).iconTheme.color,
),
onPressed: () {
context.pushRoute(CropImageRoute(image: imageWidget));
},
),
Text('Crop', style: Theme.of(context).textTheme.displayMedium),
],
),
),
);
}
}

View File

@@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
@@ -114,7 +115,7 @@ class SearchInputPage extends HookConsumerWidget {
); );
peopleCurrentFilterWidget.value = Text( peopleCurrentFilterWidget.value = Text(
value.map((e) => e.name != '' ? e.name : "No name").join(', '), value.map((e) => e.name != '' ? e.name : 'no_name'.tr()).join(', '),
style: context.textTheme.labelLarge, style: context.textTheme.labelLarge,
); );
} }
@@ -134,7 +135,7 @@ class SearchInputPage extends HookConsumerWidget {
child: FractionallySizedBox( child: FractionallySizedBox(
heightFactor: 0.8, heightFactor: 0.8,
child: FilterBottomSheetScaffold( child: FilterBottomSheetScaffold(
title: 'Select people', title: 'search_filter_people_title'.tr(),
expanded: true, expanded: true,
onSearch: search, onSearch: search,
onClear: handleClear, onClear: handleClear,
@@ -190,7 +191,7 @@ class SearchInputPage extends HookConsumerWidget {
isScrollControlled: true, isScrollControlled: true,
isDismissible: false, isDismissible: false,
child: FilterBottomSheetScaffold( child: FilterBottomSheetScaffold(
title: 'Select location', title: 'search_filter_location_title'.tr(),
onSearch: search, onSearch: search,
onClear: handleClear, onClear: handleClear,
child: Padding( child: Padding(
@@ -241,7 +242,7 @@ class SearchInputPage extends HookConsumerWidget {
isScrollControlled: true, isScrollControlled: true,
isDismissible: false, isDismissible: false,
child: FilterBottomSheetScaffold( child: FilterBottomSheetScaffold(
title: 'Select camera type', title: 'search_filter_camera_title'.tr(),
onSearch: search, onSearch: search,
onClear: handleClear, onClear: handleClear,
child: Padding( child: Padding(
@@ -268,14 +269,14 @@ class SearchInputPage extends HookConsumerWidget {
start: filter.value.date.takenAfter ?? lastDate, start: filter.value.date.takenAfter ?? lastDate,
end: filter.value.date.takenBefore ?? lastDate, end: filter.value.date.takenBefore ?? lastDate,
), ),
helpText: 'Select a date range', helpText: 'search_filter_date_title'.tr(),
cancelText: 'Cancel', cancelText: 'action_common_cancel'.tr(),
confirmText: 'Select', confirmText: 'action_common_select'.tr(),
saveText: 'Save', saveText: 'action_common_save'.tr(),
errorFormatText: 'Invalid date format', errorFormatText: 'invalid_date_format'.tr(),
errorInvalidText: 'Invalid date', errorInvalidText: 'invalid_date'.tr(),
fieldStartHintText: 'Start date', fieldStartHintText: 'start_date'.tr(),
fieldEndHintText: 'End date', fieldEndHintText: 'end_date'.tr(),
initialEntryMode: DatePickerEntryMode.input, initialEntryMode: DatePickerEntryMode.input,
); );
@@ -305,12 +306,17 @@ class SearchInputPage extends HookConsumerWidget {
// If date range is less than 24 hours, set the end date to the end of the day // If date range is less than 24 hours, set the end date to the end of the day
if (date.end.difference(date.start).inHours < 24) { if (date.end.difference(date.start).inHours < 24) {
dateRangeCurrentFilterWidget.value = Text( dateRangeCurrentFilterWidget.value = Text(
date.start.toLocal().toIso8601String().split('T').first, DateFormat.yMMMd().format(date.start.toLocal()),
style: context.textTheme.labelLarge, style: context.textTheme.labelLarge,
); );
} else { } else {
dateRangeCurrentFilterWidget.value = Text( dateRangeCurrentFilterWidget.value = Text(
'${date.start.toLocal().toIso8601String().split('T').first} to ${date.end.toLocal().toIso8601String().split('T').first}', 'search_filter_date_interval'.tr(
namedArgs: {
"start": DateFormat.yMMMd().format(date.start.toLocal()),
"end": DateFormat.yMMMd().format(date.end.toLocal()),
},
),
style: context.textTheme.labelLarge, style: context.textTheme.labelLarge,
); );
} }
@@ -326,7 +332,11 @@ class SearchInputPage extends HookConsumerWidget {
); );
mediaTypeCurrentFilterWidget.value = Text( mediaTypeCurrentFilterWidget.value = Text(
assetType == AssetType.image ? 'Image' : 'Video', assetType == AssetType.image
? 'search_filter_media_type_image'.tr()
: assetType == AssetType.video
? 'search_filter_media_type_video'.tr()
: 'search_filter_media_type_all'.tr(),
style: context.textTheme.labelLarge, style: context.textTheme.labelLarge,
); );
} }
@@ -343,7 +353,7 @@ class SearchInputPage extends HookConsumerWidget {
showFilterBottomSheet( showFilterBottomSheet(
context: context, context: context,
child: FilterBottomSheetScaffold( child: FilterBottomSheetScaffold(
title: 'Select media type', title: 'search_filter_media_type_title'.tr(),
onSearch: search, onSearch: search,
onClear: handleClear, onClear: handleClear,
child: MediaTypePicker( child: MediaTypePicker(
@@ -367,7 +377,10 @@ class SearchInputPage extends HookConsumerWidget {
isNotInAlbum: value, isNotInAlbum: value,
), ),
); );
if (value) filterText.add('Not in album'); if (value) {
filterText
.add('search_filter_display_option_not_in_album'.tr());
}
break; break;
case DisplayOption.archive: case DisplayOption.archive:
filter.value = filter.value.copyWith( filter.value = filter.value.copyWith(
@@ -375,7 +388,9 @@ class SearchInputPage extends HookConsumerWidget {
isArchive: value, isArchive: value,
), ),
); );
if (value) filterText.add('Archive'); if (value) {
filterText.add('search_filter_display_option_archive'.tr());
}
break; break;
case DisplayOption.favorite: case DisplayOption.favorite:
filter.value = filter.value.copyWith( filter.value = filter.value.copyWith(
@@ -383,7 +398,9 @@ class SearchInputPage extends HookConsumerWidget {
isFavorite: value, isFavorite: value,
), ),
); );
if (value) filterText.add('Favorite'); if (value) {
filterText.add('search_filter_display_option_favorite'.tr());
}
break; break;
} }
}); });
@@ -410,7 +427,7 @@ class SearchInputPage extends HookConsumerWidget {
showFilterBottomSheet( showFilterBottomSheet(
context: context, context: context,
child: FilterBottomSheetScaffold( child: FilterBottomSheetScaffold(
title: 'Display options', title: 'search_filter_display_options_title'.tr(),
onSearch: search, onSearch: search,
onClear: handleClear, onClear: handleClear,
child: DisplayOptionPicker( child: DisplayOptionPicker(
@@ -489,8 +506,8 @@ class SearchInputPage extends HookConsumerWidget {
controller: textSearchController, controller: textSearchController,
decoration: InputDecoration( decoration: InputDecoration(
hintText: isContextualSearch.value hintText: isContextualSearch.value
? 'Sunrise on the beach' ? 'contextual_search'.tr()
: 'File name or extension', : 'filename_search'.tr(),
hintStyle: context.textTheme.bodyLarge?.copyWith( hintStyle: context.textTheme.bodyLarge?.copyWith(
color: context.themeData.colorScheme.onSurface.withOpacity(0.75), color: context.themeData.colorScheme.onSurface.withOpacity(0.75),
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
@@ -519,37 +536,37 @@ class SearchInputPage extends HookConsumerWidget {
SearchFilterChip( SearchFilterChip(
icon: Icons.people_alt_rounded, icon: Icons.people_alt_rounded,
onTap: showPeoplePicker, onTap: showPeoplePicker,
label: 'People', label: 'search_filter_people'.tr(),
currentFilter: peopleCurrentFilterWidget.value, currentFilter: peopleCurrentFilterWidget.value,
), ),
SearchFilterChip( SearchFilterChip(
icon: Icons.location_pin, icon: Icons.location_pin,
onTap: showLocationPicker, onTap: showLocationPicker,
label: 'Location', label: 'search_filter_location'.tr(),
currentFilter: locationCurrentFilterWidget.value, currentFilter: locationCurrentFilterWidget.value,
), ),
SearchFilterChip( SearchFilterChip(
icon: Icons.camera_alt_rounded, icon: Icons.camera_alt_rounded,
onTap: showCameraPicker, onTap: showCameraPicker,
label: 'Camera', label: 'search_filter_camera'.tr(),
currentFilter: cameraCurrentFilterWidget.value, currentFilter: cameraCurrentFilterWidget.value,
), ),
SearchFilterChip( SearchFilterChip(
icon: Icons.date_range_rounded, icon: Icons.date_range_rounded,
onTap: showDatePicker, onTap: showDatePicker,
label: 'Date', label: 'search_filter_date'.tr(),
currentFilter: dateRangeCurrentFilterWidget.value, currentFilter: dateRangeCurrentFilterWidget.value,
), ),
SearchFilterChip( SearchFilterChip(
icon: Icons.video_collection_outlined, icon: Icons.video_collection_outlined,
onTap: showMediaTypePicker, onTap: showMediaTypePicker,
label: 'Media Type', label: 'search_filter_media_type'.tr(),
currentFilter: mediaTypeCurrentFilterWidget.value, currentFilter: mediaTypeCurrentFilterWidget.value,
), ),
SearchFilterChip( SearchFilterChip(
icon: Icons.display_settings_outlined, icon: Icons.display_settings_outlined,
onTap: showDisplayOptionPicker, onTap: showDisplayOptionPicker,
label: 'Display Options', label: 'search_filter_display_options'.tr(),
currentFilter: displayOptionCurrentFilterWidget.value, currentFilter: displayOptionCurrentFilterWidget.value,
), ),
], ],

View File

@@ -65,7 +65,7 @@ class ImageViewerStateNotifier extends StateNotifier<AssetViewerPageState> {
showDialog( showDialog(
context: context, context: context,
builder: (BuildContext buildContext) { builder: (BuildContext buildContext) {
_shareService.shareAsset(asset).then( _shareService.shareAsset(asset, context).then(
(bool status) { (bool status) {
if (!status) { if (!status) {
ImmichToast.show( ImmichToast.show(

View File

@@ -156,7 +156,6 @@ class AuthenticationNotifier extends StateNotifier<AuthenticationState> {
Future<bool> setSuccessLoginInfo({ Future<bool> setSuccessLoginInfo({
required String accessToken, required String accessToken,
required String serverUrl, required String serverUrl,
bool offlineLogin = false,
}) async { }) async {
_apiService.setAccessToken(accessToken); _apiService.setAccessToken(accessToken);
@@ -165,57 +164,56 @@ class AuthenticationNotifier extends StateNotifier<AuthenticationState> {
Store.tryGet(StoreKey.deviceId) ?? await FlutterUdid.consistentUdid; Store.tryGet(StoreKey.deviceId) ?? await FlutterUdid.consistentUdid;
bool shouldChangePassword = false; bool shouldChangePassword = false;
User? user; User? user = Store.tryGet(StoreKey.currentUser);
bool retResult = false; UserAdminResponseDto? userResponse;
User? offlineUser = Store.tryGet(StoreKey.currentUser); UserPreferencesResponseDto? userPreferences;
try {
// If the user is offline and there is a user saved on the device, var responses = await Future.wait([
// if not try an online login _apiService.usersApi.getMyUser(),
if (offlineLogin && offlineUser != null) { _apiService.usersApi.getMyPreferences(),
user = offlineUser; ]);
retResult = false; userResponse = responses[0] as UserAdminResponseDto;
} else { userPreferences = responses[1] as UserPreferencesResponseDto;
UserAdminResponseDto? userResponseDto; } on ApiException catch (error, stackTrace) {
UserPreferencesResponseDto? userPreferences; if (error.code == 401) {
try { _log.severe("Unauthorized access, token likely expired. Logging out.");
userResponseDto = await _apiService.usersApi.getMyUser();
userPreferences = await _apiService.usersApi.getMyPreferences();
} on ApiException catch (error, stackTrace) {
_log.severe(
"Error getting user information from the server [API EXCEPTION]",
error,
stackTrace,
);
if (error.innerException is SocketException) {
state = state.copyWith(isAuthenticated: true);
}
} catch (error, stackTrace) {
_log.severe(
"Error getting user information from the server [CATCH ALL]",
error,
stackTrace,
);
}
if (userResponseDto != null) {
Store.put(StoreKey.deviceId, deviceId);
Store.put(StoreKey.deviceIdHash, fastHash(deviceId));
Store.put(
StoreKey.currentUser,
User.fromUserDto(userResponseDto, userPreferences),
);
Store.put(StoreKey.serverUrl, serverUrl);
Store.put(StoreKey.accessToken, accessToken);
shouldChangePassword = userResponseDto.shouldChangePassword;
user = User.fromUserDto(userResponseDto, userPreferences);
retResult = true;
} else {
_log.severe("Unable to get user information from the server.");
return false; return false;
} }
_log.severe(
"Error getting user information from the server [API EXCEPTION]",
stackTrace,
);
} catch (error, stackTrace) {
_log.severe(
"Error getting user information from the server [CATCH ALL]",
error,
stackTrace,
);
}
// If the user information is successfully retrieved, update the store
// Due to the flow of the code, this will always happen on first login
if (userResponse != null) {
Store.put(StoreKey.deviceId, deviceId);
Store.put(StoreKey.deviceIdHash, fastHash(deviceId));
Store.put(
StoreKey.currentUser,
User.fromUserDto(userResponse, userPreferences),
);
Store.put(StoreKey.serverUrl, serverUrl);
Store.put(StoreKey.accessToken, accessToken);
shouldChangePassword = userResponse.shouldChangePassword;
user = User.fromUserDto(userResponse, userPreferences);
} else {
_log.severe("Unable to get user information from the server.");
}
// If the user is null, the login was not successful
// and we don't have a local copy of the user from a prior successful login
if (user == null) {
return false;
} }
state = state.copyWith( state = state.copyWith(
@@ -229,7 +227,7 @@ class AuthenticationNotifier extends StateNotifier<AuthenticationState> {
deviceId: deviceId, deviceId: deviceId,
); );
return retResult; return true;
} }
} }

View File

@@ -28,6 +28,8 @@ import 'package:immich_mobile/pages/common/headers_settings.page.dart';
import 'package:immich_mobile/pages/common/settings.page.dart'; import 'package:immich_mobile/pages/common/settings.page.dart';
import 'package:immich_mobile/pages/common/splash_screen.page.dart'; import 'package:immich_mobile/pages/common/splash_screen.page.dart';
import 'package:immich_mobile/pages/common/tab_controller.page.dart'; import 'package:immich_mobile/pages/common/tab_controller.page.dart';
import 'package:immich_mobile/pages/editing/edit.page.dart';
import 'package:immich_mobile/pages/editing/crop.page.dart';
import 'package:immich_mobile/pages/library/archive.page.dart'; import 'package:immich_mobile/pages/library/archive.page.dart';
import 'package:immich_mobile/pages/library/favorite.page.dart'; import 'package:immich_mobile/pages/library/favorite.page.dart';
import 'package:immich_mobile/pages/library/library.page.dart'; import 'package:immich_mobile/pages/library/library.page.dart';
@@ -133,6 +135,8 @@ class AppRouter extends _$AppRouter {
page: CreateAlbumRoute.page, page: CreateAlbumRoute.page,
guards: [_authGuard, _duplicateGuard], guards: [_authGuard, _duplicateGuard],
), ),
AutoRoute(page: EditImageRoute.page),
AutoRoute(page: CropImageRoute.page),
AutoRoute(page: FavoritesRoute.page, guards: [_authGuard, _duplicateGuard]), AutoRoute(page: FavoritesRoute.page, guards: [_authGuard, _duplicateGuard]),
AutoRoute(page: AllVideosRoute.page, guards: [_authGuard, _duplicateGuard]), AutoRoute(page: AllVideosRoute.page, guards: [_authGuard, _duplicateGuard]),
AutoRoute( AutoRoute(

View File

@@ -165,6 +165,28 @@ abstract class _$AppRouter extends RootStackRouter {
), ),
); );
}, },
CropImageRoute.name: (routeData) {
final args = routeData.argsAs<CropImageRouteArgs>();
return AutoRoutePage<dynamic>(
routeData: routeData,
child: CropImagePage(
key: args.key,
image: args.image,
),
);
},
EditImageRoute.name: (routeData) {
final args = routeData.argsAs<EditImageRouteArgs>(
orElse: () => const EditImageRouteArgs());
return AutoRoutePage<dynamic>(
routeData: routeData,
child: EditImagePage(
key: args.key,
image: args.image,
asset: args.asset,
),
);
},
FailedBackupStatusRoute.name: (routeData) { FailedBackupStatusRoute.name: (routeData) {
return AutoRoutePage<dynamic>( return AutoRoutePage<dynamic>(
routeData: routeData, routeData: routeData,
@@ -836,6 +858,87 @@ class CreateAlbumRouteArgs {
} }
} }
/// generated route for
/// [CropImagePage]
class CropImageRoute extends PageRouteInfo<CropImageRouteArgs> {
CropImageRoute({
Key? key,
required Image image,
List<PageRouteInfo>? children,
}) : super(
CropImageRoute.name,
args: CropImageRouteArgs(
key: key,
image: image,
),
initialChildren: children,
);
static const String name = 'CropImageRoute';
static const PageInfo<CropImageRouteArgs> page =
PageInfo<CropImageRouteArgs>(name);
}
class CropImageRouteArgs {
const CropImageRouteArgs({
this.key,
required this.image,
});
final Key? key;
final Image image;
@override
String toString() {
return 'CropImageRouteArgs{key: $key, image: $image}';
}
}
/// generated route for
/// [EditImagePage]
class EditImageRoute extends PageRouteInfo<EditImageRouteArgs> {
EditImageRoute({
Key? key,
Image? image,
Asset? asset,
List<PageRouteInfo>? children,
}) : super(
EditImageRoute.name,
args: EditImageRouteArgs(
key: key,
image: image,
asset: asset,
),
initialChildren: children,
);
static const String name = 'EditImageRoute';
static const PageInfo<EditImageRouteArgs> page =
PageInfo<EditImageRouteArgs>(name);
}
class EditImageRouteArgs {
const EditImageRouteArgs({
this.key,
this.image,
this.asset,
});
final Key? key;
final Image? image;
final Asset? asset;
@override
String toString() {
return 'EditImageRouteArgs{key: $key, image: $image, asset: $asset}';
}
}
/// generated route for /// generated route for
/// [FailedBackupStatusPage] /// [FailedBackupStatusPage]
class FailedBackupStatusRoute extends PageRouteInfo<void> { class FailedBackupStatusRoute extends PageRouteInfo<void> {

View File

@@ -64,11 +64,13 @@ class ApiService implements Authentication {
} }
Future<String> resolveAndSetEndpoint(String serverUrl) async { Future<String> resolveAndSetEndpoint(String serverUrl) async {
final endpoint = await _resolveEndpoint(serverUrl); var endpoint = Store.tryGet(StoreKey.serverEndpoint);
endpoint ??= await _resolveEndpoint(serverUrl);
setEndpoint(endpoint); setEndpoint(endpoint);
// Save in hivebox for next startup // Save in hivebox for next startup
Store.put(StoreKey.serverEndpoint, endpoint); await Store.put(StoreKey.serverEndpoint, endpoint);
return endpoint; return endpoint;
} }

View File

@@ -85,7 +85,7 @@ class ImmichLogger {
_db.writeTxn(() => _db.loggerMessages.clear()); _db.writeTxn(() => _db.loggerMessages.clear());
} }
Future<void> shareLogs() async { Future<void> shareLogs(BuildContext context) async {
final tempDir = await getTemporaryDirectory(); final tempDir = await getTemporaryDirectory();
final dateTime = DateTime.now().toIso8601String(); final dateTime = DateTime.now().toIso8601String();
final filePath = '${tempDir.path}/Immich_log_$dateTime.log'; final filePath = '${tempDir.path}/Immich_log_$dateTime.log';
@@ -107,11 +107,13 @@ class ImmichLogger {
await io.close(); await io.close();
} }
final box = context.findRenderObject() as RenderBox?;
// Share file // Share file
await Share.shareXFiles( await Share.shareXFiles(
[XFile(filePath)], [XFile(filePath)],
subject: "Immich logs $dateTime", subject: "Immich logs $dateTime",
sharePositionOrigin: Rect.zero, sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
).then( ).then(
(value) => logFile.delete(), (value) => logFile.delete(),
); );

View File

@@ -19,11 +19,11 @@ class ShareService {
ShareService(this._apiService); ShareService(this._apiService);
Future<bool> shareAsset(Asset asset) async { Future<bool> shareAsset(Asset asset, BuildContext context) async {
return await shareAssets([asset]); return await shareAssets([asset], context);
} }
Future<bool> shareAssets(List<Asset> assets) async { Future<bool> shareAssets(List<Asset> assets, BuildContext context) async {
try { try {
final downloadedXFiles = <XFile>[]; final downloadedXFiles = <XFile>[];
@@ -64,9 +64,10 @@ class ShareService {
); );
} }
final box = context.findRenderObject() as RenderBox?;
Share.shareXFiles( Share.shareXFiles(
downloadedXFiles, downloadedXFiles,
sharePositionOrigin: Rect.zero, sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
); );
return true; return true;
} catch (error) { } catch (error) {

View File

@@ -0,0 +1,12 @@
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:crop_image/crop_image.dart';
import 'dart:ui'; // Import the dart:ui library for Rect
/// A hook that provides a [CropController] instance.
CropController useCropController() {
return useMemoized(
() => CropController(
defaultCrop: const Rect.fromLTRB(0.1, 0.1, 0.9, 0.9),
),
);
}

View File

@@ -4,12 +4,47 @@ import 'package:immich_mobile/entities/store.entity.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
class HttpSSLCertOverride extends HttpOverrides { class HttpSSLCertOverride extends HttpOverrides {
static final Logger _log = Logger("HttpSSLCertOverride");
final SSLClientCertStoreVal? _clientCert;
late final SecurityContext? _ctxWithCert;
HttpSSLCertOverride() : _clientCert = SSLClientCertStoreVal.load() {
if (_clientCert != null) {
_ctxWithCert = SecurityContext(withTrustedRoots: true);
if (_ctxWithCert != null) {
setClientCert(_ctxWithCert, _clientCert);
} else {
_log.severe("Failed to create security context with client cert!");
}
} else {
_ctxWithCert = null;
}
}
static bool setClientCert(SecurityContext ctx, SSLClientCertStoreVal cert) {
try {
_log.info("Setting client certificate");
ctx.usePrivateKeyBytes(cert.data, password: cert.password);
ctx.useCertificateChainBytes(cert.data, password: cert.password);
} catch (e) {
_log.severe("Failed to set SSL client cert: $e");
return false;
}
return true;
}
@override @override
HttpClient createHttpClient(SecurityContext? context) { HttpClient createHttpClient(SecurityContext? context) {
if (context != null) {
if (_clientCert != null) {
setClientCert(context, _clientCert);
}
} else {
context = _ctxWithCert;
}
return super.createHttpClient(context) return super.createHttpClient(context)
..badCertificateCallback = (X509Certificate cert, String host, int port) { ..badCertificateCallback = (X509Certificate cert, String host, int port) {
var log = Logger("HttpSSLCertOverride");
AppSettingsEnum setting = AppSettingsEnum.allowSelfSignedSSLCert; AppSettingsEnum setting = AppSettingsEnum.allowSelfSignedSSLCert;
// Check if user has allowed self signed SSL certificates. // Check if user has allowed self signed SSL certificates.
@@ -28,7 +63,7 @@ class HttpSSLCertOverride extends HttpOverrides {
} }
if (!selfSignedCertsAllowed) { if (!selfSignedCertsAllowed) {
log.severe("Invalid SSL certificate for $host:$port"); _log.severe("Invalid SSL certificate for $host:$port");
} }
return selfSignedCertsAllowed; return selfSignedCertsAllowed;

View File

@@ -22,7 +22,10 @@ void handleShareAssets(
showDialog( showDialog(
context: context, context: context,
builder: (BuildContext buildContext) { builder: (BuildContext buildContext) {
ref.watch(shareServiceProvider).shareAssets(selection.toList()).then( ref
.watch(shareServiceProvider)
.shareAssets(selection.toList(), context)
.then(
(bool status) { (bool status) {
if (!status) { if (!status) {
ImmichToast.show( ImmichToast.show(

View File

@@ -247,7 +247,7 @@ class ControlBottomAppBar extends HookConsumerWidget {
ConstrainedBox( ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 90), constraints: const BoxConstraints(maxWidth: 90),
child: ControlBoxButton( child: ControlBoxButton(
iconData: Icons.delete_sweep_rounded, iconData: Icons.remove_circle_outline,
label: 'album_viewer_appbar_share_remove'.tr(), label: 'album_viewer_appbar_share_remove'.tr(),
onPressed: enabled ? onRemoveFromAlbum : null, onPressed: enabled ? onRemoveFromAlbum : null,
), ),

View File

@@ -6,6 +6,8 @@ import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/providers/album/current_album.provider.dart';
import 'package:immich_mobile/providers/album/shared_album.provider.dart';
import 'package:immich_mobile/providers/asset_viewer/asset_stack.provider.dart'; import 'package:immich_mobile/providers/asset_viewer/asset_stack.provider.dart';
import 'package:immich_mobile/providers/asset_viewer/image_viewer_page_state.provider.dart'; import 'package:immich_mobile/providers/asset_viewer/image_viewer_page_state.provider.dart';
import 'package:immich_mobile/providers/asset_viewer/show_controls.provider.dart'; import 'package:immich_mobile/providers/asset_viewer/show_controls.provider.dart';
@@ -19,10 +21,11 @@ import 'package:immich_mobile/providers/asset.provider.dart';
import 'package:immich_mobile/providers/server_info.provider.dart'; import 'package:immich_mobile/providers/server_info.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/widgets/common/immich_toast.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart';
import 'package:immich_mobile/pages/editing/edit.page.dart';
class BottomGalleryBar extends ConsumerWidget { class BottomGalleryBar extends ConsumerWidget {
final Asset asset; final Asset asset;
final int assetIndex; final ValueNotifier<int> assetIndex;
final bool showStack; final bool showStack;
final int stackIndex; final int stackIndex;
final ValueNotifier<int> totalAssets; final ValueNotifier<int> totalAssets;
@@ -57,6 +60,7 @@ class BottomGalleryBar extends ConsumerWidget {
final isFromTrash = isTrashEnabled && final isFromTrash = isTrashEnabled &&
navStack.length > 2 && navStack.length > 2 &&
navStack.elementAt(navStack.length - 2).name == TrashRoute.name; navStack.elementAt(navStack.length - 2).name == TrashRoute.name;
final isInAlbum = ref.watch(currentAlbumProvider)?.isRemote ?? false;
// !!!! itemsList and actionlist should always be in sync // !!!! itemsList and actionlist should always be in sync
final itemsList = [ final itemsList = [
BottomNavigationBarItem( BottomNavigationBarItem(
@@ -66,6 +70,12 @@ class BottomGalleryBar extends ConsumerWidget {
label: 'control_bottom_app_bar_share'.tr(), label: 'control_bottom_app_bar_share'.tr(),
tooltip: 'control_bottom_app_bar_share'.tr(), tooltip: 'control_bottom_app_bar_share'.tr(),
), ),
if (asset.isImage)
BottomNavigationBarItem(
icon: const Icon(Icons.edit_outlined),
label: 'control_bottom_app_bar_edit'.tr(),
tooltip: 'control_bottom_app_bar_edit'.tr(),
),
if (isOwner) if (isOwner)
asset.isArchived asset.isArchived
? BottomNavigationBarItem( ? BottomNavigationBarItem(
@@ -96,6 +106,12 @@ class BottomGalleryBar extends ConsumerWidget {
label: 'download'.tr(), label: 'download'.tr(),
tooltip: 'download'.tr(), tooltip: 'download'.tr(),
), ),
if (isInAlbum)
BottomNavigationBarItem(
icon: const Icon(Icons.remove_circle_outline),
label: 'album_viewer_appbar_share_remove'.tr(),
tooltip: 'album_viewer_appbar_share_remove'.tr(),
),
]; ];
void removeAssetFromStack() { void removeAssetFromStack() {
@@ -118,7 +134,8 @@ class BottomGalleryBar extends ConsumerWidget {
// `assetIndex == totalAssets.value - 1` handle the case of removing the last asset // `assetIndex == totalAssets.value - 1` handle the case of removing the last asset
// to not throw the error when the next preCache index is called // to not throw the error when the next preCache index is called
if (totalAssets.value == 1 || assetIndex == totalAssets.value - 1) { if (totalAssets.value == 1 ||
assetIndex.value == totalAssets.value - 1) {
// Handle only one asset // Handle only one asset
context.maybePop(); context.maybePop();
} }
@@ -270,6 +287,24 @@ class BottomGalleryBar extends ConsumerWidget {
ref.read(imageViewerStateProvider.notifier).shareAsset(asset, context); ref.read(imageViewerStateProvider.notifier).shareAsset(asset, context);
} }
void handleEdit() async {
if (asset.isOffline) {
ImmichToast.show(
durationInSecond: 1,
context: context,
msg: 'asset_action_edit_err_offline'.tr(),
gravity: ToastGravity.BOTTOM,
);
return;
}
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
EditImagePage(asset: asset), // Send the Asset object
),
);
}
handleArchive() { handleArchive() {
ref.read(assetProvider.notifier).toggleArchive([asset]); ref.read(assetProvider.notifier).toggleArchive([asset]);
if (isParent) { if (isParent) {
@@ -299,12 +334,46 @@ class BottomGalleryBar extends ConsumerWidget {
); );
} }
handleRemoveFromAlbum() async {
final album = ref.read(currentAlbumProvider);
final bool isSuccess = album != null &&
await ref
.read(sharedAlbumProvider.notifier)
.removeAssetFromAlbum(album, [asset]);
if (isSuccess) {
// Workaround for asset remaining in the gallery
renderList.deleteAsset(asset);
if (totalAssets.value == 1) {
// Handle empty viewer
await context.maybePop();
} else {
// changing this also for the last asset causes the parent to rebuild with an error
totalAssets.value -= 1;
}
if (assetIndex.value == totalAssets.value && assetIndex.value > 0) {
// handle the case of removing the last asset in the list
assetIndex.value -= 1;
}
} else {
ImmichToast.show(
context: context,
msg: "album_viewer_appbar_share_err_remove".tr(),
toastType: ToastType.error,
gravity: ToastGravity.BOTTOM,
);
}
}
List<Function(int)> actionslist = [ List<Function(int)> actionslist = [
(_) => shareAsset(), (_) => shareAsset(),
if (asset.isImage) (_) => handleEdit(),
if (isOwner) (_) => handleArchive(), if (isOwner) (_) => handleArchive(),
if (isOwner && stack.isNotEmpty) (_) => showStackActionItems(), if (isOwner && stack.isNotEmpty) (_) => showStackActionItems(),
if (isOwner) (_) => handleDelete(), if (isOwner) (_) => handleDelete(),
if (!isOwner) (_) => handleDownload(), if (!isOwner) (_) => handleDownload(),
if (isInAlbum) (_) => handleRemoveFromAlbum(),
]; ];
return IgnorePointer( return IgnorePointer(

View File

@@ -141,7 +141,8 @@ class _ManualPickerInput extends HookWidget {
errorText: isValid.value ? null : errorText.tr(), errorText: isValid.value ? null : errorText.tr(),
), ),
onEditingComplete: onEditingComplete, onEditingComplete: onEditingComplete,
keyboardType: const TextInputType.numberWithOptions(decimal: true), keyboardType:
const TextInputType.numberWithOptions(decimal: true, signed: true),
inputFormatters: [LengthLimitingTextInputFormatter(8)], inputFormatters: [LengthLimitingTextInputFormatter(8)],
onTapOutside: (_) => focusNode.unfocus(), onTapOutside: (_) => focusNode.unfocus(),
); );

View File

@@ -13,6 +13,7 @@ import 'package:immich_mobile/services/app_settings.service.dart';
import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/services/immich_logger.service.dart'; import 'package:immich_mobile/services/immich_logger.service.dart';
import 'package:immich_mobile/utils/http_ssl_cert_override.dart'; import 'package:immich_mobile/utils/http_ssl_cert_override.dart';
import 'package:immich_mobile/widgets/settings/ssl_client_cert_settings.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
class AdvancedSettings extends HookConsumerWidget { class AdvancedSettings extends HookConsumerWidget {
@@ -64,6 +65,7 @@ class AdvancedSettings extends HookConsumerWidget {
onChanged: (_) => HttpOverrides.global = HttpSSLCertOverride(), onChanged: (_) => HttpOverrides.global = HttpSSLCertOverride(),
), ),
const CustomeProxyHeaderSettings(), const CustomeProxyHeaderSettings(),
SslClientCertSettings(isLoggedIn: ref.read(currentUserProvider) != null),
]; ];
return SettingsSubPageScaffold(settings: advancedSettings); return SettingsSubPageScaffold(settings: advancedSettings);

View File

@@ -0,0 +1,158 @@
import 'dart:io';
import 'package:easy_localization/easy_localization.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/utils/http_ssl_cert_override.dart';
class SslClientCertSettings extends StatefulWidget {
const SslClientCertSettings({super.key, required this.isLoggedIn});
final bool isLoggedIn;
@override
State<StatefulWidget> createState() => _SslClientCertSettingsState();
}
class _SslClientCertSettingsState extends State<SslClientCertSettings> {
_SslClientCertSettingsState()
: isCertExist = SSLClientCertStoreVal.load() != null;
bool isCertExist;
@override
Widget build(BuildContext context) {
return ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20),
horizontalTitleGap: 20,
isThreeLine: true,
title: Text(
"client_cert_title".tr(),
style: context.textTheme.bodyLarge?.copyWith(
fontWeight: FontWeight.w500,
),
),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"client_cert_subtitle".tr(),
style: context.textTheme.bodyMedium,
),
const SizedBox(
height: 6,
),
Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
ElevatedButton(
onPressed: widget.isLoggedIn ? null : () => importCert(context),
child: Text("client_cert_import".tr()),
),
const SizedBox(
width: 15,
),
ElevatedButton(
onPressed: widget.isLoggedIn || !isCertExist
? null
: () => removeCert(context),
child: Text("client_cert_remove".tr()),
),
],
),
],
),
);
}
void showMessage(BuildContext context, String message) {
showDialog(
context: context,
builder: (ctx) => AlertDialog(
content: Text(message),
actions: [
TextButton(
onPressed: () => ctx.pop(),
child: Text("client_cert_dialog_msg_confirm".tr()),
),
],
),
);
}
void storeCert(BuildContext context, Uint8List data, String? password) {
if (password != null && password.isEmpty) {
password = null;
}
final cert = SSLClientCertStoreVal(data, password);
// Test whether the certificate is valid
final isCertValid = HttpSSLCertOverride.setClientCert(
SecurityContext(withTrustedRoots: true),
cert,
);
if (!isCertValid) {
showMessage(context, "client_cert_invalid_msg".tr());
return;
}
cert.save();
HttpOverrides.global = HttpSSLCertOverride();
setState(
() => isCertExist = true,
);
showMessage(context, "client_cert_import_success_msg".tr());
}
void setPassword(BuildContext context, Uint8List data) {
final password = TextEditingController();
showDialog(
context: context,
barrierDismissible: false,
builder: (ctx) => AlertDialog(
content: TextField(
controller: password,
obscureText: true,
obscuringCharacter: "*",
decoration: InputDecoration(
hintText: "client_cert_enter_password".tr(),
),
),
actions: [
TextButton(
onPressed: () =>
{ctx.pop(), storeCert(context, data, password.text)},
child: Text("client_cert_dialog_msg_confirm".tr()),
),
],
),
);
}
Future<void> importCert(BuildContext ctx) async {
FilePickerResult? res = await FilePicker.platform.pickFiles(
type: FileType.custom,
allowedExtensions: [
'p12',
'pfx',
],
);
if (res != null) {
File file = File(res.files.single.path!);
final bytes = await file.readAsBytes();
setPassword(ctx, bytes);
}
}
void removeCert(BuildContext context) {
SSLClientCertStoreVal.delete();
HttpOverrides.global = HttpSSLCertOverride();
setState(
() => isCertExist = false,
);
showMessage(context, "client_cert_remove_msg".tr());
}
}

View File

@@ -3,7 +3,7 @@ Immich API
This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 1.109.2 - API version: 1.110.0
- Generator version: 7.5.0 - Generator version: 7.5.0
- Build package: org.openapitools.codegen.languages.DartClientCodegen - Build package: org.openapitools.codegen.languages.DartClientCodegen
@@ -366,6 +366,8 @@ Class | Method | HTTP request | Description
- [PersonUpdateDto](doc//PersonUpdateDto.md) - [PersonUpdateDto](doc//PersonUpdateDto.md)
- [PersonWithFacesResponseDto](doc//PersonWithFacesResponseDto.md) - [PersonWithFacesResponseDto](doc//PersonWithFacesResponseDto.md)
- [PlacesResponseDto](doc//PlacesResponseDto.md) - [PlacesResponseDto](doc//PlacesResponseDto.md)
- [PurchaseResponse](doc//PurchaseResponse.md)
- [PurchaseUpdate](doc//PurchaseUpdate.md)
- [QueueStatusDto](doc//QueueStatusDto.md) - [QueueStatusDto](doc//QueueStatusDto.md)
- [ReactionLevel](doc//ReactionLevel.md) - [ReactionLevel](doc//ReactionLevel.md)
- [ReactionType](doc//ReactionType.md) - [ReactionType](doc//ReactionType.md)
@@ -450,6 +452,7 @@ Class | Method | HTTP request | Description
- [ValidateLibraryImportPathResponseDto](doc//ValidateLibraryImportPathResponseDto.md) - [ValidateLibraryImportPathResponseDto](doc//ValidateLibraryImportPathResponseDto.md)
- [ValidateLibraryResponseDto](doc//ValidateLibraryResponseDto.md) - [ValidateLibraryResponseDto](doc//ValidateLibraryResponseDto.md)
- [VideoCodec](doc//VideoCodec.md) - [VideoCodec](doc//VideoCodec.md)
- [VideoContainer](doc//VideoContainer.md)
## Documentation For Authorization ## Documentation For Authorization

View File

@@ -179,6 +179,8 @@ part 'model/person_statistics_response_dto.dart';
part 'model/person_update_dto.dart'; part 'model/person_update_dto.dart';
part 'model/person_with_faces_response_dto.dart'; part 'model/person_with_faces_response_dto.dart';
part 'model/places_response_dto.dart'; part 'model/places_response_dto.dart';
part 'model/purchase_response.dart';
part 'model/purchase_update.dart';
part 'model/queue_status_dto.dart'; part 'model/queue_status_dto.dart';
part 'model/reaction_level.dart'; part 'model/reaction_level.dart';
part 'model/reaction_type.dart'; part 'model/reaction_type.dart';
@@ -263,6 +265,7 @@ part 'model/validate_library_dto.dart';
part 'model/validate_library_import_path_response_dto.dart'; part 'model/validate_library_import_path_response_dto.dart';
part 'model/validate_library_response_dto.dart'; part 'model/validate_library_response_dto.dart';
part 'model/video_codec.dart'; part 'model/video_codec.dart';
part 'model/video_container.dart';
/// An [ApiClient] instance that uses the default values obtained from /// An [ApiClient] instance that uses the default values obtained from

View File

@@ -66,8 +66,14 @@ class PeopleApi {
/// Performs an HTTP 'GET /people' operation and returns the [Response]. /// Performs an HTTP 'GET /people' operation and returns the [Response].
/// Parameters: /// Parameters:
/// ///
/// * [num] page:
/// Page number for pagination
///
/// * [num] size:
/// Number of items per page
///
/// * [bool] withHidden: /// * [bool] withHidden:
Future<Response> getAllPeopleWithHttpInfo({ bool? withHidden, }) async { Future<Response> getAllPeopleWithHttpInfo({ num? page, num? size, bool? withHidden, }) async {
// ignore: prefer_const_declarations // ignore: prefer_const_declarations
final path = r'/people'; final path = r'/people';
@@ -78,6 +84,12 @@ class PeopleApi {
final headerParams = <String, String>{}; final headerParams = <String, String>{};
final formParams = <String, String>{}; final formParams = <String, String>{};
if (page != null) {
queryParams.addAll(_queryParams('', 'page', page));
}
if (size != null) {
queryParams.addAll(_queryParams('', 'size', size));
}
if (withHidden != null) { if (withHidden != null) {
queryParams.addAll(_queryParams('', 'withHidden', withHidden)); queryParams.addAll(_queryParams('', 'withHidden', withHidden));
} }
@@ -98,9 +110,15 @@ class PeopleApi {
/// Parameters: /// Parameters:
/// ///
/// * [num] page:
/// Page number for pagination
///
/// * [num] size:
/// Number of items per page
///
/// * [bool] withHidden: /// * [bool] withHidden:
Future<PeopleResponseDto?> getAllPeople({ bool? withHidden, }) async { Future<PeopleResponseDto?> getAllPeople({ num? page, num? size, bool? withHidden, }) async {
final response = await getAllPeopleWithHttpInfo( withHidden: withHidden, ); final response = await getAllPeopleWithHttpInfo( page: page, size: size, withHidden: withHidden, );
if (response.statusCode >= HttpStatus.badRequest) { if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response)); throw ApiException(response.statusCode, await _decodeBodyBytes(response));
} }

View File

@@ -75,7 +75,7 @@ class ServerApi {
); );
} }
Future<Object?> getServerLicense() async { Future<LicenseResponseDto?> getServerLicense() async {
final response = await getServerLicenseWithHttpInfo(); final response = await getServerLicenseWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) { if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response)); throw ApiException(response.statusCode, await _decodeBodyBytes(response));
@@ -84,7 +84,7 @@ class ServerApi {
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input" // At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string. // FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'Object',) as Object; return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'LicenseResponseDto',) as LicenseResponseDto;
} }
return null; return null;

View File

@@ -416,6 +416,10 @@ class ApiClient {
return PersonWithFacesResponseDto.fromJson(value); return PersonWithFacesResponseDto.fromJson(value);
case 'PlacesResponseDto': case 'PlacesResponseDto':
return PlacesResponseDto.fromJson(value); return PlacesResponseDto.fromJson(value);
case 'PurchaseResponse':
return PurchaseResponse.fromJson(value);
case 'PurchaseUpdate':
return PurchaseUpdate.fromJson(value);
case 'QueueStatusDto': case 'QueueStatusDto':
return QueueStatusDto.fromJson(value); return QueueStatusDto.fromJson(value);
case 'ReactionLevel': case 'ReactionLevel':
@@ -584,6 +588,8 @@ class ApiClient {
return ValidateLibraryResponseDto.fromJson(value); return ValidateLibraryResponseDto.fromJson(value);
case 'VideoCodec': case 'VideoCodec':
return VideoCodecTypeTransformer().decode(value); return VideoCodecTypeTransformer().decode(value);
case 'VideoContainer':
return VideoContainerTypeTransformer().decode(value);
default: default:
dynamic match; dynamic match;
if (value is List && (match = _regList.firstMatch(targetType)?.group(1)) != null) { if (value is List && (match = _regList.firstMatch(targetType)?.group(1)) != null) {

View File

@@ -148,6 +148,9 @@ String parameterToString(dynamic value) {
if (value is VideoCodec) { if (value is VideoCodec) {
return VideoCodecTypeTransformer().encode(value).toString(); return VideoCodecTypeTransformer().encode(value).toString();
} }
if (value is VideoContainer) {
return VideoContainerTypeTransformer().encode(value).toString();
}
return value.toString(); return value.toString();
} }

View File

@@ -13,11 +13,21 @@ part of openapi.api;
class PeopleResponseDto { class PeopleResponseDto {
/// Returns a new [PeopleResponseDto] instance. /// Returns a new [PeopleResponseDto] instance.
PeopleResponseDto({ PeopleResponseDto({
this.hasNextPage,
required this.hidden, required this.hidden,
this.people = const [], this.people = const [],
required this.total, required this.total,
}); });
/// This property was added in v1.110.0
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
bool? hasNextPage;
int hidden; int hidden;
List<PersonResponseDto> people; List<PersonResponseDto> people;
@@ -26,6 +36,7 @@ class PeopleResponseDto {
@override @override
bool operator ==(Object other) => identical(this, other) || other is PeopleResponseDto && bool operator ==(Object other) => identical(this, other) || other is PeopleResponseDto &&
other.hasNextPage == hasNextPage &&
other.hidden == hidden && other.hidden == hidden &&
_deepEquality.equals(other.people, people) && _deepEquality.equals(other.people, people) &&
other.total == total; other.total == total;
@@ -33,15 +44,21 @@ class PeopleResponseDto {
@override @override
int get hashCode => int get hashCode =>
// ignore: unnecessary_parenthesis // ignore: unnecessary_parenthesis
(hasNextPage == null ? 0 : hasNextPage!.hashCode) +
(hidden.hashCode) + (hidden.hashCode) +
(people.hashCode) + (people.hashCode) +
(total.hashCode); (total.hashCode);
@override @override
String toString() => 'PeopleResponseDto[hidden=$hidden, people=$people, total=$total]'; String toString() => 'PeopleResponseDto[hasNextPage=$hasNextPage, hidden=$hidden, people=$people, total=$total]';
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final json = <String, dynamic>{}; final json = <String, dynamic>{};
if (this.hasNextPage != null) {
json[r'hasNextPage'] = this.hasNextPage;
} else {
// json[r'hasNextPage'] = null;
}
json[r'hidden'] = this.hidden; json[r'hidden'] = this.hidden;
json[r'people'] = this.people; json[r'people'] = this.people;
json[r'total'] = this.total; json[r'total'] = this.total;
@@ -56,6 +73,7 @@ class PeopleResponseDto {
final json = value.cast<String, dynamic>(); final json = value.cast<String, dynamic>();
return PeopleResponseDto( return PeopleResponseDto(
hasNextPage: mapValueOfType<bool>(json, r'hasNextPage'),
hidden: mapValueOfType<int>(json, r'hidden')!, hidden: mapValueOfType<int>(json, r'hidden')!,
people: PersonResponseDto.listFromJson(json[r'people']), people: PersonResponseDto.listFromJson(json[r'people']),
total: mapValueOfType<int>(json, r'total')!, total: mapValueOfType<int>(json, r'total')!,

View File

@@ -0,0 +1,106 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class PurchaseResponse {
/// Returns a new [PurchaseResponse] instance.
PurchaseResponse({
required this.hideBuyButtonUntil,
required this.showSupportBadge,
});
String hideBuyButtonUntil;
bool showSupportBadge;
@override
bool operator ==(Object other) => identical(this, other) || other is PurchaseResponse &&
other.hideBuyButtonUntil == hideBuyButtonUntil &&
other.showSupportBadge == showSupportBadge;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(hideBuyButtonUntil.hashCode) +
(showSupportBadge.hashCode);
@override
String toString() => 'PurchaseResponse[hideBuyButtonUntil=$hideBuyButtonUntil, showSupportBadge=$showSupportBadge]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'hideBuyButtonUntil'] = this.hideBuyButtonUntil;
json[r'showSupportBadge'] = this.showSupportBadge;
return json;
}
/// Returns a new [PurchaseResponse] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static PurchaseResponse? fromJson(dynamic value) {
if (value is Map) {
final json = value.cast<String, dynamic>();
return PurchaseResponse(
hideBuyButtonUntil: mapValueOfType<String>(json, r'hideBuyButtonUntil')!,
showSupportBadge: mapValueOfType<bool>(json, r'showSupportBadge')!,
);
}
return null;
}
static List<PurchaseResponse> listFromJson(dynamic json, {bool growable = false,}) {
final result = <PurchaseResponse>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = PurchaseResponse.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, PurchaseResponse> mapFromJson(dynamic json) {
final map = <String, PurchaseResponse>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = PurchaseResponse.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of PurchaseResponse-objects as value to a dart map
static Map<String, List<PurchaseResponse>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<PurchaseResponse>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = PurchaseResponse.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'hideBuyButtonUntil',
'showSupportBadge',
};
}

Some files were not shown because too many files have changed in this diff Show More