Compare commits

...

50 Commits

Author SHA1 Message Date
Alex The Bot
b0d5cb62fa Version v1.54.0 2023-04-18 16:34:37 +00:00
Alex
975d23ee5c fix(web): empty album is not auto deleted (#2283)
* fix(web): empty album is not auto deleted

* regenerate api

* fix test
2023-04-18 11:26:04 -05:00
Michel Heusschen
8a421831ab fix(web): noscript message (#2278) 2023-04-18 11:24:17 -05:00
Alex
c8d3faec6d fix(mobile): video player disposes early (#2275)
* fix(mobile): video player disposes early

* fixed show download button based on asset state

* style icon size

* disable screensleep on video player

* better position for video

* better scroll physics on iOS
2023-04-18 11:23:56 -05:00
faupau
8a45c258c5 feat(web): smaller thumbnail in explore so at least 2 photos are in a row (#2277)
* image view in explore tab more responsive

* center photo

---------

Co-authored-by: faupau03 <paul.paffe@gmx.net>
2023-04-18 10:35:28 -05:00
faupau
d45ff72c9c fix(web): accountinfopanel not closing on button press (#2276)
* fix accountinfopanel not closing on button press

* remove overcomplicated logic
replace with simpler logic and only one outside listener

* remove keydown

---------

Co-authored-by: faupau03 <paul.paffe@gmx.net>
2023-04-18 10:02:51 -05:00
faupau
137d246d6a fix(web): show noscript message when js not enabled (#2274)
* show noscript message when js not enabled

* remove comment

* fix typo

---------

Co-authored-by: faupau03 <paul.paffe@gmx.net>
2023-04-18 06:06:59 -05:00
Fynn Petersen-Frey
e80d37bf8f refactor(mobile): add AssetState and proper asset updating (#2270)
* refactor(mobile): add AssetState and proper asset updating

* generate files

---------

Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2023-04-18 04:47:24 -05:00
faupau
b970a40b4e feat(web): small responsivness improvements regarding mobile use (#2255)
* make sidebar load more fluid
use css before js kicks in
added xs breakpoint in tailwind config

* fix sidebar hr still showing if opened

* make share tab not overflow on mobile

* make user management tab responsive

* make jobs panel responsive

* fix format in tailwind config

* fix full width on large screens
use md breakpoint for w-[800px]

* show accessible name for all screens

* replace grid with flex-col

* replace all xs with sm

* remove isCollapsed completly
using only tailwinds group feature and sm and md breakpoints

* remove leftovers of isCollapsed
and make the settings content less stretched

* remove isCollapsed in layout and side-bar

* fix code style

---------

Co-authored-by: faupau03 <paul.paffe@gmx.net>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2023-04-17 11:18:49 -05:00
Jason Rasmussen
1e32a5fffd chore: remove stats job (#2268) 2023-04-17 10:30:26 -05:00
Alex
2e5cd986dd feat(mobile): Archive feature on mobile (#2258)
* update asset to include isArchive property

* Not display archived assets on timeline

* replace share button to archive button

* Added archive page

* Add bottom nav bar

* clean up homepage

* remove deadcode

* improve on sync is archive

* show archive asset correctly

* better merge condition

* Added back renderList to re-rendering don't jump around

* Better way to handle showing archive assets

* complete ArchiveSelectionNotifier

* toggle archive

* remove deadcode

* fix unit tests

* update assets in DB when changing assets

* update asset state to reflect archived status

* allow to archive assets via multi-select from timeline

* fixed logic

* Add options to bulk unarchive

* regenerate api

* Change position of toast message

---------

Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com>
2023-04-17 00:02:07 -05:00
David
635eee9e5e Update in-page sample .env contents and clarify process (#2252)
* Update .env example and clarify process

Update .env contents, and add a little clarification about commands being run. On Windows, for example, you might not have wget, but you'd need to be in the directory with the docker-compose.yml and .env files to run the docker-compose up -d command successfully. (Took me a while to figure out at first)

* Fix some formatting/wording

* Put log level back in and add typesense settings to address PR comments
2023-04-16 22:53:17 -05:00
faupau
ae3ea9e531 fix(web): fix search 400 error when only entering m: (#2261)
Co-authored-by: faupau03 <paul.paffe@gmx.net>
2023-04-16 14:37:28 -05:00
bo0tzz
5b241f0b64 feat(web): Allow closing modals with Escape key (#2257) 2023-04-15 11:51:56 -05:00
Fynn Petersen-Frey
1a64075027 fix(mobile): fix asset removal edge cases (#2251)
Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2023-04-14 20:50:58 -05:00
faupau
100866be37 More responsive web frontend (#2245)
* collapsable menu in web, more mobile friendly

* finished sidebar collapsing

* make navigation bar more responsive

* make search bar and admin button more responsive

* fix administration small button coloring

* fix upload button over opened search bar

* open search directly on small devices

* make admin sidebar more responsive

* add small edge to admin content

* server stats more responsive

* fix eslint errors

* server stats flex wrap

* Delete .env

* Revert change in hooks.server.ts

* Revert change in vite.config.js

* little clean up, replace {``} with ""

* remove package-lock.json in root folder

* revert upload button to linkbutton

* show extended sidebar also on focus

* combine changes in side-bar.svelte and
+layout.svelte to side-bar-section

* fix navigation-bar cog color in light theme

---------

Co-authored-by: Paul Paffe <paul.paffe@gmx.net>
2023-04-14 20:41:52 -05:00
Fynn Petersen-Frey
2179530084 fix(mobile): consistent handling of DateTime in SyncService (#2249)
Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2023-04-14 09:14:14 -05:00
Fynn Petersen-Frey
d500ef77cf feature(mobile): configurable log level (#2248)
* feature(mobile): configurable log level

* increase maxLogEntries to 500

---------

Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com>
2023-04-14 08:50:46 -05:00
TruongSinh Tran-Nguyen
4952b3a2d6 fix(proxy): turn off nginx_proxy_buffer (#2246)
* Refactor poxy_* directives

Move from location to server context, as they are identical

* Disable proxy_request_buffering

proxy_buffering is already off, no reason to have proxy_request_buffering on. In fact, leaving it on can cause nginx to (temporarily) use a lot of disk space during uploads
2023-04-13 15:38:49 -05:00
Alex
a9859bc029 feat: Add description (#2237)
* Added dto, logic to insert description and web implementation

* create text field and update on remote database

* Update description and save changes

* styling

* fix web test

* fix server test

* preserve description on metadata extraction job run

* handle exif info is null situation

* pr feedback

* format openapi spec

* update createAssetDto

* refactor logic to service

* move files

* only owner can update description

* Render description correctly in shared album

* Render description correctly in shared link

* disable description edit for not owner of asset on mobile

* localization and clean up

* fix test

* Uses providers for description text (#2244)

* uses providers for description text

* comments

* fixes initial data setting

* fixes notifier

---------

Co-authored-by: martyfuhry <martyfuhry@gmail.com>
2023-04-13 10:22:06 -05:00
dependabot[bot]
561b208508 chore(deps): bump class-validator from 0.13.2 to 0.14.0 in /server (#2240)
Bumps [class-validator](https://github.com/typestack/class-validator) from 0.13.2 to 0.14.0.
- [Release notes](https://github.com/typestack/class-validator/releases)
- [Changelog](https://github.com/typestack/class-validator/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/typestack/class-validator/compare/v0.13.2...v0.14.0)

---
updated-dependencies:
- dependency-name: class-validator
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-04-12 20:56:07 +00:00
Zack Pollard
de59d02ad7 ci: set ghcr write permissions explicitely for dependabot PRs (#2241) 2023-04-12 21:52:01 +01:00
Zack Pollard
017a34fc10 ci: always run all code checks regardless of failures (#2239) 2023-04-12 15:17:27 -05:00
Sergey Kondrikov
d314805caf feat (server, web): Implement Archive (#2225)
* feat (server, web): add archive

* chore: generate api

* feat (web): add empty placeholder for archive page

* chore: remove title on favorites page

Duplicates sidebar selection. Two pages (Archive and Favorites)
are consistent now

* refactor (web): create EmptyPlaceholder component for empty pages

* fixed menu close button not close:

* fix (web): remove not necessary store call

* test (web): simplify asset tests code

* test (web): simplify asset tests code

* chore (server): remove isArchived while uploading

* chore (server): remove isArchived from typesense schema

* chore: generate api

* fix (web): delete asset from archive page

* chore: change archive asset count endpoint

old endpoint: /asset/archived-count-by-user-id
new endpoint: /asset/stat/archive

* chore: generate api

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2023-04-12 10:37:52 -05:00
Alex
eb9481b668 fix(server): generate thumbnail job uses stale path (#2236)
* fix(server): generate thumbnail job' using stale path

* add query for webp generation

* revert query for webp because it happens after files are moved

* Add log info
2023-04-11 20:28:25 -05:00
Alex
1564807aa0 feat(mobile): add trobleshooting toggle (#2235)
* Added troubleshooting settings

* Added asset detail info in debug mode

* lint
2023-04-11 12:21:00 -05:00
Alex
dd8d113334 fix(server): jobs using stale path (#2233)
* fix(server): jobs using stale path

* fixed test

* pr feedback
2023-04-11 08:56:52 -05:00
Alex
258bc328e0 chore(server): better logging for error message (#2230)
* chore(server): better logging for error message

* pr feedback
2023-04-11 08:53:42 -05:00
Alex
c0de3aa35c chore: update pr template (#2234) 2023-04-11 06:03:54 -05:00
Alex
a1a62b00a0 feat(server): add originalFileName to asset table (#2231) 2023-04-11 05:23:39 -05:00
Alex
db628cec11 fix(server): cannot delete an asset if presented in album (#2223)
* fix(server): cannot delete an asset if presented in album

* added migration

* preserve correct migration
2023-04-09 21:48:01 -05:00
Alex
6f7071b12d [Localizely] Translations update (#2220) 2023-04-08 22:23:26 -05:00
Alex
e9c171f7ab fix(web): show OAuth login button when disabled (#2219)
* fix(web): show OAuth login button when disable

* update api
2023-04-08 22:18:22 -05:00
Michel Heusschen
983abf5e14 chore(server): update openapi (#2205) 2023-04-08 21:26:09 -05:00
Alex
91e27affeb feat(web): add justify layout for GalleryViewer (#2207)
* Implemented justify layout

* Fixed issue with asset selection does not show style for selected assets

* pr feedback

* PR feedback

* fix test

* Added flip animation
2023-04-08 20:40:37 -05:00
Skyler Mäntysaari
d76b3c8f78 chore(server): remove unneeded debug logging (#2203)
* chore(server): commented out debug log line for codecs

* chore(server): removed debug log line for codecs as it's not needed

* Prettier run

* Make the log more useful and move it to verbose level
2023-04-08 20:35:54 -05:00
Skyler Mäntysaari
fb42a736f1 fix(server): expand tests and add avi, mov to mimetypes. (#2213) 2023-04-08 20:35:27 -05:00
Skyler Mäntysaari
a68fbcc520 chore(server): redis error handling (#2212)
* chore(server): bull error handler

* chore(server): redis error handling

* Let's not touch bull
2023-04-08 20:35:08 -05:00
Alex
9fc70fc24e fix(mobile): fix null check operator on null value (#2204) 2023-04-07 21:21:29 -05:00
Jason Rasmussen
1f17720be2 chore: run web (only) with remote backend (#2196) 2023-04-07 20:44:56 -05:00
Michel Heusschen
ab5b92ae68 refactor(web): centralize buttons (#2200) 2023-04-07 11:45:00 -05:00
Alex
767410959a [Localizely] Translations update (#2197) 2023-04-06 14:03:08 -05:00
Vegard Fladby
e3b043e0e1 Update Norwegian locale to ICU standard (#2195)
* Update Norwegian locale to ICU standard

Don't know if this is the only place this should be edited.
But the Norwegian locale is not working on the Android app (still in English), And it seems like it should be 'nb-NO' and not 'no-NO'.

https://www.localeplanet.com/icu/nb-NO/index.html

* fix norweigian locale in other places

* fix norweigian locale in other places

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2023-04-06 14:00:24 -05:00
martyfuhry
0979906933 adds bottom safe area to video player (#2194) 2023-04-06 12:51:52 -05:00
martyfuhry
e241fd0418 don't show transparent bar for sdk < 26 (#2193) 2023-04-06 12:51:32 -05:00
Michel Heusschen
8e3a7caebd feat(server): improve validation of albums (#2188)
* feat(server): improve validation of albums

* regenerate openapi + fix downloadArchive for web
2023-04-06 12:50:55 -05:00
Michel Heusschen
b03ce897c7 fix(web): search page navigation and asset select (#2191) 2023-04-06 12:50:44 -05:00
Alex
d7c1005a50 Add PR template (#2192) 2023-04-06 12:23:06 -05:00
Michel Heusschen
1111c15f77 feat(web): allow admin to update email of users (#2189) 2023-04-06 11:56:27 -05:00
Alex Tran
fc12a9f751 chore: pump openapi gen files 2023-04-06 00:23:59 -05:00
272 changed files with 5623 additions and 2883 deletions

View File

@@ -0,0 +1,2 @@
blank_issues_enabled: false
blank_pull_request_template_enabled: false

View File

@@ -0,0 +1,22 @@
## Description
<!--- Describe your changes in detail -->
<!--- Why is this change required? What problem does it solve? -->
<!--- If it fixes an open issue, please link to the issue here. -->
Fixes # (issue)
## How Has This Been Tested?
<!-- Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration -->
- [ ] Test A
- [ ] Test B
## Screenshots (if appropriate):
## Checklist:
- [ ] I have performed a self-review of my own code
- [ ] I have made corresponding changes to the documentation if applicable

View File

@@ -13,6 +13,9 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
packages: write
jobs:
build_and_push:
runs-on: ubuntu-latest

View File

@@ -1,23 +0,0 @@
name: github-repo-stats
on:
schedule:
# Run this once per day, towards the end of the day for keeping the most
# recent data point most meaningful (hours are interpreted in UTC).
- cron: "0 23 * * *"
workflow_dispatch: # Allow for running this manually.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
j1:
name: github-repo-stats
runs-on: ubuntu-latest
steps:
- name: run-ghrs
# Use latest release.
uses: jgehrcke/github-repo-stats@RELEASE
with:
ghtoken: ${{ secrets.GHRS_GITHUB_API_TOKEN }}

View File

@@ -12,7 +12,6 @@ concurrency:
jobs:
e2e-tests:
name: Run end-to-end test suites
runs-on: ubuntu-latest
steps:
@@ -25,24 +24,62 @@ jobs:
server-unit-tests:
name: Run server unit test suites and checks
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./server
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Run tests
run: cd server && npm ci && npm run check:all
- name: Run npm install
run: npm ci
- name: Run linter
run: npm run lint
if: ${{ !cancelled() }}
- name: Run formatter
run: npm run format
if: ${{ !cancelled() }}
- name: Run tsc
run: npm run check
if: ${{ !cancelled() }}
- name: Run unit tests & coverage
run: npm run test:cov
if: ${{ !cancelled() }}
web-unit-tests:
name: Run web unit test suites and checks
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./web
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Run tests
run: cd web && npm ci && npm run check:all
- name: Run npm install
run: npm ci
- name: Run linter
run: npm run lint
if: ${{ !cancelled() }}
- name: Run formatter
run: npm run format
if: ${{ !cancelled() }}
- name: Run svelte checks
run: npm run check
if: ${{ !cancelled() }}
- name: Run unit tests & coverage
run: npm run test:cov
if: ${{ !cancelled() }}
mobile-unit-tests:
name: Run mobile unit tests

View File

@@ -43,6 +43,18 @@ The mobile app `(/mobile)` will required Flutter toolchain to be installed on yo
Please refer to the [Flutter's official documentation](https://flutter.dev/docs/get-started/install) for more information on setting up the toolchain on your machine.
### Connect to a remote backend
If you only want to do web development connected to an existing, remote backend, follow these steps:
1. Enter the web directory - `cd web/`
2. Install web dependencies - `npm i`
3. Start the web development server
```
PUBLIC_IMMICH_SERVER_URL=https://demo.immich.app/api npm run dev
```
## IDE setup
### Lint / format extensions

View File

@@ -8,9 +8,14 @@ Docker Compose is the recommended method to run Immich in production. Below are
### Step 1 - Download the required files
Download [`docker-compose.yml`][compose-file] [`example.env`][env-file].
Create a directory of your choice (e.g. `./immich-app`) to hold the `docker-compose.yml` and `.env` files.
From a directory of your choice (e.g. `./immich-app`) run the following commands:
```bash title="Move to the directory you created"
mkdir ./immich-app
cd ./immich-app
```
Download [`docker-compose.yml`][compose-file] and [`example.env`][env-file], either by running the following commands:
```bash title="Get docker-compose.yml file"
wget https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
@@ -20,6 +25,10 @@ wget https://github.com/immich-app/immich/releases/latest/download/docker-compos
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
```
or by downloading from your browser and moving the files to the directory that you created.
Note: If you downloaded the files from your browser, also ensure that you rename `example.env` to `.env`.
### Step 2 - Populate the .env file with custom values
<details>
@@ -57,23 +66,32 @@ REDIS_HOSTNAME=immich_redis
# REDIS_SOCKET=
###################################################################################
# Upload File Config
# Upload File Location
#
# This is the location where uploaded files are stored.
###################################################################################
UPLOAD_LOCATION=absolute_location_on_your_machine_where_you_want_to_store_the_backup
###################################################################################
# Log message level - [simple|verbose]
###################################################################################
LOG_LEVEL=simple
###################################################################################
# Typesense
###################################################################################
# TYPESENSE_ENABLED=false
TYPESENSE_API_KEY=some-random-text
# TYPESENSE_HOST: typesense
# TYPESENSE_PORT: 8108
# TYPESENSE_PROTOCOL: http
###################################################################################
# Reverse Geocoding
####################################################################################
# DISABLE_REVERSE_GEOCODING=false
#
# Reverse geocoding is done locally which has a small impact on memory usage
# This memory usage can be altered by changing the REVERSE_GEOCODING_PRECISION variable
# This ranges from 0-3 with 3 being the most precise
@@ -81,28 +99,58 @@ LOG_LEVEL=simple
# 2 - Cities > 1000 population: ~150MB RAM
# 1 - Cities > 5000 population: ~80MB RAM
# 0 - Cities > 15000 population: ~40MB RAM
####################################################################################
# DISABLE_REVERSE_GEOCODING=false
# REVERSE_GEOCODING_PRECISION=3
####################################################################################
# WEB - Optional
#
# Custom message on the login page, should be written in HTML form.
# For example:
# PUBLIC_LOGIN_PAGE_MESSAGE="This is a demo instance of Immich.<br><br>Email: <i>demo@demo.de</i><br>Password: <i>demo</i>"
####################################################################################
# Custom message on the login page, should be written in HTML form.
# For example PUBLIC_LOGIN_PAGE_MESSAGE="This is a demo instance of Immich.<br><br>Email: <i>demo@demo.de</i><br>Password: <i>demo</i>"
PUBLIC_LOGIN_PAGE_MESSAGE="My Family Photos and Videos Backup Server"
####################################################################################
# Alternative Service Addresses - Optional
#
# This is an advanced feature for users who may be running their immich services on different hosts.
# It will not change which address or port that services bind to within their containers, but it will change where other services look for their peers.
# Note: immich-microservices is bound to 3002, but no references are made
####################################################################################
IMMICH_WEB_URL=http://immich-web:3000
IMMICH_SERVER_URL=http://immich-server:3001
IMMICH_MACHINE_LEARNING_URL=http://immich-machine-learning:3003
####################################################################################
# Alternative API's External Address - Optional
#
# This is an advanced feature used to control the public server endpoint returned to clients during Well-known discovery.
# You should only use this if you want mobile apps to access the immich API over a custom URL. Do not include trailing slash.
# NOTE: At this time, the web app will not be affected by this setting and will continue to use the relative path: /api
# Examples: http://localhost:3001, http://immich-api.example.com, etc
####################################################################################
#IMMICH_API_URL_EXTERNAL=http://localhost:3001
```
</details>
- Populate custom database information if necessary.
- Populate `UPLOAD_LOCATION` with your preferred location for storing backup assets.
- Consider changing `DB_PASSWORD` to something randomly generated
- Consider changing `TYPESENSE_API_KEY` to something randomly generated
### Step 3 - Start the containers
From the directory you created in Step 1, (which should now contain your customized `docker-compose.yml` and `.env` files) run `docker-compose up -d`.
```bash title="Start the containers using docker compose command"
docker-compose up -d # or `docker compose up -d` based on your docker-compose version
docker-compose up -d # or `docker compose up -d` based on your docker-compose version
```
:::tip
@@ -114,7 +162,7 @@ For more information on how to use the application, please refer to the [Post In
When a new version of Immich is [released](https://github.com/immich-app/immich/releases), the application can be upgraded with the following commands, run in the directory with the `docker-compose.yml` file:
```bash title="Upgrade Immich"
docker-compose pull && docker-compose up -d # Or `docker compose`
docker-compose pull && docker-compose up -d # Or `docker compose up -d`
```
:::caution Automatic Updates

View File

@@ -44,5 +44,5 @@ download:
locale_code: ru-RU
- file: mobile/assets/i18n/cs-CZ.json
locale_code: cs-CZ
- file: mobile/assets/i18n/no-NO.json
locale_code: no-NO
- file: mobile/assets/i18n/nb-NO.json
locale_code: nb-NO

View File

@@ -35,8 +35,8 @@ platform :android do
task: 'bundle',
build_type: 'Release',
properties: {
"android.injected.version.code" => 76,
"android.injected.version.name" => "1.53.0",
"android.injected.version.code" => 77,
"android.injected.version.name" => "1.54.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')

View File

@@ -4,8 +4,10 @@
"album_info_card_backup_album_excluded": "VYLOUČENO",
"album_info_card_backup_album_included": "ZAHRNUTO",
"album_thumbnail_card_item": "1 položka",
"album_thumbnail_card_items": "{} položky",
"album_thumbnail_card_items": "{} položek",
"album_thumbnail_card_shared": "Sdíleno",
"album_thumbnail_owned": "Vlastněno",
"album_thumbnail_shared_by": "Sdílené od {}",
"album_viewer_appbar_share_delete": "Odstranit album",
"album_viewer_appbar_share_err_delete": "Nepodařilo se odstranit album",
"album_viewer_appbar_share_err_leave": "Nepodařilo se ukončit album",
@@ -14,6 +16,7 @@
"album_viewer_appbar_share_leave": "Opustit album",
"album_viewer_appbar_share_remove": "Odstranit z alba",
"album_viewer_page_share_add_users": "Přidat uživatele",
"all_videos_page_title": "Videa",
"asset_list_layout_settings_dynamic_layout_title": "Dynamické rozložení",
"asset_list_layout_settings_group_by": "Seskupit položky podle",
"asset_list_layout_settings_group_by_month": "Měsíc",
@@ -35,11 +38,11 @@
"backup_background_service_in_progress_notification": "Vytvářím kopii vašich médií...",
"backup_background_service_upload_failure_notification": "Nepodařilo se nahrát {}",
"backup_controller_page_albums": "Zálohovaná alba",
"backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.",
"backup_controller_page_background_app_refresh_disabled_title": "Background app refresh disabled",
"backup_controller_page_background_app_refresh_enable_button_text": "Go to settings",
"backup_controller_page_background_app_refresh_disabled_content": "Povolte obnovení aplikace na pozadí v Nastavení > Obecné > Obnovení aplikace na pozadí, abyste mohli používat zálohování na pozadí.",
"backup_controller_page_background_app_refresh_disabled_title": " Obnovování aplikací na pozadí je vypnuté",
"backup_controller_page_background_app_refresh_enable_button_text": "Přejít do nastavení",
"backup_controller_page_background_battery_info_link": "Ukaž mi jak",
"backup_controller_page_background_battery_info_message": "Chcete-li dosáhnout nejlepších výsledků při zálohování na pozadí, vypněte všechny optimalizace baterie, které omezují aktivitu na pozadí pro Immich ve vašem zařízení. Jelikož to závisí na zařízení, zkontrolujte požadované informace pro výrobce vašeho zařízení.",
"backup_controller_page_background_battery_info_message": "Chcete-li dosáhnout nejlepších výsledků při zálohování na pozadí, vypněte všechny optimalizace baterie, které omezují aktivitu na pozadí pro Immich ve vašem zařízení. \n\nJelikož je to závis na typu zařízení, vyhledejte požadované informace pro výrobce vašeho zařízení.",
"backup_controller_page_background_battery_info_ok": "OK",
"backup_controller_page_background_battery_info_title": "Optimalizace baterie",
"backup_controller_page_background_charging": "Pouze během nabíjení",
@@ -48,13 +51,13 @@
"backup_controller_page_background_description": "Povolte službu na pozadí pro automatické zálohování všech nových aktiv bez nutnosti otevření aplikace",
"backup_controller_page_background_is_off": "Automatické zálohování na pozadí je vypnuto",
"backup_controller_page_background_is_on": "Automatické zálohování na pozadí je zapnuto",
"backup_controller_page_background_turn_off": "Zakázat službu na pozadí",
"backup_controller_page_background_turn_on": "Povolit službu na pozadí",
"backup_controller_page_background_turn_off": "Vypnout zálohování na pozadí",
"backup_controller_page_background_turn_on": "Povolit zálohování na pozadí",
"backup_controller_page_background_wifi": "Jen na WiFi",
"backup_controller_page_backup": "Zálohováno",
"backup_controller_page_backup": "Zálohování",
"backup_controller_page_backup_selected": "Vybrané: ",
"backup_controller_page_backup_sub": "Zálohované fotografie a videa",
"backup_controller_page_cancel": "Zrušit",
"backup_controller_page_cancel": "Zastavit",
"backup_controller_page_created": "Vytvořeno: {}",
"backup_controller_page_desc_backup": "Zapněte zálohování na popředí, aby se nové položky automaticky nahrávaly na server při otevření aplikace.",
"backup_controller_page_excluded": "Vyloučeno: ",
@@ -64,7 +67,7 @@
"backup_controller_page_info": "Informace o zálohování",
"backup_controller_page_none_selected": "Žádné vybrané",
"backup_controller_page_remainder": "Zůstává",
"backup_controller_page_remainder_sub": "Zbývající fotografie a alba, která se mají zálohovat z výběru",
"backup_controller_page_remainder_sub": "Zbývající fotografie a videa, která se mají zálohovat z vybraných alb",
"backup_controller_page_select": "Vybrat",
"backup_controller_page_server_storage": "Serverové úložiště",
"backup_controller_page_start_backup": "Spustit zálohování",
@@ -74,9 +77,9 @@
"backup_controller_page_to_backup": "Alba, která mají být zálohována",
"backup_controller_page_total": "Celkem",
"backup_controller_page_total_sub": "Všechny jedinečné fotografie a videa z vybraných alb",
"backup_controller_page_turn_off": "Zakázat zálohování na popředí",
"backup_controller_page_turn_off": "Vypnout zálohování na popředí",
"backup_controller_page_turn_on": "Povolit zálohování na popředí",
"backup_controller_page_uploading_file_info": "Informace o nahrávaném souboru",
"backup_controller_page_uploading_file_info": "Nahrávaný soubor",
"backup_err_only_album": "Nelze odstranit jediné vybrané album",
"backup_info_card_assets": "položek",
"cache_settings_album_thumbnails": "Náhledy stránek knihovny (položek {})",
@@ -93,16 +96,17 @@
"cache_settings_thumbnail_size": "Velikost vyrovnávací paměti náhledů (položek {})",
"cache_settings_title": "Nastavení vyrovnávací paměti",
"change_password_form_confirm_password": "Potvrďte heslo",
"change_password_form_description": "Dobrý den, {firstName} {lastName},\n\nJe to buď poprvé, co se přihlašujete do systému, nebo byl podán požadavek na změnu hesla. Níže prosím zadejte nové heslo.",
"change_password_form_description": "Dobrý den, {firstName} {lastName},\n\nJe to buď poprvé, co se přihlašujete do systému, nebo byl vytvořen požadavek na změnu hesla. Zadejte níže, prosím, nové heslo.",
"change_password_form_new_password": "Nové heslo",
"change_password_form_password_mismatch": "Hesla se neshodují",
"change_password_form_reenter_new_password": "Znovu zadejte nové heslo",
"common_add_to_album": "Přidat do alba",
"common_change_password": "Změnit heslo",
"common_create_new_album": "Vytvořit nové album",
"common_server_error": "Zkontrolujte připojení k internetu. Ujistěte se, že server je dostupný a aplikace/server jsou v kompatibilní verzi.",
"common_shared": "Sdílené",
"control_bottom_app_bar_add_to_album": "Přidat do alba",
"control_bottom_app_bar_album_info": "{} položky",
"control_bottom_app_bar_album_info": "{} položek",
"control_bottom_app_bar_album_info_shared": "{} položky - sdílené",
"control_bottom_app_bar_create_new_album": "Vytvořit nové album",
"control_bottom_app_bar_delete": "Vymazat",
@@ -113,6 +117,8 @@
"create_shared_album_page_share": "Sdílet",
"create_shared_album_page_share_add_assets": "PŘIDAT",
"create_shared_album_page_share_select_photos": "Vybrat fotografie",
"curated_location_page_title": "Místa",
"curated_object_page_title": "Věci",
"daily_title_text_date": "EEEE, d. MMMM",
"daily_title_text_date_year": "EEEE, d. MMMM y",
"date_format": "EEEE, d. MMMM y • H:mm",
@@ -123,25 +129,27 @@
"exif_bottom_sheet_description": "Přidat popis...",
"exif_bottom_sheet_details": "PODROBNOSTI",
"exif_bottom_sheet_location": "LOKALITA",
"experimental_settings_new_asset_list_subtitle": "Probíhající práce",
"experimental_settings_new_asset_list_subtitle": "Zpracovávám",
"experimental_settings_new_asset_list_title": "Povolení experimentální mřížky fotografií",
"experimental_settings_subtitle": "Používejte na vlastní riziko!",
"experimental_settings_title": "Experimentální",
"favorites_page_title": "Oblíbené",
"home_page_add_to_album_conflicts": "Přidány {added} položky do alba {album}. {failed} položky jsou již v albu.",
"home_page_add_to_album_conflicts": "Přidáno {added} položek do alba {album}. {failed} položek již je v albu.",
"home_page_add_to_album_err_local": "Zatím není možné přidat lokální média do alb, přeskakuje se",
"home_page_add_to_album_success": "Přidány položky {added} do alba {album}.",
"home_page_building_timeline": "Vytváraní časové osy",
"home_page_building_timeline": "Vytváření časové osy",
"home_page_favorite_err_local": "Zatím není možné zařadit lokální média mezi oblíbená, přeskakuje se",
"home_page_first_time_notice": "Pokud aplikaci používáte poprvé, nezapomeňte si vybrat zálohovaná alba, aby se na časové ose mohly nacházet fotografie a videa z vybraných albech.",
"image_viewer_page_state_provider_download_error": "Chyba stahování",
"image_viewer_page_state_provider_download_success": "Stahování bylo úspěšné",
"library_page_albums": "Alba",
"library_page_device_albums": "Alba v zařízení",
"library_page_favorites": "Oblíbené",
"library_page_new_album": "Nové album",
"library_page_sharing": "Sdílení",
"library_page_sort_created": "Naposledy vytvořené",
"library_page_sort_title": "Podle názvu alba",
"login_form_api_exception": "Výjimka API. Zkontrolujte URL serveru a zkuste to znovu.",
"login_form_button_text": "Přihlásit se",
"login_form_email_hint": "tvůjmail@email.com",
"login_form_endpoint_hint": "http://ip-tvého-serveru:port/api",
@@ -156,32 +164,57 @@
"login_form_failed_login": "Chyba přihlášení, zkontrolujte url adresu serveru, e-mail a heslo.",
"login_form_label_email": "E-mail",
"login_form_label_password": "Heslo",
"login_form_next_button": "Další",
"login_form_password_hint": "heslo",
"login_form_save_login": "Zůstat přihlášen",
"login_form_server_empty": "Zadejte URL serveru.",
"login_form_server_error": "Není možné se připojit k serveru.",
"monthly_title_text_date_format": "LLLL y",
"motion_photos_page_title": "Pohyblivé fotky",
"notification_permission_dialog_cancel": "Zrušit",
"notification_permission_dialog_content": "Chcete-li povolit oznámení, přejděte do Nastavení a vyberte možnost Povolit.",
"notification_permission_dialog_content": "Chcete-li povolit oznámení, přejděte do Nastavení a vyberte možnost povolit.",
"notification_permission_dialog_settings": "Nastavení",
"notification_permission_list_tile_content": "Udělte oprávnění k aktivaci oznámení.",
"notification_permission_list_tile_enable_button": "Povolit oznámení",
"notification_permission_list_tile_title": "Povolení oznámení",
"permission_onboarding_continue_anyway": "Přesto pokračovat",
"permission_onboarding_get_started": "Začít",
"permission_onboarding_go_to_settings": "Přejít do nastavení",
"permission_onboarding_grant_permission": "Povolit přístup",
"permission_onboarding_log_out": "Odhlásit se",
"permission_onboarding_permission_denied": "Přístup odepřen. Pro používání Immich, je nutné povolit přístup k fotkám a videím v nastavení.",
"permission_onboarding_permission_granted": "Přístup povolen! Vše je připraveno.",
"permission_onboarding_permission_limited": "Přístup omezen. Chcete-li používat Immich k zálohování a správě celé vaší kolekci galerií, povolte přístup k fotkám a videím v Nastavení.",
"permission_onboarding_request": "Immich potřebuje přístup k zobrazení vašich fotek a videí.",
"profile_drawer_app_logs": "Logy",
"profile_drawer_client_server_up_to_date": "Klient a server jsou aktuální",
"profile_drawer_settings": "Nastavení",
"profile_drawer_sign_out": "Odhlásit se",
"recently_added_page_title": "Nedávno přidané",
"search_bar_hint": "Prohledejte své obrázky",
"search_page_no_objects": "Žádné informace o objektech",
"search_page_no_places": "Žádné informace o místě",
"search_page_categories": "Kategorie",
"search_page_favorites": "Oblíbené",
"search_page_motion_photos": "Pohyblivé fotky",
"search_page_no_objects": "Informace o objektech nejsou k dispozici",
"search_page_no_places": "Informace o místě nejsou k dispozici",
"search_page_places": "Místa",
"search_page_recently_added": "Nedávno přidané",
"search_page_screenshots": "Snímky obrazovky",
"search_page_selfies": "Selfie",
"search_page_things": "Věci",
"search_page_videos": "Videa",
"search_page_view_all_button": "Zobrazit vše",
"search_page_your_activity": "Vaše aktivita",
"search_result_page_new_search_hint": "Nové vyhledávání",
"search_suggestion_list_smart_search_hint_1": "Ve výchozím nastavení je chytré vyhledávání zapnuto, pro vyhledávání metadat použijte syntaxi",
"search_suggestion_list_smart_search_hint_2": "m:vaše-vyhledávaná-fráze",
"select_additional_user_for_sharing_page_suggestions": "Návrhy",
"select_user_for_sharing_page_err_album": "Nepodařilo se vytvořit album",
"select_user_for_sharing_page_share_suggestions": "Návrhy",
"server_info_box_app_version": "Verze aplikace",
"server_info_box_server_version": "Verze serveru",
"setting_image_viewer_help": "V prohlížeči detailů se nejprve načte malá miniatura, poté se načte náhled střední velikosti (je-li povolen) a nakonec se načte originál (je-li povolen).",
"setting_image_viewer_original_subtitle": "Umožňuje načíst původní obrázek v plném rozlišení (velký!). Zakázat pro snížení používání dat (v síti iv mezipaměti zařízení).",
"setting_image_viewer_original_subtitle": "Umožňuje načíst původní obrázek v plném rozlišení (velký!). Zakázat pro snížení využití dat (v síti i v mezipaměti zařízení).",
"setting_image_viewer_original_title": "Načíst původní obrázek",
"setting_image_viewer_preview_subtitle": "Umožňuje načíst obrázek se středním rozlišením. Zakažte, pokud chcete přímo načíst originál nebo použít pouze miniaturu.",
"setting_image_viewer_preview_title": "Načíst náhled obrázku",
@@ -195,7 +228,7 @@
"setting_notifications_single_progress_title": "Zobrazit průběh detailů zálohování na pozadí",
"setting_notifications_subtitle": "Přizpůsobení předvoleb oznámení",
"setting_notifications_title": "Oznámení",
"setting_notifications_total_progress_subtitle": "Celkový průběh nahrávání (hotové/celkové položky)",
"setting_notifications_total_progress_subtitle": "Celkový průběh nahrávání (nahraných/celkově)",
"setting_notifications_total_progress_title": "Zobrazit celkový průběh zálohování na pozadí",
"setting_pages_app_bar_settings": "Nastavení",
"settings_require_restart": "Pro použití tohoto nastavení restartujte Immich",
@@ -205,9 +238,9 @@
"share_create_album": "Vytvořit album",
"share_dialog_preparing": "Připravuji...",
"share_invite": "Pozvat do alba",
"sharing_page_album": "Shared albums",
"sharing_page_album": "Sdílená alba",
"sharing_page_description": "Vytvářejte sdílená alba a sdílejte fotografie a videa s lidmi ve vaší síti.",
"sharing_page_empty_list": "Prázdný dopis",
"sharing_page_empty_list": "PRÁZDNÝ SEZNAM",
"sharing_silver_appbar_create_shared_album": "Vytvořit sdílené album",
"sharing_silver_appbar_share_partner": "Sdílet s partnerem",
"tab_controller_nav_library": "Knihovna",
@@ -217,7 +250,7 @@
"theme_setting_asset_list_storage_indicator_title": "Zobrazit indikátor úložiště na dlaždicích položek",
"theme_setting_asset_list_tiles_per_row_title": "Počet položek na řádek ({})",
"theme_setting_dark_mode_switch": "Tmavé téma",
"theme_setting_image_viewer_quality_subtitle": "Přizpůsobení kvality prohlížeče detailů",
"theme_setting_image_viewer_quality_subtitle": "Přizpůsobení kvality detailů prohlížeče obrázků",
"theme_setting_image_viewer_quality_title": "Kvalita prohlížeče obrázků",
"theme_setting_system_theme_switch": "Automaticky (podle systemového nastavení)",
"theme_setting_theme_subtitle": "Vyberte nastavení tématu aplikace",

View File

@@ -1,11 +1,13 @@
{
"add_to_album_bottom_sheet_added": "Added to {album}",
"add_to_album_bottom_sheet_already_exists": "Already in {album}",
"add_to_album_bottom_sheet_added": "Tilføjet til {album}",
"add_to_album_bottom_sheet_already_exists": "Allerede i {album}",
"album_info_card_backup_album_excluded": "EKSKLUDERET",
"album_info_card_backup_album_included": "INKLUDERET",
"album_thumbnail_card_item": "1 genstand",
"album_thumbnail_card_items": "{} genstande",
"album_thumbnail_card_shared": ". Delt",
"album_thumbnail_owned": "Ejet",
"album_thumbnail_shared_by": "Delt af {}",
"album_viewer_appbar_share_delete": "Slet album",
"album_viewer_appbar_share_err_delete": "Fejlede sletning af album",
"album_viewer_appbar_share_err_leave": "Fejlede i at forlade album",
@@ -14,6 +16,7 @@
"album_viewer_appbar_share_leave": "Forlad album",
"album_viewer_appbar_share_remove": "Fjern fra album",
"album_viewer_page_share_add_users": "Tilføj brugere",
"all_videos_page_title": "Videoer",
"asset_list_layout_settings_dynamic_layout_title": "Dynamisk layout",
"asset_list_layout_settings_group_by": "Gruppér elementer pr. ",
"asset_list_layout_settings_group_by_month": "Måned",
@@ -33,11 +36,11 @@
"backup_background_service_default_notification": "Søger efter nye elementer...",
"backup_background_service_error_title": "Fejl med backup",
"backup_background_service_in_progress_notification": "Tager backup af dine elementer...",
"backup_background_service_upload_failure_notification": "Failed to upload {}",
"backup_background_service_upload_failure_notification": "Fejlede med uploade af {}",
"backup_controller_page_albums": "Sikkerhedskopiér albummer",
"backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.",
"backup_controller_page_background_app_refresh_disabled_title": "Background app refresh disabled",
"backup_controller_page_background_app_refresh_enable_button_text": "Go to settings",
"backup_controller_page_background_app_refresh_disabled_content": "Slå baggrundsopdatering af applikationen til i Indstillinger > Generelt > Baggrundsopdatering af applikationer, for at bruge baggrundsbackup.",
"backup_controller_page_background_app_refresh_disabled_title": "Baggrundsopdatering af app er slået fra",
"backup_controller_page_background_app_refresh_enable_button_text": "Gå til indstillinger",
"backup_controller_page_background_battery_info_link": "Vis mig hvordan",
"backup_controller_page_background_battery_info_message": "For den bedste oplevelse med baggrundsbackup, bør du slå batterioptimering, der begrænder baggrundsaktivitet, fra.\n\nSiden dette er afhængigt af enheden, bør du undersøge denne information leveret af din enheds producent.",
"backup_controller_page_background_battery_info_ok": "OK",
@@ -92,27 +95,30 @@
"cache_settings_subtitle": "Håndter cache-adfærden for Immich-appen.",
"cache_settings_thumbnail_size": "Størrelse af miniaturebillede cache ({} elementer)",
"cache_settings_title": "Cache-indstillinger",
"change_password_form_confirm_password": "Confirm Password",
"change_password_form_description": "Hi {firstName} {lastName},\n\nThis is either the first time you are signing into the system or a request has been made to change your password. Please enter the new password below.",
"change_password_form_new_password": "New Password",
"change_password_form_password_mismatch": "Passwords do not match",
"change_password_form_reenter_new_password": "Re-enter New Password",
"common_add_to_album": "Add to album",
"common_change_password": "Change Password",
"common_create_new_album": "Create new album",
"common_shared": "Shared",
"change_password_form_confirm_password": "Bekræft kodeord",
"change_password_form_description": "Hej {firstName} {lastName},\n\nDette er enten første gang du logger ind eller også er der lavet en anmodning om at ændre dit kodeord. Indtast venligst et nyt kodeord nedenfor.",
"change_password_form_new_password": "Nyt kodeord",
"change_password_form_password_mismatch": "Kodeord er ikke ens",
"change_password_form_reenter_new_password": "Gentag nyt kodeord",
"common_add_to_album": "Tilføj til album",
"common_change_password": "Skift kodeord",
"common_create_new_album": "Opret et nyt album",
"common_server_error": "Tjek din internetforbindelse, sørg for at serveren er tilgængelig og at app- og serversioner er kompatible.",
"common_shared": "Delt",
"control_bottom_app_bar_add_to_album": "Tilføj til album",
"control_bottom_app_bar_album_info": "{} genstande",
"control_bottom_app_bar_album_info_shared": "{} genstande • Delt",
"control_bottom_app_bar_create_new_album": "Opret nyt album",
"control_bottom_app_bar_delete": "Slet",
"control_bottom_app_bar_favorite": "Favorite",
"control_bottom_app_bar_favorite": "Favorit",
"control_bottom_app_bar_share": "Del",
"create_album_page_untitled": "Uden titel",
"create_shared_album_page_create": "Opret",
"create_shared_album_page_share": "Del",
"create_shared_album_page_share_add_assets": "TILFØJ ELEMENT",
"create_shared_album_page_share_select_photos": "Vælg billeder",
"curated_location_page_title": "Steder",
"curated_object_page_title": "Ting",
"daily_title_text_date": "E, dd MMM",
"daily_title_text_date_year": "E, dd MMM, yyyy",
"date_format": "E d. LLL y • hh:mm",
@@ -129,19 +135,21 @@
"experimental_settings_title": "Eksperimentelle",
"favorites_page_title": "Favoritter",
"home_page_add_to_album_conflicts": "Tilføjede {added} elementer til album {album}. {failed} elementer er allerede i albummet.",
"home_page_add_to_album_err_local": "Can not add local assets to albums yet, skipping",
"home_page_add_to_album_err_local": "Kan endnu ikke tilføje lokale elementer til album. Springer over..",
"home_page_add_to_album_success": "Tilføjede {added} elementer til album {album}.",
"home_page_building_timeline": "Bygger tidslinjen",
"home_page_favorite_err_local": "Can not favorite local assets yet, skipping",
"home_page_favorite_err_local": "Kan endnu ikke gøre lokale elementer til favoritter. Springer over..",
"home_page_first_time_notice": "Hvis dette er din første gang i appen, bedes du vælge en backup af albummer så tidlinjen kan blive fyldt med billeder og videoer fra albummerne.",
"image_viewer_page_state_provider_download_error": "Download Error",
"image_viewer_page_state_provider_download_success": "Download Success",
"image_viewer_page_state_provider_download_error": "Fejl ved download",
"image_viewer_page_state_provider_download_success": "Download succesfuld",
"library_page_albums": "Albummer",
"library_page_device_albums": "Albummer på enhed",
"library_page_favorites": "Favoritter",
"library_page_new_album": "Nyt album",
"library_page_sharing": "Delte",
"library_page_sort_created": "Senest oprettet",
"library_page_sort_title": "Albumtitel",
"login_form_api_exception": "API-undtagelse. Tjek serverens URL og prøv igen. ",
"login_form_button_text": "Log ind",
"login_form_email_hint": "din-e-mail@e-mail.com",
"login_form_endpoint_hint": "http://din-server-ip:port/api",
@@ -156,30 +164,55 @@
"login_form_failed_login": "Der opstod en vejl ved at logge ind. Tjek server webadressen, e-mailen og kodeordet",
"login_form_label_email": "E-mail",
"login_form_label_password": "Kodeord",
"login_form_next_button": "Næste",
"login_form_password_hint": "kodeord",
"login_form_save_login": "Forbliv logget ind",
"login_form_server_empty": "Indtast server-URL.",
"login_form_server_error": "Kunne ikke forbinde til serveren.",
"monthly_title_text_date_format": "MMMM y",
"notification_permission_dialog_cancel": "Cancel",
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
"notification_permission_dialog_settings": "Settings",
"notification_permission_list_tile_content": "Grant permission to enable notifications.",
"notification_permission_list_tile_enable_button": "Enable Notifications",
"notification_permission_list_tile_title": "Notification Permission",
"motion_photos_page_title": "Bevægelsesbilleder",
"notification_permission_dialog_cancel": "Annuller",
"notification_permission_dialog_content": "Gå til indstillinger for at slå notifikationer til.",
"notification_permission_dialog_settings": "Indstillinger",
"notification_permission_list_tile_content": "Tillad at bruge notifikationer.",
"notification_permission_list_tile_enable_button": "Slå notifikationer til",
"notification_permission_list_tile_title": "Notifikationstilladelser",
"permission_onboarding_continue_anyway": "Fortsæt alligevel",
"permission_onboarding_get_started": "Kom i gang",
"permission_onboarding_go_to_settings": "Gå til indstillinger",
"permission_onboarding_grant_permission": "Giv tilladelse",
"permission_onboarding_log_out": "Log ud",
"permission_onboarding_permission_denied": "Tilladelse afvist. For at bruge Immich, skal der gives tilladelse til at se billeder og videoer i indstillinger.",
"permission_onboarding_permission_granted": "Tilladelse givet! Du er nu klar.",
"permission_onboarding_permission_limited": "Tilladelse begrænset. For at lade Immich lave backup og styre hele dit galleri, skal der gives tilladelse til billeder og videoer i indstillinger.",
"permission_onboarding_request": "Immich kræver tilliadelse til at se dine billeder og videoer.",
"profile_drawer_app_logs": "Log",
"profile_drawer_client_server_up_to_date": "Klient og server er ajour",
"profile_drawer_settings": "Indstillinger",
"profile_drawer_sign_out": "Log ud",
"recently_added_page_title": "Nyligt tilføjet",
"search_bar_hint": "Søg i dine billeder",
"search_page_categories": "Kategorier",
"search_page_favorites": "Favoritter",
"search_page_motion_photos": "Bevægelsesbilleder",
"search_page_no_objects": "Ingen elementer er tilgængelige",
"search_page_no_places": "Ingen placeringsinformation er tilgængelig",
"search_page_places": "Steder",
"search_page_recently_added": "Nyligt tilføjet",
"search_page_screenshots": "Skærmbilleder",
"search_page_selfies": "Selfier",
"search_page_things": "Ting",
"search_page_videos": "Videoer",
"search_page_view_all_button": "Vis alt",
"search_page_your_activity": "Din aktivitet",
"search_result_page_new_search_hint": "Ny søgning",
"search_suggestion_list_smart_search_hint_1": "Smart søgnining er slået til som standard. For at søge efter metadata brug syntaksen",
"search_suggestion_list_smart_search_hint_2": "m:dit-søgeord",
"select_additional_user_for_sharing_page_suggestions": "Anbefalinger",
"select_user_for_sharing_page_err_album": "Fejlede i at oprette et nyt album",
"select_user_for_sharing_page_share_suggestions": "Anbefalinger",
"server_info_box_app_version": "App Version",
"server_info_box_server_version": "Server Version",
"server_info_box_app_version": "Applikationsversion",
"server_info_box_server_version": "Serverversion ",
"setting_image_viewer_help": "Detaljeret visning indlæser miniaturebilleder først. Herefter indlæses mediumstørrelse forhåndsvisning af billedet (hvis dette er slået til), for til sidst at vise originalen (hvis dette er slået til).",
"setting_image_viewer_original_subtitle": "Slå indlæsning af originalbillede i fuld størrelse til (stort!). Deaktiver for at reducere dataforbruget (både på netværket og for enhedscache).",
"setting_image_viewer_original_title": "Indlæs originalbillede",

View File

@@ -6,6 +6,8 @@
"album_thumbnail_card_item": "1 Element",
"album_thumbnail_card_items": "{} Elemente",
"album_thumbnail_card_shared": " · Geteilt",
"album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "Shared by {}",
"album_viewer_appbar_share_delete": "Album löschen",
"album_viewer_appbar_share_err_delete": "Album konnte nicht gelöscht werden",
"album_viewer_appbar_share_err_leave": "Album konnte nicht verlassen werden",
@@ -14,6 +16,7 @@
"album_viewer_appbar_share_leave": "Album verlassen",
"album_viewer_appbar_share_remove": "Entferne vom Album",
"album_viewer_page_share_add_users": "Nutzer hinzufügen",
"all_videos_page_title": "Videos",
"asset_list_layout_settings_dynamic_layout_title": "Dynamic layout",
"asset_list_layout_settings_group_by": "Group assets by",
"asset_list_layout_settings_group_by_month": "Month",
@@ -100,6 +103,7 @@
"common_add_to_album": "Add to album",
"common_change_password": "Change Password",
"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_shared": "Shared",
"control_bottom_app_bar_add_to_album": "Add to album",
"control_bottom_app_bar_album_info": "{} items",
@@ -113,6 +117,8 @@
"create_shared_album_page_share": "Teilen",
"create_shared_album_page_share_add_assets": "ELEMENTE HINZUFÜGEN",
"create_shared_album_page_share_select_photos": "Fotos auswählen",
"curated_location_page_title": "Places",
"curated_object_page_title": "Things",
"daily_title_text_date": "E, dd MMM",
"daily_title_text_date_year": "E, dd MMM, yyyy",
"date_format": "E d. LLL y • hh:mm",
@@ -137,11 +143,13 @@
"image_viewer_page_state_provider_download_error": "Download Error",
"image_viewer_page_state_provider_download_success": "Download Success",
"library_page_albums": "Alben",
"library_page_device_albums": "Albums on Device",
"library_page_favorites": "Favorites",
"library_page_new_album": "Neues Album",
"library_page_sharing": "Sharing",
"library_page_sort_created": "Most recently created",
"library_page_sort_title": "Album title",
"login_form_api_exception": "API exception. Please check the server URL and try again.",
"login_form_button_text": "Anmelden",
"login_form_email_hint": "deine@email.de",
"login_form_endpoint_hint": "http://deine-server-ip:port/api",
@@ -156,25 +164,50 @@
"login_form_failed_login": "Error logging you in, check server url, email and password",
"login_form_label_email": "E-Mail",
"login_form_label_password": "Passwort",
"login_form_next_button": "Next",
"login_form_password_hint": "password",
"login_form_save_login": "Angemeldet bleiben",
"login_form_server_empty": "Enter a server URL.",
"login_form_server_error": "Could not connect to server.",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Motion Photos",
"notification_permission_dialog_cancel": "Cancel",
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
"notification_permission_dialog_settings": "Settings",
"notification_permission_list_tile_content": "Grant permission to enable notifications.",
"notification_permission_list_tile_enable_button": "Enable Notifications",
"notification_permission_list_tile_title": "Notification Permission",
"permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_get_started": "Get started",
"permission_onboarding_go_to_settings": "Go to settings",
"permission_onboarding_grant_permission": "Grant permission",
"permission_onboarding_log_out": "Log out",
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_server_up_to_date": "App und Server sind aktuell",
"profile_drawer_settings": "Einstellungen",
"profile_drawer_sign_out": "Abmelden",
"recently_added_page_title": "Recently Added",
"search_bar_hint": "Durchsuche deine Fotos",
"search_page_categories": "Categories",
"search_page_favorites": "Favorites",
"search_page_motion_photos": "Motion Photos",
"search_page_no_objects": "Keine Objektinformationen verfügbar",
"search_page_no_places": "Keine Informationen über Orte verfügbar",
"search_page_places": "Orte",
"search_page_recently_added": "Recently added",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_page_things": "Dinge",
"search_page_videos": "Videos",
"search_page_view_all_button": "View all",
"search_page_your_activity": "Your activity",
"search_result_page_new_search_hint": "Neue Suche",
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
"select_additional_user_for_sharing_page_suggestions": "Vorschläge",
"select_user_for_sharing_page_err_album": "Album konnte nicht erstellt werden",
"select_user_for_sharing_page_share_suggestions": "Suggestions",

View File

@@ -6,6 +6,8 @@
"album_thumbnail_card_item": "1 item",
"album_thumbnail_card_items": "{} items",
"album_thumbnail_card_shared": " · Shared",
"album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "Shared by {}",
"album_viewer_appbar_share_delete": "Delete album",
"album_viewer_appbar_share_err_delete": "Failed to delete album",
"album_viewer_appbar_share_err_leave": "Failed to leave album",
@@ -14,6 +16,7 @@
"album_viewer_appbar_share_leave": "Leave album",
"album_viewer_appbar_share_remove": "Remove from album",
"album_viewer_page_share_add_users": "Add users",
"all_videos_page_title": "Videos",
"asset_list_layout_settings_dynamic_layout_title": "Dynamic layout",
"asset_list_layout_settings_group_by": "Group assets by",
"asset_list_layout_settings_group_by_month": "Month",
@@ -100,20 +103,23 @@
"common_add_to_album": "Add to album",
"common_change_password": "Change Password",
"common_create_new_album": "Create new album",
"common_shared": "Shared",
"common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.",
"common_shared": "Shared",
"control_bottom_app_bar_add_to_album": "Add to album",
"control_bottom_app_bar_album_info": "{} items",
"control_bottom_app_bar_album_info_shared": "{} items · Shared",
"control_bottom_app_bar_create_new_album": "Create new album",
"control_bottom_app_bar_delete": "Delete",
"control_bottom_app_bar_favorite": "Favorite",
"control_bottom_app_bar_archive": "Archive",
"control_bottom_app_bar_share": "Share",
"create_album_page_untitled": "Untitled",
"create_shared_album_page_create": "Create",
"create_shared_album_page_share": "Share",
"create_shared_album_page_share_add_assets": "ADD ASSETS",
"create_shared_album_page_share_select_photos": "Select Photos",
"curated_location_page_title": "Places",
"curated_object_page_title": "Things",
"daily_title_text_date": "E, MMM dd",
"daily_title_text_date_year": "E, MMM dd, yyyy",
"date_format": "E, LLL d, y • h:mm a",
@@ -134,16 +140,19 @@
"home_page_add_to_album_success": "Added {added} assets to album {album}.",
"home_page_building_timeline": "Building the timeline",
"home_page_favorite_err_local": "Can not favorite local assets yet, skipping",
"home_page_archive_err_local": "Can not archive local assets yet, skipping",
"home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).",
"image_viewer_page_state_provider_download_error": "Download Error",
"image_viewer_page_state_provider_download_success": "Download Success",
"library_page_albums": "Albums",
"library_page_device_albums": "Albums on Device",
"library_page_favorites": "Favorites",
"library_page_new_album": "New album",
"library_page_sharing": "Sharing",
"library_page_archive": "Archive",
"library_page_sort_created": "Most recently created",
"library_page_sort_title": "Album title",
"library_page_device_albums": "Albums on Device",
"login_form_api_exception": "API exception. Please check the server URL and try again.",
"login_form_button_text": "Login",
"login_form_email_hint": "youremail@email.com",
"login_form_endpoint_hint": "http://your-server-ip:port/api",
@@ -158,28 +167,50 @@
"login_form_failed_login": "Error logging you in, check server URL, email and password",
"login_form_label_email": "Email",
"login_form_label_password": "Password",
"login_form_password_hint": "Password",
"login_form_next_button": "Next",
"login_form_password_hint": "password",
"login_form_save_login": "Stay logged in",
"login_form_server_empty": "Enter a server URL.",
"login_form_server_error": "Could not connect to server.",
"login_form_api_exception": "API exception. Please check the server URL and try again.",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Motion Photos",
"notification_permission_dialog_cancel": "Cancel",
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
"notification_permission_dialog_settings": "Settings",
"notification_permission_list_tile_content": "Grant permission to enable notifications.",
"notification_permission_list_tile_enable_button": "Enable Notifications",
"notification_permission_list_tile_title": "Notification Permission",
"permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_get_started": "Get started",
"permission_onboarding_go_to_settings": "Go to settings",
"permission_onboarding_grant_permission": "Grant permission",
"permission_onboarding_log_out": "Log out",
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_server_up_to_date": "Client and Server are up-to-date",
"profile_drawer_settings": "Settings",
"profile_drawer_sign_out": "Sign Out",
"recently_added_page_title": "Recently Added",
"search_bar_hint": "Search your photos",
"search_page_categories": "Categories",
"search_page_favorites": "Favorites",
"search_page_motion_photos": "Motion Photos",
"search_page_no_objects": "No Objects Info Available",
"search_page_no_places": "No Places Info Available",
"search_page_places": "Places",
"search_page_recently_added": "Recently added",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_page_things": "Things",
"search_page_videos": "Videos",
"search_page_view_all_button": "View all",
"search_page_your_activity": "Your activity",
"search_result_page_new_search_hint": "New Search",
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
"select_additional_user_for_sharing_page_suggestions": "Suggestions",
"select_user_for_sharing_page_err_album": "Failed to create album",
"select_user_for_sharing_page_share_suggestions": "Suggestions",
@@ -235,32 +266,11 @@
"version_announcement_overlay_text_2": "please take your time to visit the ",
"version_announcement_overlay_text_3": " and ensure your docker-compose and .env setup is up-to-date to prevent any misconfigurations, especially if you use WatchTower or any mechanism that handles updating your server application automatically.",
"version_announcement_overlay_title": "New Server Version Available \uD83C\uDF89",
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"permission_onboarding_grant_permission": "Grant permission",
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
"permission_onboarding_get_started": "Get started",
"permission_onboarding_go_to_settings": "Go to settings",
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_log_out": "Log out",
"login_form_next_button": "Next",
"album_thumbnail_shared_by": "Shared by {}",
"album_thumbnail_owned": "Owned",
"curated_object_page_title": "Things",
"curated_location_page_title": "Places",
"search_page_view_all_button": "View all",
"search_page_your_activity": "Your activity",
"search_page_favorites": "Favorites",
"search_page_videos": "Videos",
"all_videos_page_title": "Videos",
"recently_added_page_title": "Recently Added",
"motion_photos_page_title": "Motion Photos",
"search_page_motion_photos": "Motion Photos",
"search_page_recently_added": "Recently added",
"search_page_categories": "Categories",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
"search_suggestion_list_smart_search_hint_2": "m:your-search-term"
"advanced_settings_tile_title": "Advanced",
"advanced_settings_tile_subtitle": "Advanced user's settings",
"advanced_settings_troubleshooting_title": "Troubleshooting",
"advanced_settings_troubleshooting_subtitle": "Enable additional features for troubleshooting",
"description_input_submit_error": "Error updating description, check the log for more details",
"description_input_hint_text": "Add description...",
"archive_page_title": "Archive ({})"
}

View File

@@ -6,6 +6,8 @@
"album_thumbnail_card_item": "1 item",
"album_thumbnail_card_items": "{} items",
"album_thumbnail_card_shared": " · Shared",
"album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "Shared by {}",
"album_viewer_appbar_share_delete": "Eliminar álbum ",
"album_viewer_appbar_share_err_delete": "No ha podido eliminar el álbum",
"album_viewer_appbar_share_err_leave": "No ha podido dejar el álbum",
@@ -14,6 +16,7 @@
"album_viewer_appbar_share_leave": "Abandonar álbum ",
"album_viewer_appbar_share_remove": "Eliminar del álbum ",
"album_viewer_page_share_add_users": "Añadir usuarios",
"all_videos_page_title": "Videos",
"asset_list_layout_settings_dynamic_layout_title": "Disposición dinámica",
"asset_list_layout_settings_group_by": "Agrupar recursos por",
"asset_list_layout_settings_group_by_month": "Mes",
@@ -100,6 +103,7 @@
"common_add_to_album": "Add to album",
"common_change_password": "Change Password",
"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_shared": "Shared",
"control_bottom_app_bar_add_to_album": "Añadir al álbum",
"control_bottom_app_bar_album_info": "{} elementos",
@@ -113,6 +117,8 @@
"create_shared_album_page_share": "Compartir",
"create_shared_album_page_share_add_assets": "AÑADIR ACTIVOS",
"create_shared_album_page_share_select_photos": "Seleccionar Fotos",
"curated_location_page_title": "Places",
"curated_object_page_title": "Things",
"daily_title_text_date": "E dd, MMM",
"daily_title_text_date_year": "E dd de MMM, yyyy",
"date_format": "E d, LLL y • h:mm a",
@@ -137,11 +143,13 @@
"image_viewer_page_state_provider_download_error": "Download Error",
"image_viewer_page_state_provider_download_success": "Download Success",
"library_page_albums": "Albums",
"library_page_device_albums": "Albums on Device",
"library_page_favorites": "Favoritos",
"library_page_new_album": "New album",
"library_page_sharing": "Compartiendo",
"library_page_sort_created": "Creado más recientemente",
"library_page_sort_title": "Título del álbum",
"login_form_api_exception": "API exception. Please check the server URL and try again.",
"login_form_button_text": "Iniciar Sesión",
"login_form_email_hint": "tucorreo@correo.com",
"login_form_endpoint_hint": "http://tu-ip-de-servidor:puerto/api",
@@ -156,25 +164,50 @@
"login_form_failed_login": "Error logging you in, check server URL, email and password",
"login_form_label_email": "Correo",
"login_form_label_password": "Contraseña",
"login_form_next_button": "Next",
"login_form_password_hint": "contraseña",
"login_form_save_login": "Mantener la sesión iniciada",
"login_form_server_empty": "Enter a server URL.",
"login_form_server_error": "Could not connect to server.",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Motion Photos",
"notification_permission_dialog_cancel": "Cancel",
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
"notification_permission_dialog_settings": "Settings",
"notification_permission_list_tile_content": "Grant permission to enable notifications.",
"notification_permission_list_tile_enable_button": "Enable Notifications",
"notification_permission_list_tile_title": "Notification Permission",
"permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_get_started": "Get started",
"permission_onboarding_go_to_settings": "Go to settings",
"permission_onboarding_grant_permission": "Grant permission",
"permission_onboarding_log_out": "Log out",
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_server_up_to_date": "El Cliente y el Servidor están actualizados",
"profile_drawer_settings": "Settings",
"profile_drawer_sign_out": "Cerrar Sesión",
"recently_added_page_title": "Recently Added",
"search_bar_hint": "Busca tus fotos",
"search_page_categories": "Categories",
"search_page_favorites": "Favorites",
"search_page_motion_photos": "Motion Photos",
"search_page_no_objects": "No Objects Info Available",
"search_page_no_places": "No hay información de lugares disponibles",
"search_page_places": "Lugares",
"search_page_recently_added": "Recently added",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_page_things": "Cosas",
"search_page_videos": "Videos",
"search_page_view_all_button": "View all",
"search_page_your_activity": "Your activity",
"search_result_page_new_search_hint": "Nueva Busqueda",
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
"select_additional_user_for_sharing_page_suggestions": "Sugerencias",
"select_user_for_sharing_page_err_album": "Fallo al crear el álbum",
"select_user_for_sharing_page_share_suggestions": "Suggestions",

View File

@@ -6,6 +6,8 @@
"album_thumbnail_card_item": "1 kohde",
"album_thumbnail_card_items": "{} kohdetta",
"album_thumbnail_card_shared": "Jaettu",
"album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "Shared by {}",
"album_viewer_appbar_share_delete": "Poista albumi",
"album_viewer_appbar_share_err_delete": "Albumin poistaminen epäonnistui",
"album_viewer_appbar_share_err_leave": "Albumista poistuminen epäonnistui",
@@ -14,6 +16,7 @@
"album_viewer_appbar_share_leave": "Poistu albumista",
"album_viewer_appbar_share_remove": "Poista albumista",
"album_viewer_page_share_add_users": "Lisää käyttäjiä",
"all_videos_page_title": "Videos",
"asset_list_layout_settings_dynamic_layout_title": "Dynaaminen asetelma",
"asset_list_layout_settings_group_by": "Ryhmittele",
"asset_list_layout_settings_group_by_month": "Kuukauden mukaan",
@@ -100,6 +103,7 @@
"common_add_to_album": "Add to album",
"common_change_password": "Change Password",
"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_shared": "Shared",
"control_bottom_app_bar_add_to_album": "Lisää albumiin",
"control_bottom_app_bar_album_info": "{} kohdetta",
@@ -113,6 +117,8 @@
"create_shared_album_page_share": "Jaa",
"create_shared_album_page_share_add_assets": "LISÄÄ KOHTEITA",
"create_shared_album_page_share_select_photos": "Valitse kuvat",
"curated_location_page_title": "Places",
"curated_object_page_title": "Things",
"daily_title_text_date": "E, MMM dd",
"daily_title_text_date_year": "E, MMM dd, yyyy",
"date_format": "E, LLL d, y • h:mm a",
@@ -137,11 +143,13 @@
"image_viewer_page_state_provider_download_error": "Download Error",
"image_viewer_page_state_provider_download_success": "Download Success",
"library_page_albums": "Albumit",
"library_page_device_albums": "Albums on Device",
"library_page_favorites": "Suosikit",
"library_page_new_album": "Uusi albumi",
"library_page_sharing": "Jakaminen",
"library_page_sort_created": "Viimeisin luotu",
"library_page_sort_title": "Albumin otsikko",
"login_form_api_exception": "API exception. Please check the server URL and try again.",
"login_form_button_text": "Kirjaudu",
"login_form_email_hint": "sahkopostisi@esimerkki.fi",
"login_form_endpoint_hint": "http://palvelimesi-osoite:portti/api",
@@ -156,25 +164,50 @@
"login_form_failed_login": "Virhe kirjautumisessa. Tarkista palvelimen URL, sähköpostiosoite ja salasana.",
"login_form_label_email": "Sähköposti",
"login_form_label_password": "Salasana",
"login_form_next_button": "Next",
"login_form_password_hint": "salasana",
"login_form_save_login": "Pysy kirjautuneena",
"login_form_server_empty": "Enter a server URL.",
"login_form_server_error": "Could not connect to server.",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Motion Photos",
"notification_permission_dialog_cancel": "Cancel",
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
"notification_permission_dialog_settings": "Settings",
"notification_permission_list_tile_content": "Grant permission to enable notifications.",
"notification_permission_list_tile_enable_button": "Enable Notifications",
"notification_permission_list_tile_title": "Notification Permission",
"permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_get_started": "Get started",
"permission_onboarding_go_to_settings": "Go to settings",
"permission_onboarding_grant_permission": "Grant permission",
"permission_onboarding_log_out": "Log out",
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"profile_drawer_app_logs": "Lokit",
"profile_drawer_client_server_up_to_date": "Asiakassovellus ja palvelin ovat ajan tasalla",
"profile_drawer_settings": "Asetukset",
"profile_drawer_sign_out": "Kirjaudu ulos",
"recently_added_page_title": "Recently Added",
"search_bar_hint": "Etsi kuvia",
"search_page_categories": "Categories",
"search_page_favorites": "Favorites",
"search_page_motion_photos": "Motion Photos",
"search_page_no_objects": "Objektitietoja ei ole saatavilla",
"search_page_no_places": "Paikkatietoja ei ole saatavilla",
"search_page_places": "Paikat",
"search_page_recently_added": "Recently added",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_page_things": "Asiat",
"search_page_videos": "Videos",
"search_page_view_all_button": "View all",
"search_page_your_activity": "Your activity",
"search_result_page_new_search_hint": "Uusi haku",
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
"select_additional_user_for_sharing_page_suggestions": "Ehdotukset",
"select_user_for_sharing_page_err_album": "Albumin luonti epäonnistui",
"select_user_for_sharing_page_share_suggestions": "Ehdotukset",

View File

@@ -1,11 +1,13 @@
{
"add_to_album_bottom_sheet_added": "Added to {album}",
"add_to_album_bottom_sheet_already_exists": "Already in {album}",
"add_to_album_bottom_sheet_added": "Ajouté à {album}",
"add_to_album_bottom_sheet_already_exists": "Déjà dans {album}",
"album_info_card_backup_album_excluded": "EXCLU",
"album_info_card_backup_album_included": "INCLUS",
"album_thumbnail_card_item": "1 élément",
"album_thumbnail_card_items": "{} éléments",
"album_thumbnail_card_shared": " · Partagé",
"album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "Shared by {}",
"album_viewer_appbar_share_delete": "Supprimer l'album",
"album_viewer_appbar_share_err_delete": "Échec de la suppression de l'album",
"album_viewer_appbar_share_err_leave": "Impossible de quitter l'album",
@@ -14,6 +16,7 @@
"album_viewer_appbar_share_leave": "Quitter l'album",
"album_viewer_appbar_share_remove": "Retirer de l'album",
"album_viewer_page_share_add_users": "Ajouter des utilisateurs",
"all_videos_page_title": "Videos",
"asset_list_layout_settings_dynamic_layout_title": "Affichage dynamique",
"asset_list_layout_settings_group_by": "Grouper les éléments par",
"asset_list_layout_settings_group_by_month": "Mois",
@@ -35,9 +38,9 @@
"backup_background_service_in_progress_notification": "Sauvegarde de vos éléments...",
"backup_background_service_upload_failure_notification": "Impossible de transférer {}",
"backup_controller_page_albums": "Sauvegarder les albums",
"backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.",
"backup_controller_page_background_app_refresh_disabled_title": "Background app refresh disabled",
"backup_controller_page_background_app_refresh_enable_button_text": "Go to settings",
"backup_controller_page_background_app_refresh_disabled_content": "Activez le rafraîchissement de l'application en arrière-plan dans Paramètres > Général > Rafraîchissement de l'application en arrière-plan afin d'utiliser la sauvegarde en arrière-plan.",
"backup_controller_page_background_app_refresh_disabled_title": "Rafraîchissement de l'application en arrière-plan désactivé",
"backup_controller_page_background_app_refresh_enable_button_text": "Aller aux paramètres",
"backup_controller_page_background_battery_info_link": "Montrez-moi comment",
"backup_controller_page_background_battery_info_message": "Pour une expérience optimale de la sauvegarde en arrière-plan, veuillez désactiver toute optimisation de la batterie limitant l'activité en arrière-plan pour Immich.\n\nÉtant donné que cela est spécifique à chaque appareil, veuillez consulter les informations requises pour le fabricant de votre appareil.",
"backup_controller_page_background_battery_info_ok": "OK",
@@ -92,27 +95,30 @@
"cache_settings_subtitle": "Contrôler le comportement de mise en cache de l'application mobile Immich",
"cache_settings_thumbnail_size": "Taille du cache des miniatures ({} éléments)",
"cache_settings_title": "Paramètres de mise en cache",
"change_password_form_confirm_password": "Confirm Password",
"change_password_form_description": "Hi {firstName} {lastName},\n\nThis is either the first time you are signing into the system or a request has been made to change your password. Please enter the new password below.",
"change_password_form_new_password": "New Password",
"change_password_form_password_mismatch": "Passwords do not match",
"change_password_form_reenter_new_password": "Re-enter New Password",
"common_add_to_album": "Add to album",
"common_change_password": "Change Password",
"common_create_new_album": "Create new album",
"common_shared": "Shared",
"change_password_form_confirm_password": "Confirmez le mot de passe",
"change_password_form_description": "Bonjour {firstName} {lastName},\n\nC'est la première fois que vous vous connectez au système ou vous avez demandé à changer votre mot de passe. Veuillez saisir le nouveau mot de passe ci-dessous.",
"change_password_form_new_password": "Nouveau mot de passe",
"change_password_form_password_mismatch": "Les mots de passe ne correspondent pas",
"change_password_form_reenter_new_password": "Saisissez à nouveau le nouveau mot de passe",
"common_add_to_album": "Ajouter à l'album",
"common_change_password": "Modifier le mot de passe",
"common_create_new_album": "Créer un nouvel album",
"common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.",
"common_shared": "Partagé",
"control_bottom_app_bar_add_to_album": "Ajouter à l'album",
"control_bottom_app_bar_album_info": "{} éléments",
"control_bottom_app_bar_album_info_shared": "{} éléments - Partagés",
"control_bottom_app_bar_create_new_album": "Créer un nouvel album",
"control_bottom_app_bar_delete": "Supprimer",
"control_bottom_app_bar_favorite": "Favorite",
"control_bottom_app_bar_favorite": "Favoris",
"control_bottom_app_bar_share": "Partager",
"create_album_page_untitled": "Sans titre",
"create_shared_album_page_create": "Créer",
"create_shared_album_page_share": "Partager",
"create_shared_album_page_share_add_assets": "AJOUTER DES ÉLÉMENTS",
"create_shared_album_page_share_select_photos": "Sélectionner les photos",
"curated_location_page_title": "Places",
"curated_object_page_title": "Things",
"daily_title_text_date": "E, dd MMM",
"daily_title_text_date_year": "E, dd MMM, yyyy",
"date_format": "E, LLL d, y • h:mm a",
@@ -124,24 +130,26 @@
"exif_bottom_sheet_details": "DÉTAILS",
"exif_bottom_sheet_location": "LOCALISATION",
"experimental_settings_new_asset_list_subtitle": "En cours de développement",
"experimental_settings_new_asset_list_title": "Activez la grille de photos expérimentale",
"experimental_settings_new_asset_list_title": "Activer la grille de photos expérimentale",
"experimental_settings_subtitle": "Utilisez à vos dépends !",
"experimental_settings_title": "Expérimental",
"favorites_page_title": "Favoris",
"home_page_add_to_album_conflicts": "{added} éléments ajoutés à l'album {album}. Les éléments {failed} sont déjà dans l'album.",
"home_page_add_to_album_err_local": "Can not add local assets to albums yet, skipping",
"home_page_add_to_album_err_local": "Impossible d'ajouter des éléments locaux aux albums pour le moment, étape ignorée",
"home_page_add_to_album_success": "{added} éléments ajoutés à l'album {album}.",
"home_page_building_timeline": "Construction de la chronologie",
"home_page_favorite_err_local": "Can not favorite local assets yet, skipping",
"home_page_favorite_err_local": "Impossible d'ajouter des éléments locaux aux favoris pour le moment, étape ignorée",
"home_page_first_time_notice": "Si c'est la première fois que vous utilisez l'application, veillez à choisir un ou plusieurs albums de sauvegarde afin que la chronologie puisse alimenter les photos et les vidéos de cet ou ces albums.",
"image_viewer_page_state_provider_download_error": "Download Error",
"image_viewer_page_state_provider_download_success": "Download Success",
"image_viewer_page_state_provider_download_error": "Erreur de téléchargement",
"image_viewer_page_state_provider_download_success": "Téléchargement réussi",
"library_page_albums": "Albums",
"library_page_device_albums": "Albums on Device",
"library_page_favorites": "Favoris",
"library_page_new_album": "Nouvel album",
"library_page_sharing": "Partage",
"library_page_sort_created": "Créations les plus récentes",
"library_page_sort_title": "Titre de l'album",
"login_form_api_exception": "API exception. Please check the server URL and try again.",
"login_form_button_text": "Connexion",
"login_form_email_hint": "votreemail@email.com",
"login_form_endpoint_hint": "http://adresse-ip-serveur:port/api",
@@ -156,30 +164,55 @@
"login_form_failed_login": "Erreur de connexion, vérifiez l'url du serveur, l'email et le mot de passe",
"login_form_label_email": "Email",
"login_form_label_password": "Mot de passe",
"login_form_next_button": "Next",
"login_form_password_hint": "mot de passe",
"login_form_save_login": "Rester connecté",
"login_form_server_empty": "Enter a server URL.",
"login_form_server_error": "Could not connect to server.",
"monthly_title_text_date_format": "MMMM y",
"notification_permission_dialog_cancel": "Cancel",
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
"notification_permission_dialog_settings": "Settings",
"notification_permission_list_tile_content": "Grant permission to enable notifications.",
"notification_permission_list_tile_enable_button": "Enable Notifications",
"notification_permission_list_tile_title": "Notification Permission",
"motion_photos_page_title": "Motion Photos",
"notification_permission_dialog_cancel": "Annuler",
"notification_permission_dialog_content": "Pour activer les notifications, allez dans Paramètres et sélectionnez Autoriser.",
"notification_permission_dialog_settings": "Paramètres",
"notification_permission_list_tile_content": "Accordez la permission d'activer les notifications.",
"notification_permission_list_tile_enable_button": "Activer les notifications",
"notification_permission_list_tile_title": "Permission de notification",
"permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_get_started": "Get started",
"permission_onboarding_go_to_settings": "Go to settings",
"permission_onboarding_grant_permission": "Grant permission",
"permission_onboarding_log_out": "Log out",
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"profile_drawer_app_logs": "Journaux",
"profile_drawer_client_server_up_to_date": "Le client et le serveur sont à jour",
"profile_drawer_settings": "Paramètres",
"profile_drawer_sign_out": "Se déconnecter",
"recently_added_page_title": "Recently Added",
"search_bar_hint": "Rechercher vos photos",
"search_page_categories": "Categories",
"search_page_favorites": "Favorites",
"search_page_motion_photos": "Motion Photos",
"search_page_no_objects": "Aucune information disponible sur les objets",
"search_page_no_places": "Aucune information disponible sur la localisation",
"search_page_places": "Lieux",
"search_page_recently_added": "Recently added",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_page_things": "Objets",
"search_page_videos": "Videos",
"search_page_view_all_button": "View all",
"search_page_your_activity": "Your activity",
"search_result_page_new_search_hint": "Nouvelle recherche",
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
"select_additional_user_for_sharing_page_suggestions": "Suggestions",
"select_user_for_sharing_page_err_album": "Échec de la création de l'album",
"select_user_for_sharing_page_share_suggestions": "Suggestions",
"server_info_box_app_version": "App Version",
"server_info_box_server_version": "Server Version",
"server_info_box_app_version": "Version de l'application",
"server_info_box_server_version": "Version du serveur",
"setting_image_viewer_help": "Le visualiseur de détails charge d'abord la petite miniature, puis l'aperçu de taille moyenne (s'il est activé), enfin l'original (s'il est activé).",
"setting_image_viewer_original_subtitle": "Activez cette option pour charger l'image en résolution originale (volumineux !). Désactiver pour réduire l'utilisation des données (réseau et cache de l'appareil).",
"setting_image_viewer_original_title": "Charger l'image originale",

View File

@@ -1,11 +1,13 @@
{
"add_to_album_bottom_sheet_added": "Added to {album}",
"add_to_album_bottom_sheet_already_exists": "Already in {album}",
"add_to_album_bottom_sheet_added": "Aggiunto in {album}",
"add_to_album_bottom_sheet_already_exists": "Già presente in {album}",
"album_info_card_backup_album_excluded": "ESCLUSI",
"album_info_card_backup_album_included": "INCLUSI",
"album_thumbnail_card_item": "1 elemento ",
"album_thumbnail_card_items": "{} elementi",
"album_thumbnail_card_shared": "Condiviso",
"album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "Shared by {}",
"album_viewer_appbar_share_delete": "Elimina album ",
"album_viewer_appbar_share_err_delete": "Impossibile cancellare l'album ",
"album_viewer_appbar_share_err_leave": "Impossibile lasciare l'album ",
@@ -14,10 +16,11 @@
"album_viewer_appbar_share_leave": "Lascia album",
"album_viewer_appbar_share_remove": "Rimuovere dall'album ",
"album_viewer_page_share_add_users": "Aggiungi utenti",
"asset_list_layout_settings_dynamic_layout_title": "Dynamic layout",
"asset_list_layout_settings_group_by": "Group assets by",
"asset_list_layout_settings_group_by_month": "Month",
"asset_list_layout_settings_group_by_month_day": "Month + day",
"all_videos_page_title": "Videos",
"asset_list_layout_settings_dynamic_layout_title": "Layout dinamico",
"asset_list_layout_settings_group_by": "Raggruppa le immagini per",
"asset_list_layout_settings_group_by_month": "Mese",
"asset_list_layout_settings_group_by_month_day": "Mese + giorno",
"asset_list_settings_subtitle": "Impostazion del layout della griglia delle foto",
"asset_list_settings_title": "Griglia foto",
"backup_album_selection_page_albums_device": "Albums sul device ({})",
@@ -35,9 +38,9 @@
"backup_background_service_in_progress_notification": "Backing dei tuoi contenuti…",
"backup_background_service_upload_failure_notification": "Impossibile caricare {}",
"backup_controller_page_albums": "Backup Album",
"backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.",
"backup_controller_page_background_app_refresh_disabled_title": "Background app refresh disabled",
"backup_controller_page_background_app_refresh_enable_button_text": "Go to settings",
"backup_controller_page_background_app_refresh_disabled_content": "Attiva background app refresh dalle Impostazioni > Generale > Background App Refresh per utilizzare backup in background.",
"backup_controller_page_background_app_refresh_disabled_title": "Backup in background è disattivo",
"backup_controller_page_background_app_refresh_enable_button_text": "Vai alle impostazioni",
"backup_controller_page_background_battery_info_link": "Mostrami come",
"backup_controller_page_background_battery_info_message": "Per una migliore esperienza di backup, disabilita le ottimizzazioni della batteria per l'app Immich.\n\nDal momento che è una funzionalità specifica del dispositivo, per favore consulta il manuale del produttore.",
"backup_controller_page_background_battery_info_ok": "OK",
@@ -82,7 +85,7 @@
"cache_settings_album_thumbnails": "Anteprime pagine librerie ({} assets)",
"cache_settings_clear_cache_button": "Cancella cache",
"cache_settings_clear_cache_button_title": "Cancella la cache dell'app. Questo impatterà significativamente le prestazioni dell''app fino a quando la cache non sarà rigenerata.",
"cache_settings_image_cache_size": "Dimensione cache foto ({} assets)",
"cache_settings_image_cache_size": "Dimensione cache delle foto ({} assets)",
"cache_settings_statistics_album": "Anteprime librerie",
"cache_settings_statistics_assets": "{} contenuti ({})",
"cache_settings_statistics_full": "Immagini complete",
@@ -90,29 +93,32 @@
"cache_settings_statistics_thumbnail": "Anteprime",
"cache_settings_statistics_title": "Uso della cache",
"cache_settings_subtitle": "Controlla il comportamento della cache dell'applicazione mobile immich",
"cache_settings_thumbnail_size": "Dimensione cache anteprime ({} assets)",
"cache_settings_thumbnail_size": "Dimensione cache dei thumbnail ({} assets)",
"cache_settings_title": "Impostazioni della Cache",
"change_password_form_confirm_password": "Confirm Password",
"change_password_form_description": "Hi {firstName} {lastName},\n\nThis is either the first time you are signing into the system or a request has been made to change your password. Please enter the new password below.",
"change_password_form_new_password": "New Password",
"change_password_form_password_mismatch": "Passwords do not match",
"change_password_form_reenter_new_password": "Re-enter New Password",
"common_add_to_album": "Add to album",
"common_change_password": "Change Password",
"common_create_new_album": "Create new album",
"common_shared": "Shared",
"change_password_form_confirm_password": "Conferma Password ",
"change_password_form_description": "Ciao {firstName} {lastName},\n\nQuesto è la prima volta che accedi al sistema oppure è stato fatto una richiesta di cambiare la password. Per favore inserisca la nuova password qui sotto",
"change_password_form_new_password": "Nuova Password",
"change_password_form_password_mismatch": "Le password non coincidono",
"change_password_form_reenter_new_password": "Inserisci ancora la nuova password ",
"common_add_to_album": "Aggiungi all'album",
"common_change_password": "Cambia Password",
"common_create_new_album": "Crea nuovo Album",
"common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.",
"common_shared": "Condivisi",
"control_bottom_app_bar_add_to_album": "Aggiungi all'album",
"control_bottom_app_bar_album_info": "{} elementi",
"control_bottom_app_bar_album_info_shared": "{} elementi · Condivisi",
"control_bottom_app_bar_create_new_album": "Crea nuovo album",
"control_bottom_app_bar_delete": "Elimina",
"control_bottom_app_bar_favorite": "Favorite",
"control_bottom_app_bar_favorite": "Preferiti",
"control_bottom_app_bar_share": "Condividi",
"create_album_page_untitled": "Senza titolo",
"create_shared_album_page_create": "Crea",
"create_shared_album_page_share": "Condividi",
"create_shared_album_page_share_add_assets": "AGGIUNGI OGGETTI",
"create_shared_album_page_share_select_photos": "Seleziona foto",
"curated_location_page_title": "Places",
"curated_object_page_title": "Things",
"daily_title_text_date": "E, dd MMM",
"daily_title_text_date_year": "E, dd MMM, yyyy",
"date_format": "E, d LLL, y • hh:mm",
@@ -127,28 +133,30 @@
"experimental_settings_new_asset_list_title": "Attiva griglia di foto sperimentale",
"experimental_settings_subtitle": "Usalo a tuo rischio!",
"experimental_settings_title": "Sperimentale",
"favorites_page_title": "Favorites",
"favorites_page_title": "Preferiti",
"home_page_add_to_album_conflicts": "Aggiunti {added} elementi all'album {album}. {failed} elementi erano già presenti nell'album.",
"home_page_add_to_album_err_local": "Can not add local assets to albums yet, skipping",
"home_page_add_to_album_err_local": "Non puoi aggiungere negli album foto ancora non caricate",
"home_page_add_to_album_success": "Aggiunti {added} elementi all'album {album}",
"home_page_building_timeline": "Building the timeline",
"home_page_favorite_err_local": "Can not favorite local assets yet, skipping",
"home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).",
"image_viewer_page_state_provider_download_error": "Download Error",
"image_viewer_page_state_provider_download_success": "Download Success",
"home_page_building_timeline": "Costruendo il Timeline",
"home_page_favorite_err_local": "Non puoi aggiungere tra i preferiti le foto ancora non caricate",
"home_page_first_time_notice": "Se è la prima volta che usi l'app, assicurati di scegliere gli album per avere il Timeline con immagini e video",
"image_viewer_page_state_provider_download_error": "Errore nel Download",
"image_viewer_page_state_provider_download_success": "Download con successo",
"library_page_albums": "Album",
"library_page_favorites": "Favorites",
"library_page_device_albums": "Albums on Device",
"library_page_favorites": "Preferiti",
"library_page_new_album": "Nuovo Album",
"library_page_sharing": "Sharing",
"library_page_sort_created": "Most recently created",
"library_page_sort_title": "Album title",
"library_page_sharing": "Condividendo",
"library_page_sort_created": "Creato il più recente",
"library_page_sort_title": "Titolo album",
"login_form_api_exception": "API exception. Please check the server URL and try again.",
"login_form_button_text": "Login",
"login_form_email_hint": "tuaemail@email.com",
"login_form_endpoint_hint": "http://ip-del-tuo-server:port/api",
"login_form_endpoint_url": "Server Endpoint URL",
"login_form_err_http": "Per favore specificare http:// o https://",
"login_form_err_invalid_email": "Email non valida",
"login_form_err_invalid_url": "Invalid URL",
"login_form_err_invalid_url": "URL invalido",
"login_form_err_leading_whitespace": "Whitespace all'inizio ",
"login_form_err_trailing_whitespace": "Whitespace alla fine",
"login_form_failed_get_oauth_server_config": "Errore di login usando OAuth, controlla l'URL del server",
@@ -156,30 +164,55 @@
"login_form_failed_login": "Errore nel login, controlla URL del server e le credenziali (email e password)",
"login_form_label_email": "Email",
"login_form_label_password": "Password",
"login_form_next_button": "Next",
"login_form_password_hint": "password ",
"login_form_save_login": "Rimani connesso ",
"login_form_server_empty": "Enter a server URL.",
"login_form_server_error": "Could not connect to server.",
"monthly_title_text_date_format": "MMMM y",
"notification_permission_dialog_cancel": "Cancel",
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
"notification_permission_dialog_settings": "Settings",
"notification_permission_list_tile_content": "Grant permission to enable notifications.",
"notification_permission_list_tile_enable_button": "Enable Notifications",
"notification_permission_list_tile_title": "Notification Permission",
"motion_photos_page_title": "Motion Photos",
"notification_permission_dialog_cancel": "Annulla",
"notification_permission_dialog_content": "Per attivare le notifiche, vai alle Impostazioni e seleziona concedi",
"notification_permission_dialog_settings": "Impostazioni",
"notification_permission_list_tile_content": "Concedi i permessi per attivare le notifiche",
"notification_permission_list_tile_enable_button": "Attiva notifiche",
"notification_permission_list_tile_title": "Permessi delle Notifiche",
"permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_get_started": "Get started",
"permission_onboarding_go_to_settings": "Go to settings",
"permission_onboarding_grant_permission": "Grant permission",
"permission_onboarding_log_out": "Log out",
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_server_up_to_date": "Client e server sono aggiornati",
"profile_drawer_settings": "Impostazioni ",
"profile_drawer_sign_out": "Logout",
"recently_added_page_title": "Recently Added",
"search_bar_hint": "Cerca le tue foto",
"search_page_categories": "Categories",
"search_page_favorites": "Favorites",
"search_page_motion_photos": "Motion Photos",
"search_page_no_objects": "Nessuna informazione relativa all'oggetto disponibile",
"search_page_no_places": "Nessun informazione sul luogo disponibile",
"search_page_places": "Luoghi",
"search_page_recently_added": "Recently added",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_page_things": "Oggetti",
"search_page_videos": "Videos",
"search_page_view_all_button": "View all",
"search_page_your_activity": "Your activity",
"search_result_page_new_search_hint": "Nuova ricerca ",
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
"select_additional_user_for_sharing_page_suggestions": "Suggerimenti ",
"select_user_for_sharing_page_err_album": "Impossibile nel creare l'album ",
"select_user_for_sharing_page_share_suggestions": "Suggerimenti",
"server_info_box_app_version": "App Version",
"server_info_box_server_version": "Server Version",
"server_info_box_app_version": "Versione App",
"server_info_box_server_version": "Versione Server",
"setting_image_viewer_help": "Il visualizzatore dettagliato carica una piccola thumbnail per prima, per poi caricare un immagine di media grandezza (se abilitato). Ed infine carica l'originale (se abilitato).",
"setting_image_viewer_original_subtitle": "Abilita per caricare l'immagine originale a risoluzione massima (grande!). Disabilita per ridurre l'utilizzo di banda (sia sul network che nella cache del dispositivo).",
"setting_image_viewer_original_title": "Carica l'immagine originale",

View File

@@ -1,11 +1,13 @@
{
"add_to_album_bottom_sheet_added": "Added to {album}",
"add_to_album_bottom_sheet_already_exists": "Already in {album}",
"add_to_album_bottom_sheet_added": "{album}に追加しました",
"add_to_album_bottom_sheet_already_exists": "{album}にもう存在してます",
"album_info_card_backup_album_excluded": "除外中",
"album_info_card_backup_album_included": "選択中",
"album_thumbnail_card_item": "項目数: 1",
"album_thumbnail_card_items": "項目数: {}",
"album_thumbnail_card_shared": "共有済み",
"album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "Shared by {}",
"album_viewer_appbar_share_delete": "アルバムを削除",
"album_viewer_appbar_share_err_delete": "削除に失敗...",
"album_viewer_appbar_share_err_leave": "退会に失敗...",
@@ -14,10 +16,11 @@
"album_viewer_appbar_share_leave": "アルバムから退会",
"album_viewer_appbar_share_remove": "アルバムから除外",
"album_viewer_page_share_add_users": "ユーザーを追加",
"asset_list_layout_settings_dynamic_layout_title": "Dynamic layout",
"asset_list_layout_settings_group_by": "Group assets by",
"asset_list_layout_settings_group_by_month": "Month",
"asset_list_layout_settings_group_by_month_day": "Month + day",
"all_videos_page_title": "Videos",
"asset_list_layout_settings_dynamic_layout_title": "ダイナミックレイアウト",
"asset_list_layout_settings_group_by": "写真をグループ分けする方法:",
"asset_list_layout_settings_group_by_month": "",
"asset_list_layout_settings_group_by_month_day": "月+日",
"asset_list_settings_subtitle": "グリッドに関する設定",
"asset_list_settings_title": "グリッド",
"backup_album_selection_page_albums_device": "端末上のアルバム数は {} だよ",
@@ -30,21 +33,21 @@
"backup_background_service_backup_failed_message": "アップロードに失敗しました。リトライ中",
"backup_background_service_connection_failed_message": "サーバーに接続できません。リトライ中",
"backup_background_service_current_upload_notification": " {} をアップロード中",
"backup_background_service_default_notification": "新しい写真をチェックしています",
"backup_background_service_default_notification": "新しい写真をチェックしてるよ",
"backup_background_service_error_title": "バックアップエラー",
"backup_background_service_in_progress_notification": "バックアップ中",
"backup_background_service_upload_failure_notification": "{} のアップロードに失敗",
"backup_controller_page_albums": "アルバム",
"backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.",
"backup_controller_page_background_app_refresh_disabled_title": "Background app refresh disabled",
"backup_controller_page_background_app_refresh_enable_button_text": "Go to settings",
"backup_controller_page_background_app_refresh_disabled_content": "バックグラウンドで写真のバックアップを行いたい場合はバックグラウンド更新を \n設定 > 一般 > Appのバックグラウンド更新 \nからオンにしてください",
"backup_controller_page_background_app_refresh_disabled_title": "バックグラウンドバックアップはオフになってます",
"backup_controller_page_background_app_refresh_enable_button_text": "設定を開く",
"backup_controller_page_background_battery_info_link": "方法を見る",
"backup_controller_page_background_battery_info_message": "バックグラウンドバックアップが正常に動作するためにImmichに適用されてるバッテリーの最適化と自動調整をオフにしてね。\n\n端末によって方法が変わるから各々調べてね",
"backup_controller_page_background_battery_info_ok": "了解",
"backup_controller_page_background_battery_info_title": "バッテリーの最適化",
"backup_controller_page_background_charging": "充電中のみに行う",
"backup_controller_page_background_configure_error": "バックグラウンドサービスの構築に失敗しました",
"backup_controller_page_background_delay": "Delay new assets backup: {}",
"backup_controller_page_background_delay": "新しい写真のバックアップを遅らせる: {}",
"backup_controller_page_background_description": "バックグラウンドバックアップをオンにしてアプリを開かなくても自動で画像をアップロードするようにします",
"backup_controller_page_background_is_off": "自動バックグラウンドバックアップはオフになってます",
"backup_controller_page_background_is_on": "自動バックグラウンドバックアップはオンになってます",
@@ -92,27 +95,30 @@
"cache_settings_subtitle": "キャッシュの動作を変更できるよ",
"cache_settings_thumbnail_size": "サムネイルのキャッシュのサイズ ({}枚)",
"cache_settings_title": "キャッシュの設定",
"change_password_form_confirm_password": "Confirm Password",
"change_password_form_description": "Hi {firstName} {lastName},\n\nThis is either the first time you are signing into the system or a request has been made to change your password. Please enter the new password below.",
"change_password_form_new_password": "New Password",
"change_password_form_password_mismatch": "Passwords do not match",
"change_password_form_reenter_new_password": "Re-enter New Password",
"common_add_to_album": "Add to album",
"common_change_password": "Change Password",
"common_create_new_album": "Create new album",
"common_shared": "Shared",
"control_bottom_app_bar_add_to_album": "Add to album",
"control_bottom_app_bar_album_info": "{} items",
"control_bottom_app_bar_album_info_shared": "{} items · Shared",
"control_bottom_app_bar_create_new_album": "Create new album",
"change_password_form_confirm_password": "パスワードを確定",
"change_password_form_description": "{lastaName} {firstName}さん こんにちは\n\nサーバーにアクセスするのが初めて、又はパスワードリセットのリクエストがされました。新しいパスワードを入力してください",
"change_password_form_new_password": "新しいパスワード",
"change_password_form_password_mismatch": "パスワードが一致しません",
"change_password_form_reenter_new_password": "再度パスワードを入力してください",
"common_add_to_album": "アルバムに追加",
"common_change_password": "パスワードを変更",
"common_create_new_album": "アルバムを作成",
"common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.",
"common_shared": "共有済み",
"control_bottom_app_bar_add_to_album": "アルバムに追加",
"control_bottom_app_bar_album_info": "{}枚の写真",
"control_bottom_app_bar_album_info_shared": "{}枚の共有中の写真",
"control_bottom_app_bar_create_new_album": "新しいアルバムを作成",
"control_bottom_app_bar_delete": "削除",
"control_bottom_app_bar_favorite": "Favorite",
"control_bottom_app_bar_favorite": "お気に入り",
"control_bottom_app_bar_share": "共有",
"create_album_page_untitled": "タイトル無し",
"create_shared_album_page_create": "作成",
"create_shared_album_page_share": "共有",
"create_shared_album_page_share_add_assets": "写真を追加",
"create_shared_album_page_share_select_photos": "写真を選択",
"curated_location_page_title": "Places",
"curated_object_page_title": "Things",
"daily_title_text_date": "MM月 DD日, EE",
"daily_title_text_date_year": "yyyy年 MM月 DD日, EE",
"date_format": "MM月 DD日, EE • hh時mm分",
@@ -123,74 +129,101 @@
"exif_bottom_sheet_description": "概要を追加",
"exif_bottom_sheet_details": "詳細な情報",
"exif_bottom_sheet_location": "撮影地",
"experimental_settings_new_asset_list_subtitle": "進行中",
"experimental_settings_new_asset_list_subtitle": "製作途中(WIP)",
"experimental_settings_new_asset_list_title": "試験的なグリッドを有効",
"experimental_settings_subtitle": "試験的だから自己責任でね",
"experimental_settings_title": "試験的",
"favorites_page_title": "Favorites",
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.",
"home_page_add_to_album_err_local": "Can not add local assets to albums yet, skipping",
"home_page_add_to_album_success": "Added {added} assets to album {album}.",
"home_page_building_timeline": "Building the timeline",
"home_page_favorite_err_local": "Can not favorite local assets yet, skipping",
"home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).",
"image_viewer_page_state_provider_download_error": "Download Error",
"image_viewer_page_state_provider_download_success": "Download Success",
"favorites_page_title": "お気に入り",
"home_page_add_to_album_conflicts": "{album}に{added}枚写真を追加しました。{failed}枚の写真は常に存在してたよ",
"home_page_add_to_album_err_local": "まだアップロードされてない写真はアルバムに登録できないよ",
"home_page_add_to_album_success": "{album}に{added}枚写真を追加しました",
"home_page_building_timeline": "タイムラインを構築中",
"home_page_favorite_err_local": "まだアップロードされてない写真はお気に入り登録できないよ",
"home_page_first_time_notice": "アプリを使うのがはじめての場合タイムラインに写真を表示するためにアルバムを選択してね",
"image_viewer_page_state_provider_download_error": "ダウンロードエラー",
"image_viewer_page_state_provider_download_success": "ダウンロードできました",
"library_page_albums": "アルバム",
"library_page_favorites": "Favorites",
"library_page_device_albums": "Albums on Device",
"library_page_favorites": "お気に入り",
"library_page_new_album": "新しいアルバム",
"library_page_sharing": "Sharing",
"library_page_sort_created": "Most recently created",
"library_page_sort_title": "Album title",
"library_page_sharing": "共有中",
"library_page_sort_created": "最後に作成した",
"library_page_sort_title": "アルバムのタイトル",
"login_form_api_exception": "API exception. Please check the server URL and try again.",
"login_form_button_text": "ログイン",
"login_form_email_hint": "example@email.com",
"login_form_endpoint_hint": "https://example.com:port/api",
"login_form_endpoint_url": "サーバーエンドポイントURL",
"login_form_err_http": "http://かhttps://かを指定してね",
"login_form_err_invalid_email": "メールアドレスが有効じゃないよ",
"login_form_err_invalid_url": "Invalid URL",
"login_form_err_invalid_url": "無効なURLです",
"login_form_err_leading_whitespace": "最初に半角スペースが含まれてるよ",
"login_form_err_trailing_whitespace": "最後に半角スペースが含まれてるよ",
"login_form_failed_get_oauth_server_config": "Error logging using OAuth, check server URL",
"login_form_failed_get_oauth_server_disable": "OAuth feature is not available on this server",
"login_form_failed_get_oauth_server_config": "OAuthを使ってのログインに失敗しました。サーバーのURLを確認してください",
"login_form_failed_get_oauth_server_disable": "OAuthはこのサーバーで使えません",
"login_form_failed_login": "ログインエラー。サーバーのURL、メールアドレスとパスワードを再確認してね",
"login_form_label_email": "メールアドレス",
"login_form_label_password": "パスワード",
"login_form_next_button": "Next",
"login_form_password_hint": "パスワード",
"login_form_save_login": "ログインしたままにする",
"login_form_server_empty": "Enter a server URL.",
"login_form_server_error": "Could not connect to server.",
"monthly_title_text_date_format": "yyyy年 MM月",
"notification_permission_dialog_cancel": "Cancel",
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
"notification_permission_dialog_settings": "Settings",
"notification_permission_list_tile_content": "Grant permission to enable notifications.",
"notification_permission_list_tile_enable_button": "Enable Notifications",
"notification_permission_list_tile_title": "Notification Permission",
"profile_drawer_app_logs": "Logs",
"motion_photos_page_title": "Motion Photos",
"notification_permission_dialog_cancel": "キャンセル",
"notification_permission_dialog_content": "通知を許可するには設定を開いてオンにしてください",
"notification_permission_dialog_settings": "設定",
"notification_permission_list_tile_content": "通知の許可 をオンにしてください",
"notification_permission_list_tile_enable_button": "通知をオンにする",
"notification_permission_list_tile_title": "通知の許可",
"permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_get_started": "Get started",
"permission_onboarding_go_to_settings": "Go to settings",
"permission_onboarding_grant_permission": "Grant permission",
"permission_onboarding_log_out": "Log out",
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"profile_drawer_app_logs": "ログ",
"profile_drawer_client_server_up_to_date": "サーバーとクライアント、両方最新バージョンだよ",
"profile_drawer_settings": "設定",
"profile_drawer_sign_out": "サインアウト",
"recently_added_page_title": "Recently Added",
"search_bar_hint": "写真を検索",
"search_page_categories": "Categories",
"search_page_favorites": "Favorites",
"search_page_motion_photos": "Motion Photos",
"search_page_no_objects": "被写体に関するデータがなし",
"search_page_no_places": "場所に関するデータがなし",
"search_page_places": "撮影地",
"search_page_recently_added": "Recently added",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_page_things": "カテゴリ",
"search_page_videos": "Videos",
"search_page_view_all_button": "View all",
"search_page_your_activity": "Your activity",
"search_result_page_new_search_hint": "検索",
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
"select_additional_user_for_sharing_page_suggestions": "ユーザーリスト",
"select_user_for_sharing_page_err_album": "アルバム作成に失敗...",
"select_user_for_sharing_page_share_suggestions": "ユーザーの一覧",
"server_info_box_app_version": "App Version",
"server_info_box_server_version": "Server Version",
"setting_image_viewer_help": "The detail viewer loads the small thumbnail first, then loads the medium-size preview (if enabled), finally loads the original (if enabled).",
"setting_image_viewer_original_subtitle": "Enable to load the original full-resolution image (large!). Disable to reduce data usage (both network and on device cache).",
"setting_image_viewer_original_title": "Load original image",
"setting_image_viewer_preview_subtitle": "Enable to load a medium-resolution image. Disable to either directly load the original or only use the thumbnail.",
"setting_image_viewer_preview_title": "Load preview image",
"server_info_box_app_version": "アプリVer.",
"server_info_box_server_version": "サーバーVer.",
"setting_image_viewer_help": "ディテールビューは最初にサムネイルをロードします。次に中画質のサイズの写真が表示されます。次ににオプションがオンになってる場合大きいサイズの写真がロードされて、最後にオンになってる場合オリジナルサイズの写真がロードされます",
"setting_image_viewer_original_subtitle": "オリジナルの写真を表示したい時にオンにしてください(最大の画質で表示されるので携帯のモバイルデータとストレージの消費量が増えます)。節約したい場合はオフにしてください",
"setting_image_viewer_original_title": "オリジナルをロードする",
"setting_image_viewer_preview_subtitle": "中画質の写真をロードしたい時にオンにしてください。直接最大画質の写真を表示したい場合はオフにしてください(ロード中はサムネイルが代わりに表示されます)",
"setting_image_viewer_preview_title": "プレビュー画像をロードする",
"setting_notifications_notify_failures_grace_period": "バックアップ失敗の通知: {}",
"setting_notifications_notify_hours": "{}時間後",
"setting_notifications_notify_immediately": "すぐに行う",
"setting_notifications_notify_minutes": "{}分後",
"setting_notifications_notify_never": "行わない",
"setting_notifications_notify_seconds": "{} seconds",
"setting_notifications_notify_seconds": "{}",
"setting_notifications_single_progress_subtitle": "アップロード中の写真の詳細",
"setting_notifications_single_progress_title": "バックグランドバックアップの詳細を表示",
"setting_notifications_subtitle": "通知設定を変更する",
@@ -217,8 +250,8 @@
"theme_setting_asset_list_storage_indicator_title": "ストレージに関する情報を表示",
"theme_setting_asset_list_tiles_per_row_title": "一列のの写真の数: {} ",
"theme_setting_dark_mode_switch": "ダークモード",
"theme_setting_image_viewer_quality_subtitle": "画像ビューの画質の設定",
"theme_setting_image_viewer_quality_title": "画像ビュー",
"theme_setting_image_viewer_quality_subtitle": "画像ビューの画質の設定",
"theme_setting_image_viewer_quality_title": "画像ビュー",
"theme_setting_system_theme_switch": "自動 (端末の設定を反映) ",
"theme_setting_theme_subtitle": "アプリの見た目の設定",
"theme_setting_theme_title": "テーマ",

View File

@@ -6,6 +6,8 @@
"album_thumbnail_card_item": "1개 항목",
"album_thumbnail_card_items": "{}개 항목",
"album_thumbnail_card_shared": " · 공유",
"album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "Shared by {}",
"album_viewer_appbar_share_delete": "앨범 삭제",
"album_viewer_appbar_share_err_delete": "앨범 삭제 실패",
"album_viewer_appbar_share_err_leave": "앨범에서 나가지 못했습니다",
@@ -14,6 +16,7 @@
"album_viewer_appbar_share_leave": "앨범 나가기",
"album_viewer_appbar_share_remove": "앨범에서 제거",
"album_viewer_page_share_add_users": "사용자 추가",
"all_videos_page_title": "Videos",
"asset_list_layout_settings_dynamic_layout_title": "다이나믹 레이아웃",
"asset_list_layout_settings_group_by": "다음으로 그룹화",
"asset_list_layout_settings_group_by_month": "월",
@@ -100,6 +103,7 @@
"common_add_to_album": "앨범에 추가",
"common_change_password": "비밀번호 변경",
"common_create_new_album": "새 앨범 만들기",
"common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.",
"common_shared": "공유됨",
"control_bottom_app_bar_add_to_album": "앨범에 추가",
"control_bottom_app_bar_album_info": "{} 항목",
@@ -113,6 +117,8 @@
"create_shared_album_page_share": "공유",
"create_shared_album_page_share_add_assets": "사진 추가",
"create_shared_album_page_share_select_photos": "사진 선택",
"curated_location_page_title": "Places",
"curated_object_page_title": "Things",
"daily_title_text_date": "E, M월 d일",
"daily_title_text_date_year": "E, M월 d일, yyyy",
"date_format": "yyyy년 M월 d일, EEEE • a h:mm",
@@ -137,11 +143,13 @@
"image_viewer_page_state_provider_download_error": "다운로드 에러",
"image_viewer_page_state_provider_download_success": "다운로드 완료",
"library_page_albums": "앨범",
"library_page_device_albums": "Albums on Device",
"library_page_favorites": "즐겨찾기",
"library_page_new_album": "새 앨범",
"library_page_sharing": "공유",
"library_page_sort_created": "최근생성일",
"library_page_sort_title": "앨범 제목",
"login_form_api_exception": "API exception. Please check the server URL and try again.",
"login_form_button_text": "로그인",
"login_form_email_hint": "youremail@email.com",
"login_form_endpoint_hint": "https://your-server-ip:port/api",
@@ -156,25 +164,50 @@
"login_form_failed_login": "로그인 오류, 서버 URL, 이메일 및 비밀번호를 확인하세요",
"login_form_label_email": "이메일",
"login_form_label_password": "비밀번호",
"login_form_next_button": "Next",
"login_form_password_hint": "비밀번호",
"login_form_save_login": "로그인상태 유지",
"login_form_server_empty": "Enter a server URL.",
"login_form_server_error": "Could not connect to server.",
"monthly_title_text_date_format": "y년 M월",
"motion_photos_page_title": "Motion Photos",
"notification_permission_dialog_cancel": "취소",
"notification_permission_dialog_content": "알림을 활성화하려면 설정으로 이동하여 허용을 선택해주세요.",
"notification_permission_dialog_settings": "설정",
"notification_permission_list_tile_content": "알림 활성화 권한허용",
"notification_permission_list_tile_enable_button": "알림 활성화",
"notification_permission_list_tile_title": "알림 권한",
"permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_get_started": "Get started",
"permission_onboarding_go_to_settings": "Go to settings",
"permission_onboarding_grant_permission": "Grant permission",
"permission_onboarding_log_out": "Log out",
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"profile_drawer_app_logs": "로그",
"profile_drawer_client_server_up_to_date": "클라이언트와 서버가 최신 상태입니다",
"profile_drawer_settings": "설정",
"profile_drawer_sign_out": "로그아웃",
"recently_added_page_title": "Recently Added",
"search_bar_hint": "사진 검색",
"search_page_categories": "Categories",
"search_page_favorites": "Favorites",
"search_page_motion_photos": "Motion Photos",
"search_page_no_objects": "발견된 사물이\n없습니다",
"search_page_no_places": "발견된 장소가\n없습니다",
"search_page_places": "장소",
"search_page_recently_added": "Recently added",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_page_things": "사물",
"search_page_videos": "Videos",
"search_page_view_all_button": "View all",
"search_page_your_activity": "Your activity",
"search_result_page_new_search_hint": "새 검색",
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
"select_additional_user_for_sharing_page_suggestions": "초대 가능한 사용자 제안",
"select_user_for_sharing_page_err_album": "앨범 생성 실패",
"select_user_for_sharing_page_share_suggestions": "초대 가능한 사용자 제안",

View File

@@ -6,6 +6,8 @@
"album_thumbnail_card_item": "1 objekt",
"album_thumbnail_card_items": "{} objekter",
"album_thumbnail_card_shared": "Delt",
"album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "Shared by {}",
"album_viewer_appbar_share_delete": "Slett album",
"album_viewer_appbar_share_err_delete": "Feilet ved sletting av album",
"album_viewer_appbar_share_err_leave": "Kunne ikke forlate albumet",
@@ -14,6 +16,7 @@
"album_viewer_appbar_share_leave": "Forlat album",
"album_viewer_appbar_share_remove": "Fjern fra album",
"album_viewer_page_share_add_users": "Legg til brukere",
"all_videos_page_title": "Videos",
"asset_list_layout_settings_dynamic_layout_title": "Dynamisk layout",
"asset_list_layout_settings_group_by": "Grupper bilder etter",
"asset_list_layout_settings_group_by_month": "Måned",
@@ -35,9 +38,9 @@
"backup_background_service_in_progress_notification": "Foretar backup av objekter...",
"backup_background_service_upload_failure_notification": "Filet under opplasting {}",
"backup_controller_page_albums": "Sikkerhetskopier albumer",
"backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.",
"backup_controller_page_background_app_refresh_disabled_title": "Background app refresh disabled",
"backup_controller_page_background_app_refresh_enable_button_text": "Go to settings",
"backup_controller_page_background_app_refresh_disabled_content": "Aktiver oppdatering av bakgrunnsapp i Innstillinger > Generelt > Oppdater bakgrunnsapp for å bruke sikkerhetskopiering i bakgrunnen.",
"backup_controller_page_background_app_refresh_disabled_title": "Oppdatering av bakgrunnsapp er deaktivert",
"backup_controller_page_background_app_refresh_enable_button_text": "Gå til innstillinger",
"backup_controller_page_background_battery_info_link": "Hvis meg hvordan",
"backup_controller_page_background_battery_info_message": "For den beste bakgrunnsbackup opplevelsen, deaktiver enhver batterioptimalisering som begrenser bakgrunnsaktiviteten til Immich.\n\nSiden dette er en enhets-spesifik justering, se innstillinger for den aktuelle enhet.",
"backup_controller_page_background_battery_info_ok": "OK",
@@ -100,6 +103,7 @@
"common_add_to_album": "Legg til i album",
"common_change_password": "Endre passord",
"common_create_new_album": "Lag nytt album",
"common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.",
"common_shared": "Delt",
"control_bottom_app_bar_add_to_album": "Legg til i album",
"control_bottom_app_bar_album_info": "{} objekter",
@@ -113,6 +117,8 @@
"create_shared_album_page_share": "Del",
"create_shared_album_page_share_add_assets": "LEGG TIL OBJEKTER",
"create_shared_album_page_share_select_photos": "Velg bilder",
"curated_location_page_title": "Places",
"curated_object_page_title": "Things",
"daily_title_text_date": "E, MMM dd",
"daily_title_text_date_year": "E, MMM dd, yyyy",
"date_format": "E, LLL d, y • h:mm a",
@@ -137,11 +143,13 @@
"image_viewer_page_state_provider_download_error": "Nedlasting feilet",
"image_viewer_page_state_provider_download_success": "Nedlasting vellykket",
"library_page_albums": "Albumer",
"library_page_device_albums": "Albums on Device",
"library_page_favorites": "Favoritter",
"library_page_new_album": "Nytt album",
"library_page_sharing": "Deling",
"library_page_sort_created": "Nylig opplastet",
"library_page_sort_title": "Album tittel",
"login_form_api_exception": "API exception. Please check the server URL and try again.",
"login_form_button_text": "Logg inn",
"login_form_email_hint": "dinepost@epost.no",
"login_form_endpoint_hint": "http://din-server-ip:port/api",
@@ -156,25 +164,50 @@
"login_form_failed_login": "Feil ved innlogging, sjekk server URL, epost og passord",
"login_form_label_email": "Epostadresse",
"login_form_label_password": "Passord",
"login_form_next_button": "Next",
"login_form_password_hint": "passord",
"login_form_save_login": "Forbli innlogget",
"login_form_server_empty": "Enter a server URL.",
"login_form_server_error": "Could not connect to server.",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Motion Photos",
"notification_permission_dialog_cancel": "Avbryt",
"notification_permission_dialog_content": "For å aktivere notifikasjoner, gå til Innstillinger og velg tillat.",
"notification_permission_dialog_settings": "Innstillinger",
"notification_permission_list_tile_content": "Tillat tilgang for å aktivere notifikasjoner",
"notification_permission_list_tile_enable_button": "Aktiver notifikasjoner",
"notification_permission_list_tile_title": "Notifikasjonstilgang",
"permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_get_started": "Get started",
"permission_onboarding_go_to_settings": "Go to settings",
"permission_onboarding_grant_permission": "Grant permission",
"permission_onboarding_log_out": "Log out",
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"profile_drawer_app_logs": "Logg",
"profile_drawer_client_server_up_to_date": "Klient og Server er oppdatert",
"profile_drawer_settings": "Innstillinger",
"profile_drawer_sign_out": "Logg ut",
"recently_added_page_title": "Recently Added",
"search_bar_hint": "Søk i dine bilder",
"search_page_categories": "Categories",
"search_page_favorites": "Favorites",
"search_page_motion_photos": "Motion Photos",
"search_page_no_objects": "Ingen objektinfo tilgjengelig",
"search_page_no_places": "Ingen plasseringsinfo tilgjengelig",
"search_page_places": "Plasser",
"search_page_recently_added": "Recently added",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_page_things": "Ting",
"search_page_videos": "Videos",
"search_page_view_all_button": "View all",
"search_page_your_activity": "Your activity",
"search_result_page_new_search_hint": "Nytt søk",
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
"select_additional_user_for_sharing_page_suggestions": "Forslag",
"select_user_for_sharing_page_err_album": "Feilet ved oppretting av album",
"select_user_for_sharing_page_share_suggestions": "Forslag",

View File

@@ -6,6 +6,8 @@
"album_thumbnail_card_item": "1 item",
"album_thumbnail_card_items": "{} items",
"album_thumbnail_card_shared": " · Gedeeld",
"album_thumbnail_owned": "Eigenaar",
"album_thumbnail_shared_by": "Gedeeld door {}",
"album_viewer_appbar_share_delete": "Verwijder album",
"album_viewer_appbar_share_err_delete": "Fout bij verwijderen album",
"album_viewer_appbar_share_err_leave": "Fout bij verlaten album",
@@ -14,6 +16,7 @@
"album_viewer_appbar_share_leave": "Verlaat album",
"album_viewer_appbar_share_remove": "Verwijder uit album",
"album_viewer_page_share_add_users": "Gebruikers toevoegen",
"all_videos_page_title": "Video's",
"asset_list_layout_settings_dynamic_layout_title": "Dynamische layout",
"asset_list_layout_settings_group_by": "Groupeer items per",
"asset_list_layout_settings_group_by_month": "Maand",
@@ -35,9 +38,9 @@
"backup_background_service_in_progress_notification": "Back-up maken van items…",
"backup_background_service_upload_failure_notification": "Fout bij upload {}",
"backup_controller_page_albums": "Back-up albums",
"backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.",
"backup_controller_page_background_app_refresh_disabled_title": "Background app refresh disabled",
"backup_controller_page_background_app_refresh_enable_button_text": "Go to settings",
"backup_controller_page_background_app_refresh_disabled_content": "Schakel verversen op de achtergrond in via Instellingen > Algemeen > Ververs op achtergrond, om back-ups op de achtergrond te maken.",
"backup_controller_page_background_app_refresh_disabled_title": "Ververs op achtergrond uitgeschakeld",
"backup_controller_page_background_app_refresh_enable_button_text": "Ga naar instellingen",
"backup_controller_page_background_battery_info_link": "Toon me hoe",
"backup_controller_page_background_battery_info_message": "Schakel voor de beste back-up ervaring op de achtergrond alle batterij optimalisaties uit, die de achtergrondactiviteit van Immich beperkt.\n\nAangezien dit apparaatspecifiek is, zoek de vereiste informatie op voor de fabrikant van je apparaat.",
"backup_controller_page_background_battery_info_ok": "OK",
@@ -100,6 +103,7 @@
"common_add_to_album": "Toevoegen aan album",
"common_change_password": "Wachtwoord wijzigen",
"common_create_new_album": "Maak nieuw album",
"common_server_error": "Controleer je netwerkverbinding, zorg ervoor dat de server bereikbaar is en de app/server versies compatibel zijn.",
"common_shared": "Gedeeld",
"control_bottom_app_bar_add_to_album": "Toevoegen aan album",
"control_bottom_app_bar_album_info": "{} items",
@@ -113,6 +117,8 @@
"create_shared_album_page_share": "Delen",
"create_shared_album_page_share_add_assets": "ITEMS TOEVOEGEN",
"create_shared_album_page_share_select_photos": "Selecteer foto's",
"curated_location_page_title": "Plaatsen",
"curated_object_page_title": "Dingen",
"daily_title_text_date": "E dd MMM",
"daily_title_text_date_year": "E dd MMM yyyy",
"date_format": "E d LLL y • H:mm",
@@ -137,11 +143,13 @@
"image_viewer_page_state_provider_download_error": "Download mislukt",
"image_viewer_page_state_provider_download_success": "Download succesvol",
"library_page_albums": "Albums",
"library_page_device_albums": "Albums op apparaat",
"library_page_favorites": "Favorieten",
"library_page_new_album": "Nieuw album",
"library_page_sharing": "Gedeeld",
"library_page_sort_created": "Meest recent gemaakt",
"library_page_sort_title": "Albumtitel",
"login_form_api_exception": "API fout. Controleer de server URL en probeer opnieuw.",
"login_form_button_text": "Inloggen",
"login_form_email_hint": "jouwemail@email.com",
"login_form_endpoint_hint": "http://jouw-server-ip:port/api",
@@ -156,25 +164,50 @@
"login_form_failed_login": "Fout bij inloggen, controleer server URL, e-mailadres en wachtwoord",
"login_form_label_email": "E-mailadres",
"login_form_label_password": "Wachtwoord",
"login_form_next_button": "Volgende",
"login_form_password_hint": "wachtwoord",
"login_form_save_login": "Ingelogd blijven",
"login_form_server_empty": "Voer een server URL in.",
"login_form_server_error": "Kan geen verbinding maken met de server.",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Bewegende foto's",
"notification_permission_dialog_cancel": "Annuleren",
"notification_permission_dialog_content": "Om meldingen in te schakelen, ga naar Instellingen en selecteer toestaan.",
"notification_permission_dialog_settings": "Instellingen",
"notification_permission_list_tile_content": "Geef toestemming om meldingen in te schakelen.",
"notification_permission_list_tile_content": "Geef toestemming om meldingen te versturen.",
"notification_permission_list_tile_enable_button": "Meldingen inschakelen",
"notification_permission_list_tile_title": "Toestemming meldingen",
"notification_permission_list_tile_title": "Meldingen toestaan",
"permission_onboarding_continue_anyway": "Toch doorgaan",
"permission_onboarding_get_started": "Aan de slag",
"permission_onboarding_go_to_settings": "Ga naar instellingen",
"permission_onboarding_grant_permission": "Toestemming verlenen",
"permission_onboarding_log_out": "Uitloggen",
"permission_onboarding_permission_denied": "Toestemming geweigerd. Geef toestemming tot foto's en video's in je Instellingen om Immich te kunnen gebruiken.",
"permission_onboarding_permission_granted": "Toestemming verleend. Je bent helemaal klaar.",
"permission_onboarding_permission_limited": "Beperkte toestemming. Geef toestemming tot foto's en video's in Instellingen om Immich een back-up te laten maken van je galerij en deze te beheren.",
"permission_onboarding_request": "Immich heeft toestemming nodig om je foto's en video's te bekijken.",
"profile_drawer_app_logs": "Logboek",
"profile_drawer_client_server_up_to_date": "App en server zijn up-to-date",
"profile_drawer_settings": "Instellingen",
"profile_drawer_sign_out": "Uitloggen",
"recently_added_page_title": "Recent toegevoegd",
"search_bar_hint": "Zoeken naar foto's",
"search_page_categories": "Categorieën",
"search_page_favorites": "Favorieten",
"search_page_motion_photos": "Bewegende foto's",
"search_page_no_objects": "Geen object gegevens beschikbaar",
"search_page_no_places": "Geen locatie gegevens beschikbaar",
"search_page_places": "Plaatsen",
"search_page_recently_added": "Recent toegevoegd",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_page_things": "Dingen",
"search_page_videos": "Video's",
"search_page_view_all_button": "Bekijk alle",
"search_page_your_activity": "Je activiteit",
"search_result_page_new_search_hint": "Nieuwe zoekopdracht",
"search_suggestion_list_smart_search_hint_1": "Slim zoeken is standaard ingeschakeld, om naar metadata te zoeken gebruik",
"search_suggestion_list_smart_search_hint_2": "m:je-zoekterm",
"select_additional_user_for_sharing_page_suggestions": "Suggesties",
"select_user_for_sharing_page_err_album": "Album aanmaken mislukt",
"select_user_for_sharing_page_share_suggestions": "Suggesties",
@@ -193,8 +226,8 @@
"setting_notifications_notify_seconds": "{} seconden",
"setting_notifications_single_progress_subtitle": "Gedetaileerde informatie over de uploadvoortgang per item",
"setting_notifications_single_progress_title": "Toon gedetailleerde informatie over back-ups op de achtergrond",
"setting_notifications_subtitle": "Werk je notificatievoorkeuren bij",
"setting_notifications_title": "Notificaties",
"setting_notifications_subtitle": "Voorkeuren voor meldingen beheren",
"setting_notifications_title": "Meldingen",
"setting_notifications_total_progress_subtitle": "Algehele uploadvoortgang (voltooid/totaal aantal items)",
"setting_notifications_total_progress_title": "Toon de totale voortgang van achtergrond back-up",
"setting_pages_app_bar_settings": "Instellingen",

View File

@@ -6,6 +6,8 @@
"album_thumbnail_card_item": "1 pozycja",
"album_thumbnail_card_items": "{} pozycje",
"album_thumbnail_card_shared": "Udostępniony",
"album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "Shared by {}",
"album_viewer_appbar_share_delete": "Usuń album",
"album_viewer_appbar_share_err_delete": "Nie udało się usunąć albumu",
"album_viewer_appbar_share_err_leave": "Nie udało się wyjść z albumu",
@@ -14,6 +16,7 @@
"album_viewer_appbar_share_leave": "Opuść album",
"album_viewer_appbar_share_remove": "Usuń z albumu",
"album_viewer_page_share_add_users": "Dodaj użytkowników",
"all_videos_page_title": "Videos",
"asset_list_layout_settings_dynamic_layout_title": "Dynamic layout",
"asset_list_layout_settings_group_by": "Group assets by",
"asset_list_layout_settings_group_by_month": "Month",
@@ -100,6 +103,7 @@
"common_add_to_album": "Add to album",
"common_change_password": "Change Password",
"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_shared": "Shared",
"control_bottom_app_bar_add_to_album": "Add to album",
"control_bottom_app_bar_album_info": "{} items",
@@ -113,6 +117,8 @@
"create_shared_album_page_share": "Udostępnij",
"create_shared_album_page_share_add_assets": "DODAJ ZASOBY",
"create_shared_album_page_share_select_photos": "Zaznacz Zdjęcia",
"curated_location_page_title": "Places",
"curated_object_page_title": "Things",
"daily_title_text_date": "E, MMM dd",
"daily_title_text_date_year": "E, MMM dd, yyyy",
"date_format": "E, LLL d, y • h:mm a",
@@ -137,11 +143,13 @@
"image_viewer_page_state_provider_download_error": "Download Error",
"image_viewer_page_state_provider_download_success": "Download Success",
"library_page_albums": "Albumy",
"library_page_device_albums": "Albums on Device",
"library_page_favorites": "Favorites",
"library_page_new_album": "Nowy album",
"library_page_sharing": "Sharing",
"library_page_sort_created": "Most recently created",
"library_page_sort_title": "Album title",
"login_form_api_exception": "API exception. Please check the server URL and try again.",
"login_form_button_text": "Login",
"login_form_email_hint": "twojmail@email.com",
"login_form_endpoint_hint": "http://ip-twojego-serwera:port/api",
@@ -156,25 +164,50 @@
"login_form_failed_login": "Błąd logowania, sprawdź adres url serwera, email i hasło.",
"login_form_label_email": "Email",
"login_form_label_password": "Hasło",
"login_form_next_button": "Next",
"login_form_password_hint": "hasło",
"login_form_save_login": "Pozostań zalogowany",
"login_form_server_empty": "Enter a server URL.",
"login_form_server_error": "Could not connect to server.",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Motion Photos",
"notification_permission_dialog_cancel": "Cancel",
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
"notification_permission_dialog_settings": "Settings",
"notification_permission_list_tile_content": "Grant permission to enable notifications.",
"notification_permission_list_tile_enable_button": "Enable Notifications",
"notification_permission_list_tile_title": "Notification Permission",
"permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_get_started": "Get started",
"permission_onboarding_go_to_settings": "Go to settings",
"permission_onboarding_grant_permission": "Grant permission",
"permission_onboarding_log_out": "Log out",
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_server_up_to_date": "Klient i serwer są aktualne",
"profile_drawer_settings": "Ustawienia",
"profile_drawer_sign_out": "Wyloguj się",
"recently_added_page_title": "Recently Added",
"search_bar_hint": "Szukaj swoich zdjęć",
"search_page_categories": "Categories",
"search_page_favorites": "Favorites",
"search_page_motion_photos": "Motion Photos",
"search_page_no_objects": "Brak informacji o obiektach",
"search_page_no_places": "Brak informacji o miejscu",
"search_page_places": "Miejsca",
"search_page_recently_added": "Recently added",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_page_things": "Rzeczy",
"search_page_videos": "Videos",
"search_page_view_all_button": "View all",
"search_page_your_activity": "Your activity",
"search_result_page_new_search_hint": "Nowe wyszukiwanie",
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
"select_additional_user_for_sharing_page_suggestions": "Propozycje",
"select_user_for_sharing_page_err_album": "Nie udało się utworzyć albumu",
"select_user_for_sharing_page_share_suggestions": "Propozycje",

View File

@@ -6,6 +6,8 @@
"album_thumbnail_card_item": "1 объект",
"album_thumbnail_card_items": "{} объектов",
"album_thumbnail_card_shared": "· Общий",
"album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "Shared by {}",
"album_viewer_appbar_share_delete": "Удалить альбом",
"album_viewer_appbar_share_err_delete": "Невозможно удалить альбом",
"album_viewer_appbar_share_err_leave": "Невозможно покинуть альбом",
@@ -14,6 +16,7 @@
"album_viewer_appbar_share_leave": "Покинуть альбом",
"album_viewer_appbar_share_remove": "Удалить из альбома",
"album_viewer_page_share_add_users": "Добавить пользователей",
"all_videos_page_title": "Videos",
"asset_list_layout_settings_dynamic_layout_title": "Динамическое расположение",
"asset_list_layout_settings_group_by": "Группировать объекты по",
"asset_list_layout_settings_group_by_month": "месяцу",
@@ -100,6 +103,7 @@
"common_add_to_album": "Добавить в альбом",
"common_change_password": "Изменить пароль",
"common_create_new_album": "Создать новый альбом",
"common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.",
"common_shared": "Общие",
"control_bottom_app_bar_add_to_album": "Добавить в альбом",
"control_bottom_app_bar_album_info": "{} файлов",
@@ -113,6 +117,8 @@
"create_shared_album_page_share": "Поделиться",
"create_shared_album_page_share_add_assets": "ДОБАВИТЬ ОБЪЕКТЫ",
"create_shared_album_page_share_select_photos": "Выберите фотографии",
"curated_location_page_title": "Places",
"curated_object_page_title": "Things",
"daily_title_text_date": "E, MMM dd",
"daily_title_text_date_year": "E, MMM dd, yyyy",
"date_format": "E, LLL d, y • h:mm a",
@@ -137,11 +143,13 @@
"image_viewer_page_state_provider_download_error": "Ошибка загрузки",
"image_viewer_page_state_provider_download_success": "Успешно загружено",
"library_page_albums": "Альбомы",
"library_page_device_albums": "Albums on Device",
"library_page_favorites": "Избранное",
"library_page_new_album": "Новый альбом",
"library_page_sharing": "Общие",
"library_page_sort_created": "По новизне",
"library_page_sort_title": "По названию альбома",
"login_form_api_exception": "API exception. Please check the server URL and try again.",
"login_form_button_text": "Войти",
"login_form_email_hint": "youremail@email.com",
"login_form_endpoint_hint": "http://your-server-ip:port/api",
@@ -156,25 +164,50 @@
"login_form_failed_login": "Ошибка при входе в систему, проверьте URL-адрес сервера, адрес электронной почты и пароль",
"login_form_label_email": "Email",
"login_form_label_password": "Пароль",
"login_form_next_button": "Next",
"login_form_password_hint": "пароль",
"login_form_save_login": "Оставаться в системе",
"login_form_server_empty": "Enter a server URL.",
"login_form_server_error": "Could not connect to server.",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Motion Photos",
"notification_permission_dialog_cancel": "Отмена",
"notification_permission_dialog_content": "Чтобы включить уведомления, перейдите в «Настройки» и выберите «Разрешить».",
"notification_permission_dialog_settings": "Настройки",
"notification_permission_list_tile_content": "Предоставьте разрешение на включение уведомлений",
"notification_permission_list_tile_enable_button": "Включить уведомления",
"notification_permission_list_tile_title": "Разрешение на уведомление",
"permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_get_started": "Get started",
"permission_onboarding_go_to_settings": "Go to settings",
"permission_onboarding_grant_permission": "Grant permission",
"permission_onboarding_log_out": "Log out",
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"profile_drawer_app_logs": "Журналы",
"profile_drawer_client_server_up_to_date": "Клиент и сервер обновлены",
"profile_drawer_settings": "Настройки",
"profile_drawer_sign_out": "Выйти",
"recently_added_page_title": "Recently Added",
"search_bar_hint": "Поиск фотографий",
"search_page_categories": "Categories",
"search_page_favorites": "Favorites",
"search_page_motion_photos": "Motion Photos",
"search_page_no_objects": "Нет доступной информации об объектах",
"search_page_no_places": "Информация о местах отсутствует",
"search_page_places": "Места",
"search_page_recently_added": "Recently added",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_page_things": "Предметы",
"search_page_videos": "Videos",
"search_page_view_all_button": "View all",
"search_page_your_activity": "Your activity",
"search_result_page_new_search_hint": "Новый поиск",
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
"select_additional_user_for_sharing_page_suggestions": "Предложения",
"select_user_for_sharing_page_err_album": "\nНе удалось создать альбом",
"select_user_for_sharing_page_share_suggestions": "Предложения",
@@ -227,7 +260,7 @@
"version_announcement_overlay_ack": "Подтверждение",
"version_announcement_overlay_release_notes": "примечания к выпуску",
"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_title": "Доступна новая версия сервера \uD83C\uDF89"
}
}

View File

@@ -4,8 +4,10 @@
"album_info_card_backup_album_excluded": "VYLÚČENÉ",
"album_info_card_backup_album_included": "ZAHRNUTÉ",
"album_thumbnail_card_item": "1 položka",
"album_thumbnail_card_items": "{} položky",
"album_thumbnail_card_items": "{} položiek",
"album_thumbnail_card_shared": "Zdieľané",
"album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "Shared by {}",
"album_viewer_appbar_share_delete": "Odstrániť album",
"album_viewer_appbar_share_err_delete": "Nepodarilo sa odstrániť album",
"album_viewer_appbar_share_err_leave": "Nepodarilo sa ukončiť album",
@@ -14,6 +16,7 @@
"album_viewer_appbar_share_leave": "Opustiť album",
"album_viewer_appbar_share_remove": "Odstrániť z albumu",
"album_viewer_page_share_add_users": "Pridať používateľov",
"all_videos_page_title": "Videos",
"asset_list_layout_settings_dynamic_layout_title": "Dynamické rozloženie",
"asset_list_layout_settings_group_by": "Zoskupiť položky podľa",
"asset_list_layout_settings_group_by_month": "Mesiac",
@@ -35,9 +38,9 @@
"backup_background_service_in_progress_notification": "Vytváram kópiu vašich médií...",
"backup_background_service_upload_failure_notification": "Nepodarilo sa nahrať {}",
"backup_controller_page_albums": "Zálohované albumy",
"backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.",
"backup_controller_page_background_app_refresh_disabled_title": "Background app refresh disabled",
"backup_controller_page_background_app_refresh_enable_button_text": "Go to settings",
"backup_controller_page_background_app_refresh_disabled_content": "Ak chcete používať zálohovanie na pozadí, povoľte obnovovanie aplikácií na pozadí v ponuke Nastavenia > Všeobecné > Obnovovanie aplikácií na pozadí.",
"backup_controller_page_background_app_refresh_disabled_title": "Obnovovanie aplikácií na pozadí je vypnuté.",
"backup_controller_page_background_app_refresh_enable_button_text": "Prejsť do nastavení",
"backup_controller_page_background_battery_info_link": "Ukáž mi ako",
"backup_controller_page_background_battery_info_message": "Ak chcete dosiahnuť najlepšie výsledky pri zálohovaní na pozadí, vypnite všetky optimalizácie batérie, ktoré obmedzujú aktivitu na pozadí pre Immich vo vašom zariadení. Keďže to závisí od zariadenia, skontrolujte požadované informácie pre výrobcu vášho zariadenia.",
"backup_controller_page_background_battery_info_ok": "OK",
@@ -48,13 +51,13 @@
"backup_controller_page_background_description": "Povoľte službu na pozadí na automatické zálohovanie všetkých nových aktív bez nutnosti otvorenia aplikácie",
"backup_controller_page_background_is_off": "Automatické zálohovanie na pozadí je vypnuté",
"backup_controller_page_background_is_on": "Automatické zálohovanie na pozadí je zapnuté",
"backup_controller_page_background_turn_off": "Zakázať službu na pozadí",
"backup_controller_page_background_turn_on": "Povoliť službu na pozadí",
"backup_controller_page_background_turn_off": "Vypnúť zálohovanie na pozadí",
"backup_controller_page_background_turn_on": "Povoliť zálohovanie na pozadí",
"backup_controller_page_background_wifi": "Len na WiFi",
"backup_controller_page_backup": "Zálohované",
"backup_controller_page_backup": "Zálohovanie",
"backup_controller_page_backup_selected": "Vybrané: ",
"backup_controller_page_backup_sub": "Zálohované fotografie a videa",
"backup_controller_page_cancel": "Zrušiť",
"backup_controller_page_cancel": "Zastaviť",
"backup_controller_page_created": "Vytvorené: {}",
"backup_controller_page_desc_backup": "Zapnite zálohovanie na popredí, aby sa nové položky automaticky nahrávali na server pri otvorení aplikácie.",
"backup_controller_page_excluded": "Vylúčené: ",
@@ -64,7 +67,7 @@
"backup_controller_page_info": "Informácie o zálohovaní",
"backup_controller_page_none_selected": "Žiadne vybrané",
"backup_controller_page_remainder": "Zostáva",
"backup_controller_page_remainder_sub": "Zostávajúce fotografie a albumy, ktoré sa majú zálohovať z výberu",
"backup_controller_page_remainder_sub": "Zostávajúce fotografie a videá, ktoré sa majú zálohovať z výbraných albumov",
"backup_controller_page_select": "Vybrať",
"backup_controller_page_server_storage": "Serverové úložisko",
"backup_controller_page_start_backup": "Spustiť zálohovanie",
@@ -74,9 +77,9 @@
"backup_controller_page_to_backup": "Albumy, ktoré sa majú zálohovať",
"backup_controller_page_total": "Celkom",
"backup_controller_page_total_sub": "Všetky jedinečné fotografie a videá z vybraných albumov",
"backup_controller_page_turn_off": "Zakázať zálohovanie na popredí",
"backup_controller_page_turn_off": "Vypnúť zálohovanie na popredí",
"backup_controller_page_turn_on": "Povoliť zálohovanie na popredí",
"backup_controller_page_uploading_file_info": "Informácia o nahrávanom súbore",
"backup_controller_page_uploading_file_info": "Nahrávaný súbor",
"backup_err_only_album": "Nie je možné odstrániť jediný vybraný album",
"backup_info_card_assets": "položiek",
"cache_settings_album_thumbnails": "Náhľady stránok knižnice (položiek {})",
@@ -100,9 +103,10 @@
"common_add_to_album": "Pridať do albumu",
"common_change_password": "Zmeniť heslo",
"common_create_new_album": "Vytvoriť nový album",
"common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.",
"common_shared": "Zdieľané",
"control_bottom_app_bar_add_to_album": "Pridať do albumu",
"control_bottom_app_bar_album_info": "{} položky",
"control_bottom_app_bar_album_info": "{} položiek",
"control_bottom_app_bar_album_info_shared": "{} položky - zdieľané",
"control_bottom_app_bar_create_new_album": "Vytvoriť nový album",
"control_bottom_app_bar_delete": "Vymazať",
@@ -113,6 +117,8 @@
"create_shared_album_page_share": "Zdieľať",
"create_shared_album_page_share_add_assets": "PRIDAŤ",
"create_shared_album_page_share_select_photos": "Vybrať fotografie",
"curated_location_page_title": "Places",
"curated_object_page_title": "Things",
"daily_title_text_date": "EEEE, d. MMMM",
"daily_title_text_date_year": "EEEE, d. MMMM y",
"date_format": "EEEE, d. MMMM y • H:mm",
@@ -128,7 +134,7 @@
"experimental_settings_subtitle": "Používajte na vlastné riziko!",
"experimental_settings_title": "Experimentálne",
"favorites_page_title": "Obľúbené",
"home_page_add_to_album_conflicts": "Pridané {added} položky do albumu {album}. {failed} položky sú už v albume.",
"home_page_add_to_album_conflicts": "Pridané {added} položiek do albumu {album}. {failed} položiek už je v albume.",
"home_page_add_to_album_err_local": "Zatiaľ nie je možné pridať lokálne média do albumov, preskakuje sa",
"home_page_add_to_album_success": "Pridané {added} položky do albumu {album}.",
"home_page_building_timeline": "Vytváranie časovej osi",
@@ -137,11 +143,13 @@
"image_viewer_page_state_provider_download_error": "Chyba sťahovania",
"image_viewer_page_state_provider_download_success": "Sťahovanie bolo úspešné",
"library_page_albums": "Albumy",
"library_page_device_albums": "Albums on Device",
"library_page_favorites": "Obľúbené",
"library_page_new_album": "Nový album",
"library_page_sharing": "Zdieľanie",
"library_page_sort_created": "Najnovšie vytvorené",
"library_page_sort_title": "Podľa názvu albumu",
"login_form_api_exception": "API exception. Please check the server URL and try again.",
"login_form_button_text": "Prihlásiť sa",
"login_form_email_hint": "tvojmail@email.com",
"login_form_endpoint_hint": "http://ip-tvojho-servera:port/api",
@@ -156,25 +164,50 @@
"login_form_failed_login": "Chyba prihlásenia, skontrolujte url adresu servera, e-mail a heslo.",
"login_form_label_email": "E-mail",
"login_form_label_password": "Heslo",
"login_form_next_button": "Next",
"login_form_password_hint": "heslo",
"login_form_save_login": "Zostať prihlásený",
"login_form_server_empty": "Enter a server URL.",
"login_form_server_error": "Could not connect to server.",
"monthly_title_text_date_format": "LLLL y",
"motion_photos_page_title": "Motion Photos",
"notification_permission_dialog_cancel": "Zrušiť",
"notification_permission_dialog_content": "Ak chcete povoliť upozornenia, prejdite do Nastavenia a vyberte možnosť Povoliť.",
"notification_permission_dialog_settings": "Nastavenia",
"notification_permission_list_tile_content": "Udeľte oprávnenie k aktivácii oznámení.",
"notification_permission_list_tile_enable_button": "Povoliť upozornenia",
"notification_permission_list_tile_title": "Povolenie oznámení",
"permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_get_started": "Get started",
"permission_onboarding_go_to_settings": "Go to settings",
"permission_onboarding_grant_permission": "Grant permission",
"permission_onboarding_log_out": "Log out",
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"profile_drawer_app_logs": "Logy",
"profile_drawer_client_server_up_to_date": "Klient a server sú aktuálne",
"profile_drawer_settings": "Nastavenia",
"profile_drawer_sign_out": "Odhlásiť sa",
"recently_added_page_title": "Recently Added",
"search_bar_hint": "Prehľadajte svoje obrázky",
"search_page_categories": "Categories",
"search_page_favorites": "Favorites",
"search_page_motion_photos": "Motion Photos",
"search_page_no_objects": "Žiadne informácie o objektoch",
"search_page_no_places": "Žiadne informácie o mieste",
"search_page_places": "Miesta",
"search_page_recently_added": "Recently added",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_page_things": "Veci",
"search_page_videos": "Videos",
"search_page_view_all_button": "View all",
"search_page_your_activity": "Your activity",
"search_result_page_new_search_hint": "Nové vyhľadávanie",
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
"select_additional_user_for_sharing_page_suggestions": "Návrhy",
"select_user_for_sharing_page_err_album": "Nepodarilo sa vytvoriť album",
"select_user_for_sharing_page_share_suggestions": "Návrhy",
@@ -195,7 +228,7 @@
"setting_notifications_single_progress_title": "Zobraziť priebeh detailov zálohovania na pozadí",
"setting_notifications_subtitle": "Prispôsobenie predvolieb oznámení",
"setting_notifications_title": "Oznámenia",
"setting_notifications_total_progress_subtitle": "Celkový priebeh nahrávania (hotové/celkové položky)",
"setting_notifications_total_progress_subtitle": "Celkový priebeh nahrávania (nahraných/celkovo)",
"setting_notifications_total_progress_title": "Zobraziť celkový priebeh zálohovania na pozadí",
"setting_pages_app_bar_settings": "Nastavenia",
"settings_require_restart": "Na použitie tohto nastavenia reštartujte Immich",

View File

@@ -6,6 +6,8 @@
"album_thumbnail_card_item": "1 objekt",
"album_thumbnail_card_items": "{} objekt",
"album_thumbnail_card_shared": ". Delad",
"album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "Delat av {}",
"album_viewer_appbar_share_delete": "Radera album",
"album_viewer_appbar_share_err_delete": "Kunde inte radera album",
"album_viewer_appbar_share_err_leave": "Kunde inte lämna album",
@@ -14,6 +16,7 @@
"album_viewer_appbar_share_leave": "Lämna album",
"album_viewer_appbar_share_remove": "Ta bort från album",
"album_viewer_page_share_add_users": "Lägg till användare",
"all_videos_page_title": "Videos",
"asset_list_layout_settings_dynamic_layout_title": "Dynamisk layout",
"asset_list_layout_settings_group_by": "Gruppera bilder efter",
"asset_list_layout_settings_group_by_month": "Månad",
@@ -37,7 +40,7 @@
"backup_controller_page_albums": "Säkerhetskopiera album",
"backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.",
"backup_controller_page_background_app_refresh_disabled_title": "Background app refresh disabled",
"backup_controller_page_background_app_refresh_enable_button_text": "Go to settings",
"backup_controller_page_background_app_refresh_enable_button_text": "Gå till inställningar",
"backup_controller_page_background_battery_info_link": "Visa mig hur",
"backup_controller_page_background_battery_info_message": "För optimal säkerhetskopiering i bakgrunden bör du stänga av batterioptimering som begränsar bakgrundsaktivitet för Immich.\n\nEftersom detta är enhetsspecifikt så bör du söka instruktioner från din enhetstillverkare.",
"backup_controller_page_background_battery_info_ok": "OK",
@@ -92,27 +95,30 @@
"cache_settings_subtitle": "Hantera cachebeteendet för Immich-appen.",
"cache_settings_thumbnail_size": "Storlek på cacheminnet ({} bilder och videor)",
"cache_settings_title": "Cache Inställningar",
"change_password_form_confirm_password": "Confirm Password",
"change_password_form_confirm_password": "Bekräfta lösenord",
"change_password_form_description": "Hi {firstName} {lastName},\n\nThis is either the first time you are signing into the system or a request has been made to change your password. Please enter the new password below.",
"change_password_form_new_password": "New Password",
"change_password_form_new_password": "Nytt lösenord",
"change_password_form_password_mismatch": "Passwords do not match",
"change_password_form_reenter_new_password": "Re-enter New Password",
"common_add_to_album": "Add to album",
"common_change_password": "Change Password",
"common_create_new_album": "Create new album",
"common_shared": "Shared",
"common_change_password": "Ändra lösenord",
"common_create_new_album": "Skapa ett nytt album",
"common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.",
"common_shared": "Delad",
"control_bottom_app_bar_add_to_album": "Lägg till i album",
"control_bottom_app_bar_album_info": "{} objekt",
"control_bottom_app_bar_album_info_shared": "{} objekt • Delat",
"control_bottom_app_bar_create_new_album": "Skapa nytt album",
"control_bottom_app_bar_delete": "Radera",
"control_bottom_app_bar_favorite": "Favorite",
"control_bottom_app_bar_favorite": "Favorit",
"control_bottom_app_bar_share": "Dela",
"create_album_page_untitled": "Namnlös",
"create_shared_album_page_create": "Skapa",
"create_shared_album_page_share": "Dela",
"create_shared_album_page_share_add_assets": "LÄGG TILL OBJEKT",
"create_shared_album_page_share_select_photos": "Välj bilder",
"curated_location_page_title": "Platser",
"curated_object_page_title": "Saker",
"daily_title_text_date": "E, dd MMM",
"daily_title_text_date_year": "E, dd MMM, yyyy",
"date_format": "E d. LLL y • hh:mm",
@@ -137,11 +143,13 @@
"image_viewer_page_state_provider_download_error": "Download Error",
"image_viewer_page_state_provider_download_success": "Download Success",
"library_page_albums": "Album",
"library_page_device_albums": "Albums on Device",
"library_page_favorites": "Favoriter",
"library_page_new_album": "Nytt album",
"library_page_sharing": "Delas",
"library_page_sort_created": "Senast skapad",
"library_page_sort_title": "Albumtitel",
"login_form_api_exception": "API exception. Please check the server URL and try again.",
"login_form_button_text": "Logga in",
"login_form_email_hint": "din.email@email.com",
"login_form_endpoint_hint": "http://din-server-ip:port/api",
@@ -156,30 +164,55 @@
"login_form_failed_login": "Kunde inte logga in. Kontrollera serverns webbadress, email och lösenord.",
"login_form_label_email": "Email",
"login_form_label_password": "Lösenord",
"login_form_next_button": "Nästa",
"login_form_password_hint": "lösenord",
"login_form_save_login": "Håll mig inloggad",
"login_form_server_empty": "Enter a server URL.",
"login_form_server_error": "Kunde inte ansluta till servern",
"monthly_title_text_date_format": "MMMM y",
"notification_permission_dialog_cancel": "Cancel",
"motion_photos_page_title": "Motion Photos",
"notification_permission_dialog_cancel": "Avbryt",
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
"notification_permission_dialog_settings": "Settings",
"notification_permission_dialog_settings": "Inställningar",
"notification_permission_list_tile_content": "Grant permission to enable notifications.",
"notification_permission_list_tile_enable_button": "Enable Notifications",
"notification_permission_list_tile_title": "Notification Permission",
"permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_get_started": "Get started",
"permission_onboarding_go_to_settings": "Gå till inställningar",
"permission_onboarding_grant_permission": "Grant permission",
"permission_onboarding_log_out": "Logga ut",
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"profile_drawer_app_logs": "Loggar",
"profile_drawer_client_server_up_to_date": "Klient och server är uppdaterade",
"profile_drawer_settings": "Inställningar",
"profile_drawer_sign_out": "Logga ut",
"recently_added_page_title": "Nyligen tillagda",
"search_bar_hint": "Sök bland dina foton",
"search_page_categories": "Kategorier",
"search_page_favorites": "Favoriter",
"search_page_motion_photos": "Motion Photos",
"search_page_no_objects": "Inga objekt är tillgängliga",
"search_page_no_places": "Ingen platsinformation finns tillgänglig",
"search_page_places": "Platser",
"search_page_recently_added": "Nyligen tillagda",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_page_things": "Saker",
"search_page_videos": "Videos",
"search_page_view_all_button": "Visa alla",
"search_page_your_activity": "Dina aktiviteter",
"search_result_page_new_search_hint": "Ny sökning",
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
"search_suggestion_list_smart_search_hint_2": "m:ditt-sökord",
"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_share_suggestions": "Förslag",
"server_info_box_app_version": "App Version",
"server_info_box_server_version": "Server Version",
"server_info_box_app_version": "App 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_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",

View File

@@ -1,23 +1,26 @@
{
"add_to_album_bottom_sheet_added": "Added to {album}",
"add_to_album_bottom_sheet_already_exists": "Already in {album}",
"add_to_album_bottom_sheet_added": "添加到{album}",
"add_to_album_bottom_sheet_already_exists": "已经在{album}中了",
"album_info_card_backup_album_excluded": "排除",
"album_info_card_backup_album_included": "已选",
"album_thumbnail_card_item": "1张",
"album_thumbnail_card_items": "{}张",
"album_thumbnail_card_shared": "已共享",
"album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "Shared by {}",
"album_viewer_appbar_share_delete": "删除相册",
"album_viewer_appbar_share_err_delete": "删除相册失败",
"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_leave": "退出相册",
"album_viewer_appbar_share_remove": "从相册中移除",
"album_viewer_page_share_add_users": "新增用户",
"asset_list_layout_settings_dynamic_layout_title": "Dynamic layout",
"asset_list_layout_settings_group_by": "Group assets by",
"asset_list_layout_settings_group_by_month": "Month",
"asset_list_layout_settings_group_by_month_day": "Month + day",
"all_videos_page_title": "Videos",
"asset_list_layout_settings_dynamic_layout_title": "动态布局",
"asset_list_layout_settings_group_by": "分组照片或视频由",
"asset_list_layout_settings_group_by_month": "",
"asset_list_layout_settings_group_by_month_day": "月和日",
"asset_list_settings_subtitle": "照片预览设置",
"asset_list_settings_title": "照片预览",
"backup_album_selection_page_albums_device": "设备上的相册({})",
@@ -35,9 +38,9 @@
"backup_background_service_in_progress_notification": "正在备份…",
"backup_background_service_upload_failure_notification": "上传失败 {}",
"backup_controller_page_albums": "备份相册",
"backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.",
"backup_controller_page_background_app_refresh_disabled_title": "Background app refresh disabled",
"backup_controller_page_background_app_refresh_enable_button_text": "Go to settings",
"backup_controller_page_background_app_refresh_disabled_content": "在“设置”>“常规”>“后台应用程序刷新”中启用后台应用程序刷新,以便使用后台备份功能。",
"backup_controller_page_background_app_refresh_disabled_title": "禁用后台应用程序刷新",
"backup_controller_page_background_app_refresh_enable_button_text": "前往设置",
"backup_controller_page_background_battery_info_link": "怎么做",
"backup_controller_page_background_battery_info_message": "为了获得最佳的后台备份体验,请禁用任何限制 Immich 后台活动的电池优化。\n\n由于这是设备相关的因此请查找设备制造商所需的信息。",
"backup_controller_page_background_battery_info_ok": "我知道了",
@@ -92,28 +95,31 @@
"cache_settings_subtitle": "控制 Immich的缓存表现",
"cache_settings_thumbnail_size": "缩略图缓存大小({}张)",
"cache_settings_title": "缓存设置",
"change_password_form_confirm_password": "Confirm Password",
"change_password_form_description": "Hi {firstName} {lastName},\n\nThis is either the first time you are signing into the system or a request has been made to change your password. Please enter the new password below.",
"change_password_form_new_password": "New Password",
"change_password_form_password_mismatch": "Passwords do not match",
"change_password_form_reenter_new_password": "Re-enter New Password",
"common_add_to_album": "Add to album",
"common_change_password": "Change Password",
"common_create_new_album": "Create new album",
"common_shared": "Shared",
"change_password_form_confirm_password": "确认密码",
"change_password_form_description": " {firstName} {lastName},\n\n这是您第一次登录系统,或者管理员要求您更改密码。 请在下面输入新密码。",
"change_password_form_new_password": "新密码",
"change_password_form_password_mismatch": "密码不匹配",
"change_password_form_reenter_new_password": "重新输入新的密码",
"common_add_to_album": "添加到相册",
"common_change_password": "更改密码",
"common_create_new_album": "创建新相册",
"common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.",
"common_shared": "共享",
"control_bottom_app_bar_add_to_album": "添加到相册",
"control_bottom_app_bar_album_info": "{}张",
"control_bottom_app_bar_album_info_shared": "{} 张已分享",
"control_bottom_app_bar_create_new_album": "新建相册",
"control_bottom_app_bar_delete": "删除",
"control_bottom_app_bar_favorite": "Favorite",
"control_bottom_app_bar_favorite": "收藏",
"control_bottom_app_bar_share": "分享",
"create_album_page_untitled": "未命名",
"create_shared_album_page_create": "新建",
"create_shared_album_page_share": "分享",
"create_shared_album_page_share_add_assets": "新增照片",
"create_shared_album_page_share_select_photos": "选择照片",
"daily_title_text_date": "\t\n\nE, MMM dd",
"curated_location_page_title": "Places",
"curated_object_page_title": "Things",
"daily_title_text_date": "E, MMM dd",
"daily_title_text_date_year": "E, MMM dd, yyyy",
"date_format": "E, LLL d, y • h:mm a",
"delete_dialog_alert": "这些数据将会永久性的从Immich和你的设备上删除",
@@ -127,28 +133,30 @@
"experimental_settings_new_asset_list_title": "启用实验性的照片宫格",
"experimental_settings_subtitle": "使用风险自负!",
"experimental_settings_title": "实验功能",
"favorites_page_title": "Favorites",
"favorites_page_title": "收藏",
"home_page_add_to_album_conflicts": "添加{added}张到相册{album}。{failed} 项已经处于该相册中。",
"home_page_add_to_album_err_local": "Can not add local assets to albums yet, skipping",
"home_page_add_to_album_err_local": "无法在相册中收藏本地的照片或视频,跳过",
"home_page_add_to_album_success": "添加了{added}张到相册{album}。",
"home_page_building_timeline": "Building the timeline",
"home_page_favorite_err_local": "Can not favorite local assets yet, skipping",
"home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).",
"image_viewer_page_state_provider_download_error": "Download Error",
"image_viewer_page_state_provider_download_success": "Download Success",
"home_page_building_timeline": "生成时间线",
"home_page_favorite_err_local": "还不能收藏本地的照片或视频,跳过",
"home_page_first_time_notice": "如果这是您第一次使用该应用程序,请确保选择一个想要备份的本地相册,以便可以在时间线中预览该相册中的照片和视频。",
"image_viewer_page_state_provider_download_error": "下载出现错误",
"image_viewer_page_state_provider_download_success": "下载成功",
"library_page_albums": "相册",
"library_page_favorites": "Favorites",
"library_page_device_albums": "Albums on Device",
"library_page_favorites": "收藏",
"library_page_new_album": "新建相册",
"library_page_sharing": "Sharing",
"library_page_sort_created": "Most recently created",
"library_page_sort_title": "Album title",
"library_page_sharing": "共享",
"library_page_sort_created": "最近创建的",
"library_page_sort_title": "相册标题",
"login_form_api_exception": "API exception. Please check the server URL and try again.",
"login_form_button_text": "登录",
"login_form_email_hint": "youremail@email.com",
"login_form_endpoint_hint": "http://your-server-ip:port/api",
"login_form_endpoint_url": "服务器地址",
"login_form_err_http": "请检查http://或https://",
"login_form_err_invalid_email": "请输入正确的邮箱",
"login_form_err_invalid_url": "Invalid URL",
"login_form_err_invalid_url": "无效的URL",
"login_form_err_leading_whitespace": "前面空格",
"login_form_err_trailing_whitespace": "后面空格",
"login_form_failed_get_oauth_server_config": "使用 OAuth 时出错,请检查服务器 地址",
@@ -156,30 +164,55 @@
"login_form_failed_login": "登录失败, 请检查邮箱、密码和服务器地址",
"login_form_label_email": "邮箱",
"login_form_label_password": "密码",
"login_form_next_button": "Next",
"login_form_password_hint": "密码",
"login_form_save_login": "保持登录",
"login_form_server_empty": "Enter a server URL.",
"login_form_server_error": "Could not connect to server.",
"monthly_title_text_date_format": "MMMM y",
"notification_permission_dialog_cancel": "Cancel",
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
"notification_permission_dialog_settings": "Settings",
"notification_permission_list_tile_content": "Grant permission to enable notifications.",
"notification_permission_list_tile_enable_button": "Enable Notifications",
"notification_permission_list_tile_title": "Notification Permission",
"motion_photos_page_title": "Motion Photos",
"notification_permission_dialog_cancel": "取消",
"notification_permission_dialog_content": "要启用通知,请转到“设置”并选择“允许”。",
"notification_permission_dialog_settings": "设置",
"notification_permission_list_tile_content": "授予启用通知的权限。",
"notification_permission_list_tile_enable_button": "允许通知",
"notification_permission_list_tile_title": "通知权限",
"permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_get_started": "Get started",
"permission_onboarding_go_to_settings": "Go to settings",
"permission_onboarding_grant_permission": "Grant permission",
"permission_onboarding_log_out": "Log out",
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"profile_drawer_app_logs": "日志",
"profile_drawer_client_server_up_to_date": "客户端和服务端都是最新的",
"profile_drawer_settings": "设置",
"profile_drawer_sign_out": "退出登录",
"recently_added_page_title": "Recently Added",
"search_bar_hint": "搜索照片",
"search_page_categories": "Categories",
"search_page_favorites": "Favorites",
"search_page_motion_photos": "Motion Photos",
"search_page_no_objects": "没有事物信息",
"search_page_no_places": "地点信息不存在",
"search_page_places": "地点",
"search_page_recently_added": "Recently added",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_page_things": "事物",
"search_page_videos": "Videos",
"search_page_view_all_button": "View all",
"search_page_your_activity": "Your activity",
"search_result_page_new_search_hint": "搜索新的",
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
"select_additional_user_for_sharing_page_suggestions": "建议",
"select_user_for_sharing_page_err_album": "创建相册失败",
"select_user_for_sharing_page_share_suggestions": "建议",
"server_info_box_app_version": "App Version",
"server_info_box_server_version": "Server Version",
"server_info_box_app_version": "App 版本",
"server_info_box_server_version": "服务器版本",
"setting_image_viewer_help": "查看大图时会首先加载缩略图,然后加载中等质量的图片(如果启用),最后加载原始质量的图片(如果启用)。",
"setting_image_viewer_original_subtitle": "开启将会加载原图。关闭将会减少内存和网络占用。",
"setting_image_viewer_original_title": "加载原图",

BIN
mobile/flutter_01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 679 KiB

View File

@@ -38,7 +38,7 @@
<string>se</string>
<string>sk</string>
<string>zh</string>
<string>no</string>
<string>nb</string>
</array>
<key>CFBundleName</key>
<string>immich_mobile</string>

View File

@@ -19,7 +19,7 @@ platform :ios do
desc "iOS Beta"
lane :beta do
increment_version_number(
version_number: "1.53.0"
version_number: "1.54.0"
)
increment_build_number(
build_number: latest_testflight_build_number + 1,

View File

@@ -20,7 +20,7 @@ const List<Locale> locales = [
Locale('sv', 'SE'),
Locale('sk', 'SK'),
Locale('zh', 'CN'),
Locale('no', 'NO'),
Locale('nb', 'NO'),
];
const String translationsPath = 'assets/i18n';

View File

@@ -1,5 +1,6 @@
import 'dart:io';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
@@ -46,6 +47,7 @@ import 'package:permission_handler/permission_handler.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final db = await loadDb();
await initApp();
await migrateHiveToStoreIfNecessary();
@@ -185,6 +187,25 @@ class ImmichAppState extends ConsumerState<ImmichApp>
Future<void> initApp() async {
WidgetsBinding.instance.addObserver(this);
// Draw the app from edge to edge
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
// Sets the navigation bar color
SystemUiOverlayStyle overlayStyle = const SystemUiOverlayStyle(
systemNavigationBarColor: Colors.transparent,
);
if (Platform.isAndroid) {
// Android 8 does not support transparent app bars
final info = await DeviceInfoPlugin().androidInfo;
if (info.version.sdkInt <= 26) {
overlayStyle =
MediaQuery.of(context).platformBrightness == Brightness.light
? SystemUiOverlayStyle.light
: SystemUiOverlayStyle.dark;
}
}
SystemChrome.setSystemUIOverlayStyle(overlayStyle);
}
@override
@@ -208,11 +229,6 @@ class ImmichAppState extends ConsumerState<ImmichApp>
var router = ref.watch(appRouterProvider);
ref.watch(releaseInfoProvider.notifier).checkGithubReleaseInfo();
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
SystemChrome.setSystemUIOverlayStyle(
const SystemUiOverlayStyle(systemNavigationBarColor: Colors.transparent),
);
return MaterialApp(
localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales,

View File

@@ -51,14 +51,14 @@ class AddToAlbumBottomSheet extends HookConsumerWidget {
ImmichToast.show(
context: context,
msg: 'add_to_album_bottom_sheet_already_exists'.tr(
namedArgs: { "album": album.name },
namedArgs: {"album": album.name},
),
);
} else {
ImmichToast.show(
context: context,
msg: 'add_to_album_bottom_sheet_added'.tr(
namedArgs: { "album": album.name },
namedArgs: {"album": album.name},
),
);
}
@@ -71,6 +71,7 @@ class AddToAlbumBottomSheet extends HookConsumerWidget {
}
return Card(
elevation: 0,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(15),
@@ -99,8 +100,15 @@ class AddToAlbumBottomSheet extends HookConsumerWidget {
style: Theme.of(context).textTheme.displayMedium,
),
TextButton.icon(
icon: const Icon(Icons.add),
label: Text('common_create_new_album'.tr()),
icon: Icon(
Icons.add,
color: Theme.of(context).primaryColor,
),
label: Text(
'common_create_new_album'.tr(),
style:
TextStyle(color: Theme.of(context).primaryColor),
),
onPressed: () {
ref
.watch(assetSelectionProvider.notifier)

View File

@@ -6,6 +6,7 @@ import 'package:immich_mobile/modules/album/providers/asset_selection.provider.d
import 'package:immich_mobile/routing/router.dart';
import 'package:immich_mobile/shared/models/asset.dart';
import 'package:immich_mobile/shared/ui/immich_image.dart';
import 'package:immich_mobile/utils/storage_indicator.dart';
class AlbumViewerThumbnail extends HookConsumerWidget {
final Asset asset;
@@ -85,11 +86,7 @@ class AlbumViewerThumbnail extends HookConsumerWidget {
right: 10,
bottom: 5,
child: Icon(
asset.isRemote
? (asset.isLocal
? Icons.cloud_done_outlined
: Icons.cloud_outlined)
: Icons.cloud_off_outlined,
storageIcon(asset),
color: Colors.white,
size: 18,
),

View File

@@ -43,7 +43,8 @@ class LibraryPage extends HookConsumerWidget {
);
}
final selectedAlbumSortOrder = useState(settings.getSetting(AppSettingsEnum.selectedAlbumSortOrder));
final selectedAlbumSortOrder =
useState(settings.getSetting(AppSettingsEnum.selectedAlbumSortOrder));
List<Album> sortedAlbums() {
if (selectedAlbumSortOrder.value == 0) {
@@ -179,13 +180,13 @@ class LibraryPage extends HookConsumerWidget {
label,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 12.0,
color: isDarkMode ? Colors.white : Colors.black,
fontSize: 13.0,
color: isDarkMode ? Colors.white : Colors.grey[800],
),
),
),
style: OutlinedButton.styleFrom(
padding: const EdgeInsets.all(12),
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16),
backgroundColor: isDarkMode ? Colors.grey[900] : Colors.grey[50],
side: BorderSide(
color: isDarkMode ? Colors.grey[800]! : Colors.grey[300]!,
@@ -225,8 +226,8 @@ class LibraryPage extends HookConsumerWidget {
}),
const SizedBox(width: 12.0),
buildLibraryNavButton(
"library_page_sharing".tr(), Icons.group_outlined, () {
AutoRouter.of(context).navigate(const SharingRoute());
"library_page_archive".tr(), Icons.archive_outlined, () {
AutoRouter.of(context).navigate(const ArchiveRoute());
}),
],
),

View File

@@ -0,0 +1,55 @@
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/shared/models/asset.dart';
import 'package:immich_mobile/shared/providers/asset.provider.dart';
import 'package:immich_mobile/shared/providers/db.provider.dart';
import 'package:isar/isar.dart';
class ArchiveSelectionNotifier extends StateNotifier<Set<int>> {
ArchiveSelectionNotifier(this.db, this.assetNotifier) : super({}) {
state = db.assets
.filter()
.isArchivedEqualTo(true)
.findAllSync()
.map((e) => e.id)
.toSet();
}
final Isar db;
final AssetNotifier assetNotifier;
void _setArchiveForAssetId(int id, bool archive) {
if (!archive) {
state = state.difference({id});
} else {
state = state.union({id});
}
}
bool _isArchive(int id) {
return state.contains(id);
}
Future<void> toggleArchive(Asset asset) async {
if (asset.storage == AssetState.local) return;
_setArchiveForAssetId(asset.id, !_isArchive(asset.id));
await assetNotifier.toggleArchive(
[asset],
state.contains(asset.id),
);
}
Future<void> addToArchives(Iterable<Asset> assets) {
state = state.union(assets.map((a) => a.id).toSet());
return assetNotifier.toggleArchive(assets, true);
}
}
final archiveProvider =
StateNotifierProvider<ArchiveSelectionNotifier, Set<int>>((ref) {
return ArchiveSelectionNotifier(
ref.watch(dbProvider),
ref.watch(assetProvider.notifier),
);
});

View File

@@ -0,0 +1,126 @@
import 'package:auto_route/auto_route.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart' hide Store;
import 'package:fluttertoast/fluttertoast.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/modules/home/ui/asset_grid/immich_asset_grid.dart';
import 'package:immich_mobile/shared/models/asset.dart';
import 'package:immich_mobile/shared/models/store.dart';
import 'package:immich_mobile/shared/models/user.dart';
import 'package:immich_mobile/shared/providers/asset.provider.dart';
import 'package:immich_mobile/shared/providers/db.provider.dart';
import 'package:immich_mobile/shared/ui/immich_toast.dart';
import 'package:isar/isar.dart';
class ArchivePage extends HookConsumerWidget {
const ArchivePage({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final User me = Store.get(StoreKey.currentUser);
final query = ref
.watch(dbProvider)
.assets
.filter()
.ownerIdEqualTo(me.isarId)
.isArchivedEqualTo(true);
final stream = query.watch();
final archivedAssets = useState<List<Asset>>([]);
final selectionEnabledHook = useState(false);
final selection = useState(<Asset>{});
useEffect(
() {
query.findAll().then((value) => archivedAssets.value = value);
final subscription = stream.listen((e) {
archivedAssets.value = e;
});
// Cancel the subscription when the widget is disposed
return subscription.cancel;
},
[],
);
void selectionListener(
bool multiselect,
Set<Asset> selectedAssets,
) {
selectionEnabledHook.value = multiselect;
selection.value = selectedAssets;
}
AppBar buildAppBar() {
return AppBar(
leading: IconButton(
onPressed: () => AutoRouter.of(context).pop(),
icon: const Icon(Icons.arrow_back_ios_rounded),
),
centerTitle: true,
automaticallyImplyLeading: false,
title: const Text(
'archive_page_title',
).tr(args: [archivedAssets.value.length.toString()]),
);
}
Widget buildBottomBar() {
return SafeArea(
child: Align(
alignment: Alignment.bottomCenter,
child: SizedBox(
height: 64,
child: Card(
child: Column(
children: [
ListTile(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
leading: const Icon(
Icons.unarchive_rounded,
),
title:
const Text("Unarchive", style: TextStyle(fontSize: 14)),
onTap: () {
if (selection.value.isNotEmpty) {
ref
.watch(assetProvider.notifier)
.toggleArchive(selection.value, false);
final assetOrAssets =
selection.value.length > 1 ? 'assets' : 'asset';
ImmichToast.show(
context: context,
msg:
'Moved ${selection.value.length} $assetOrAssets to library',
gravity: ToastGravity.CENTER,
);
}
selectionEnabledHook.value = false;
},
)
],
),
),
),
),
);
}
return Scaffold(
appBar: buildAppBar(),
body: Stack(
children: [
ImmichAssetGrid(
assets: archivedAssets.value,
listener: selectionListener,
selectionActive: selectionEnabledHook.value,
),
if (selectionEnabledHook.value) buildBottomBar()
],
),
);
}
}

View File

@@ -0,0 +1,93 @@
import 'dart:async';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/modules/asset_viewer/services/asset_description.service.dart';
import 'package:immich_mobile/shared/models/asset.dart';
import 'package:immich_mobile/shared/models/exif_info.dart';
import 'package:immich_mobile/shared/providers/db.provider.dart';
import 'package:isar/isar.dart';
class AssetDescriptionNotifier extends StateNotifier<String> {
final Isar _db;
final AssetDescriptionService _service;
final Asset _asset;
AssetDescriptionNotifier(
this._db,
this._service,
this._asset,
) : super('') {
_fetchLocalDescription();
_fetchRemoteDescription();
}
String get description => state;
/// Fetches the local database value for description
/// and writes it to [state]
void _fetchLocalDescription() async {
final localExifId = _asset.exifInfo?.id;
// Guard [localExifId] null
if (localExifId == null) {
return;
}
// Subscribe to local changes
final exifInfo = await _db
.exifInfos
.get(localExifId);
// Guard
if (exifInfo?.description == null) {
return;
}
state = exifInfo!.description!;
}
/// Fetches the remote value and sets the state
void _fetchRemoteDescription() async {
final remoteAssetId = _asset.remoteId;
final localExifId = _asset.exifInfo?.id;
// Guard [remoteAssetId] and [localExifId] null
if (remoteAssetId == null || localExifId == null) {
return;
}
// Reads the latest from the remote and writes it to DB in the service
final latest = await _service.readLatest(remoteAssetId, localExifId);
state = latest;
}
/// Sets the description to [description]
/// Uses the service to set the asset value
Future<void> setDescription(String description) async {
state = description;
final remoteAssetId = _asset.remoteId;
final localExifId = _asset.exifInfo?.id;
// Guard [remoteAssetId] and [localExifId] null
if (remoteAssetId == null || localExifId == null) {
return;
}
return _service
.setDescription(description, remoteAssetId, localExifId);
}
}
final assetDescriptionProvider = StateNotifierProvider
.autoDispose
.family<AssetDescriptionNotifier, String, Asset>(
(ref, asset) => AssetDescriptionNotifier(
ref.watch(dbProvider),
ref.watch(assetDescriptionServiceProvider),
asset,
),
);

View File

@@ -0,0 +1,62 @@
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/shared/models/exif_info.dart';
import 'package:immich_mobile/shared/providers/api.provider.dart';
import 'package:immich_mobile/shared/providers/db.provider.dart';
import 'package:immich_mobile/shared/services/api.service.dart';
import 'package:isar/isar.dart';
import 'package:openapi/api.dart';
class AssetDescriptionService {
AssetDescriptionService(this._db, this._api);
final Isar _db;
final ApiService _api;
setDescription(
String description,
String remoteAssetId,
int localExifId,
) async {
final result = await _api.assetApi.updateAsset(
remoteAssetId,
UpdateAssetDto(description: description),
);
if (result?.exifInfo?.description != null) {
var exifInfo = await _db.exifInfos.get(localExifId);
if (exifInfo != null) {
exifInfo.description = result!.exifInfo!.description;
await _db.writeTxn(
() => _db.exifInfos.put(exifInfo),
);
}
}
}
Future<String> readLatest(String assetRemoteId, int localExifId) async {
final latestAssetFromServer =
await _api.assetApi.getAssetById(assetRemoteId);
final localExifInfo = await _db.exifInfos.get(localExifId);
if (latestAssetFromServer != null && localExifInfo != null) {
localExifInfo.description =
latestAssetFromServer.exifInfo?.description ?? '';
await _db.writeTxn(
() => _db.exifInfos.put(localExifInfo),
);
return localExifInfo.description!;
}
return "";
}
}
final assetDescriptionServiceProvider = Provider(
(ref) => AssetDescriptionService(
ref.watch(dbProvider),
ref.watch(apiServiceProvider),
),
);

View File

@@ -0,0 +1,99 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/shared/models/asset.dart';
class AdvancedBottomSheet extends HookConsumerWidget {
final Asset assetDetail;
const AdvancedBottomSheet({Key? key, required this.assetDetail})
: super(key: key);
@override
Widget build(BuildContext context, WidgetRef ref) {
var isDarkMode = Theme.of(context).brightness == Brightness.dark;
return SingleChildScrollView(
child: Card(
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(15),
topRight: Radius.circular(15),
),
),
margin: const EdgeInsets.all(0),
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 8.0),
child: LayoutBuilder(
builder: (context, constraints) {
// One column
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const SizedBox(height: 32.0),
const Align(
child: Text(
"ADVANCED INFO",
style: TextStyle(fontSize: 12.0),
),
),
const SizedBox(height: 32.0),
Container(
decoration: BoxDecoration(
color: isDarkMode ? Colors.grey[900] : Colors.grey[200],
borderRadius: BorderRadius.circular(15.0),
),
child: Padding(
padding: const EdgeInsets.only(
right: 16.0,
left: 16,
top: 8,
bottom: 16,
),
child: ListView(
shrinkWrap: true,
children: [
Align(
alignment: Alignment.centerRight,
child: IconButton(
onPressed: () {
Clipboard.setData(
ClipboardData(text: assetDetail.toString()),
).then((_) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text("Copied to clipboard"),
),
);
});
},
icon: Icon(
Icons.copy,
size: 16.0,
color: Theme.of(context).primaryColor,
),
),
),
SelectableText(
assetDetail.toString(),
style: const TextStyle(
fontSize: 12.0,
fontWeight: FontWeight.bold,
fontFamily: "Inconsolata",
),
showCursor: true,
),
],
),
),
),
const SizedBox(height: 32.0),
],
);
},
),
),
),
);
}
}

View File

@@ -0,0 +1,103 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/modules/asset_viewer/providers/asset_description.provider.dart';
import 'package:immich_mobile/shared/models/asset.dart';
import 'package:immich_mobile/shared/ui/immich_toast.dart';
import 'package:logging/logging.dart';
import 'package:immich_mobile/shared/models/store.dart' as store;
class DescriptionInput extends HookConsumerWidget {
DescriptionInput({
super.key,
required this.asset,
});
final Asset asset;
final Logger _log = Logger('DescriptionInput');
@override
Widget build(BuildContext context, WidgetRef ref) {
final isDarkTheme = Theme.of(context).brightness == Brightness.dark;
final textColor = isDarkTheme ? Colors.white : Colors.black;
final controller = useTextEditingController();
final focusNode = useFocusNode();
final isFocus = useState(false);
final isTextEmpty = useState(controller.text.isEmpty);
final descriptionProvider = ref.watch(assetDescriptionProvider(asset).notifier);
final description = ref.watch(assetDescriptionProvider(asset));
final owner = store.Store.get(store.StoreKey.currentUser);
final hasError = useState(false);
controller.text = description;
submitDescription(String description) async {
hasError.value = false;
try {
await descriptionProvider.setDescription(
description,
);
} catch (error, stack) {
hasError.value = true;
_log.severe("Error updating description $error", error, stack);
ImmichToast.show(
context: context,
msg: "description_input_submit_error".tr(),
toastType: ToastType.error,
);
}
}
Widget? suffixIcon;
if (hasError.value) {
suffixIcon = const Icon(Icons.warning_outlined);
} else if (!isTextEmpty.value && isFocus.value) {
suffixIcon = IconButton(
onPressed: () {
controller.clear();
isTextEmpty.value = true;
},
icon: Icon(
Icons.cancel_rounded,
color: Colors.grey[500],
),
splashRadius: 10,
);
}
return TextField(
enabled: owner.isarId == asset.ownerId,
focusNode: focusNode,
onTap: () => isFocus.value = true,
onChanged: (value) {
isTextEmpty.value = false;
},
onTapOutside: (a) async {
isFocus.value = false;
focusNode.unfocus();
if (description != controller.text) {
await submitDescription(controller.text);
}
},
autofocus: false,
maxLines: null,
keyboardType: TextInputType.multiline,
controller: controller,
style: const TextStyle(
fontSize: 14,
),
decoration: InputDecoration(
hintText: 'description_input_hint_text'.tr(),
border: InputBorder.none,
hintStyle: TextStyle(
fontWeight: FontWeight.normal,
fontSize: 12,
color: textColor.withOpacity(0.5),
),
suffixIcon: suffixIcon,
),
);
}
}

View File

@@ -2,25 +2,25 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/modules/asset_viewer/ui/description_input.dart';
import 'package:immich_mobile/shared/models/asset.dart';
import 'package:immich_mobile/shared/models/exif_info.dart';
import 'package:immich_mobile/shared/ui/drag_sheet.dart';
import 'package:latlong2/latlong.dart';
import 'package:immich_mobile/utils/bytes_units.dart';
class ExifBottomSheet extends HookConsumerWidget {
final Asset assetDetail;
final Asset asset;
const ExifBottomSheet({Key? key, required this.assetDetail})
: super(key: key);
const ExifBottomSheet({Key? key, required this.asset}) : super(key: key);
bool get showMap =>
assetDetail.exifInfo?.latitude != null &&
assetDetail.exifInfo?.longitude != null;
asset.exifInfo?.latitude != null && asset.exifInfo?.longitude != null;
@override
Widget build(BuildContext context, WidgetRef ref) {
final ExifInfo? exifInfo = assetDetail.exifInfo;
final exifInfo = asset.exifInfo;
var isDarkTheme = Theme.of(context).brightness == Brightness.dark;
var textColor = isDarkTheme ? Colors.white : Colors.black;
buildMap() {
return Padding(
@@ -76,19 +76,6 @@ class ExifBottomSheet extends HookConsumerWidget {
);
}
final textColor = Theme.of(context).primaryColor;
buildLocationText() {
return Text(
"${exifInfo?.city}, ${exifInfo?.state}",
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.bold,
color: textColor,
),
);
}
buildSizeText(Asset a) {
String resolution = a.width != null && a.height != null
? "${a.height} x ${a.width} "
@@ -128,13 +115,39 @@ class ExifBottomSheet extends HookConsumerWidget {
children: [
Text(
"exif_bottom_sheet_location",
style: TextStyle(fontSize: 11, color: textColor),
style: TextStyle(
fontSize: 11,
color: textColor,
fontWeight: FontWeight.bold,
),
).tr(),
buildMap(),
if (exifInfo != null &&
exifInfo.city != null &&
exifInfo.state != null)
buildLocationText(),
RichText(
text: TextSpan(
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.bold,
color: textColor,
fontFamily: 'WorkSans',
),
children: [
if (exifInfo != null && exifInfo.city != null)
TextSpan(
text: exifInfo.city,
),
if (exifInfo != null &&
exifInfo.city != null &&
exifInfo.state != null)
const TextSpan(
text: ", ",
),
if (exifInfo != null && exifInfo.state != null)
TextSpan(
text: "${exifInfo.state}",
),
],
),
),
Text(
"${exifInfo!.latitude!.toStringAsFixed(4)}, ${exifInfo.longitude!.toStringAsFixed(4)}",
style: const TextStyle(fontSize: 12),
@@ -146,7 +159,7 @@ class ExifBottomSheet extends HookConsumerWidget {
}
buildDate() {
final fileCreatedAt = assetDetail.fileCreatedAt.toLocal();
final fileCreatedAt = asset.fileCreatedAt.toLocal();
final date = DateFormat.yMMMEd().format(fileCreatedAt);
final time = DateFormat.jm().format(fileCreatedAt);
@@ -167,27 +180,37 @@ class ExifBottomSheet extends HookConsumerWidget {
padding: const EdgeInsets.only(bottom: 8.0),
child: Text(
"exif_bottom_sheet_details",
style: TextStyle(fontSize: 11, color: textColor),
style: TextStyle(
fontSize: 11,
color: textColor,
fontWeight: FontWeight.bold,
),
).tr(),
),
ListTile(
contentPadding: const EdgeInsets.all(0),
dense: true,
leading: const Icon(Icons.image),
leading: Icon(
Icons.image,
color: textColor.withAlpha(200),
),
title: Text(
assetDetail.fileName,
asset.fileName,
style: TextStyle(
fontWeight: FontWeight.bold,
color: textColor,
),
),
subtitle: buildSizeText(assetDetail),
subtitle: buildSizeText(asset),
),
if (exifInfo?.make != null)
ListTile(
contentPadding: const EdgeInsets.all(0),
dense: true,
leading: const Icon(Icons.camera),
leading: Icon(
Icons.camera,
color: textColor.withAlpha(200),
),
title: Text(
"${exifInfo!.make} ${exifInfo.model}",
style: TextStyle(
@@ -203,80 +226,75 @@ class ExifBottomSheet extends HookConsumerWidget {
);
}
return SingleChildScrollView(
child: Card(
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(15),
topRight: Radius.circular(15),
return GestureDetector(
onTap: () {
// FocusScope.of(context).unfocus();
},
child: SingleChildScrollView(
child: Card(
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(15),
topRight: Radius.circular(15),
),
),
),
margin: const EdgeInsets.all(0),
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 8.0),
child: LayoutBuilder(
builder: (context, constraints) {
if (constraints.maxWidth > 600) {
// Two column
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
buildDragHeader(),
buildDate(),
const SizedBox(height: 32.0),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Flexible(
flex: showMap ? 5 : 0,
child: Padding(
padding: const EdgeInsets.only(right: 8.0),
child: buildLocation(),
margin: const EdgeInsets.all(0),
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 16.0),
child: LayoutBuilder(
builder: (context, constraints) {
if (constraints.maxWidth > 600) {
// Two column
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
buildDragHeader(),
buildDate(),
if (asset.isRemote) DescriptionInput(asset: asset),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Flexible(
flex: showMap ? 5 : 0,
child: Padding(
padding: const EdgeInsets.only(right: 8.0),
child: buildLocation(),
),
),
),
Flexible(
flex: 5,
child: Padding(
padding: const EdgeInsets.only(left: 8.0),
child: buildDetail(),
Flexible(
flex: 5,
child: Padding(
padding: const EdgeInsets.only(left: 8.0),
child: buildDetail(),
),
),
),
],
),
const SizedBox(height: 50),
],
),
);
}
// One column
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
buildDragHeader(),
buildDate(),
const SizedBox(height: 16.0),
if (showMap)
Divider(
thickness: 1,
color: Colors.grey[600],
],
),
const SizedBox(height: 50),
],
),
const SizedBox(height: 16.0),
buildLocation(),
const SizedBox(height: 16.0),
Divider(
thickness: 1,
color: Colors.grey[600],
),
const SizedBox(height: 16.0),
buildDetail(),
const SizedBox(height: 50),
],
);
},
);
}
// One column
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
buildDragHeader(),
buildDate(),
if (asset.isRemote) DescriptionInput(asset: asset),
const SizedBox(height: 8.0),
buildLocation(),
SizedBox(height: showMap ? 16.0 : 0.0),
buildDetail(),
const SizedBox(height: 50),
],
);
},
),
),
),
),

View File

@@ -9,8 +9,6 @@ class TopControlAppBar extends HookConsumerWidget {
required this.asset,
required this.onMoreInfoPressed,
required this.onDownloadPressed,
required this.onSharePressed,
required this.onDeletePressed,
required this.onAddToAlbumPressed,
required this.onToggleMotionVideo,
required this.isPlayingMotionVideo,
@@ -22,27 +20,25 @@ class TopControlAppBar extends HookConsumerWidget {
final Function onMoreInfoPressed;
final VoidCallback? onDownloadPressed;
final VoidCallback onToggleMotionVideo;
final VoidCallback onDeletePressed;
final VoidCallback onAddToAlbumPressed;
final VoidCallback onFavorite;
final Function onSharePressed;
final bool isPlayingMotionVideo;
final bool isFavorite;
@override
Widget build(BuildContext context, WidgetRef ref) {
const double iconSize = 18.0;
const double iconSize = 22.0;
Widget buildFavoriteButton() {
return IconButton(
onPressed: () {
onFavorite();
},
icon: Icon(
isFavorite ? Icons.star : Icons.star_border,
color: Colors.grey[200],
),
);
return IconButton(
onPressed: () {
onFavorite();
},
icon: Icon(
isFavorite ? Icons.star : Icons.star_border,
color: Colors.grey[200],
),
);
}
return AppBar(
@@ -86,15 +82,14 @@ class TopControlAppBar extends HookConsumerWidget {
color: Colors.grey[200],
),
),
IconButton(
onPressed: () {
onSharePressed();
},
icon: Icon(
Icons.ios_share_rounded,
color: Colors.grey[200],
if (asset.storage == AssetState.merged)
IconButton(
onPressed: onDownloadPressed,
icon: Icon(
Icons.cloud_download_outlined,
color: Colors.grey[200],
),
),
),
if (asset.isRemote)
IconButton(
onPressed: () {
@@ -105,15 +100,6 @@ class TopControlAppBar extends HookConsumerWidget {
color: Colors.grey[200],
),
),
IconButton(
onPressed: () {
onDeletePressed();
},
icon: Icon(
Icons.delete_outline_rounded,
color: Colors.grey[200],
),
),
IconButton(
onPressed: () {
onMoreInfoPressed();

View File

@@ -8,6 +8,7 @@ import 'package:flutter_hooks/flutter_hooks.dart' hide Store;
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/modules/album/ui/add_to_album_bottom_sheet.dart';
import 'package:immich_mobile/modules/asset_viewer/providers/image_viewer_page_state.provider.dart';
import 'package:immich_mobile/modules/asset_viewer/ui/advanced_bottom_sheet.dart';
import 'package:immich_mobile/modules/asset_viewer/ui/exif_bottom_sheet.dart';
import 'package:immich_mobile/modules/asset_viewer/ui/top_control_app_bar.dart';
import 'package:immich_mobile/modules/asset_viewer/views/video_viewer_page.dart';
@@ -189,7 +190,17 @@ class GalleryViewerPage extends HookConsumerWidget {
isScrollControlled: true,
context: context,
builder: (context) {
return ExifBottomSheet(assetDetail: assetDetail!);
if (ref
.watch(appSettingsServiceProvider)
.getSetting<bool>(AppSettingsEnum.advancedTroubleshooting)) {
return AdvancedBottomSheet(assetDetail: assetDetail!);
}
return Padding(
padding: EdgeInsets.only(
bottom: MediaQuery.of(context).viewInsets.bottom,
),
child: ExifBottomSheet(asset: assetDetail!),
);
},
);
}
@@ -220,11 +231,10 @@ class GalleryViewerPage extends HookConsumerWidget {
void addToAlbum(Asset addToAlbumAsset) {
showModalBottomSheet(
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15.0),
),
barrierColor: Colors.transparent,
backgroundColor: Colors.transparent,
context: context,
builder: (BuildContext _) {
return AddToAlbumBottomSheet(
@@ -256,6 +266,19 @@ class GalleryViewerPage extends HookConsumerWidget {
}
}
shareAsset() {
ref
.watch(imageViewerStateProvider.notifier)
.shareAsset(assetList[indexOfAsset.value], context);
}
handleArchive(Asset asset) {
ref
.watch(assetProvider.notifier)
.toggleArchive([asset], !asset.isArchived);
AutoRouter.of(context).pop();
}
buildAppBar() {
final show = (showAppBar.value || // onTap has the final say
(showAppBar.value && !isZoomed.value)) &&
@@ -278,7 +301,8 @@ class GalleryViewerPage extends HookConsumerWidget {
onFavorite: () {
toggleFavorite(assetList[indexOfAsset.value]);
},
onDownloadPressed: assetList[indexOfAsset.value].isLocal
onDownloadPressed: assetList[indexOfAsset.value].storage ==
AssetState.local
? null
: () {
ref.watch(imageViewerStateProvider.notifier).downloadAsset(
@@ -286,16 +310,9 @@ class GalleryViewerPage extends HookConsumerWidget {
context,
);
},
onSharePressed: () {
ref
.watch(imageViewerStateProvider.notifier)
.shareAsset(assetList[indexOfAsset.value], context);
},
onToggleMotionVideo: (() {
isPlayingMotionVideo.value = !isPlayingMotionVideo.value;
}),
onDeletePressed: () =>
handleDelete((assetList[indexOfAsset.value])),
onAddToAlbumPressed: () =>
addToAlbum(assetList[indexOfAsset.value]),
),
@@ -303,6 +320,59 @@ class GalleryViewerPage extends HookConsumerWidget {
);
}
buildBottomBar() {
final show = (showAppBar.value || // onTap has the final say
(showAppBar.value && !isZoomed.value)) &&
!isPlayingVideo.value;
final currentAsset = assetList[indexOfAsset.value];
return AnimatedOpacity(
duration: const Duration(milliseconds: 100),
opacity: show ? 1.0 : 0.0,
child: BottomNavigationBar(
backgroundColor: Colors.black.withOpacity(0.4),
unselectedIconTheme: const IconThemeData(color: Colors.white),
selectedIconTheme: const IconThemeData(color: Colors.white),
unselectedLabelStyle: const TextStyle(color: Colors.black),
selectedLabelStyle: const TextStyle(color: Colors.black),
showSelectedLabels: false,
showUnselectedLabels: false,
items: [
const BottomNavigationBarItem(
icon: Icon(Icons.ios_share_rounded),
label: 'Share',
tooltip: 'Share',
),
BottomNavigationBarItem(
icon: currentAsset.isArchived
? const Icon(Icons.unarchive_rounded)
: const Icon(Icons.archive_outlined),
label: 'Archive',
tooltip: 'Archive',
),
const BottomNavigationBarItem(
icon: Icon(Icons.delete_outline),
label: 'Delete',
tooltip: 'Delete',
),
],
onTap: (index) {
switch (index) {
case 0:
shareAsset();
break;
case 1:
handleArchive(assetList[indexOfAsset.value]);
break;
case 2:
handleDelete(assetList[indexOfAsset.value]);
break;
}
},
),
);
}
return Scaffold(
backgroundColor: Colors.black,
body: WillPopScope(
@@ -322,7 +392,7 @@ class GalleryViewerPage extends HookConsumerWidget {
scrollPhysics: isZoomed.value
? const NeverScrollableScrollPhysics() // Don't allow paging while scrolled in
: (Platform.isIOS
? const BouncingScrollPhysics() // Use bouncing physics for iOS
? const ScrollPhysics() // Use bouncing physics for iOS
: const ClampingScrollPhysics() // Use heavy physics for Android
),
itemCount: assetList.length,
@@ -447,6 +517,7 @@ class GalleryViewerPage extends HookConsumerWidget {
filterQuality: FilterQuality.high,
maxScale: 1.0,
minScale: 1.0,
basePosition: Alignment.bottomCenter,
child: SafeArea(
child: VideoViewerPage(
onPlaying: () => isPlayingVideo.value = true,
@@ -470,6 +541,12 @@ class GalleryViewerPage extends HookConsumerWidget {
right: 0,
child: buildAppBar(),
),
Positioned(
bottom: 0,
left: 0,
right: 0,
child: buildBottomBar(),
),
],
),
),

View File

@@ -30,10 +30,10 @@ class VideoViewerPage extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
if (asset.isLocal) {
if (asset.storage == AssetState.local && asset.livePhotoVideoId == null) {
final AsyncValue<File> videoFile = ref.watch(_fileFamily(asset.local!));
return videoFile.when(
data: (data) => VideoThumbnailPlayer(
data: (data) => VideoPlayer(
file: data,
isMotionVideo: false,
onVideoEnded: () {},
@@ -59,7 +59,7 @@ class VideoViewerPage extends HookConsumerWidget {
return Stack(
children: [
VideoThumbnailPlayer(
VideoPlayer(
url: videoUrl,
jwtToken: Store.get(StoreKey.accessToken),
isMotionVideo: isMotionVideo,
@@ -85,7 +85,7 @@ final _fileFamily =
return file;
});
class VideoThumbnailPlayer extends StatefulWidget {
class VideoPlayer extends StatefulWidget {
final String? url;
final String? jwtToken;
final File? file;
@@ -95,7 +95,7 @@ class VideoThumbnailPlayer extends StatefulWidget {
final Function()? onPlaying;
final Function()? onPaused;
const VideoThumbnailPlayer({
const VideoPlayer({
Key? key,
this.url,
this.jwtToken,
@@ -107,10 +107,10 @@ class VideoThumbnailPlayer extends StatefulWidget {
}) : super(key: key);
@override
State<VideoThumbnailPlayer> createState() => _VideoThumbnailPlayerState();
State<VideoPlayer> createState() => _VideoPlayerState();
}
class _VideoThumbnailPlayerState extends State<VideoThumbnailPlayer> {
class _VideoPlayerState extends State<VideoPlayer> {
late VideoPlayerController videoPlayerController;
ChewieController? chewieController;
@@ -120,14 +120,17 @@ class _VideoThumbnailPlayerState extends State<VideoThumbnailPlayer> {
initializePlayer();
videoPlayerController.addListener(() {
if (videoPlayerController.value.isPlaying) {
widget.onPlaying?.call();
} else if (!videoPlayerController.value.isPlaying) {
widget.onPaused?.call();
}
if (videoPlayerController.value.position ==
videoPlayerController.value.duration) {
widget.onVideoEnded();
if (videoPlayerController.value.isInitialized) {
if (videoPlayerController.value.isPlaying) {
widget.onPlaying?.call();
} else if (!videoPlayerController.value.isPlaying) {
widget.onPaused?.call();
}
if (videoPlayerController.value.position ==
videoPlayerController.value.duration) {
widget.onVideoEnded();
}
}
});
}
@@ -145,18 +148,22 @@ class _VideoThumbnailPlayerState extends State<VideoThumbnailPlayer> {
_createChewieController();
setState(() {});
} catch (e) {
debugPrint("ERROR initialize video player");
debugPrint("ERROR initialize video player $e");
}
}
_createChewieController() {
chewieController = ChewieController(
controlsSafeAreaMinimum: const EdgeInsets.only(
bottom: 100,
),
showOptions: true,
showControlsOnInitialize: false,
videoPlayerController: videoPlayerController,
autoPlay: true,
autoInitialize: true,
allowFullScreen: true,
allowedScreenSleep: false,
showControls: !widget.isMotionVideo,
hideControlsTimer: const Duration(seconds: 5),
);
@@ -172,20 +179,22 @@ class _VideoThumbnailPlayerState extends State<VideoThumbnailPlayer> {
@override
Widget build(BuildContext context) {
return chewieController?.videoPlayerController.value.isInitialized == true
? SizedBox(
child: Chewie(
controller: chewieController!,
),
)
: const Center(
child: SizedBox(
width: 75,
height: 75,
child: CircularProgressIndicator.adaptive(
strokeWidth: 2,
),
),
);
if (chewieController?.videoPlayerController.value.isInitialized == true) {
return SizedBox(
child: Chewie(
controller: chewieController!,
),
);
} else {
return const Center(
child: SizedBox(
width: 75,
height: 75,
child: CircularProgressIndicator.adaptive(
strokeWidth: 2,
),
),
);
}
}
}

View File

@@ -26,8 +26,8 @@ class FavoriteSelectionNotifier extends StateNotifier<Set<int>> {
}
Future<void> toggleFavorite(Asset asset) async {
if (!asset.isRemote) return; // TODO support local favorite assets
// TODO support local favorite assets
if (asset.storage == AssetState.local) return;
_setFavoriteForAssetId(asset.id, !_isFavorite(asset.id));
await assetNotifier.toggleFavorite(

View File

@@ -109,7 +109,7 @@ class RenderList {
final groups = _groupAssets(allAssets, groupBy);
groups.entries.sortedBy((e) =>e.key).reversed.forEach((entry) {
groups.entries.sortedBy((e) => e.key).reversed.forEach((entry) {
final date = entry.key;
final assets = entry.value;

View File

@@ -50,10 +50,9 @@ class ImmichAssetGrid extends HookConsumerWidget {
// Unfortunately, using the transition animation itself didn't
// seem to work reliably. So instead, wait until the duration of the
// animation has elapsed to re-enable the hero animations
Future.delayed(transitionDuration)
.then((_) {
enableHeroAnimations.value = true;
});
Future.delayed(transitionDuration).then((_) {
enableHeroAnimations.value = true;
});
}
return null;
},

View File

@@ -6,6 +6,7 @@ import 'package:immich_mobile/modules/favorite/providers/favorite_provider.dart'
import 'package:immich_mobile/routing/router.dart';
import 'package:immich_mobile/shared/models/asset.dart';
import 'package:immich_mobile/shared/ui/immich_image.dart';
import 'package:immich_mobile/utils/storage_indicator.dart';
class ThumbnailImage extends HookConsumerWidget {
final Asset asset;
@@ -124,11 +125,7 @@ class ThumbnailImage extends HookConsumerWidget {
right: 10,
bottom: 5,
child: Icon(
asset.isRemote
? (asset.isLocal
? Icons.cloud_done_outlined
: Icons.cloud_outlined)
: Icons.cloud_off_outlined,
storageIcon(asset),
color: Colors.white,
size: 18,
),

View File

@@ -9,6 +9,7 @@ import 'package:immich_mobile/shared/models/album.dart';
class ControlBottomAppBar extends ConsumerWidget {
final Function onShare;
final Function onFavorite;
final Function onArchive;
final Function onDelete;
final Function(Album album) onAddToAlbum;
final void Function() onCreateNewAlbum;
@@ -20,6 +21,7 @@ class ControlBottomAppBar extends ConsumerWidget {
Key? key,
required this.onShare,
required this.onFavorite,
required this.onArchive,
required this.onDelete,
required this.sharedAlbums,
required this.albums,
@@ -62,6 +64,11 @@ class ControlBottomAppBar extends ConsumerWidget {
);
},
),
ControlBoxButton(
iconData: Icons.archive,
label: "control_bottom_app_bar_archive".tr(),
onPressed: () => onArchive(),
),
],
);
}

View File

@@ -94,7 +94,6 @@ class HomePage extends HookConsumerWidget {
barrierDismissible: false,
);
// ref.watch(shareServiceProvider).shareAssets(selection.value.toList());
selectionEnabledHook.value = false;
}
@@ -132,6 +131,24 @@ class HomePage extends HookConsumerWidget {
selectionEnabledHook.value = false;
}
void onArchiveAsset() {
final remoteAssets = remoteOnlySelection(
localErrorMessage: 'home_page_archive_err_local'.tr(),
);
if (remoteAssets.isNotEmpty) {
ref.watch(assetProvider.notifier).toggleArchive(remoteAssets, true);
final assetOrAssets = remoteAssets.length > 1 ? 'assets' : 'asset';
ImmichToast.show(
context: context,
msg: 'Moved ${remoteAssets.length} $assetOrAssets to archive',
gravity: ToastGravity.CENTER,
);
}
selectionEnabledHook.value = false;
}
void onDelete() {
ref.watch(assetProvider.notifier).deleteAssets(selection.value);
selectionEnabledHook.value = false;
@@ -265,7 +282,7 @@ class HomePage extends HookConsumerWidget {
? buildLoadingIndicator()
: ImmichAssetGrid(
renderList: ref.watch(assetProvider).renderList!,
assets: ref.watch(assetProvider).allAssets,
assets: ref.read(assetProvider).allAssets,
assetsPerRow: appSettingService
.getSetting(AppSettingsEnum.tilesPerRow),
showStorageIndicator: appSettingService
@@ -278,6 +295,7 @@ class HomePage extends HookConsumerWidget {
ControlBottomAppBar(
onShare: onShareAssets,
onFavorite: onFavoriteAssets,
onArchive: onArchiveAsset,
onDelete: onDelete,
onAddToAlbum: onAddToAlbum,
albums: albums,
@@ -291,9 +309,7 @@ class HomePage extends HookConsumerWidget {
return Scaffold(
appBar: !selectionEnabledHook.value
? HomePageAppBar(
onPopBack: reloadAllAsset,
)
? HomePageAppBar(onPopBack: reloadAllAsset)
: null,
drawer: const ProfileDrawer(),
body: buildBody(),

View File

@@ -43,12 +43,14 @@ enum AppSettingsEnum<T> {
"selectedAlbumSortOrder",
0,
),
advancedTroubleshooting<bool>(StoreKey.advancedTroubleshooting, null, false),
logLevel<int>(StoreKey.logLevel, null, 5) // Level.INFO = 5
;
const AppSettingsEnum(this.storeKey, this.hiveKey, this.defaultValue);
final StoreKey<T> storeKey;
final String hiveKey;
final String? hiveKey;
final T defaultValue;
}

View File

@@ -0,0 +1,83 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/modules/settings/providers/app_settings.provider.dart';
import 'package:immich_mobile/modules/settings/services/app_settings.service.dart';
import 'package:immich_mobile/modules/settings/ui/settings_switch_list_tile.dart';
import 'package:immich_mobile/shared/services/immich_logger.service.dart';
import 'package:logging/logging.dart';
class AdvancedSettings extends HookConsumerWidget {
const AdvancedSettings({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final appSettingService = ref.watch(appSettingsServiceProvider);
final isEnabled =
useState(AppSettingsEnum.advancedTroubleshooting.defaultValue);
final levelId = useState(AppSettingsEnum.logLevel.defaultValue);
useEffect(
() {
isEnabled.value = appSettingService.getSetting<bool>(
AppSettingsEnum.advancedTroubleshooting,
);
levelId.value = appSettingService.getSetting(AppSettingsEnum.logLevel);
return null;
},
[],
);
final logLevel = Level.LEVELS[levelId.value].name;
return ExpansionTile(
textColor: Theme.of(context).primaryColor,
title: const Text(
"advanced_settings_tile_title",
style: TextStyle(
fontWeight: FontWeight.bold,
),
).tr(),
subtitle: const Text(
"advanced_settings_tile_subtitle",
style: TextStyle(
fontSize: 13,
),
).tr(),
children: [
SettingsSwitchListTile(
enabled: true,
appSettingService: appSettingService,
valueNotifier: isEnabled,
settingsEnum: AppSettingsEnum.advancedTroubleshooting,
title: "advanced_settings_troubleshooting_title".tr(),
subtitle: "advanced_settings_troubleshooting_subtitle".tr(),
),
ListTile(
dense: true,
title: Text(
// Not translated because the levels are only English
"Log level: $logLevel",
style: const TextStyle(fontWeight: FontWeight.bold),
),
subtitle: Slider(
value: levelId.value.toDouble(),
onChanged: (double v) => levelId.value = v.toInt(),
onChangeEnd: (double v) {
appSettingService.setSetting(
AppSettingsEnum.logLevel,
v.toInt(),
);
ImmichLogger().level = Level.LEVELS[v.toInt()];
},
max: 8,
min: 1.0,
divisions: 7,
label: logLevel,
activeColor: Theme.of(context).primaryColor,
),
),
],
);
}
}

View File

@@ -1,6 +1,7 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/modules/settings/ui/advanced_settings/advanced_settings.dart';
import 'package:immich_mobile/modules/settings/ui/asset_list_settings/asset_list_settings.dart';
import 'package:immich_mobile/modules/settings/ui/image_viewer_quality_setting/image_viewer_quality_setting.dart';
import 'package:immich_mobile/modules/settings/ui/notification_setting/notification_setting.dart';
@@ -40,7 +41,8 @@ class SettingsPage extends HookConsumerWidget {
const ThemeSetting(),
const AssetListSettings(),
const NotificationSetting(),
//const ExperimentalSettings(),
// const ExperimentalSettings(),
const AdvancedSettings()
],
).toList(),
],

View File

@@ -9,6 +9,7 @@ import 'package:immich_mobile/modules/album/views/library_page.dart';
import 'package:immich_mobile/modules/album/views/select_additional_user_for_sharing_page.dart';
import 'package:immich_mobile/modules/album/views/select_user_for_sharing_page.dart';
import 'package:immich_mobile/modules/album/views/sharing_page.dart';
import 'package:immich_mobile/modules/archive/views/archive_page.dart';
import 'package:immich_mobile/modules/asset_viewer/views/gallery_viewer.dart';
import 'package:immich_mobile/modules/asset_viewer/views/video_viewer_page.dart';
import 'package:immich_mobile/modules/backup/views/album_preview_page.dart';
@@ -128,6 +129,13 @@ part 'router.gr.dart';
AutoRoute(
page: AppLogDetailPage,
),
AutoRoute(
page: ArchivePage,
guards: [
AuthGuard,
DuplicateGuard,
],
),
],
)
class AppRouter extends _$AppRouter {

View File

@@ -240,6 +240,12 @@ class _$AppRouter extends RootStackRouter {
),
);
},
ArchiveRoute.name: (routeData) {
return MaterialPageX<dynamic>(
routeData: routeData,
child: const ArchivePage(),
);
},
HomeRoute.name: (routeData) {
return MaterialPageX<dynamic>(
routeData: routeData,
@@ -499,6 +505,14 @@ class _$AppRouter extends RootStackRouter {
AppLogDetailRoute.name,
path: '/app-log-detail-page',
),
RouteConfig(
ArchiveRoute.name,
path: '/archive-page',
guards: [
authGuard,
duplicateGuard,
],
),
];
}
@@ -1022,6 +1036,18 @@ class AppLogDetailRouteArgs {
}
}
/// generated route for
/// [ArchivePage]
class ArchiveRoute extends PageRouteInfo<void> {
const ArchiveRoute()
: super(
ArchiveRoute.name,
path: '/archive-page',
);
static const String name = 'ArchiveRoute';
}
/// generated route for
/// [HomePage]
class HomeRoute extends PageRouteInfo<void> {

View File

@@ -29,7 +29,8 @@ class Asset {
ownerId = fastHash(remote.ownerId),
exifInfo =
remote.exifInfo != null ? ExifInfo.fromDto(remote.exifInfo!) : null,
isFavorite = remote.isFavorite;
isFavorite = remote.isFavorite,
isArchived = remote.isArchived;
Asset.local(AssetEntity local)
: localId = local.id,
@@ -44,6 +45,7 @@ class Asset {
fileModifiedAt = local.modifiedDateTime,
updatedAt = local.modifiedDateTime,
isFavorite = local.isFavorite,
isArchived = false,
fileCreatedAt = local.createDateTime {
if (fileCreatedAt.year == 1970) {
fileCreatedAt = fileModifiedAt;
@@ -54,6 +56,7 @@ class Asset {
}
Asset({
this.id = Isar.autoIncrement,
this.remoteId,
required this.localId,
required this.deviceId,
@@ -70,6 +73,7 @@ class Asset {
this.exifInfo,
required this.isFavorite,
required this.isLocal,
required this.isArchived,
});
@ignore
@@ -130,8 +134,11 @@ class Asset {
bool isFavorite;
/// `true` if this [Asset] is present on the device
bool isLocal;
bool isArchived;
@ignore
ExifInfo? exifInfo;
@@ -141,12 +148,26 @@ class Asset {
@ignore
String get name => p.withoutExtension(fileName);
/// `true` if this [Asset] is present on the server
@ignore
bool get isRemote => remoteId != null;
@ignore
bool get isImage => type == AssetType.image;
@ignore
AssetState get storage {
if (isRemote && isLocal) {
return AssetState.merged;
} else if (isRemote) {
return AssetState.remote;
} else if (isLocal) {
return AssetState.local;
} else {
throw Exception("Asset has illegal state: $this");
}
}
@ignore
Duration get duration => Duration(seconds: durationInSeconds);
@@ -168,7 +189,8 @@ class Asset {
fileName == other.fileName &&
livePhotoVideoId == other.livePhotoVideoId &&
isFavorite == other.isFavorite &&
isLocal == other.isLocal;
isLocal == other.isLocal &&
isArchived == other.isArchived;
}
@override
@@ -189,37 +211,116 @@ class Asset {
fileName.hashCode ^
livePhotoVideoId.hashCode ^
isFavorite.hashCode ^
isLocal.hashCode;
isLocal.hashCode ^
isArchived.hashCode;
bool updateFromAssetEntity(AssetEntity ae) {
// TODO check more fields;
// width and height are most important because local assets require these
final bool hasChanges =
isLocal == false || width != ae.width || height != ae.height;
if (hasChanges) {
isLocal = true;
width = ae.width;
height = ae.height;
}
return hasChanges;
}
Asset withUpdatesFromDto(AssetResponseDto dto) =>
Asset.remote(dto).updateFromDb(this);
Asset updateFromDb(Asset a) {
/// Returns `true` if this [Asset] can updated with values from parameter [a]
bool canUpdate(Asset a) {
assert(isInDb);
assert(localId == a.localId);
assert(deviceId == a.deviceId);
id = a.id;
isLocal |= a.isLocal;
remoteId ??= a.remoteId;
width ??= a.width;
height ??= a.height;
exifInfo ??= a.exifInfo;
exifInfo?.id = id;
return this;
assert(a.storage != AssetState.merged);
return a.updatedAt.isAfter(updatedAt) ||
a.isRemote && !isRemote ||
a.isLocal && !isLocal ||
width == null && a.width != null ||
height == null && a.height != null ||
exifInfo == null && a.exifInfo != null ||
livePhotoVideoId == null && a.livePhotoVideoId != null ||
!isRemote && a.isRemote && isFavorite != a.isFavorite ||
!isRemote && a.isRemote && isArchived != a.isArchived;
}
/// Returns a new [Asset] with values from this and merged & updated with [a]
Asset updatedCopy(Asset a) {
assert(canUpdate(a));
if (a.updatedAt.isAfter(updatedAt)) {
// take most values from newer asset
// keep vales that can never be set by the asset not in DB
if (a.isRemote) {
return a._copyWith(
id: id,
isLocal: isLocal,
width: a.width ?? width,
height: a.height ?? height,
exifInfo: a.exifInfo?.copyWith(id: id) ?? exifInfo,
);
} else {
return a._copyWith(
id: id,
remoteId: remoteId,
livePhotoVideoId: livePhotoVideoId,
isFavorite: isFavorite,
isArchived: isArchived,
);
}
} else {
// fill in potentially missing values, i.e. merge assets
if (a.isRemote) {
// values from remote take precedence
return _copyWith(
remoteId: a.remoteId,
width: a.width,
height: a.height,
livePhotoVideoId: a.livePhotoVideoId,
// isFavorite + isArchived are not set by device-only assets
isFavorite: a.isFavorite,
isArchived: a.isArchived,
exifInfo: a.exifInfo?.copyWith(id: id) ?? exifInfo,
);
} else {
// add only missing values (and set isLocal to true)
return _copyWith(
isLocal: true,
width: width ?? a.width,
height: height ?? a.height,
exifInfo: exifInfo ?? a.exifInfo?.copyWith(id: id),
);
}
}
}
Asset _copyWith({
Id? id,
String? remoteId,
String? localId,
int? deviceId,
int? ownerId,
DateTime? fileCreatedAt,
DateTime? fileModifiedAt,
DateTime? updatedAt,
int? durationInSeconds,
AssetType? type,
short? width,
short? height,
String? fileName,
String? livePhotoVideoId,
bool? isFavorite,
bool? isLocal,
bool? isArchived,
ExifInfo? exifInfo,
}) =>
Asset(
id: id ?? this.id,
remoteId: remoteId ?? this.remoteId,
localId: localId ?? this.localId,
deviceId: deviceId ?? this.deviceId,
ownerId: ownerId ?? this.ownerId,
fileCreatedAt: fileCreatedAt ?? this.fileCreatedAt,
fileModifiedAt: fileModifiedAt ?? this.fileModifiedAt,
updatedAt: updatedAt ?? this.updatedAt,
durationInSeconds: durationInSeconds ?? this.durationInSeconds,
type: type ?? this.type,
width: width ?? this.width,
height: height ?? this.height,
fileName: fileName ?? this.fileName,
livePhotoVideoId: livePhotoVideoId ?? this.livePhotoVideoId,
isFavorite: isFavorite ?? this.isFavorite,
isLocal: isLocal ?? this.isLocal,
isArchived: isArchived ?? this.isArchived,
exifInfo: exifInfo ?? this.exifInfo,
);
Future<void> put(Isar db) async {
await db.assets.put(this);
if (exifInfo != null) {
@@ -252,6 +353,31 @@ class Asset {
static int compareByLocalId(Asset a, Asset b) =>
a.localId.compareTo(b.localId);
@override
String toString() {
return """
{
"remoteId": "${remoteId ?? "N/A"}",
"localId": "$localId",
"deviceId": "$deviceId",
"ownerId": "$ownerId",
"livePhotoVideoId": "${livePhotoVideoId ?? "N/A"}",
"fileCreatedAt": "$fileCreatedAt",
"fileModifiedAt": "$fileModifiedAt",
"updatedAt": "$updatedAt",
"durationInSeconds": $durationInSeconds,
"type": "$type",
"fileName": "$fileName",
"isFavorite": $isFavorite,
"isLocal": $isLocal,
"isRemote: $isRemote,
"storage": $storage,
"width": ${width ?? "N/A"},
"height": ${height ?? "N/A"},
"isArchived": $isArchived
}""";
}
}
enum AssetType {
@@ -278,6 +404,14 @@ extension AssetTypeEnumHelper on AssetTypeEnum {
}
}
/// Describes where the information of this asset came from:
/// only from the local device, only from the remote server or merged from both
enum AssetState {
local,
remote,
merged,
}
extension AssetsHelper on IsarCollection<Asset> {
Future<int> deleteAllByRemoteId(Iterable<String> ids) =>
ids.isEmpty ? Future.value(0) : _remote(ids).deleteAll();

View File

@@ -47,49 +47,54 @@ const AssetSchema = CollectionSchema(
name: r'height',
type: IsarType.int,
),
r'isFavorite': PropertySchema(
r'isArchived': PropertySchema(
id: 6,
name: r'isArchived',
type: IsarType.bool,
),
r'isFavorite': PropertySchema(
id: 7,
name: r'isFavorite',
type: IsarType.bool,
),
r'isLocal': PropertySchema(
id: 7,
id: 8,
name: r'isLocal',
type: IsarType.bool,
),
r'livePhotoVideoId': PropertySchema(
id: 8,
id: 9,
name: r'livePhotoVideoId',
type: IsarType.string,
),
r'localId': PropertySchema(
id: 9,
id: 10,
name: r'localId',
type: IsarType.string,
),
r'ownerId': PropertySchema(
id: 10,
id: 11,
name: r'ownerId',
type: IsarType.long,
),
r'remoteId': PropertySchema(
id: 11,
id: 12,
name: r'remoteId',
type: IsarType.string,
),
r'type': PropertySchema(
id: 12,
id: 13,
name: r'type',
type: IsarType.byte,
enumMap: _AssettypeEnumValueMap,
),
r'updatedAt': PropertySchema(
id: 13,
id: 14,
name: r'updatedAt',
type: IsarType.dateTime,
),
r'width': PropertySchema(
id: 14,
id: 15,
name: r'width',
type: IsarType.int,
)
@@ -175,15 +180,16 @@ void _assetSerialize(
writer.writeDateTime(offsets[3], object.fileModifiedAt);
writer.writeString(offsets[4], object.fileName);
writer.writeInt(offsets[5], object.height);
writer.writeBool(offsets[6], object.isFavorite);
writer.writeBool(offsets[7], object.isLocal);
writer.writeString(offsets[8], object.livePhotoVideoId);
writer.writeString(offsets[9], object.localId);
writer.writeLong(offsets[10], object.ownerId);
writer.writeString(offsets[11], object.remoteId);
writer.writeByte(offsets[12], object.type.index);
writer.writeDateTime(offsets[13], object.updatedAt);
writer.writeInt(offsets[14], object.width);
writer.writeBool(offsets[6], object.isArchived);
writer.writeBool(offsets[7], object.isFavorite);
writer.writeBool(offsets[8], object.isLocal);
writer.writeString(offsets[9], object.livePhotoVideoId);
writer.writeString(offsets[10], object.localId);
writer.writeLong(offsets[11], object.ownerId);
writer.writeString(offsets[12], object.remoteId);
writer.writeByte(offsets[13], object.type.index);
writer.writeDateTime(offsets[14], object.updatedAt);
writer.writeInt(offsets[15], object.width);
}
Asset _assetDeserialize(
@@ -199,18 +205,19 @@ Asset _assetDeserialize(
fileModifiedAt: reader.readDateTime(offsets[3]),
fileName: reader.readString(offsets[4]),
height: reader.readIntOrNull(offsets[5]),
isFavorite: reader.readBool(offsets[6]),
isLocal: reader.readBool(offsets[7]),
livePhotoVideoId: reader.readStringOrNull(offsets[8]),
localId: reader.readString(offsets[9]),
ownerId: reader.readLong(offsets[10]),
remoteId: reader.readStringOrNull(offsets[11]),
type: _AssettypeValueEnumMap[reader.readByteOrNull(offsets[12])] ??
id: id,
isArchived: reader.readBool(offsets[6]),
isFavorite: reader.readBool(offsets[7]),
isLocal: reader.readBool(offsets[8]),
livePhotoVideoId: reader.readStringOrNull(offsets[9]),
localId: reader.readString(offsets[10]),
ownerId: reader.readLong(offsets[11]),
remoteId: reader.readStringOrNull(offsets[12]),
type: _AssettypeValueEnumMap[reader.readByteOrNull(offsets[13])] ??
AssetType.other,
updatedAt: reader.readDateTime(offsets[13]),
width: reader.readIntOrNull(offsets[14]),
updatedAt: reader.readDateTime(offsets[14]),
width: reader.readIntOrNull(offsets[15]),
);
object.id = id;
return object;
}
@@ -238,19 +245,21 @@ P _assetDeserializeProp<P>(
case 7:
return (reader.readBool(offset)) as P;
case 8:
return (reader.readStringOrNull(offset)) as P;
return (reader.readBool(offset)) as P;
case 9:
return (reader.readString(offset)) as P;
case 10:
return (reader.readLong(offset)) as P;
case 11:
return (reader.readStringOrNull(offset)) as P;
case 10:
return (reader.readString(offset)) as P;
case 11:
return (reader.readLong(offset)) as P;
case 12:
return (reader.readStringOrNull(offset)) as P;
case 13:
return (_AssettypeValueEnumMap[reader.readByteOrNull(offset)] ??
AssetType.other) as P;
case 13:
return (reader.readDateTime(offset)) as P;
case 14:
return (reader.readDateTime(offset)) as P;
case 15:
return (reader.readIntOrNull(offset)) as P;
default:
throw IsarError('Unknown property with id $propertyId');
@@ -1024,6 +1033,16 @@ extension AssetQueryFilter on QueryBuilder<Asset, Asset, QFilterCondition> {
});
}
QueryBuilder<Asset, Asset, QAfterFilterCondition> isArchivedEqualTo(
bool value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'isArchived',
value: value,
));
});
}
QueryBuilder<Asset, Asset, QAfterFilterCondition> isFavoriteEqualTo(
bool value) {
return QueryBuilder.apply(this, (query) {
@@ -1771,6 +1790,18 @@ extension AssetQuerySortBy on QueryBuilder<Asset, Asset, QSortBy> {
});
}
QueryBuilder<Asset, Asset, QAfterSortBy> sortByIsArchived() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'isArchived', Sort.asc);
});
}
QueryBuilder<Asset, Asset, QAfterSortBy> sortByIsArchivedDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'isArchived', Sort.desc);
});
}
QueryBuilder<Asset, Asset, QAfterSortBy> sortByIsFavorite() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'isFavorite', Sort.asc);
@@ -1965,6 +1996,18 @@ extension AssetQuerySortThenBy on QueryBuilder<Asset, Asset, QSortThenBy> {
});
}
QueryBuilder<Asset, Asset, QAfterSortBy> thenByIsArchived() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'isArchived', Sort.asc);
});
}
QueryBuilder<Asset, Asset, QAfterSortBy> thenByIsArchivedDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'isArchived', Sort.desc);
});
}
QueryBuilder<Asset, Asset, QAfterSortBy> thenByIsFavorite() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'isFavorite', Sort.asc);
@@ -2112,6 +2155,12 @@ extension AssetQueryWhereDistinct on QueryBuilder<Asset, Asset, QDistinct> {
});
}
QueryBuilder<Asset, Asset, QDistinct> distinctByIsArchived() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'isArchived');
});
}
QueryBuilder<Asset, Asset, QDistinct> distinctByIsFavorite() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'isFavorite');
@@ -2214,6 +2263,12 @@ extension AssetQueryProperty on QueryBuilder<Asset, Asset, QQueryProperty> {
});
}
QueryBuilder<Asset, bool, QQueryOperations> isArchivedProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'isArchived');
});
}
QueryBuilder<Asset, bool, QQueryOperations> isFavoriteProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'isFavorite');

View File

@@ -21,6 +21,7 @@ class ExifInfo {
String? city;
String? state;
String? country;
String? description;
@ignore
String get exposureTime {
@@ -58,9 +59,11 @@ class ExifInfo {
long = dto.longitude?.toDouble(),
city = dto.city,
state = dto.state,
country = dto.country;
country = dto.country,
description = dto.description;
ExifInfo({
this.id,
this.fileSize,
this.make,
this.model,
@@ -74,7 +77,43 @@ class ExifInfo {
this.city,
this.state,
this.country,
this.description,
});
ExifInfo copyWith({
Id? id,
int? fileSize,
String? make,
String? model,
String? lens,
float? f,
float? mm,
short? iso,
float? exposureSeconds,
float? lat,
float? long,
String? city,
String? state,
String? country,
String? description,
}) =>
ExifInfo(
id: id ?? this.id,
fileSize: fileSize ?? this.fileSize,
make: make ?? this.make,
model: model ?? this.model,
lens: lens ?? this.lens,
f: f ?? this.f,
mm: mm ?? this.mm,
iso: iso ?? this.iso,
exposureSeconds: exposureSeconds ?? this.exposureSeconds,
lat: lat ?? this.lat,
long: long ?? this.long,
city: city ?? this.city,
state: state ?? this.state,
country: country ?? this.country,
description: description ?? this.description,
);
}
double? _exposureTimeToSeconds(String? s) {

View File

@@ -27,58 +27,63 @@ const ExifInfoSchema = CollectionSchema(
name: r'country',
type: IsarType.string,
),
r'exposureSeconds': PropertySchema(
r'description': PropertySchema(
id: 2,
name: r'description',
type: IsarType.string,
),
r'exposureSeconds': PropertySchema(
id: 3,
name: r'exposureSeconds',
type: IsarType.float,
),
r'f': PropertySchema(
id: 3,
id: 4,
name: r'f',
type: IsarType.float,
),
r'fileSize': PropertySchema(
id: 4,
id: 5,
name: r'fileSize',
type: IsarType.long,
),
r'iso': PropertySchema(
id: 5,
id: 6,
name: r'iso',
type: IsarType.int,
),
r'lat': PropertySchema(
id: 6,
id: 7,
name: r'lat',
type: IsarType.float,
),
r'lens': PropertySchema(
id: 7,
id: 8,
name: r'lens',
type: IsarType.string,
),
r'long': PropertySchema(
id: 8,
id: 9,
name: r'long',
type: IsarType.float,
),
r'make': PropertySchema(
id: 9,
id: 10,
name: r'make',
type: IsarType.string,
),
r'mm': PropertySchema(
id: 10,
id: 11,
name: r'mm',
type: IsarType.float,
),
r'model': PropertySchema(
id: 11,
id: 12,
name: r'model',
type: IsarType.string,
),
r'state': PropertySchema(
id: 12,
id: 13,
name: r'state',
type: IsarType.string,
)
@@ -115,6 +120,12 @@ int _exifInfoEstimateSize(
bytesCount += 3 + value.length * 3;
}
}
{
final value = object.description;
if (value != null) {
bytesCount += 3 + value.length * 3;
}
}
{
final value = object.lens;
if (value != null) {
@@ -150,17 +161,18 @@ void _exifInfoSerialize(
) {
writer.writeString(offsets[0], object.city);
writer.writeString(offsets[1], object.country);
writer.writeFloat(offsets[2], object.exposureSeconds);
writer.writeFloat(offsets[3], object.f);
writer.writeLong(offsets[4], object.fileSize);
writer.writeInt(offsets[5], object.iso);
writer.writeFloat(offsets[6], object.lat);
writer.writeString(offsets[7], object.lens);
writer.writeFloat(offsets[8], object.long);
writer.writeString(offsets[9], object.make);
writer.writeFloat(offsets[10], object.mm);
writer.writeString(offsets[11], object.model);
writer.writeString(offsets[12], object.state);
writer.writeString(offsets[2], object.description);
writer.writeFloat(offsets[3], object.exposureSeconds);
writer.writeFloat(offsets[4], object.f);
writer.writeLong(offsets[5], object.fileSize);
writer.writeInt(offsets[6], object.iso);
writer.writeFloat(offsets[7], object.lat);
writer.writeString(offsets[8], object.lens);
writer.writeFloat(offsets[9], object.long);
writer.writeString(offsets[10], object.make);
writer.writeFloat(offsets[11], object.mm);
writer.writeString(offsets[12], object.model);
writer.writeString(offsets[13], object.state);
}
ExifInfo _exifInfoDeserialize(
@@ -172,19 +184,20 @@ ExifInfo _exifInfoDeserialize(
final object = ExifInfo(
city: reader.readStringOrNull(offsets[0]),
country: reader.readStringOrNull(offsets[1]),
exposureSeconds: reader.readFloatOrNull(offsets[2]),
f: reader.readFloatOrNull(offsets[3]),
fileSize: reader.readLongOrNull(offsets[4]),
iso: reader.readIntOrNull(offsets[5]),
lat: reader.readFloatOrNull(offsets[6]),
lens: reader.readStringOrNull(offsets[7]),
long: reader.readFloatOrNull(offsets[8]),
make: reader.readStringOrNull(offsets[9]),
mm: reader.readFloatOrNull(offsets[10]),
model: reader.readStringOrNull(offsets[11]),
state: reader.readStringOrNull(offsets[12]),
description: reader.readStringOrNull(offsets[2]),
exposureSeconds: reader.readFloatOrNull(offsets[3]),
f: reader.readFloatOrNull(offsets[4]),
fileSize: reader.readLongOrNull(offsets[5]),
id: id,
iso: reader.readIntOrNull(offsets[6]),
lat: reader.readFloatOrNull(offsets[7]),
lens: reader.readStringOrNull(offsets[8]),
long: reader.readFloatOrNull(offsets[9]),
make: reader.readStringOrNull(offsets[10]),
mm: reader.readFloatOrNull(offsets[11]),
model: reader.readStringOrNull(offsets[12]),
state: reader.readStringOrNull(offsets[13]),
);
object.id = id;
return object;
}
@@ -200,27 +213,29 @@ P _exifInfoDeserializeProp<P>(
case 1:
return (reader.readStringOrNull(offset)) as P;
case 2:
return (reader.readFloatOrNull(offset)) as P;
return (reader.readStringOrNull(offset)) as P;
case 3:
return (reader.readFloatOrNull(offset)) as P;
case 4:
return (reader.readLongOrNull(offset)) as P;
return (reader.readFloatOrNull(offset)) as P;
case 5:
return (reader.readIntOrNull(offset)) as P;
return (reader.readLongOrNull(offset)) as P;
case 6:
return (reader.readFloatOrNull(offset)) as P;
return (reader.readIntOrNull(offset)) as P;
case 7:
return (reader.readStringOrNull(offset)) as P;
return (reader.readFloatOrNull(offset)) as P;
case 8:
return (reader.readFloatOrNull(offset)) as P;
return (reader.readStringOrNull(offset)) as P;
case 9:
return (reader.readStringOrNull(offset)) as P;
case 10:
return (reader.readFloatOrNull(offset)) as P;
case 11:
case 10:
return (reader.readStringOrNull(offset)) as P;
case 11:
return (reader.readFloatOrNull(offset)) as P;
case 12:
return (reader.readStringOrNull(offset)) as P;
case 13:
return (reader.readStringOrNull(offset)) as P;
default:
throw IsarError('Unknown property with id $propertyId');
}
@@ -607,6 +622,155 @@ extension ExifInfoQueryFilter
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterFilterCondition> descriptionIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'description',
));
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterFilterCondition>
descriptionIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'description',
));
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterFilterCondition> descriptionEqualTo(
String? value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'description',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterFilterCondition>
descriptionGreaterThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'description',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterFilterCondition> descriptionLessThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'description',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterFilterCondition> descriptionBetween(
String? lower,
String? upper, {
bool includeLower = true,
bool includeUpper = true,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'description',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterFilterCondition> descriptionStartsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'description',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterFilterCondition> descriptionEndsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'description',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterFilterCondition> descriptionContains(
String value,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'description',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterFilterCondition> descriptionMatches(
String pattern,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'description',
wildcard: pattern,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterFilterCondition> descriptionIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'description',
value: '',
));
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterFilterCondition>
descriptionIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'description',
value: '',
));
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterFilterCondition>
exposureSecondsIsNull() {
return QueryBuilder.apply(this, (query) {
@@ -1825,6 +1989,18 @@ extension ExifInfoQuerySortBy on QueryBuilder<ExifInfo, ExifInfo, QSortBy> {
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterSortBy> sortByDescription() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'description', Sort.asc);
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterSortBy> sortByDescriptionDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'description', Sort.desc);
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterSortBy> sortByExposureSeconds() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'exposureSeconds', Sort.asc);
@@ -1984,6 +2160,18 @@ extension ExifInfoQuerySortThenBy
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterSortBy> thenByDescription() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'description', Sort.asc);
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterSortBy> thenByDescriptionDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'description', Sort.desc);
});
}
QueryBuilder<ExifInfo, ExifInfo, QAfterSortBy> thenByExposureSeconds() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'exposureSeconds', Sort.asc);
@@ -2145,6 +2333,13 @@ extension ExifInfoQueryWhereDistinct
});
}
QueryBuilder<ExifInfo, ExifInfo, QDistinct> distinctByDescription(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'description', caseSensitive: caseSensitive);
});
}
QueryBuilder<ExifInfo, ExifInfo, QDistinct> distinctByExposureSeconds() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'exposureSeconds');
@@ -2236,6 +2431,12 @@ extension ExifInfoQueryProperty
});
}
QueryBuilder<ExifInfo, String?, QQueryOperations> descriptionProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'description');
});
}
QueryBuilder<ExifInfo, double?, QQueryOperations> exposureSecondsProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'exposureSeconds');

View File

@@ -167,6 +167,8 @@ enum StoreKey<T> {
imageCacheSize<int>(111, type: int),
albumThumbnailCacheSize<int>(112, type: int),
selectedAlbumSortOrder<int>(113, type: int),
advancedTroubleshooting<bool>(114, type: bool),
logLevel<int>(115, type: int),
;
const StoreKey(

View File

@@ -1,3 +1,4 @@
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/modules/album/services/album.service.dart';
import 'package:immich_mobile/shared/models/exif_info.dart';
@@ -19,6 +20,8 @@ import 'package:logging/logging.dart';
import 'package:openapi/api.dart';
import 'package:photo_manager/photo_manager.dart';
/// State does not contain archived assets.
/// Use database provider if you want to access the isArchived assets
class AssetsState {
final List<Asset> allAssets;
final RenderList? renderList;
@@ -76,6 +79,7 @@ class AssetNotifier extends StateNotifier<AssetsState> {
GroupAssetsBy
.values[_settingsService.getSetting(AppSettingsEnum.groupAssetsBy)],
);
state = await AssetsState.fromAssetList(newAssetList)
.withRenderDataStructure(layout);
}
@@ -98,8 +102,7 @@ class AssetNotifier extends StateNotifier<AssetsState> {
await clearAssetsAndAlbums(_db);
log.info("Manual refresh requested, cleared assets and albums from db");
} else if (_stateUpdateLock.enqueued <= 1) {
final int cachedCount =
await _db.assets.filter().ownerIdEqualTo(me.isarId).count();
final int cachedCount = await _userAssetQuery(me.isarId).count();
if (cachedCount > 0 && cachedCount != state.allAssets.length) {
await _stateUpdateLock.run(
() async => _updateAssetsState(await _getUserAssets(me.isarId)),
@@ -112,12 +115,12 @@ class AssetNotifier extends StateNotifier<AssetsState> {
}
final bool newRemote = await _assetService.refreshRemoteAssets();
final bool newLocal = await _albumService.refreshDeviceAlbums();
debugPrint("newRemote: $newRemote, newLocal: $newLocal");
log.info("Load assets: ${stopwatch.elapsedMilliseconds}ms");
stopwatch.reset();
if (!newRemote &&
!newLocal &&
state.allAssets.length ==
await _db.assets.filter().ownerIdEqualTo(me.isarId).count()) {
state.allAssets.length == await _userAssetQuery(me.isarId).count()) {
log.info("state is already up-to-date");
return;
}
@@ -136,11 +139,13 @@ class AssetNotifier extends StateNotifier<AssetsState> {
}
}
Future<List<Asset>> _getUserAssets(int userId) => _db.assets
.filter()
.ownerIdEqualTo(userId)
.sortByFileCreatedAtDesc()
.findAll();
Future<List<Asset>> _getUserAssets(int userId) =>
_userAssetQuery(userId).sortByFileCreatedAtDesc().findAll();
QueryBuilder<Asset, Asset, QAfterFilterCondition> _userAssetQuery(
int userId,
) =>
_db.assets.filter().ownerIdEqualTo(userId).isArchivedEqualTo(false);
Future<void> clearAllAsset() {
state = AssetsState.empty();
@@ -224,13 +229,46 @@ class AssetNotifier extends StateNotifier<AssetsState> {
}
final index = state.allAssets.indexWhere((a) => asset.id == a.id);
if (index > 0) {
if (index != -1) {
state.allAssets[index] = newAsset;
_updateAssetsState(state.allAssets);
}
return newAsset.isFavorite;
}
Future<void> toggleArchive(Iterable<Asset> assets, bool status) async {
final newAssets = await Future.wait(
assets.map((a) => _assetService.changeArchiveStatus(a, status)),
);
int i = 0;
bool unArchived = false;
for (Asset oldAsset in assets) {
final newAsset = newAssets[i++];
if (newAsset == null) {
log.severe("Change archive status failed for asset ${oldAsset.id}");
continue;
}
final index = state.allAssets.indexWhere((a) => oldAsset.id == a.id);
if (newAsset.isArchived) {
// remove from state
if (index != -1) {
state.allAssets.removeAt(index);
}
} else {
// add to state is difficult because the list is sorted
unArchived = true;
}
}
if (unArchived) {
final User me = Store.get(StoreKey.currentUser);
await _stateUpdateLock.run(
() async => _updateAssetsState(await _getUserAssets(me.isarId)),
);
} else {
_updateAssetsState(state.allAssets);
}
}
}
final assetProvider = StateNotifierProvider<AssetNotifier, AssetsState>((ref) {

View File

@@ -101,7 +101,7 @@ class AssetService {
if (a.isRemote) {
final dto = await _apiService.assetApi.getAssetById(a.remoteId!);
if (dto != null && dto.exifInfo != null) {
a = a.withUpdatesFromDto(dto);
a.exifInfo = Asset.remote(dto).exifInfo!.copyWith(id: a.id);
if (a.isInDb) {
_db.writeTxn(() => a.put(_db));
} else {
@@ -121,10 +121,21 @@ class AssetService {
) async {
final dto =
await _apiService.assetApi.updateAsset(asset.remoteId!, updateAssetDto);
return dto == null ? null : Asset.remote(dto);
if (dto != null) {
final updated = asset.updatedCopy(Asset.remote(dto));
if (updated.isInDb) {
await _db.writeTxn(() => updated.put(_db));
}
return updated;
}
return null;
}
Future<Asset?> changeFavoriteStatus(Asset asset, bool isFavorite) {
return updateAsset(asset, UpdateAssetDto(isFavorite: isFavorite));
}
Future<Asset?> changeArchiveStatus(Asset asset, bool isArchive) {
return updateAsset(asset, UpdateAssetDto(isArchived: isArchive));
}
}

View File

@@ -3,6 +3,7 @@ import 'dart:io';
import 'package:flutter/widgets.dart';
import 'package:immich_mobile/shared/models/logger_message.model.dart';
import 'package:immich_mobile/shared/models/store.dart';
import 'package:isar/isar.dart';
import 'package:logging/logging.dart';
import 'package:path_provider/path_provider.dart';
@@ -18,7 +19,7 @@ import 'package:share_plus/share_plus.dart';
/// and generate a csv file.
class ImmichLogger {
static final ImmichLogger _instance = ImmichLogger._internal();
final maxLogEntries = 200;
final maxLogEntries = 500;
final Isar _db = Isar.getInstance()!;
List<LoggerMessage> _msgBuffer = [];
Timer? _timer;
@@ -27,10 +28,13 @@ class ImmichLogger {
ImmichLogger._internal() {
_removeOverflowMessages();
Logger.root.level = Level.INFO;
final int levelId = Store.get(StoreKey.logLevel, 5); // 5 is INFO
Logger.root.level = Level.LEVELS[levelId];
Logger.root.onRecord.listen(_writeLogToDatabase);
}
set level(Level level) => Logger.root.level = level;
List<LoggerMessage> get messages {
final inDb =
_db.loggerMessages.where(sort: Sort.desc).anyId().findAllSync();

View File

@@ -9,6 +9,7 @@ import 'package:immich_mobile/shared/models/store.dart';
import 'package:immich_mobile/shared/models/user.dart';
import 'package:immich_mobile/shared/providers/db.provider.dart';
import 'package:immich_mobile/utils/async_mutex.dart';
import 'package:immich_mobile/utils/builtin_extensions.dart';
import 'package:immich_mobile/utils/diff.dart';
import 'package:immich_mobile/utils/tuple.dart';
import 'package:isar/isar.dart';
@@ -40,7 +41,7 @@ class SyncService {
dbUsers,
compare: (User a, User b) => a.id.compareTo(b.id),
both: (User a, User b) {
if (a.updatedAt != b.updatedAt) {
if (!a.updatedAt.isAtSameMomentAs(b.updatedAt)) {
toUpsert.add(a);
return true;
}
@@ -118,7 +119,7 @@ class SyncService {
// TODO instead of this heuristics: match by checksum once available
for (Asset a in inDb) {
if (a.ownerId == newAsset.ownerId &&
a.fileModifiedAt == newAsset.fileModifiedAt) {
a.fileModifiedAt.isAtSameMomentAs(newAsset.fileModifiedAt)) {
assert(match == null);
match = a;
}
@@ -135,7 +136,7 @@ class SyncService {
if (match != null) {
// unify local/remote assets by replacing the
// local-only asset in the DB with a local&remote asset
newAsset.updateFromDb(match);
newAsset = match.updatedCopy(newAsset);
}
try {
await _db.writeTxn(() => newAsset.put(_db));
@@ -277,7 +278,7 @@ class SyncService {
album.name = dto.albumName;
album.shared = dto.shared;
album.modifiedAt = DateTime.parse(dto.updatedAt).toUtc();
album.modifiedAt = DateTime.parse(dto.updatedAt);
if (album.thumbnail.value?.remoteId != dto.albumThumbnailAssetId) {
album.thumbnail.value = await _db.assets
.where()
@@ -389,7 +390,13 @@ class SyncService {
_addAlbumFromDevice(ape, existing, excludedAssets),
onlySecond: (Album a) => _removeAlbumFromDb(a, deleteCandidates),
);
_log.fine(
"Syncing all local albums almost done. Collected ${deleteCandidates.length} asset candidates to delete",
);
final pair = _handleAssetRemoval(deleteCandidates, existing, remote: false);
_log.fine(
"${pair.first.length} assets to delete, ${pair.second.length} to update",
);
if (pair.first.isNotEmpty || pair.second.isNotEmpty) {
await _db.writeTxn(() async {
await _db.assets.deleteAll(pair.first);
@@ -415,6 +422,7 @@ class SyncService {
bool forceRefresh = false,
]) async {
if (!forceRefresh && !await _hasAssetPathEntityChanged(ape, album)) {
_log.fine("Local album ${ape.name} has not changed. Skipping sync.");
return false;
}
if (!forceRefresh &&
@@ -439,15 +447,25 @@ class SyncService {
toUpdate.isEmpty &&
toDelete.isEmpty &&
album.name == ape.name &&
album.modifiedAt == ape.lastModified) {
ape.lastModified != null &&
album.modifiedAt.isAtSameMomentAs(ape.lastModified!)) {
// changes only affeted excluded albums
_log.fine(
"Only excluded assets in local album ${ape.name} changed. Stopping sync.",
);
return false;
}
_log.fine(
"Syncing local album ${ape.name}. ${toAdd.length} assets to add, ${toUpdate.length} to update, ${toDelete.length} to delete",
);
final result = await _linkWithExistingFromDb(toAdd);
_log.fine(
"Linking assets to add with existing from db. ${result.first.length} existing, ${result.second.length} to update",
);
deleteCandidates.addAll(toDelete);
existing.addAll(result.first);
album.name = ape.name;
album.modifiedAt = ape.lastModified!;
album.modifiedAt = ape.lastModified ?? DateTime.now();
if (album.thumbnail.value != null &&
toDelete.contains(album.thumbnail.value)) {
album.thumbnail.value = null;
@@ -462,9 +480,9 @@ class SyncService {
album.thumbnail.value ??= await album.assets.filter().findFirst();
await album.thumbnail.save();
});
_log.info("Synced changes of local album $ape to DB");
_log.info("Synced changes of local album ${ape.name} to DB");
} on IsarError catch (e) {
_log.severe("Failed to update synced album $ape in DB: $e");
_log.severe("Failed to update synced album ${ape.name} in DB: $e");
}
return true;
@@ -479,7 +497,7 @@ class SyncService {
filterOptionGroup: FilterOptionGroup(
updateTimeCond: DateTimeCond(
min: album.modifiedAt.add(const Duration(seconds: 1)),
max: ape.lastModified!,
max: ape.lastModified ?? DateTime.now(),
),
),
)
@@ -491,7 +509,7 @@ class SyncService {
if (totalOnDevice != album.assets.length + newAssets.length) {
return false;
}
album.modifiedAt = ape.lastModified!.toUtc();
album.modifiedAt = ape.lastModified ?? DateTime.now();
final result = await _linkWithExistingFromDb(newAssets);
try {
await _db.writeTxn(() async {
@@ -499,9 +517,9 @@ class SyncService {
await album.assets.update(link: result.first + result.second);
await _db.albums.put(album);
});
_log.info("Fast synced local album $ape to DB");
_log.info("Fast synced local album ${ape.name} to DB");
} on IsarError catch (e) {
_log.severe("Failed to fast sync local album $ape to DB: $e");
_log.severe("Failed to fast sync local album ${ape.name} to DB: $e");
return false;
}
@@ -515,11 +533,10 @@ class SyncService {
List<Asset> existing, [
Set<String>? excludedAssets,
]) async {
_log.info("Syncing a new local album to DB: $ape");
_log.info("Syncing a new local album to DB: ${ape.name}");
final Album a = Album.local(ape);
final result = await _linkWithExistingFromDb(
await ape.getAssets(excludedAssets: excludedAssets),
);
final assets = await ape.getAssets(excludedAssets: excludedAssets);
final result = await _linkWithExistingFromDb(assets);
_log.info(
"${result.first.length} assets already existed in DB, to upsert ${result.second.length}",
);
@@ -531,9 +548,9 @@ class SyncService {
a.thumbnail.value = thumb;
try {
await _db.writeTxn(() => _db.albums.store(a));
_log.info("Added a new local album to DB: $ape");
_log.info("Added a new local album to DB: ${ape.name}");
} on IsarError catch (e) {
_log.severe("Failed to add new local album $ape to DB: $e");
_log.severe("Failed to add new local album ${ape.name} to DB: $e");
}
}
@@ -564,17 +581,19 @@ class SyncService {
// client and server, thus never reaching "both" case below
compare: Asset.compareByOwnerDeviceLocalId,
both: (Asset a, Asset b) {
if ((a.isLocal || !b.isLocal) &&
(a.isRemote || !b.isRemote) &&
a.updatedAt == b.updatedAt) {
if (a.canUpdate(b)) {
toUpsert.add(a.updatedCopy(b));
return true;
} else {
existing.add(a);
return false;
} else {
toUpsert.add(b.updateFromDb(a));
return true;
}
},
onlyFirst: (Asset a) => {},
onlyFirst: (Asset a) => _log.finer(
"_linkWithExistingFromDb encountered asset only in DB: $a",
null,
StackTrace.current,
),
onlySecond: (Asset b) => toUpsert.add(b),
);
return Pair(existing, toUpsert);
@@ -618,10 +637,8 @@ Triple<List<Asset>, List<Asset>, List<Asset>> _diffAssets(
assets,
compare: compare,
both: (Asset a, Asset b) {
if (a.updatedAt.isBefore(b.updatedAt) ||
(!a.isLocal && b.isLocal) ||
(!a.isRemote && b.isRemote)) {
toUpdate.add(b.updateFromDb(a));
if (a.canUpdate(b)) {
toUpdate.add(a.updatedCopy(b));
return true;
}
return false;
@@ -656,20 +673,24 @@ Pair<List<int>, List<Asset>> _handleAssetRemoval(
return const Pair([], []);
}
deleteCandidates.sort(Asset.compareById);
deleteCandidates.uniqueConsecutive((a) => a.id);
existing.sort(Asset.compareById);
existing.uniqueConsecutive((a) => a.id);
final triple = _diffAssets(
existing,
deleteCandidates,
compare: Asset.compareById,
remote: remote,
);
assert(triple.first.isEmpty, "toAdd should be empty in _handleAssetRemoval");
return Pair(triple.third.map((e) => e.id).toList(), triple.second);
}
/// returns `true` if the albums differ on the surface
Future<bool> _hasAssetPathEntityChanged(AssetPathEntity a, Album b) async {
return a.name != b.name ||
a.lastModified != b.modifiedAt ||
a.lastModified == null ||
!a.lastModified!.isAtSameMomentAs(b.modifiedAt) ||
await a.assetCountAsync != b.assetCount;
}
@@ -680,5 +701,5 @@ bool _hasAlbumResponseDtoChanged(AlbumResponseDto dto, Album a) {
dto.albumThumbnailAssetId != a.thumbnail.value?.remoteId ||
dto.shared != a.shared ||
dto.sharedUsers.length != a.sharedUsers.length ||
DateTime.parse(dto.updatedAt).toUtc() != a.modifiedAt.toUtc();
!DateTime.parse(dto.updatedAt).isAtSameMomentAs(a.modifiedAt);
}

View File

@@ -18,3 +18,20 @@ extension DurationExtension on String {
return int.parse(this);
}
}
extension ListExtension<E> on List<E> {
List<E> uniqueConsecutive<T>([T Function(E element)? key]) {
key ??= (E e) => e as T;
int i = 1, j = 1;
for (; i < length; i++) {
if (key(this[i]) != key(this[i - 1])) {
if (i != j) {
this[j] = this[i];
}
j++;
}
}
length = length == 0 ? 0 : j;
return this;
}
}

View File

@@ -112,7 +112,9 @@ FutureOr<void> _migrateDuplicatedAssetsBox(Box<HiveDuplicatedAssets> box) {
Future<void> _migrateAppSettingsBox(Box box) async {
for (AppSettingsEnum s in AppSettingsEnum.values) {
await _migrateKey(box, s.hiveKey, s.storeKey);
if (s.hiveKey != null) {
await _migrateKey(box, s.hiveKey!, s.storeKey);
}
}
}

View File

@@ -0,0 +1,14 @@
import 'package:flutter/material.dart';
import 'package:immich_mobile/shared/models/asset.dart';
/// Returns the suitable [IconData] to represent an [Asset]s storage location
IconData storageIcon(Asset asset) {
switch (asset.storage) {
case AssetState.local:
return Icons.cloud_off_outlined;
case AssetState.remote:
return Icons.cloud_outlined;
case AssetState.merged:
return Icons.cloud_done_outlined;
}
}

View File

@@ -1,5 +1,5 @@
build:
flutter packages pub run build_runner build
flutter packages pub run build_runner build --delete-conflicting-outputs
watch:
flutter packages pub run build_runner watch --delete-conflicting-outputs

View File

@@ -1 +1 @@
6.0.1
6.5.0

View File

@@ -3,7 +3,7 @@ Immich API
This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 1.52.1
- API version: 1.53.0
- Build package: org.openapitools.codegen.languages.DartClientCodegen
## Requirements
@@ -39,16 +39,16 @@ Please follow the [installation procedure](#installation--usage) and then run th
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = APIKeyApi();
final aPIKeyCreateDto = APIKeyCreateDto(); // APIKeyCreateDto |
@@ -94,6 +94,7 @@ Class | Method | HTTP request | Description
*AssetApi* | [**downloadFiles**](doc//AssetApi.md#downloadfiles) | **POST** /asset/download-files |
*AssetApi* | [**downloadLibrary**](doc//AssetApi.md#downloadlibrary) | **GET** /asset/download-library |
*AssetApi* | [**getAllAssets**](doc//AssetApi.md#getallassets) | **GET** /asset |
*AssetApi* | [**getArchivedAssetCountByUserId**](doc//AssetApi.md#getarchivedassetcountbyuserid) | **GET** /asset/stat/archive |
*AssetApi* | [**getAssetById**](doc//AssetApi.md#getassetbyid) | **GET** /asset/assetById/{assetId} |
*AssetApi* | [**getAssetByTimeBucket**](doc//AssetApi.md#getassetbytimebucket) | **POST** /asset/time-bucket |
*AssetApi* | [**getAssetCountByTimeBucket**](doc//AssetApi.md#getassetcountbytimebucket) | **POST** /asset/count-by-time-bucket |

View File

@@ -21,21 +21,19 @@ Method | HTTP request | Description
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = APIKeyApi();
final aPIKeyCreateDto = APIKeyCreateDto(); // APIKeyCreateDto |
@@ -60,7 +58,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -74,21 +72,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = APIKeyApi();
final id = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -112,7 +108,7 @@ void (empty response body)
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -126,21 +122,19 @@ void (empty response body)
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = APIKeyApi();
final id = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -165,7 +159,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -179,21 +173,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = APIKeyApi();
@@ -214,7 +206,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -228,21 +220,19 @@ This endpoint does not need any parameter.
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = APIKeyApi();
final id = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -269,7 +259,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers

View File

@@ -28,21 +28,19 @@ Method | HTTP request | Description
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AlbumApi();
final albumId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -71,7 +69,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -85,21 +83,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AlbumApi();
final albumId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -126,7 +122,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -140,21 +136,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AlbumApi();
final createAlbumDto = CreateAlbumDto(); // CreateAlbumDto |
@@ -179,7 +173,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -193,21 +187,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AlbumApi();
final createAlbumShareLinkDto = CreateAlbumShareLinkDto(); // CreateAlbumShareLinkDto |
@@ -232,7 +224,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -246,21 +238,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AlbumApi();
final albumId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -284,7 +274,7 @@ void (empty response body)
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -294,33 +284,32 @@ void (empty response body)
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **downloadArchive**
> MultipartFile downloadArchive(albumId, skip, key)
> MultipartFile downloadArchive(albumId, name, skip, key)
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AlbumApi();
final albumId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
final name = name_example; // String |
final skip = 8.14; // num |
final key = key_example; // String |
try {
final result = api_instance.downloadArchive(albumId, skip, key);
final result = api_instance.downloadArchive(albumId, name, skip, key);
print(result);
} catch (e) {
print('Exception when calling AlbumApi->downloadArchive: $e\n');
@@ -332,6 +321,7 @@ try {
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**albumId** | **String**| |
**name** | **String**| | [optional]
**skip** | **num**| | [optional]
**key** | **String**| | [optional]
@@ -341,7 +331,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -355,21 +345,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AlbumApi();
@@ -390,7 +378,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -404,21 +392,19 @@ This endpoint does not need any parameter.
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AlbumApi();
final albumId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -445,7 +431,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -459,21 +445,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AlbumApi();
final shared = true; // bool |
@@ -500,7 +484,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -514,21 +498,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AlbumApi();
final albumId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -555,7 +537,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -569,21 +551,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AlbumApi();
final albumId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -609,7 +589,7 @@ void (empty response body)
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -623,21 +603,19 @@ void (empty response body)
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AlbumApi();
final albumId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -664,7 +642,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers

View File

@@ -18,6 +18,7 @@ Method | HTTP request | Description
[**downloadFiles**](AssetApi.md#downloadfiles) | **POST** /asset/download-files |
[**downloadLibrary**](AssetApi.md#downloadlibrary) | **GET** /asset/download-library |
[**getAllAssets**](AssetApi.md#getallassets) | **GET** /asset |
[**getArchivedAssetCountByUserId**](AssetApi.md#getarchivedassetcountbyuserid) | **GET** /asset/stat/archive |
[**getAssetById**](AssetApi.md#getassetbyid) | **GET** /asset/assetById/{assetId} |
[**getAssetByTimeBucket**](AssetApi.md#getassetbytimebucket) | **POST** /asset/time-bucket |
[**getAssetCountByTimeBucket**](AssetApi.md#getassetcountbytimebucket) | **POST** /asset/count-by-time-bucket |
@@ -39,21 +40,19 @@ Method | HTTP request | Description
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final addAssetsDto = AddAssetsDto(); // AddAssetsDto |
@@ -80,7 +79,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -99,16 +98,16 @@ Check duplicated asset before uploading - for Web upload used
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final checkDuplicateAssetDto = CheckDuplicateAssetDto(); // CheckDuplicateAssetDto |
@@ -135,7 +134,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -154,16 +153,16 @@ Checks if multiple assets exist on the server and returns all existing - used by
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final checkExistingAssetsDto = CheckExistingAssetsDto(); // CheckExistingAssetsDto |
@@ -188,7 +187,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -202,21 +201,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final createAssetsShareLinkDto = CreateAssetsShareLinkDto(); // CreateAssetsShareLinkDto |
@@ -241,7 +238,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -255,21 +252,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final deleteAssetDto = DeleteAssetDto(); // DeleteAssetDto |
@@ -294,7 +289,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -308,21 +303,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final assetId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -349,7 +342,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -363,21 +356,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final downloadFilesDto = DownloadFilesDto(); // DownloadFilesDto |
@@ -404,7 +395,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -414,7 +405,7 @@ Name | Type | Description | Notes
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **downloadLibrary**
> MultipartFile downloadLibrary(skip, key)
> MultipartFile downloadLibrary(name, skip, key)
@@ -423,23 +414,24 @@ Current this is not used in any UI element
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final name = name_example; // String |
final skip = 8.14; // num |
final key = key_example; // String |
try {
final result = api_instance.downloadLibrary(skip, key);
final result = api_instance.downloadLibrary(name, skip, key);
print(result);
} catch (e) {
print('Exception when calling AssetApi->downloadLibrary: $e\n');
@@ -450,6 +442,7 @@ try {
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**name** | **String**| | [optional]
**skip** | **num**| | [optional]
**key** | **String**| | [optional]
@@ -459,7 +452,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -469,7 +462,7 @@ Name | Type | Description | Notes
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **getAllAssets**
> List<AssetResponseDto> getAllAssets(isFavorite, skip, ifNoneMatch)
> List<AssetResponseDto> getAllAssets(isFavorite, isArchived, skip, ifNoneMatch)
@@ -478,24 +471,25 @@ Get all AssetEntity belong to the user
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final isFavorite = true; // bool |
final isArchived = true; // bool |
final skip = 8.14; // num |
final ifNoneMatch = ifNoneMatch_example; // String | ETag of data already cached on the client
try {
final result = api_instance.getAllAssets(isFavorite, skip, ifNoneMatch);
final result = api_instance.getAllAssets(isFavorite, isArchived, skip, ifNoneMatch);
print(result);
} catch (e) {
print('Exception when calling AssetApi->getAllAssets: $e\n');
@@ -507,6 +501,7 @@ try {
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**isFavorite** | **bool**| | [optional]
**isArchived** | **bool**| | [optional]
**skip** | **num**| | [optional]
**ifNoneMatch** | **String**| ETag of data already cached on the client | [optional]
@@ -516,7 +511,54 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
- **Content-Type**: Not defined
- **Accept**: application/json
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **getArchivedAssetCountByUserId**
> AssetCountByUserIdResponseDto getArchivedAssetCountByUserId()
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
final api_instance = AssetApi();
try {
final result = api_instance.getArchivedAssetCountByUserId();
print(result);
} catch (e) {
print('Exception when calling AssetApi->getArchivedAssetCountByUserId: $e\n');
}
```
### Parameters
This endpoint does not need any parameter.
### Return type
[**AssetCountByUserIdResponseDto**](AssetCountByUserIdResponseDto.md)
### Authorization
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -535,16 +577,16 @@ Get a single asset's information
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final assetId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -571,7 +613,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -585,21 +627,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final getAssetByTimeBucketDto = GetAssetByTimeBucketDto(); // GetAssetByTimeBucketDto |
@@ -624,7 +664,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -638,21 +678,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final getAssetCountByTimeBucketDto = GetAssetCountByTimeBucketDto(); // GetAssetCountByTimeBucketDto |
@@ -677,7 +715,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -691,21 +729,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
@@ -726,7 +762,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -740,21 +776,19 @@ This endpoint does not need any parameter.
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
@@ -775,7 +809,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -789,21 +823,19 @@ This endpoint does not need any parameter.
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final assetId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -832,7 +864,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -846,21 +878,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
@@ -881,7 +911,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -895,21 +925,19 @@ This endpoint does not need any parameter.
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
@@ -930,7 +958,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -949,16 +977,16 @@ Get all asset of a device that are in the database, ID only.
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final deviceId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -983,7 +1011,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -997,21 +1025,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final removeAssetsDto = RemoveAssetsDto(); // RemoveAssetsDto |
@@ -1038,7 +1064,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -1052,21 +1078,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final searchAssetDto = SearchAssetDto(); // SearchAssetDto |
@@ -1091,7 +1115,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -1105,21 +1129,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final assetId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -1150,7 +1172,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -1169,16 +1191,16 @@ Update an asset
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final assetId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -1205,7 +1227,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -1215,25 +1237,23 @@ Name | Type | Description | Notes
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **uploadFile**
> AssetFileUploadResponseDto uploadFile(assetType, assetData, deviceAssetId, deviceId, fileCreatedAt, fileModifiedAt, isFavorite, fileExtension, key, livePhotoData, isVisible, duration)
> AssetFileUploadResponseDto uploadFile(assetType, assetData, deviceAssetId, deviceId, fileCreatedAt, fileModifiedAt, isFavorite, fileExtension, key, livePhotoData, isArchived, isVisible, duration)
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AssetApi();
final assetType = ; // AssetTypeEnum |
@@ -1246,11 +1266,12 @@ final isFavorite = true; // bool |
final fileExtension = fileExtension_example; // String |
final key = key_example; // String |
final livePhotoData = BINARY_DATA_HERE; // MultipartFile |
final isArchived = true; // bool |
final isVisible = true; // bool |
final duration = duration_example; // String |
try {
final result = api_instance.uploadFile(assetType, assetData, deviceAssetId, deviceId, fileCreatedAt, fileModifiedAt, isFavorite, fileExtension, key, livePhotoData, isVisible, duration);
final result = api_instance.uploadFile(assetType, assetData, deviceAssetId, deviceId, fileCreatedAt, fileModifiedAt, isFavorite, fileExtension, key, livePhotoData, isArchived, isVisible, duration);
print(result);
} catch (e) {
print('Exception when calling AssetApi->uploadFile: $e\n');
@@ -1271,6 +1292,7 @@ Name | Type | Description | Notes
**fileExtension** | **String**| |
**key** | **String**| | [optional]
**livePhotoData** | **MultipartFile**| | [optional]
**isArchived** | **bool**| | [optional]
**isVisible** | **bool**| | [optional]
**duration** | **String**| | [optional]
@@ -1280,7 +1302,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers

View File

@@ -14,11 +14,13 @@ Name | Type | Description | Notes
**ownerId** | **String** | |
**deviceId** | **String** | |
**originalPath** | **String** | |
**originalFileName** | **String** | |
**resizePath** | **String** | |
**fileCreatedAt** | **String** | |
**fileModifiedAt** | **String** | |
**updatedAt** | **String** | |
**isFavorite** | **bool** | |
**isArchived** | **bool** | |
**mimeType** | **String** | |
**duration** | **String** | |
**webpPath** | **String** | |

View File

@@ -21,8 +21,6 @@ Method | HTTP request | Description
### Example
```dart
import 'package:openapi/api.dart';
@@ -64,21 +62,19 @@ No authorization required
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AuthenticationApi();
final changePasswordDto = ChangePasswordDto(); // ChangePasswordDto |
@@ -103,7 +99,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -117,8 +113,6 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
@@ -160,21 +154,19 @@ No authorization required
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AuthenticationApi();
@@ -195,7 +187,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -209,21 +201,19 @@ This endpoint does not need any parameter.
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = AuthenticationApi();
@@ -244,7 +234,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers

View File

@@ -9,7 +9,7 @@ import 'package:openapi/api.dart';
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**albumId** | **String** | |
**expiresAt** | **String** | | [optional]
**expiresAt** | [**DateTime**](DateTime.md) | | [optional]
**allowUpload** | **bool** | | [optional]
**allowDownload** | **bool** | | [optional]
**showExif** | **bool** | | [optional]

View File

@@ -17,21 +17,19 @@ Method | HTTP request | Description
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = DeviceInfoApi();
final upsertDeviceInfoDto = UpsertDeviceInfoDto(); // UpsertDeviceInfoDto |
@@ -56,7 +54,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers

View File

@@ -11,7 +11,6 @@ Name | Type | Description | Notes
**fileSizeInByte** | **int** | | [optional]
**make** | **String** | | [optional]
**model** | **String** | | [optional]
**imageName** | **String** | | [optional]
**exifImageWidth** | **num** | | [optional]
**exifImageHeight** | **num** | | [optional]
**orientation** | **String** | | [optional]
@@ -28,6 +27,7 @@ Name | Type | Description | Notes
**city** | **String** | | [optional]
**state** | **String** | | [optional]
**country** | **String** | | [optional]
**description** | **String** | | [optional]
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -18,21 +18,19 @@ Method | HTTP request | Description
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = JobApi();
@@ -53,7 +51,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -67,21 +65,19 @@ This endpoint does not need any parameter.
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = JobApi();
final jobId = ; // JobName |
@@ -108,7 +104,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers

View File

@@ -21,8 +21,6 @@ Method | HTTP request | Description
### Example
```dart
import 'package:openapi/api.dart';
@@ -64,8 +62,6 @@ No authorization required
### Example
```dart
import 'package:openapi/api.dart';
@@ -107,21 +103,19 @@ No authorization required
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = OAuthApi();
final oAuthCallbackDto = OAuthCallbackDto(); // OAuthCallbackDto |
@@ -146,7 +140,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -160,8 +154,6 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
@@ -198,21 +190,19 @@ No authorization required
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = OAuthApi();
@@ -233,7 +223,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers

View File

@@ -19,21 +19,19 @@ Method | HTTP request | Description
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = SearchApi();
@@ -54,7 +52,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -68,21 +66,19 @@ This endpoint does not need any parameter.
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = SearchApi();
@@ -103,7 +99,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -113,25 +109,23 @@ This endpoint does not need any parameter.
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **search**
> SearchResponseDto search(q, query, clip, type, isFavorite, exifInfoPeriodCity, exifInfoPeriodState, exifInfoPeriodCountry, exifInfoPeriodMake, exifInfoPeriodModel, smartInfoPeriodObjects, smartInfoPeriodTags, recent, motion)
> SearchResponseDto search(q, query, clip, type, isFavorite, isArchived, exifInfoPeriodCity, exifInfoPeriodState, exifInfoPeriodCountry, exifInfoPeriodMake, exifInfoPeriodModel, smartInfoPeriodObjects, smartInfoPeriodTags, recent, motion)
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = SearchApi();
final q = q_example; // String |
@@ -139,6 +133,7 @@ final query = query_example; // String |
final clip = true; // bool |
final type = type_example; // String |
final isFavorite = true; // bool |
final isArchived = true; // bool |
final exifInfoPeriodCity = exifInfoPeriodCity_example; // String |
final exifInfoPeriodState = exifInfoPeriodState_example; // String |
final exifInfoPeriodCountry = exifInfoPeriodCountry_example; // String |
@@ -150,7 +145,7 @@ final recent = true; // bool |
final motion = true; // bool |
try {
final result = api_instance.search(q, query, clip, type, isFavorite, exifInfoPeriodCity, exifInfoPeriodState, exifInfoPeriodCountry, exifInfoPeriodMake, exifInfoPeriodModel, smartInfoPeriodObjects, smartInfoPeriodTags, recent, motion);
final result = api_instance.search(q, query, clip, type, isFavorite, isArchived, exifInfoPeriodCity, exifInfoPeriodState, exifInfoPeriodCountry, exifInfoPeriodMake, exifInfoPeriodModel, smartInfoPeriodObjects, smartInfoPeriodTags, recent, motion);
print(result);
} catch (e) {
print('Exception when calling SearchApi->search: $e\n');
@@ -166,6 +161,7 @@ Name | Type | Description | Notes
**clip** | **bool**| | [optional]
**type** | **String**| | [optional]
**isFavorite** | **bool**| | [optional]
**isArchived** | **bool**| | [optional]
**exifInfoPeriodCity** | **String**| | [optional]
**exifInfoPeriodState** | **String**| | [optional]
**exifInfoPeriodCountry** | **String**| | [optional]
@@ -182,7 +178,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers

View File

@@ -20,21 +20,19 @@ Method | HTTP request | Description
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = ServerInfoApi();
@@ -55,7 +53,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -69,8 +67,6 @@ This endpoint does not need any parameter.
### Example
```dart
import 'package:openapi/api.dart';
@@ -108,21 +104,19 @@ No authorization required
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = ServerInfoApi();
@@ -143,7 +137,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -157,8 +151,6 @@ This endpoint does not need any parameter.
### Example
```dart
import 'package:openapi/api.dart';

View File

@@ -21,21 +21,19 @@ Method | HTTP request | Description
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = ShareApi();
final id = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -62,7 +60,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -76,21 +74,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = ShareApi();
@@ -111,7 +107,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -125,21 +121,19 @@ This endpoint does not need any parameter.
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = ShareApi();
final key = key_example; // String |
@@ -164,7 +158,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -178,21 +172,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = ShareApi();
final id = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -217,7 +209,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -231,21 +223,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = ShareApi();
final id = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -269,7 +259,7 @@ void (empty response body)
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers

View File

@@ -20,21 +20,19 @@ Method | HTTP request | Description
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = SystemConfigApi();
@@ -55,7 +53,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -69,21 +67,19 @@ This endpoint does not need any parameter.
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = SystemConfigApi();
@@ -104,7 +100,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -118,21 +114,19 @@ This endpoint does not need any parameter.
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = SystemConfigApi();
@@ -153,7 +147,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -167,21 +161,19 @@ This endpoint does not need any parameter.
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = SystemConfigApi();
final systemConfigDto = SystemConfigDto(); // SystemConfigDto |
@@ -206,7 +198,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers

View File

@@ -21,21 +21,19 @@ Method | HTTP request | Description
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = TagApi();
final createTagDto = CreateTagDto(); // CreateTagDto |
@@ -60,7 +58,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -74,21 +72,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = TagApi();
final id = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -112,7 +108,7 @@ void (empty response body)
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -126,21 +122,19 @@ void (empty response body)
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = TagApi();
@@ -161,7 +155,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -175,21 +169,19 @@ This endpoint does not need any parameter.
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = TagApi();
final id = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -214,7 +206,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -228,21 +220,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = TagApi();
final id = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -269,7 +259,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers

View File

@@ -10,6 +10,8 @@ Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**tagIds** | **List<String>** | | [optional] [default to const []]
**isFavorite** | **bool** | | [optional]
**isArchived** | **bool** | | [optional]
**description** | **String** | | [optional]
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -26,21 +26,19 @@ Method | HTTP request | Description
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = UserApi();
final file = BINARY_DATA_HERE; // MultipartFile |
@@ -65,7 +63,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -79,21 +77,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = UserApi();
final createUserDto = CreateUserDto(); // CreateUserDto |
@@ -118,7 +114,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -132,21 +128,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = UserApi();
final userId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -171,7 +165,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -185,21 +179,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = UserApi();
final isAll = true; // bool |
@@ -224,7 +216,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -238,21 +230,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = UserApi();
@@ -273,7 +263,7 @@ This endpoint does not need any parameter.
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -287,21 +277,19 @@ This endpoint does not need any parameter.
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = UserApi();
final userId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -326,7 +314,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -340,21 +328,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = UserApi();
final userId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -379,7 +365,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -393,8 +379,6 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
@@ -436,21 +420,19 @@ No authorization required
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = UserApi();
final userId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
@@ -475,7 +457,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers
@@ -489,21 +471,19 @@ Name | Type | Description | Notes
### Example
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication<ApiKeyAuth>('cookie').apiKeyPrefix = 'Bearer';
final api_instance = UserApi();
final updateUserDto = UpdateUserDto(); // UpdateUserDto |
@@ -528,7 +508,7 @@ Name | Type | Description | Notes
### Authorization
[bearer](../README.md#bearer), [cookie](../README.md#cookie)
[cookie](../README.md#cookie), [bearer](../README.md#bearer)
### HTTP request headers

View File

@@ -16,10 +16,7 @@ class AlbumApi {
final ApiClient apiClient;
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'PUT /album/{albumId}/assets' operation and returns the [Response].
/// Parameters:
///
/// * [String] albumId (required):
@@ -57,8 +54,6 @@ class AlbumApi {
);
}
///
///
/// Parameters:
///
/// * [String] albumId (required):
@@ -81,10 +76,7 @@ class AlbumApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'PUT /album/{albumId}/users' operation and returns the [Response].
/// Parameters:
///
/// * [String] albumId (required):
@@ -116,8 +108,6 @@ class AlbumApi {
);
}
///
///
/// Parameters:
///
/// * [String] albumId (required):
@@ -138,10 +128,7 @@ class AlbumApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'POST /album' operation and returns the [Response].
/// Parameters:
///
/// * [CreateAlbumDto] createAlbumDto (required):
@@ -170,8 +157,6 @@ class AlbumApi {
);
}
///
///
/// Parameters:
///
/// * [CreateAlbumDto] createAlbumDto (required):
@@ -190,10 +175,7 @@ class AlbumApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'POST /album/create-shared-link' operation and returns the [Response].
/// Parameters:
///
/// * [CreateAlbumShareLinkDto] createAlbumShareLinkDto (required):
@@ -222,8 +204,6 @@ class AlbumApi {
);
}
///
///
/// Parameters:
///
/// * [CreateAlbumShareLinkDto] createAlbumShareLinkDto (required):
@@ -242,10 +222,7 @@ class AlbumApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'DELETE /album/{albumId}' operation and returns the [Response].
/// Parameters:
///
/// * [String] albumId (required):
@@ -275,8 +252,6 @@ class AlbumApi {
);
}
///
///
/// Parameters:
///
/// * [String] albumId (required):
@@ -287,18 +262,17 @@ class AlbumApi {
}
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'GET /album/{albumId}/download' operation and returns the [Response].
/// Parameters:
///
/// * [String] albumId (required):
///
/// * [String] name:
///
/// * [num] skip:
///
/// * [String] key:
Future<Response> downloadArchiveWithHttpInfo(String albumId, { num? skip, String? key, }) async {
Future<Response> downloadArchiveWithHttpInfo(String albumId, { String? name, num? skip, String? key, }) async {
// ignore: prefer_const_declarations
final path = r'/album/{albumId}/download'
.replaceAll('{albumId}', albumId);
@@ -310,6 +284,9 @@ class AlbumApi {
final headerParams = <String, String>{};
final formParams = <String, String>{};
if (name != null) {
queryParams.addAll(_queryParams('', 'name', name));
}
if (skip != null) {
queryParams.addAll(_queryParams('', 'skip', skip));
}
@@ -331,17 +308,17 @@ class AlbumApi {
);
}
///
///
/// Parameters:
///
/// * [String] albumId (required):
///
/// * [String] name:
///
/// * [num] skip:
///
/// * [String] key:
Future<MultipartFile?> downloadArchive(String albumId, { num? skip, String? key, }) async {
final response = await downloadArchiveWithHttpInfo(albumId, skip: skip, key: key, );
Future<MultipartFile?> downloadArchive(String albumId, { String? name, num? skip, String? key, }) async {
final response = await downloadArchiveWithHttpInfo(albumId, name: name, skip: skip, key: key, );
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
@@ -355,9 +332,7 @@ class AlbumApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
/// Performs an HTTP 'GET /album/count-by-user-id' operation and returns the [Response].
Future<Response> getAlbumCountByUserIdWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/album/count-by-user-id';
@@ -383,7 +358,6 @@ class AlbumApi {
);
}
///
Future<AlbumCountResponseDto?> getAlbumCountByUserId() async {
final response = await getAlbumCountByUserIdWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
@@ -399,10 +373,7 @@ class AlbumApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'GET /album/{albumId}' operation and returns the [Response].
/// Parameters:
///
/// * [String] albumId (required):
@@ -438,8 +409,6 @@ class AlbumApi {
);
}
///
///
/// Parameters:
///
/// * [String] albumId (required):
@@ -460,10 +429,7 @@ class AlbumApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'GET /album' operation and returns the [Response].
/// Parameters:
///
/// * [bool] shared:
@@ -502,8 +468,6 @@ class AlbumApi {
);
}
///
///
/// Parameters:
///
/// * [bool] shared:
@@ -528,10 +492,7 @@ class AlbumApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'DELETE /album/{albumId}/assets' operation and returns the [Response].
/// Parameters:
///
/// * [String] albumId (required):
@@ -563,8 +524,6 @@ class AlbumApi {
);
}
///
///
/// Parameters:
///
/// * [String] albumId (required):
@@ -585,10 +544,7 @@ class AlbumApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'DELETE /album/{albumId}/user/{userId}' operation and returns the [Response].
/// Parameters:
///
/// * [String] albumId (required):
@@ -621,8 +577,6 @@ class AlbumApi {
);
}
///
///
/// Parameters:
///
/// * [String] albumId (required):
@@ -635,10 +589,7 @@ class AlbumApi {
}
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'PATCH /album/{albumId}' operation and returns the [Response].
/// Parameters:
///
/// * [String] albumId (required):
@@ -670,8 +621,6 @@ class AlbumApi {
);
}
///
///
/// Parameters:
///
/// * [String] albumId (required):

View File

@@ -16,10 +16,7 @@ class APIKeyApi {
final ApiClient apiClient;
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'POST /api-key' operation and returns the [Response].
/// Parameters:
///
/// * [APIKeyCreateDto] aPIKeyCreateDto (required):
@@ -48,8 +45,6 @@ class APIKeyApi {
);
}
///
///
/// Parameters:
///
/// * [APIKeyCreateDto] aPIKeyCreateDto (required):
@@ -68,10 +63,7 @@ class APIKeyApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'DELETE /api-key/{id}' operation and returns the [Response].
/// Parameters:
///
/// * [String] id (required):
@@ -101,8 +93,6 @@ class APIKeyApi {
);
}
///
///
/// Parameters:
///
/// * [String] id (required):
@@ -113,10 +103,7 @@ class APIKeyApi {
}
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'GET /api-key/{id}' operation and returns the [Response].
/// Parameters:
///
/// * [String] id (required):
@@ -146,8 +133,6 @@ class APIKeyApi {
);
}
///
///
/// Parameters:
///
/// * [String] id (required):
@@ -166,9 +151,7 @@ class APIKeyApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
/// Performs an HTTP 'GET /api-key' operation and returns the [Response].
Future<Response> getKeysWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/api-key';
@@ -194,7 +177,6 @@ class APIKeyApi {
);
}
///
Future<List<APIKeyResponseDto>?> getKeys() async {
final response = await getKeysWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
@@ -213,10 +195,7 @@ class APIKeyApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'PUT /api-key/{id}' operation and returns the [Response].
/// Parameters:
///
/// * [String] id (required):
@@ -248,8 +227,6 @@ class APIKeyApi {
);
}
///
///
/// Parameters:
///
/// * [String] id (required):

View File

@@ -16,10 +16,7 @@ class AssetApi {
final ApiClient apiClient;
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'PATCH /asset/shared-link/add' operation and returns the [Response].
/// Parameters:
///
/// * [AddAssetsDto] addAssetsDto (required):
@@ -54,8 +51,6 @@ class AssetApi {
);
}
///
///
/// Parameters:
///
/// * [AddAssetsDto] addAssetsDto (required):
@@ -188,10 +183,7 @@ class AssetApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'POST /asset/shared-link' operation and returns the [Response].
/// Parameters:
///
/// * [CreateAssetsShareLinkDto] createAssetsShareLinkDto (required):
@@ -220,8 +212,6 @@ class AssetApi {
);
}
///
///
/// Parameters:
///
/// * [CreateAssetsShareLinkDto] createAssetsShareLinkDto (required):
@@ -240,10 +230,7 @@ class AssetApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'DELETE /asset' operation and returns the [Response].
/// Parameters:
///
/// * [DeleteAssetDto] deleteAssetDto (required):
@@ -272,8 +259,6 @@ class AssetApi {
);
}
///
///
/// Parameters:
///
/// * [DeleteAssetDto] deleteAssetDto (required):
@@ -295,10 +280,7 @@ class AssetApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'GET /asset/download/{assetId}' operation and returns the [Response].
/// Parameters:
///
/// * [String] assetId (required):
@@ -334,8 +316,6 @@ class AssetApi {
);
}
///
///
/// Parameters:
///
/// * [String] assetId (required):
@@ -356,10 +336,7 @@ class AssetApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'POST /asset/download-files' operation and returns the [Response].
/// Parameters:
///
/// * [DownloadFilesDto] downloadFilesDto (required):
@@ -394,8 +371,6 @@ class AssetApi {
);
}
///
///
/// Parameters:
///
/// * [DownloadFilesDto] downloadFilesDto (required):
@@ -422,10 +397,12 @@ class AssetApi {
///
/// Parameters:
///
/// * [String] name:
///
/// * [num] skip:
///
/// * [String] key:
Future<Response> downloadLibraryWithHttpInfo({ num? skip, String? key, }) async {
Future<Response> downloadLibraryWithHttpInfo({ String? name, num? skip, String? key, }) async {
// ignore: prefer_const_declarations
final path = r'/asset/download-library';
@@ -436,6 +413,9 @@ class AssetApi {
final headerParams = <String, String>{};
final formParams = <String, String>{};
if (name != null) {
queryParams.addAll(_queryParams('', 'name', name));
}
if (skip != null) {
queryParams.addAll(_queryParams('', 'skip', skip));
}
@@ -461,11 +441,13 @@ class AssetApi {
///
/// Parameters:
///
/// * [String] name:
///
/// * [num] skip:
///
/// * [String] key:
Future<MultipartFile?> downloadLibrary({ num? skip, String? key, }) async {
final response = await downloadLibraryWithHttpInfo( skip: skip, key: key, );
Future<MultipartFile?> downloadLibrary({ String? name, num? skip, String? key, }) async {
final response = await downloadLibraryWithHttpInfo( name: name, skip: skip, key: key, );
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
@@ -487,11 +469,13 @@ class AssetApi {
///
/// * [bool] isFavorite:
///
/// * [bool] isArchived:
///
/// * [num] skip:
///
/// * [String] ifNoneMatch:
/// ETag of data already cached on the client
Future<Response> getAllAssetsWithHttpInfo({ bool? isFavorite, num? skip, String? ifNoneMatch, }) async {
Future<Response> getAllAssetsWithHttpInfo({ bool? isFavorite, bool? isArchived, num? skip, String? ifNoneMatch, }) async {
// ignore: prefer_const_declarations
final path = r'/asset';
@@ -505,6 +489,9 @@ class AssetApi {
if (isFavorite != null) {
queryParams.addAll(_queryParams('', 'isFavorite', isFavorite));
}
if (isArchived != null) {
queryParams.addAll(_queryParams('', 'isArchived', isArchived));
}
if (skip != null) {
queryParams.addAll(_queryParams('', 'skip', skip));
}
@@ -533,12 +520,14 @@ class AssetApi {
///
/// * [bool] isFavorite:
///
/// * [bool] isArchived:
///
/// * [num] skip:
///
/// * [String] ifNoneMatch:
/// ETag of data already cached on the client
Future<List<AssetResponseDto>?> getAllAssets({ bool? isFavorite, num? skip, String? ifNoneMatch, }) async {
final response = await getAllAssetsWithHttpInfo( isFavorite: isFavorite, skip: skip, ifNoneMatch: ifNoneMatch, );
Future<List<AssetResponseDto>?> getAllAssets({ bool? isFavorite, bool? isArchived, num? skip, String? ifNoneMatch, }) async {
final response = await getAllAssetsWithHttpInfo( isFavorite: isFavorite, isArchived: isArchived, skip: skip, ifNoneMatch: ifNoneMatch, );
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
@@ -555,6 +544,47 @@ class AssetApi {
return null;
}
/// Performs an HTTP 'GET /asset/stat/archive' operation and returns the [Response].
Future<Response> getArchivedAssetCountByUserIdWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/asset/stat/archive';
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
path,
'GET',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
);
}
Future<AssetCountByUserIdResponseDto?> getArchivedAssetCountByUserId() async {
final response = await getArchivedAssetCountByUserIdWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AssetCountByUserIdResponseDto',) as AssetCountByUserIdResponseDto;
}
return null;
}
/// Get a single asset's information
///
/// Note: This method returns the HTTP [Response].
@@ -616,10 +646,7 @@ class AssetApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'POST /asset/time-bucket' operation and returns the [Response].
/// Parameters:
///
/// * [GetAssetByTimeBucketDto] getAssetByTimeBucketDto (required):
@@ -648,8 +675,6 @@ class AssetApi {
);
}
///
///
/// Parameters:
///
/// * [GetAssetByTimeBucketDto] getAssetByTimeBucketDto (required):
@@ -671,10 +696,7 @@ class AssetApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'POST /asset/count-by-time-bucket' operation and returns the [Response].
/// Parameters:
///
/// * [GetAssetCountByTimeBucketDto] getAssetCountByTimeBucketDto (required):
@@ -703,8 +725,6 @@ class AssetApi {
);
}
///
///
/// Parameters:
///
/// * [GetAssetCountByTimeBucketDto] getAssetCountByTimeBucketDto (required):
@@ -723,9 +743,7 @@ class AssetApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
/// Performs an HTTP 'GET /asset/count-by-user-id' operation and returns the [Response].
Future<Response> getAssetCountByUserIdWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/asset/count-by-user-id';
@@ -751,7 +769,6 @@ class AssetApi {
);
}
///
Future<AssetCountByUserIdResponseDto?> getAssetCountByUserId() async {
final response = await getAssetCountByUserIdWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
@@ -767,9 +784,7 @@ class AssetApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
/// Performs an HTTP 'GET /asset/search-terms' operation and returns the [Response].
Future<Response> getAssetSearchTermsWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/asset/search-terms';
@@ -795,7 +810,6 @@ class AssetApi {
);
}
///
Future<List<String>?> getAssetSearchTerms() async {
final response = await getAssetSearchTermsWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
@@ -814,10 +828,7 @@ class AssetApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'GET /asset/thumbnail/{assetId}' operation and returns the [Response].
/// Parameters:
///
/// * [String] assetId (required):
@@ -858,8 +869,6 @@ class AssetApi {
);
}
///
///
/// Parameters:
///
/// * [String] assetId (required):
@@ -882,9 +891,7 @@ class AssetApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
/// Performs an HTTP 'GET /asset/curated-locations' operation and returns the [Response].
Future<Response> getCuratedLocationsWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/asset/curated-locations';
@@ -910,7 +917,6 @@ class AssetApi {
);
}
///
Future<List<CuratedLocationsResponseDto>?> getCuratedLocations() async {
final response = await getCuratedLocationsWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
@@ -929,9 +935,7 @@ class AssetApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
/// Performs an HTTP 'GET /asset/curated-objects' operation and returns the [Response].
Future<Response> getCuratedObjectsWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/asset/curated-objects';
@@ -957,7 +961,6 @@ class AssetApi {
);
}
///
Future<List<CuratedObjectsResponseDto>?> getCuratedObjects() async {
final response = await getCuratedObjectsWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
@@ -1032,10 +1035,7 @@ class AssetApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'PATCH /asset/shared-link/remove' operation and returns the [Response].
/// Parameters:
///
/// * [RemoveAssetsDto] removeAssetsDto (required):
@@ -1070,8 +1070,6 @@ class AssetApi {
);
}
///
///
/// Parameters:
///
/// * [RemoveAssetsDto] removeAssetsDto (required):
@@ -1092,10 +1090,7 @@ class AssetApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'POST /asset/search' operation and returns the [Response].
/// Parameters:
///
/// * [SearchAssetDto] searchAssetDto (required):
@@ -1124,8 +1119,6 @@ class AssetApi {
);
}
///
///
/// Parameters:
///
/// * [SearchAssetDto] searchAssetDto (required):
@@ -1147,10 +1140,7 @@ class AssetApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'GET /asset/file/{assetId}' operation and returns the [Response].
/// Parameters:
///
/// * [String] assetId (required):
@@ -1196,8 +1186,6 @@ class AssetApi {
);
}
///
///
/// Parameters:
///
/// * [String] assetId (required):
@@ -1279,10 +1267,7 @@ class AssetApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'POST /asset/upload' operation and returns the [Response].
/// Parameters:
///
/// * [AssetTypeEnum] assetType (required):
@@ -1305,10 +1290,12 @@ class AssetApi {
///
/// * [MultipartFile] livePhotoData:
///
/// * [bool] isArchived:
///
/// * [bool] isVisible:
///
/// * [String] duration:
Future<Response> uploadFileWithHttpInfo(AssetTypeEnum assetType, MultipartFile assetData, String deviceAssetId, String deviceId, String fileCreatedAt, String fileModifiedAt, bool isFavorite, String fileExtension, { String? key, MultipartFile? livePhotoData, bool? isVisible, String? duration, }) async {
Future<Response> uploadFileWithHttpInfo(AssetTypeEnum assetType, MultipartFile assetData, String deviceAssetId, String deviceId, String fileCreatedAt, String fileModifiedAt, bool isFavorite, String fileExtension, { String? key, MultipartFile? livePhotoData, bool? isArchived, bool? isVisible, String? duration, }) async {
// ignore: prefer_const_declarations
final path = r'/asset/upload';
@@ -1361,6 +1348,10 @@ class AssetApi {
hasFields = true;
mp.fields[r'isFavorite'] = parameterToString(isFavorite);
}
if (isArchived != null) {
hasFields = true;
mp.fields[r'isArchived'] = parameterToString(isArchived);
}
if (isVisible != null) {
hasFields = true;
mp.fields[r'isVisible'] = parameterToString(isVisible);
@@ -1388,8 +1379,6 @@ class AssetApi {
);
}
///
///
/// Parameters:
///
/// * [AssetTypeEnum] assetType (required):
@@ -1412,11 +1401,13 @@ class AssetApi {
///
/// * [MultipartFile] livePhotoData:
///
/// * [bool] isArchived:
///
/// * [bool] isVisible:
///
/// * [String] duration:
Future<AssetFileUploadResponseDto?> uploadFile(AssetTypeEnum assetType, MultipartFile assetData, String deviceAssetId, String deviceId, String fileCreatedAt, String fileModifiedAt, bool isFavorite, String fileExtension, { String? key, MultipartFile? livePhotoData, bool? isVisible, String? duration, }) async {
final response = await uploadFileWithHttpInfo(assetType, assetData, deviceAssetId, deviceId, fileCreatedAt, fileModifiedAt, isFavorite, fileExtension, key: key, livePhotoData: livePhotoData, isVisible: isVisible, duration: duration, );
Future<AssetFileUploadResponseDto?> uploadFile(AssetTypeEnum assetType, MultipartFile assetData, String deviceAssetId, String deviceId, String fileCreatedAt, String fileModifiedAt, bool isFavorite, String fileExtension, { String? key, MultipartFile? livePhotoData, bool? isArchived, bool? isVisible, String? duration, }) async {
final response = await uploadFileWithHttpInfo(assetType, assetData, deviceAssetId, deviceId, fileCreatedAt, fileModifiedAt, isFavorite, fileExtension, key: key, livePhotoData: livePhotoData, isArchived: isArchived, isVisible: isVisible, duration: duration, );
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}

View File

@@ -16,10 +16,7 @@ class AuthenticationApi {
final ApiClient apiClient;
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'POST /auth/admin-sign-up' operation and returns the [Response].
/// Parameters:
///
/// * [SignUpDto] signUpDto (required):
@@ -48,8 +45,6 @@ class AuthenticationApi {
);
}
///
///
/// Parameters:
///
/// * [SignUpDto] signUpDto (required):
@@ -68,10 +63,7 @@ class AuthenticationApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'POST /auth/change-password' operation and returns the [Response].
/// Parameters:
///
/// * [ChangePasswordDto] changePasswordDto (required):
@@ -100,8 +92,6 @@ class AuthenticationApi {
);
}
///
///
/// Parameters:
///
/// * [ChangePasswordDto] changePasswordDto (required):
@@ -120,10 +110,7 @@ class AuthenticationApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'POST /auth/login' operation and returns the [Response].
/// Parameters:
///
/// * [LoginCredentialDto] loginCredentialDto (required):
@@ -152,8 +139,6 @@ class AuthenticationApi {
);
}
///
///
/// Parameters:
///
/// * [LoginCredentialDto] loginCredentialDto (required):
@@ -172,9 +157,7 @@ class AuthenticationApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
/// Performs an HTTP 'POST /auth/logout' operation and returns the [Response].
Future<Response> logoutWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/auth/logout';
@@ -200,7 +183,6 @@ class AuthenticationApi {
);
}
///
Future<LogoutResponseDto?> logout() async {
final response = await logoutWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
@@ -216,9 +198,7 @@ class AuthenticationApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
/// Performs an HTTP 'POST /auth/validateToken' operation and returns the [Response].
Future<Response> validateAccessTokenWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/auth/validateToken';
@@ -244,7 +224,6 @@ class AuthenticationApi {
);
}
///
Future<ValidateAccessTokenResponseDto?> validateAccessToken() async {
final response = await validateAccessTokenWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {

View File

@@ -16,10 +16,7 @@ class DeviceInfoApi {
final ApiClient apiClient;
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'PUT /device-info' operation and returns the [Response].
/// Parameters:
///
/// * [UpsertDeviceInfoDto] upsertDeviceInfoDto (required):
@@ -48,8 +45,6 @@ class DeviceInfoApi {
);
}
///
///
/// Parameters:
///
/// * [UpsertDeviceInfoDto] upsertDeviceInfoDto (required):

View File

@@ -16,9 +16,7 @@ class JobApi {
final ApiClient apiClient;
///
///
/// Note: This method returns the HTTP [Response].
/// Performs an HTTP 'GET /jobs' operation and returns the [Response].
Future<Response> getAllJobsStatusWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/jobs';
@@ -44,7 +42,6 @@ class JobApi {
);
}
///
Future<AllJobStatusResponseDto?> getAllJobsStatus() async {
final response = await getAllJobsStatusWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
@@ -60,10 +57,7 @@ class JobApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'PUT /jobs/{jobId}' operation and returns the [Response].
/// Parameters:
///
/// * [JobName] jobId (required):
@@ -95,8 +89,6 @@ class JobApi {
);
}
///
///
/// Parameters:
///
/// * [JobName] jobId (required):

View File

@@ -16,10 +16,7 @@ class OAuthApi {
final ApiClient apiClient;
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'POST /oauth/callback' operation and returns the [Response].
/// Parameters:
///
/// * [OAuthCallbackDto] oAuthCallbackDto (required):
@@ -48,8 +45,6 @@ class OAuthApi {
);
}
///
///
/// Parameters:
///
/// * [OAuthCallbackDto] oAuthCallbackDto (required):
@@ -68,10 +63,7 @@ class OAuthApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'POST /oauth/config' operation and returns the [Response].
/// Parameters:
///
/// * [OAuthConfigDto] oAuthConfigDto (required):
@@ -100,8 +92,6 @@ class OAuthApi {
);
}
///
///
/// Parameters:
///
/// * [OAuthConfigDto] oAuthConfigDto (required):
@@ -120,10 +110,7 @@ class OAuthApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'POST /oauth/link' operation and returns the [Response].
/// Parameters:
///
/// * [OAuthCallbackDto] oAuthCallbackDto (required):
@@ -152,8 +139,6 @@ class OAuthApi {
);
}
///
///
/// Parameters:
///
/// * [OAuthCallbackDto] oAuthCallbackDto (required):
@@ -172,9 +157,7 @@ class OAuthApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
/// Performs an HTTP 'GET /oauth/mobile-redirect' operation and returns the [Response].
Future<Response> mobileRedirectWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/oauth/mobile-redirect';
@@ -200,7 +183,6 @@ class OAuthApi {
);
}
///
Future<void> mobileRedirect() async {
final response = await mobileRedirectWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
@@ -208,9 +190,7 @@ class OAuthApi {
}
}
///
///
/// Note: This method returns the HTTP [Response].
/// Performs an HTTP 'POST /oauth/unlink' operation and returns the [Response].
Future<Response> unlinkWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/oauth/unlink';
@@ -236,7 +216,6 @@ class OAuthApi {
);
}
///
Future<UserResponseDto?> unlink() async {
final response = await unlinkWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {

View File

@@ -16,9 +16,7 @@ class SearchApi {
final ApiClient apiClient;
///
///
/// Note: This method returns the HTTP [Response].
/// Performs an HTTP 'GET /search/explore' operation and returns the [Response].
Future<Response> getExploreDataWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/search/explore';
@@ -44,7 +42,6 @@ class SearchApi {
);
}
///
Future<List<SearchExploreResponseDto>?> getExploreData() async {
final response = await getExploreDataWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
@@ -63,9 +60,7 @@ class SearchApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
/// Performs an HTTP 'GET /search/config' operation and returns the [Response].
Future<Response> getSearchConfigWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/search/config';
@@ -91,7 +86,6 @@ class SearchApi {
);
}
///
Future<SearchConfigResponseDto?> getSearchConfig() async {
final response = await getSearchConfigWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
@@ -107,10 +101,7 @@ class SearchApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
///
/// Performs an HTTP 'GET /search' operation and returns the [Response].
/// Parameters:
///
/// * [String] q:
@@ -123,6 +114,8 @@ class SearchApi {
///
/// * [bool] isFavorite:
///
/// * [bool] isArchived:
///
/// * [String] exifInfoPeriodCity:
///
/// * [String] exifInfoPeriodState:
@@ -140,7 +133,7 @@ class SearchApi {
/// * [bool] recent:
///
/// * [bool] motion:
Future<Response> searchWithHttpInfo({ String? q, String? query, bool? clip, String? type, bool? isFavorite, String? exifInfoPeriodCity, String? exifInfoPeriodState, String? exifInfoPeriodCountry, String? exifInfoPeriodMake, String? exifInfoPeriodModel, List<String>? smartInfoPeriodObjects, List<String>? smartInfoPeriodTags, bool? recent, bool? motion, }) async {
Future<Response> searchWithHttpInfo({ String? q, String? query, bool? clip, String? type, bool? isFavorite, bool? isArchived, String? exifInfoPeriodCity, String? exifInfoPeriodState, String? exifInfoPeriodCountry, String? exifInfoPeriodMake, String? exifInfoPeriodModel, List<String>? smartInfoPeriodObjects, List<String>? smartInfoPeriodTags, bool? recent, bool? motion, }) async {
// ignore: prefer_const_declarations
final path = r'/search';
@@ -166,6 +159,9 @@ class SearchApi {
if (isFavorite != null) {
queryParams.addAll(_queryParams('', 'isFavorite', isFavorite));
}
if (isArchived != null) {
queryParams.addAll(_queryParams('', 'isArchived', isArchived));
}
if (exifInfoPeriodCity != null) {
queryParams.addAll(_queryParams('', 'exifInfo.city', exifInfoPeriodCity));
}
@@ -208,8 +204,6 @@ class SearchApi {
);
}
///
///
/// Parameters:
///
/// * [String] q:
@@ -222,6 +216,8 @@ class SearchApi {
///
/// * [bool] isFavorite:
///
/// * [bool] isArchived:
///
/// * [String] exifInfoPeriodCity:
///
/// * [String] exifInfoPeriodState:
@@ -239,8 +235,8 @@ class SearchApi {
/// * [bool] recent:
///
/// * [bool] motion:
Future<SearchResponseDto?> search({ String? q, String? query, bool? clip, String? type, bool? isFavorite, String? exifInfoPeriodCity, String? exifInfoPeriodState, String? exifInfoPeriodCountry, String? exifInfoPeriodMake, String? exifInfoPeriodModel, List<String>? smartInfoPeriodObjects, List<String>? smartInfoPeriodTags, bool? recent, bool? motion, }) async {
final response = await searchWithHttpInfo( q: q, query: query, clip: clip, type: type, isFavorite: isFavorite, exifInfoPeriodCity: exifInfoPeriodCity, exifInfoPeriodState: exifInfoPeriodState, exifInfoPeriodCountry: exifInfoPeriodCountry, exifInfoPeriodMake: exifInfoPeriodMake, exifInfoPeriodModel: exifInfoPeriodModel, smartInfoPeriodObjects: smartInfoPeriodObjects, smartInfoPeriodTags: smartInfoPeriodTags, recent: recent, motion: motion, );
Future<SearchResponseDto?> search({ String? q, String? query, bool? clip, String? type, bool? isFavorite, bool? isArchived, String? exifInfoPeriodCity, String? exifInfoPeriodState, String? exifInfoPeriodCountry, String? exifInfoPeriodMake, String? exifInfoPeriodModel, List<String>? smartInfoPeriodObjects, List<String>? smartInfoPeriodTags, bool? recent, bool? motion, }) async {
final response = await searchWithHttpInfo( q: q, query: query, clip: clip, type: type, isFavorite: isFavorite, isArchived: isArchived, exifInfoPeriodCity: exifInfoPeriodCity, exifInfoPeriodState: exifInfoPeriodState, exifInfoPeriodCountry: exifInfoPeriodCountry, exifInfoPeriodMake: exifInfoPeriodMake, exifInfoPeriodModel: exifInfoPeriodModel, smartInfoPeriodObjects: smartInfoPeriodObjects, smartInfoPeriodTags: smartInfoPeriodTags, recent: recent, motion: motion, );
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}

View File

@@ -16,9 +16,7 @@ class ServerInfoApi {
final ApiClient apiClient;
///
///
/// Note: This method returns the HTTP [Response].
/// Performs an HTTP 'GET /server-info' operation and returns the [Response].
Future<Response> getServerInfoWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/server-info';
@@ -44,7 +42,6 @@ class ServerInfoApi {
);
}
///
Future<ServerInfoResponseDto?> getServerInfo() async {
final response = await getServerInfoWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
@@ -60,9 +57,7 @@ class ServerInfoApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
/// Performs an HTTP 'GET /server-info/version' operation and returns the [Response].
Future<Response> getServerVersionWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/server-info/version';
@@ -88,7 +83,6 @@ class ServerInfoApi {
);
}
///
Future<ServerVersionReponseDto?> getServerVersion() async {
final response = await getServerVersionWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
@@ -104,9 +98,7 @@ class ServerInfoApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
/// Performs an HTTP 'GET /server-info/stats' operation and returns the [Response].
Future<Response> getStatsWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/server-info/stats';
@@ -132,7 +124,6 @@ class ServerInfoApi {
);
}
///
Future<ServerStatsResponseDto?> getStats() async {
final response = await getStatsWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
@@ -148,9 +139,7 @@ class ServerInfoApi {
return null;
}
///
///
/// Note: This method returns the HTTP [Response].
/// Performs an HTTP 'GET /server-info/ping' operation and returns the [Response].
Future<Response> pingServerWithHttpInfo() async {
// ignore: prefer_const_declarations
final path = r'/server-info/ping';
@@ -176,7 +165,6 @@ class ServerInfoApi {
);
}
///
Future<ServerPingResponse?> pingServer() async {
final response = await pingServerWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {

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