Compare commits

..

1 Commits

Author SHA1 Message Date
Alex
94e315c845 open database 2024-09-04 08:58:30 -05:00
234 changed files with 1005 additions and 2771 deletions

View File

@@ -22,7 +22,7 @@ permissions:
jobs:
publish:
name: CLI Publish
name: Publish
runs-on: ubuntu-latest
defaults:
run:

View File

@@ -234,16 +234,3 @@ jobs:
BUILD_IMAGE=${{ github.event_name == 'release' && github.ref_name || steps.metadata.outputs.tags }}
BUILD_SOURCE_REF=${{ github.ref_name }}
BUILD_SOURCE_COMMIT=${{ github.sha }}
success-check:
name: Docker Build & Push Success
needs: [build_and_push_ml, build_and_push_server]
runs-on: ubuntu-latest
if: always()
steps:
- name: Any jobs failed?
if: ${{ contains(needs.*.result, 'failure') }}
run: exit 1
- name: All jobs passed or skipped
if: ${{ !(contains(needs.*.result, 'failure')) }}
run: echo "All jobs passed or skipped" && echo "${{ toJSON(needs.*.result) }}"

View File

@@ -30,7 +30,6 @@ jobs:
run: echo "should_force=${{ github.event_name == 'release' }}" >> "$GITHUB_OUTPUT"
build:
name: Docs Build
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run == 'true' }}
runs-on: ubuntu-latest

View File

@@ -7,7 +7,6 @@ on:
jobs:
checks:
name: Docs Deploy Checks
runs-on: ubuntu-latest
outputs:
parameters: ${{ steps.parameters.outputs.result }}
@@ -92,7 +91,6 @@ jobs:
return parameters;
deploy:
name: Docs Deploy
runs-on: ubuntu-latest
needs: checks
if: ${{ fromJson(needs.checks.outputs.artifact).found && fromJson(needs.checks.outputs.parameters).shouldDeploy }}

View File

@@ -5,7 +5,6 @@ on:
jobs:
deploy:
name: Docs Destroy
runs-on: ubuntu-latest
steps:
- name: Checkout code

View File

@@ -48,7 +48,7 @@ jobs:
run: echo "should_force=${{ github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT"
server-unit-tests:
name: Test & Lint Server
name: Server
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_server == 'true' }}
runs-on: ubuntu-latest
@@ -85,7 +85,7 @@ jobs:
if: ${{ !cancelled() }}
cli-unit-tests:
name: Unit Test CLI
name: CLI
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_cli == 'true' }}
runs-on: ubuntu-latest
@@ -126,7 +126,7 @@ jobs:
if: ${{ !cancelled() }}
cli-unit-tests-win:
name: Unit Test CLI (Windows)
name: CLI (Windows)
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_cli == 'true' }}
runs-on: windows-latest
@@ -160,7 +160,7 @@ jobs:
if: ${{ !cancelled() }}
web-unit-tests:
name: Test & Lint Web
name: Web
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_web == 'true' }}
runs-on: ubuntu-latest
@@ -327,7 +327,7 @@ jobs:
if: ${{ !cancelled() }}
mobile-unit-tests:
name: Unit Test Mobile
name: Mobile
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_mobile == 'true' }}
runs-on: ubuntu-latest
@@ -343,7 +343,7 @@ jobs:
run: flutter test -j 1
ml-unit-tests:
name: Unit Test ML
name: Machine Learning
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_ml == 'true' }}
runs-on: ubuntu-latest

6
cli/package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "@immich/cli",
"version": "2.2.18",
"version": "2.2.17",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@immich/cli",
"version": "2.2.18",
"version": "2.2.17",
"license": "GNU Affero General Public License version 3",
"dependencies": {
"fast-glob": "^3.3.2",
@@ -52,7 +52,7 @@
},
"../open-api/typescript-sdk": {
"name": "@immich/sdk",
"version": "1.114.0",
"version": "1.113.1",
"dev": true,
"license": "GNU Affero General Public License version 3",
"dependencies": {

View File

@@ -1,6 +1,6 @@
{
"name": "@immich/cli",
"version": "2.2.18",
"version": "2.2.17",
"description": "Command Line Interface (CLI) for Immich",
"type": "module",
"exports": "./dist/index.js",

View File

@@ -78,4 +78,4 @@ borg mount "$REMOTE_HOST:$REMOTE_BACKUP_PATH"/immich-borg /tmp/immich-mountpoint
cd /tmp/immich-mountpoint
```
You can find available snapshots in separate sub-directories at `/tmp/immich-mountpoint`. Restore the files you need, and unmount the Borg repository using `borg umount /tmp/immich-mountpoint`
You can find available snapshots in seperate sub-directories at `/tmp/immich-mountpoint`. Restore the files you need, and unmount the Borg repository using `borg umount /tmp/immich-mountpoint`

View File

@@ -125,7 +125,7 @@ When `DB_URL` is defined, the `DB_HOSTNAME`, `DB_PORT`, `DB_USERNAME`, `DB_PASSW
All `REDIS_` variables must be provided to all Immich workers, including `api` and `microservices`.
`REDIS_URL` must start with `ioredis://` and then include a `base64` encoded JSON string for the configuration.
More info can be found in the upstream [ioredis] documentation.
More info can be found in the upstream [ioredis][redis-api] documentation.
When `REDIS_URL` or `REDIS_SOCKET` are defined, the `REDIS_HOSTNAME`, `REDIS_PORT`, `REDIS_USERNAME`, `REDIS_PASSWORD`, and `REDIS_DBINDEX` variables are ignored.
:::
@@ -226,4 +226,4 @@ to use use a Docker secret for the password in the Redis container.
[docker-secrets-example]: https://github.com/docker-library/redis/issues/46#issuecomment-335326234
[docker-secrets-docs]: https://github.com/docker-library/docs/tree/master/postgres#docker-secrets
[docker-secrets]: https://docs.docker.com/engine/swarm/secrets/
[ioredis]: https://ioredis.readthedocs.io/en/latest/README/#connect-to-redis
[redis-api]: https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository

View File

@@ -27,9 +27,3 @@ If an asset is in multiple albums, `{{album}}` will be set to the name of the al
:::
Immich also provides a mechanism to migrate between templates so that if the template you set now doesn't work in the future, you can always migrate all the existing files to the new template. The mechanism is run as a job on the Job page.
If you want to store assets in album folders, but you also have assets that do not belong to any album, you can use `{{#if album}}`, `{{else}}` and `{{/if}}` to create a conditional statement. For example, the following template will store assets in album folders if they belong to an album, and in a folder named "Other/Month" if they do not belong to an album:
```
{{y}}/{{#if album}}{{album}}{{else}}Other/{{MM}}{{/if}}/{{filename}}
```

View File

@@ -13698,10 +13698,9 @@
}
},
"node_modules/prism-react-renderer": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.0.tgz",
"integrity": "sha512-327BsVCD/unU4CNLZTWVHyUHKnsqcvj2qbPlQ8MiBE2eq2rgctjigPA1Gp9HLF83kZ20zNN6jgizHJeEsyFYOw==",
"license": "MIT",
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz",
"integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==",
"dependencies": {
"@types/prismjs": "^1.26.0",
"clsx": "^2.0.0"

View File

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

8
e2e/package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "immich-e2e",
"version": "1.114.0",
"version": "1.113.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "immich-e2e",
"version": "1.114.0",
"version": "1.113.1",
"license": "GNU Affero General Public License version 3",
"devDependencies": {
"@eslint/eslintrc": "^3.1.0",
@@ -45,7 +45,7 @@
},
"../cli": {
"name": "@immich/cli",
"version": "2.2.18",
"version": "2.2.17",
"dev": true,
"license": "GNU Affero General Public License version 3",
"dependencies": {
@@ -92,7 +92,7 @@
},
"../open-api/typescript-sdk": {
"name": "@immich/sdk",
"version": "1.114.0",
"version": "1.113.1",
"dev": true,
"license": "GNU Affero General Public License version 3",
"dependencies": {

View File

@@ -1,6 +1,6 @@
{
"name": "immich-e2e",
"version": "1.114.0",
"version": "1.113.1",
"description": "",
"main": "index.js",
"type": "module",

View File

@@ -6,9 +6,7 @@ import {
LoginResponseDto,
SharedLinkType,
getAssetInfo,
getConfig,
getMyUser,
updateConfig,
} from '@immich/sdk';
import { exiftool } from 'exiftool-vendored';
import { DateTime } from 'luxon';
@@ -45,9 +43,6 @@ const TEN_TIMES = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
const locationAssetFilepath = `${testAssetDir}/metadata/gps-position/thompson-springs.jpg`;
const ratingAssetFilepath = `${testAssetDir}/metadata/rating/mongolels.jpg`;
const facesAssetFilepath = `${testAssetDir}/metadata/faces/portrait.jpg`;
const getSystemConfig = (accessToken: string) => getConfig({ headers: asBearerAuth(accessToken) });
const readTags = async (bytes: Buffer, filename: string) => {
const filepath = join(tempDir, filename);
@@ -76,7 +71,6 @@ describe('/asset', () => {
let user2Assets: AssetMediaResponseDto[];
let locationAsset: AssetMediaResponseDto;
let ratingAsset: AssetMediaResponseDto;
let facesAsset: AssetMediaResponseDto;
const setupTests = async () => {
await utils.resetDatabase();
@@ -230,64 +224,6 @@ describe('/asset', () => {
});
});
it('should get the asset faces', async () => {
const config = await getSystemConfig(admin.accessToken);
config.metadata.faces.import = true;
await updateConfig({ systemConfigDto: config }, { headers: asBearerAuth(admin.accessToken) });
// asset faces
facesAsset = await utils.createAsset(admin.accessToken, {
assetData: {
filename: 'portrait.jpg',
bytes: await readFile(facesAssetFilepath),
},
});
await utils.waitForWebsocketEvent({ event: 'assetUpload', id: facesAsset.id });
const { status, body } = await request(app)
.get(`/assets/${facesAsset.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body.id).toEqual(facesAsset.id);
expect(body.people).toMatchObject([
{
name: 'Marie Curie',
birthDate: null,
thumbnailPath: '',
isHidden: false,
faces: [
{
imageHeight: 700,
imageWidth: 840,
boundingBoxX1: 261,
boundingBoxX2: 356,
boundingBoxY1: 146,
boundingBoxY2: 284,
sourceType: 'exif',
},
],
},
{
name: 'Pierre Curie',
birthDate: null,
thumbnailPath: '',
isHidden: false,
faces: [
{
imageHeight: 700,
imageWidth: 840,
boundingBoxX1: 536,
boundingBoxX2: 618,
boundingBoxY1: 83,
boundingBoxY2: 252,
sourceType: 'exif',
},
],
},
]);
});
it('should work with a shared link', async () => {
const sharedLink = await utils.createSharedLink(user1.accessToken, {
type: SharedLinkType.Individual,

View File

@@ -102,7 +102,6 @@ describe('/server-info', () => {
configFile: false,
duplicateDetection: false,
facialRecognition: false,
importFaces: false,
map: true,
reverseGeocoding: true,
oauth: false,

View File

@@ -110,7 +110,6 @@ describe('/server', () => {
facialRecognition: false,
map: true,
reverseGeocoding: true,
importFaces: false,
oauth: false,
oauthAutoLaunch: false,
passwordLogin: true,

View File

@@ -44,7 +44,7 @@ test.describe('Shared Links', () => {
test('download from a shared link', async ({ page }) => {
await page.goto(`/share/${sharedLink.key}`);
await page.getByRole('heading', { name: 'Test Album' }).waitFor();
await page.locator(`[data-asset-id="${asset.id}"]`).hover();
await page.locator('.group').first().hover();
await page.waitForSelector('#asset-group-by-date svg');
await page.getByRole('checkbox').click();
await page.getByRole('button', { name: 'Download' }).click();
@@ -69,15 +69,4 @@ test.describe('Shared Links', () => {
await page.goto('/share/invalid');
await page.getByRole('heading', { name: 'Invalid share key' }).waitFor();
});
test('auth on navigation from shared link to timeline', async ({ context, page }) => {
await utils.setAuthCookies(context, admin.accessToken);
await page.goto(`/share/${sharedLink.key}`);
await page.getByRole('heading', { name: 'Test Album' }).waitFor();
await page.locator('a[href="/"]').click();
await page.waitForURL('/photos');
await page.locator(`[data-asset-id="${asset.id}"]`).waitFor();
});
});

View File

@@ -1,6 +1,6 @@
ARG DEVICE=cpu
FROM python:3.11-bookworm@sha256:20c1819af5af3acba0b2b66074a2615e398ceee6842adf03cd7ad5f8d0ee3daf AS builder-cpu
FROM python:3.11-bookworm@sha256:f7543d9969bdc112dd9819ca642e14433fdacfe857f170f6b803392fc7e451ad AS builder-cpu
FROM builder-cpu AS builder-openvino
@@ -34,7 +34,7 @@ RUN python3 -m venv /opt/venv
COPY poetry.lock pyproject.toml ./
RUN poetry install --sync --no-interaction --no-ansi --no-root --with ${DEVICE} --without dev
FROM python:3.11-slim-bookworm@sha256:ed4e985674f478c90ce879e9aa224fbb772c84e39b4aed5155b9e2280f131039 AS prod-cpu
FROM python:3.11-slim-bookworm@sha256:ad5dadd957a398226996bc4846e522c39f2a77340b531b28aaab85b2d361210b AS prod-cpu
FROM prod-cpu AS prod-openvino

View File

@@ -1,4 +1,4 @@
FROM mambaorg/micromamba:bookworm-slim@sha256:29174348bd09352e5f1b1f6756cf1d00021487b8340fae040e91e4f98e954ce5 AS builder
FROM mambaorg/micromamba:bookworm-slim@sha256:475730daef12ff9c0733e70092aeeefdf4c373a584c952dac3f7bdb739601990 AS builder
ENV TRANSFORMERS_CACHE=/cache \
PYTHONDONTWRITEBYTECODE=1 \

View File

@@ -680,13 +680,13 @@ test = ["pytest (>=6)"]
[[package]]
name = "fastapi-slim"
version = "0.112.2"
version = "0.112.1"
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
optional = false
python-versions = ">=3.8"
files = [
{file = "fastapi_slim-0.112.2-py3-none-any.whl", hash = "sha256:c023f74768f187af142c2fe5ff9e4ca3c4c1940bbde7df008cb283532422a23f"},
{file = "fastapi_slim-0.112.2.tar.gz", hash = "sha256:75b8eb0c6ee05a20270da7a527ac7ad53b83414602f42b68f7027484dab3aedb"},
{file = "fastapi_slim-0.112.1-py3-none-any.whl", hash = "sha256:cc227cf9402d0ba54a24f80eb205c33bcb25d3ea18d53fdac3fd76ea5af8e76d"},
{file = "fastapi_slim-0.112.1.tar.gz", hash = "sha256:876ebd24e72273986709db2d469b75dc18f04c3ab9140ffd78b29d7785d26687"},
]
[package.dependencies]
@@ -695,8 +695,8 @@ starlette = ">=0.37.2,<0.39.0"
typing-extensions = ">=4.8.0"
[package.extras]
all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=2.11.2)", "python-multipart (>=0.0.7)", "uvicorn[standard] (>=0.12.0)"]
all = ["email_validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
standard = ["email_validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=2.11.2)", "python-multipart (>=0.0.7)", "uvicorn[standard] (>=0.12.0)"]
[[package]]
name = "filelock"
@@ -1212,13 +1212,13 @@ test = ["Cython (>=0.29.24,<0.30.0)"]
[[package]]
name = "httpx"
version = "0.27.2"
version = "0.27.0"
description = "The next generation HTTP client."
optional = false
python-versions = ">=3.8"
files = [
{file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"},
{file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"},
{file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"},
{file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"},
]
[package.dependencies]
@@ -1233,7 +1233,6 @@ brotli = ["brotli", "brotlicffi"]
cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"]
http2 = ["h2 (>=3,<5)"]
socks = ["socksio (==1.*)"]
zstd = ["zstandard (>=0.18.0)"]
[[package]]
name = "huggingface-hub"
@@ -1531,13 +1530,13 @@ test = ["pytest (>=7.4)", "pytest-cov (>=4.1)"]
[[package]]
name = "locust"
version = "2.31.5"
version = "2.31.3"
description = "Developer-friendly load testing framework"
optional = false
python-versions = ">=3.9"
files = [
{file = "locust-2.31.5-py3-none-any.whl", hash = "sha256:2904ff6307d54d3202c9ebd776f9170214f6dfbe4059504dad9e3ffaca03f600"},
{file = "locust-2.31.5.tar.gz", hash = "sha256:14b2fa6f95bf248668e6dc92d100a44f06c5dcb1c26f88a5442bcaaee18faceb"},
{file = "locust-2.31.3-py3-none-any.whl", hash = "sha256:03122e007519b371a5a553d578af502826755de83551d79ea8a412ea1c660115"},
{file = "locust-2.31.3.tar.gz", hash = "sha256:25f4603f24afa11ef1ee1f26b1c86a232eb9a1140be30b2a4642c12d7a7af8ae"},
]
[package.dependencies]
@@ -1795,38 +1794,38 @@ files = [
[[package]]
name = "mypy"
version = "1.11.2"
version = "1.11.1"
description = "Optional static typing for Python"
optional = false
python-versions = ">=3.8"
files = [
{file = "mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a"},
{file = "mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef"},
{file = "mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383"},
{file = "mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8"},
{file = "mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7"},
{file = "mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385"},
{file = "mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca"},
{file = "mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104"},
{file = "mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4"},
{file = "mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6"},
{file = "mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318"},
{file = "mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36"},
{file = "mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987"},
{file = "mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca"},
{file = "mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70"},
{file = "mypy-1.11.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:37c7fa6121c1cdfcaac97ce3d3b5588e847aa79b580c1e922bb5d5d2902df19b"},
{file = "mypy-1.11.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a8a53bc3ffbd161b5b2a4fff2f0f1e23a33b0168f1c0778ec70e1a3d66deb86"},
{file = "mypy-1.11.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ff93107f01968ed834f4256bc1fc4475e2fecf6c661260066a985b52741ddce"},
{file = "mypy-1.11.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:edb91dded4df17eae4537668b23f0ff6baf3707683734b6a818d5b9d0c0c31a1"},
{file = "mypy-1.11.2-cp38-cp38-win_amd64.whl", hash = "sha256:ee23de8530d99b6db0573c4ef4bd8f39a2a6f9b60655bf7a1357e585a3486f2b"},
{file = "mypy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:801ca29f43d5acce85f8e999b1e431fb479cb02d0e11deb7d2abb56bdaf24fd6"},
{file = "mypy-1.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70"},
{file = "mypy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7821776e5c4286b6a13138cc935e2e9b6fde05e081bdebf5cdb2bb97c9df81d"},
{file = "mypy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539c570477a96a4e6fb718b8d5c3e0c0eba1f485df13f86d2970c91f0673148d"},
{file = "mypy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f14cd3d386ac4d05c5a39a51b84387403dadbd936e17cb35882134d4f8f0d24"},
{file = "mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12"},
{file = "mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79"},
{file = "mypy-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a32fc80b63de4b5b3e65f4be82b4cfa362a46702672aa6a0f443b4689af7008c"},
{file = "mypy-1.11.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c1952f5ea8a5a959b05ed5f16452fddadbaae48b5d39235ab4c3fc444d5fd411"},
{file = "mypy-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1e30dc3bfa4e157e53c1d17a0dad20f89dc433393e7702b813c10e200843b03"},
{file = "mypy-1.11.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2c63350af88f43a66d3dfeeeb8d77af34a4f07d760b9eb3a8697f0386c7590b4"},
{file = "mypy-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:a831671bad47186603872a3abc19634f3011d7f83b083762c942442d51c58d58"},
{file = "mypy-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7b6343d338390bb946d449677726edf60102a1c96079b4f002dedff375953fc5"},
{file = "mypy-1.11.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4fe9f4e5e521b458d8feb52547f4bade7ef8c93238dfb5bbc790d9ff2d770ca"},
{file = "mypy-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:886c9dbecc87b9516eff294541bf7f3655722bf22bb898ee06985cd7269898de"},
{file = "mypy-1.11.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fca4a60e1dd9fd0193ae0067eaeeb962f2d79e0d9f0f66223a0682f26ffcc809"},
{file = "mypy-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:0bd53faf56de9643336aeea1c925012837432b5faf1701ccca7fde70166ccf72"},
{file = "mypy-1.11.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f39918a50f74dc5969807dcfaecafa804fa7f90c9d60506835036cc1bc891dc8"},
{file = "mypy-1.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0bc71d1fb27a428139dd78621953effe0d208aed9857cb08d002280b0422003a"},
{file = "mypy-1.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b868d3bcff720dd7217c383474008ddabaf048fad8d78ed948bb4b624870a417"},
{file = "mypy-1.11.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a707ec1527ffcdd1c784d0924bf5cb15cd7f22683b919668a04d2b9c34549d2e"},
{file = "mypy-1.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:64f4a90e3ea07f590c5bcf9029035cf0efeae5ba8be511a8caada1a4893f5525"},
{file = "mypy-1.11.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:749fd3213916f1751fff995fccf20c6195cae941dc968f3aaadf9bb4e430e5a2"},
{file = "mypy-1.11.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b639dce63a0b19085213ec5fdd8cffd1d81988f47a2dec7100e93564f3e8fb3b"},
{file = "mypy-1.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c956b49c5d865394d62941b109728c5c596a415e9c5b2be663dd26a1ff07bc0"},
{file = "mypy-1.11.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45df906e8b6804ef4b666af29a87ad9f5921aad091c79cc38e12198e220beabd"},
{file = "mypy-1.11.1-cp38-cp38-win_amd64.whl", hash = "sha256:d44be7551689d9d47b7abc27c71257adfdb53f03880841a5db15ddb22dc63edb"},
{file = "mypy-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2684d3f693073ab89d76da8e3921883019ea8a3ec20fa5d8ecca6a2db4c54bbe"},
{file = "mypy-1.11.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:79c07eb282cb457473add5052b63925e5cc97dfab9812ee65a7c7ab5e3cb551c"},
{file = "mypy-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11965c2f571ded6239977b14deebd3f4c3abd9a92398712d6da3a772974fad69"},
{file = "mypy-1.11.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a2b43895a0f8154df6519706d9bca8280cda52d3d9d1514b2d9c3e26792a0b74"},
{file = "mypy-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:1a81cf05975fd61aec5ae16501a091cfb9f605dc3e3c878c0da32f250b74760b"},
{file = "mypy-1.11.1-py3-none-any.whl", hash = "sha256:0624bdb940255d2dd24e829d99a13cfeb72e4e9031f9492148f410ed30bcab54"},
{file = "mypy-1.11.1.tar.gz", hash = "sha256:f404a0b069709f18bbdb702eb3dcfe51910602995de00bd39cea3050b5772d08"},
]
[package.dependencies]
@@ -2816,13 +2815,13 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
[[package]]
name = "rich"
version = "13.8.0"
version = "13.7.1"
description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
optional = false
python-versions = ">=3.7.0"
files = [
{file = "rich-13.8.0-py3-none-any.whl", hash = "sha256:2e85306a063b9492dffc86278197a60cbece75bcb766022f3436f567cae11bdc"},
{file = "rich-13.8.0.tar.gz", hash = "sha256:a5ac1f1cd448ade0d59cc3356f7db7a7ccda2c8cbae9c7a90c28ff463d3e91f4"},
{file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"},
{file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"},
]
[package.dependencies]
@@ -2834,29 +2833,29 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"]
[[package]]
name = "ruff"
version = "0.6.3"
version = "0.6.2"
description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false
python-versions = ">=3.7"
files = [
{file = "ruff-0.6.3-py3-none-linux_armv6l.whl", hash = "sha256:97f58fda4e309382ad30ede7f30e2791d70dd29ea17f41970119f55bdb7a45c3"},
{file = "ruff-0.6.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3b061e49b5cf3a297b4d1c27ac5587954ccb4ff601160d3d6b2f70b1622194dc"},
{file = "ruff-0.6.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:34e2824a13bb8c668c71c1760a6ac7d795ccbd8d38ff4a0d8471fdb15de910b1"},
{file = "ruff-0.6.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bddfbb8d63c460f4b4128b6a506e7052bad4d6f3ff607ebbb41b0aa19c2770d1"},
{file = "ruff-0.6.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ced3eeb44df75353e08ab3b6a9e113b5f3f996bea48d4f7c027bc528ba87b672"},
{file = "ruff-0.6.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47021dff5445d549be954eb275156dfd7c37222acc1e8014311badcb9b4ec8c1"},
{file = "ruff-0.6.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:7d7bd20dc07cebd68cc8bc7b3f5ada6d637f42d947c85264f94b0d1cd9d87384"},
{file = "ruff-0.6.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:500f166d03fc6d0e61c8e40a3ff853fa8a43d938f5d14c183c612df1b0d6c58a"},
{file = "ruff-0.6.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42844ff678f9b976366b262fa2d1d1a3fe76f6e145bd92c84e27d172e3c34500"},
{file = "ruff-0.6.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70452a10eb2d66549de8e75f89ae82462159855e983ddff91bc0bce6511d0470"},
{file = "ruff-0.6.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:65a533235ed55f767d1fc62193a21cbf9e3329cf26d427b800fdeacfb77d296f"},
{file = "ruff-0.6.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d2e2c23cef30dc3cbe9cc5d04f2899e7f5e478c40d2e0a633513ad081f7361b5"},
{file = "ruff-0.6.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d8a136aa7d228975a6aee3dd8bea9b28e2b43e9444aa678fb62aeb1956ff2351"},
{file = "ruff-0.6.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f92fe93bc72e262b7b3f2bba9879897e2d58a989b4714ba6a5a7273e842ad2f8"},
{file = "ruff-0.6.3-py3-none-win32.whl", hash = "sha256:7a62d3b5b0d7f9143d94893f8ba43aa5a5c51a0ffc4a401aa97a81ed76930521"},
{file = "ruff-0.6.3-py3-none-win_amd64.whl", hash = "sha256:746af39356fee2b89aada06c7376e1aa274a23493d7016059c3a72e3b296befb"},
{file = "ruff-0.6.3-py3-none-win_arm64.whl", hash = "sha256:14a9528a8b70ccc7a847637c29e56fd1f9183a9db743bbc5b8e0c4ad60592a82"},
{file = "ruff-0.6.3.tar.gz", hash = "sha256:183b99e9edd1ef63be34a3b51fee0a9f4ab95add123dbf89a71f7b1f0c991983"},
{file = "ruff-0.6.2-py3-none-linux_armv6l.whl", hash = "sha256:5c8cbc6252deb3ea840ad6a20b0f8583caab0c5ef4f9cca21adc5a92b8f79f3c"},
{file = "ruff-0.6.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:17002fe241e76544448a8e1e6118abecbe8cd10cf68fde635dad480dba594570"},
{file = "ruff-0.6.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3dbeac76ed13456f8158b8f4fe087bf87882e645c8e8b606dd17b0b66c2c1158"},
{file = "ruff-0.6.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:094600ee88cda325988d3f54e3588c46de5c18dae09d683ace278b11f9d4d534"},
{file = "ruff-0.6.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:316d418fe258c036ba05fbf7dfc1f7d3d4096db63431546163b472285668132b"},
{file = "ruff-0.6.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d72b8b3abf8a2d51b7b9944a41307d2f442558ccb3859bbd87e6ae9be1694a5d"},
{file = "ruff-0.6.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2aed7e243be68487aa8982e91c6e260982d00da3f38955873aecd5a9204b1d66"},
{file = "ruff-0.6.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d371f7fc9cec83497fe7cf5eaf5b76e22a8efce463de5f775a1826197feb9df8"},
{file = "ruff-0.6.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8f310d63af08f583363dfb844ba8f9417b558199c58a5999215082036d795a1"},
{file = "ruff-0.6.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7db6880c53c56addb8638fe444818183385ec85eeada1d48fc5abe045301b2f1"},
{file = "ruff-0.6.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1175d39faadd9a50718f478d23bfc1d4da5743f1ab56af81a2b6caf0a2394f23"},
{file = "ruff-0.6.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5b939f9c86d51635fe486585389f54582f0d65b8238e08c327c1534844b3bb9a"},
{file = "ruff-0.6.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d0d62ca91219f906caf9b187dea50d17353f15ec9bb15aae4a606cd697b49b4c"},
{file = "ruff-0.6.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7438a7288f9d67ed3c8ce4d059e67f7ed65e9fe3aa2ab6f5b4b3610e57e3cb56"},
{file = "ruff-0.6.2-py3-none-win32.whl", hash = "sha256:279d5f7d86696df5f9549b56b9b6a7f6c72961b619022b5b7999b15db392a4da"},
{file = "ruff-0.6.2-py3-none-win_amd64.whl", hash = "sha256:d9f3469c7dd43cd22eb1c3fc16926fb8258d50cb1b216658a07be95dd117b0f2"},
{file = "ruff-0.6.2-py3-none-win_arm64.whl", hash = "sha256:f28fcd2cd0e02bdf739297516d5643a945cc7caf09bd9bcb4d932540a5ea4fa9"},
{file = "ruff-0.6.2.tar.gz", hash = "sha256:239ee6beb9e91feb8e0ec384204a763f36cb53fb895a1a364618c6abb076b3be"},
]
[[package]]

View File

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

View File

@@ -118,9 +118,7 @@ class BackupWorker(ctx: Context, params: WorkerParameters) : ListenableWorker(ct
// called when the system has to stop this worker because constraints are
// no longer met or the system needs resources for more important tasks
Handler(Looper.getMainLooper()).postAtFrontOfQueue {
if (::backgroundChannel.isInitialized) {
backgroundChannel.invokeMethod("systemStop", null)
}
backgroundChannel.invokeMethod("systemStop", null)
}
waitOnSetForegroundAsync()
// cannot await/get(block) on resolvableFuture as its already cancelled (would throw CancellationException)

View File

@@ -35,8 +35,8 @@ platform :android do
task: 'bundle',
build_type: 'Release',
properties: {
"android.injected.version.code" => 158,
"android.injected.version.name" => "1.114.0",
"android.injected.version.code" => 157,
"android.injected.version.name" => "1.113.1",
}
)
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

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "حذف الرابط المشترك",
"description_input_hint_text": "اضف وصفا...",
"description_input_submit_error": "خطأ تحديث الوصف ، تحقق من السجل لمزيد من التفاصيل",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "التاريخ و الوقت",
"edit_date_time_dialog_timezone": "وحدة زمنية",
"edit_image_title": "Edit",

View File

@@ -63,7 +63,7 @@
"assets_trashed_from_server": "{} položek vyhozeno do koše na Immich serveru",
"asset_viewer_settings_title": "Prohlížeč",
"backup_album_selection_page_albums_device": "Alba v zařízení ({})",
"backup_album_selection_page_albums_tap": "Klepnutím na položku ji zahrnete, opětovným klepnutím ji vyloučíte",
"backup_album_selection_page_albums_tap": "Klepnutím na položku ji zahrnete, dvojím klepnutím ji vyloučíte",
"backup_album_selection_page_assets_scatter": "Položky mohou být roztroušeny ve více albech. To umožňuje zahrnout nebo vyloučit alba během procesu zálohování.",
"backup_album_selection_page_select_albums": "Vybraná alba",
"backup_album_selection_page_selection_info": "Informace o výběru",
@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Odstranit sdílený odkaz",
"description_input_hint_text": "Přidat popis...",
"description_input_submit_error": "Chyba aktualizace popisu, další podrobnosti najdete v logu",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Datum a čas",
"edit_date_time_dialog_timezone": "Časové pásmo",
"edit_image_title": "Upravit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Slet delt link",
"description_input_hint_text": "Tilføj en beskrivelse...",
"description_input_submit_error": "Fejl med at opdatere beskrivelsen. Tjek loggen for flere detaljer",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Dato og klokkeslæt",
"edit_date_time_dialog_timezone": "Tidszone",
"edit_image_title": "Rediger",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Geteilten Link löschen",
"description_input_hint_text": "Beschreibung hinzufügen...",
"description_input_submit_error": "Beschreibung konnte nicht geändert werden, bitte im Log für mehr Details nachsehen.",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Datum und Uhrzeit",
"edit_date_time_dialog_timezone": "Zeitzone",
"edit_image_title": "Bearbeiten",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Διαγραφή Κοινοποιημένου Συνδέσμου",
"description_input_hint_text": "Προσθήκη περιγραφής...",
"description_input_submit_error": "Σφάλμα κατά την ενημέρωση της περιγραφής, ελέγξτε το αρχείο καταγραφής για περισσότερες λεπτομέρειες",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Ημερομηνία και Ώρα",
"edit_date_time_dialog_timezone": "Ζώνη ώρας",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Delete Shared Link",
"description_input_hint_text": "Add description...",
"description_input_submit_error": "Error updating description, check the log for more details",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",

View File

@@ -173,8 +173,8 @@
"control_bottom_app_bar_delete": "Eliminar",
"control_bottom_app_bar_delete_from_immich": "Borrar de Immich",
"control_bottom_app_bar_delete_from_local": "Borrar del dispositivo",
"control_bottom_app_bar_download": "Descargar",
"control_bottom_app_bar_edit": "Editar",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "Editar ubicación",
"control_bottom_app_bar_edit_time": "Editar fecha y hora",
"control_bottom_app_bar_favorite": "Favorito",
@@ -190,7 +190,7 @@
"create_shared_album_page_share": "Compartir",
"create_shared_album_page_share_add_assets": "AGREGAR ELEMENTOS",
"create_shared_album_page_share_select_photos": "Seleccionar Fotos",
"crop": "Recortar",
"crop": "Crop",
"curated_location_page_title": "Lugares",
"curated_object_page_title": "Objetos",
"daily_title_text_date": "E dd, MMM",
@@ -210,13 +210,9 @@
"delete_shared_link_dialog_title": "Eliminar enlace compartido",
"description_input_hint_text": "Agregar descripción...",
"description_input_submit_error": "Error al actualizar la descripción, verifica el registro para obtener más detalles",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Fecha y Hora",
"edit_date_time_dialog_timezone": "Zona horaria",
"edit_image_title": "Editar",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Ubicación",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Agregar Descripción...",
@@ -255,13 +251,13 @@
"home_page_first_time_notice": "Si esta es la primera vez que usas la app, por favor, asegúrate de elegir un álbum de respaldo para que la línea de tiempo pueda cargar fotos y videos en los álbumes.",
"home_page_share_err_local": "No se pueden compartir elementos locales a través de un enlace, omitiendo",
"home_page_upload_err_limit": "Solo se pueden subir 30 elementos simultáneamente, omitiendo",
"image_saved_successfully": "Imágenes guardas",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Error de descarga",
"image_viewer_page_state_provider_download_started": "Descarga Iniciada",
"image_viewer_page_state_provider_download_success": "Descarga exitosa",
"image_viewer_page_state_provider_share_error": "Error al compartir",
"invalid_date": "Fecha incorrecta",
"invalid_date_format": "Formato de fecha incorrecto",
"invalid_date": "Invalid date",
"invalid_date_format": "Invalid date format",
"library_page_albums": "Álbumes",
"library_page_archive": "Archivo",
"library_page_device_albums": "Álbumes en el dispositivo",
@@ -384,27 +380,27 @@
"profile_drawer_sign_out": "Cerrar Sesión",
"profile_drawer_trash": "Papelera",
"recently_added_page_title": "Recién Agregadas",
"save_to_gallery": "Guardado en la galería",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Ha ocurrido un error",
"search_bar_hint": "Busca tus fotos",
"search_filter_apply": "Aplicar filtros",
"search_filter_camera": "Cámara",
"search_filter_camera": "Camera",
"search_filter_camera_make": "Marca",
"search_filter_camera_model": "Modelo",
"search_filter_camera_title": "Select camera type",
"search_filter_date": "Fecha",
"search_filter_date_interval": "{start} al {end}",
"search_filter_date_title": "Selecciona un intervalo de fechas",
"search_filter_date": "Date",
"search_filter_date_interval": "{start} to {end}",
"search_filter_date_title": "Select a date range",
"search_filter_display_option_archive": "Archivado",
"search_filter_display_option_favorite": "Favorito",
"search_filter_display_option_not_in_album": "No en álbum",
"search_filter_display_options": "Display Options",
"search_filter_display_options_title": "Display options",
"search_filter_location": "Ubicación",
"search_filter_location": "Location",
"search_filter_location_city": "Ciudad",
"search_filter_location_country": "País",
"search_filter_location_state": "Estado",
"search_filter_location_title": "Seleccionar una ubicación",
"search_filter_location_title": "Select location",
"search_filter_media_type": "Media Type",
"search_filter_media_type_all": "Todos",
"search_filter_media_type_image": "Imagen",
@@ -539,7 +535,7 @@
"sharing_silver_appbar_create_shared_album": "Crear un álbum compartido",
"sharing_silver_appbar_shared_links": "Enlaces compartidos",
"sharing_silver_appbar_share_partner": "Compartir con el compañero",
"sync": "Sincronizar",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Eliminar enlace compartido",
"description_input_hint_text": "Agregar descripción...",
"description_input_submit_error": "Error al actualizar la descripción, verifica el registro para obtener más detalles",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Eliminar enlace compartido",
"description_input_hint_text": "Agregar descripción...",
"description_input_submit_error": "Error al actualizar la descripción, verifica el registro para obtener más detalles",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Eliminar enlace compartido",
"description_input_hint_text": "Agregar descripción...",
"description_input_submit_error": "Error al actualizar la descripción, verifica el registro para obtener más detalles",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Poista jaettu linkki",
"description_input_hint_text": "Lisää kuvaus...",
"description_input_submit_error": "Virhe kuvauksen päivittämisessä, tarkista lisätiedot lokista",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Päivämäärä ja aika",
"edit_date_time_dialog_timezone": "Aikavyöhyke",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Supprimer le lien partagé",
"description_input_hint_text": "Ajouter une description...",
"description_input_submit_error": "Erreur de mise à jour de la description, vérifier le journal pour plus de détails",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Supprimer le lien partagé",
"description_input_hint_text": "Ajouter une description…",
"description_input_submit_error": "Erreur de mise à jour de la description, vérifier le journal pour plus de détails",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Date et heure",
"edit_date_time_dialog_timezone": "Fuseau horaire",
"edit_image_title": "Edit",

View File

@@ -190,7 +190,7 @@
"create_shared_album_page_share": "שתף",
"create_shared_album_page_share_add_assets": "הוסף נכסים",
"create_shared_album_page_share_select_photos": "בחירת תמונות",
"crop": "חתוך",
"crop": "Crop",
"curated_location_page_title": "מקומות",
"curated_object_page_title": "דברים",
"daily_title_text_date": "E, MMM dd",
@@ -210,15 +210,11 @@
"delete_shared_link_dialog_title": "מחק קישור משותף",
"description_input_hint_text": "הוסף תיאור...",
"description_input_submit_error": "שגיאה בעדכון תיאור, בדוק את היומן לפרטים נוספים",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "תאריך וזמן",
"edit_date_time_dialog_timezone": "אזור זמן",
"edit_image_title": "ערוך",
"edit_image_title": "Edit",
"edit_location_dialog_title": "מיקום",
"error_saving_image": "שגיאה: {}",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "הוסף תיאור...",
"exif_bottom_sheet_details": "פרטים",
"exif_bottom_sheet_location": "מיקום",
@@ -255,7 +251,7 @@
"home_page_first_time_notice": "אם זאת הפעם הראשונה שאת/ה משתמש/ת ביישום, נא להקפיד לבחור אלבומ(ים) לגיבוי כך שציר הזמן יוכל לאכלס תמונות וסרטונים באלבומ(ים)",
"home_page_share_err_local": "לא ניתן לשתף נכסים מקומיים על ידי קישור, מדלג",
"home_page_upload_err_limit": "ניתן להעלות רק מקסימום של 30 נכסים בכל פעם, מדלג",
"image_saved_successfully": "תמונה נשמרה",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "שגיאת הורדה",
"image_viewer_page_state_provider_download_started": "ההורדה החלה",
"image_viewer_page_state_provider_download_success": "הצלחת הורדה",
@@ -384,7 +380,7 @@
"profile_drawer_sign_out": "יציאה",
"profile_drawer_trash": "אשפה",
"recently_added_page_title": "נוסף לאחרונה",
"save_to_gallery": "שמור לגלריה",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "אירעה שגיאה",
"search_bar_hint": "חפש/י בתמונות שלך",
"search_filter_apply": "החל סינון",
@@ -539,10 +535,10 @@
"sharing_silver_appbar_create_shared_album": "אלבום משותף חדש",
"sharing_silver_appbar_shared_links": "קישורים משותפים",
"sharing_silver_appbar_share_partner": "שיתוף עם שותף",
"sync": "סנכרן",
"sync_albums": "סנכרן אלבומים",
"sync_albums_manual_subtitle": "סנכרן את כל הסרטונים והתמונות שהועלו לאלבומי הגיבוי שנבחרו",
"sync_upload_album_setting_subtitle": "צור והעלה תמונות וסרטונים שלך לאלבומים שנבחרו ביישום",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "ספרייה",
"tab_controller_nav_photos": "תמונות",
"tab_controller_nav_search": "חיפוש",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "साझा किए गए लिंक को हटाएं",
"description_input_hint_text": "Add description...",
"description_input_submit_error": "Error updating description, check the log for more details",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Megosztott Link Törlése",
"description_input_hint_text": "Leírás hozzáadása...",
"description_input_submit_error": "Nem sikerült frissíteni a leírást. További információért kérjük, nézd meg az eseménynaplót",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Dátum és Idő",
"edit_date_time_dialog_timezone": "Időzóna",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Elimina link condiviso",
"description_input_hint_text": "Aggiungi descrizione...",
"description_input_submit_error": "Errore modificare descrizione, controlli I log per maggiori dettagli",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Data e ora",
"edit_date_time_dialog_timezone": "Fuso orario",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "共有リンクを消す",
"description_input_hint_text": "説明を追加",
"description_input_submit_error": "説明の編集に失敗しました。詳細はログを確認してください。",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "日付と時間",
"edit_date_time_dialog_timezone": "タイムゾーン",
"edit_image_title": "Edit",

View File

@@ -31,7 +31,7 @@
"album_viewer_appbar_share_err_delete": "앨범을 삭제하지 못했습니다.",
"album_viewer_appbar_share_err_leave": "앨범에서 나가지 못했습니다.",
"album_viewer_appbar_share_err_remove": "앨범에서 항목을 제거하지 못했습니다.",
"album_viewer_appbar_share_err_title": "앨범을 변경하지 못했습니다.",
"album_viewer_appbar_share_err_title": "앨범 이름을 변경하지 못했습니다.",
"album_viewer_appbar_share_leave": "앨범 나가기",
"album_viewer_appbar_share_remove": "앨범에서 제거",
"album_viewer_appbar_share_to": "공유 대상",
@@ -55,12 +55,12 @@
"asset_list_settings_subtitle": "사진 배열 레이아웃 설정",
"asset_list_settings_title": "사진 배열",
"asset_restored_successfully": "항목이 성공적으로 복원되었습니다.",
"assets_deleted_permanently": "{}개 항목이 영구적으로 삭제됨",
"assets_deleted_permanently_from_server": "{}개 항목이 Immich 서버에서 영구적으로 삭제됨",
"assets_removed_permanently_from_device": "{}개 항목이 기기에서 영구적으로 삭제됨",
"assets_restored_successfully": "항목 {}개를 복원습니다.",
"assets_trashed": "휴지통으로 {}개 항목이 이동되었습니다.",
"assets_trashed_from_server": "휴지통으로 Immich 서버 {}개 항목이 이동되었습니다.",
"assets_deleted_permanently": "{} 미디어가 영구 삭제됨",
"assets_deleted_permanently_from_server": "Immich 서버에서 {} 미디어가 영구 삭제되었습니다.",
"assets_removed_permanently_from_device": "장치에서 {} 미디어가 영구적으로 제거되었습니다.",
"assets_restored_successfully": "{} 미디어가 성공적으로 복원되었습니다.",
"assets_trashed": "{} 미디어가 휴지통에 버려졌습니다.",
"assets_trashed_from_server": "Immich 서버에서 {} 미디어를 삭제했습니다.",
"asset_viewer_settings_title": "보기 옵션",
"backup_album_selection_page_albums_device": "기기의 앨범 ({})",
"backup_album_selection_page_albums_tap": "한 번 눌러 선택, 두 번 눌러 제외하세요.",
@@ -69,55 +69,55 @@
"backup_album_selection_page_selection_info": "선택한 앨범",
"backup_album_selection_page_total_assets": "전체 항목",
"backup_all": "모두",
"backup_background_service_backup_failed_message": "항목을 백업하지 못했습니다. 다시 시도하는 중...",
"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_error_title": "백업 오류",
"backup_background_service_in_progress_notification": "선택한 항목을 백업하는 중...",
"backup_background_service_upload_failure_notification": "{} 업로드 실패",
"backup_controller_page_albums": "백업 앨범",
"backup_controller_page_albums": "백업 대상 앨범",
"backup_controller_page_background_app_refresh_disabled_content": "백그라운드 백업을 사용하려면 설정 > 일반 > 백그라운드 앱 새로 고침에서 백그라운드 앱 새로 고침을 활성화하세요.",
"backup_controller_page_background_app_refresh_disabled_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_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": "새 콘텐츠 백업 간격: {}",
"backup_controller_page_background_description": "백그라운드 서비스를 활성화하 앱을 실행하지 않고 새 항목을 자동으로 백업하세요.",
"backup_controller_page_background_is_off": "백그라운드 백업이 비활성화되었습니다.",
"backup_controller_page_background_is_on": "백그라운드 백업이 활성화되었습니다.",
"backup_controller_page_background_description": "백그라운드 서비스를 활성화하 앱을 지 않고콘텐츠를 자동으로 백업할 수 있습니다.",
"backup_controller_page_background_is_off": "자동 백그라운드 백업이 비활성화되었습니다.",
"backup_controller_page_background_is_on": "자동 백그라운드 백업이 활성화되었습니다.",
"backup_controller_page_background_turn_off": "백그라운드 서비스 비활성화",
"backup_controller_page_background_turn_on": "백그라운드 서비스 활성화",
"backup_controller_page_background_wifi": "Wi-Fi에서만",
"backup_controller_page_backup": "백업",
"backup_controller_page_backup_selected": "선택:",
"backup_controller_page_backup_selected": "선택: ",
"backup_controller_page_backup_sub": "백업된 사진 및 동영상",
"backup_controller_page_cancel": "취소",
"backup_controller_page_created": "생성일: {}",
"backup_controller_page_desc_backup": "포그라운드 백업을 활성화하여 앱을 시작할 때 새 항목을 서버에 자동으로 업로드하세요.",
"backup_controller_page_excluded": "제외:",
"backup_controller_page_desc_backup": "앱을 열 때 새 항목을 서버에 자동으로 업로드하려면 포그라운드 백업을 활성화하세요.",
"backup_controller_page_excluded": "제외: ",
"backup_controller_page_failed": "실패 ({})",
"backup_controller_page_filename": "파일명: {} [{}]",
"backup_controller_page_id": "ID: {}",
"backup_controller_page_info": "백업 정보",
"backup_controller_page_none_selected": "선택한 항목이 없습니다.",
"backup_controller_page_remainder": "남은 항목",
"backup_controller_page_remainder_sub": "백업 대기 중인 사진 및 동영상",
"backup_controller_page_remainder_sub": "백업 사진 및 동영상",
"backup_controller_page_select": "선택",
"backup_controller_page_server_storage": "저장 공간",
"backup_controller_page_start_backup": "백업 시작",
"backup_controller_page_status_off": "포그라운드 백업이 비활성화되었습니다.",
"backup_controller_page_status_on": "포그라운드 백업이 활성화되었습니다.",
"backup_controller_page_status_off": "자동 백업이 비활성화되었습니다.",
"backup_controller_page_status_on": "자동 백업이 활성화되었습니다.",
"backup_controller_page_storage_format": "{} 사용 중, 전체 {}",
"backup_controller_page_to_backup": "백업 앨범 목록",
"backup_controller_page_to_backup": "백업 대상 앨범 목록",
"backup_controller_page_total": "전체",
"backup_controller_page_total_sub": "선택한 앨범의 고유한 사진 및 동영상",
"backup_controller_page_turn_off": "비활성화",
"backup_controller_page_turn_on": "활성화",
"backup_controller_page_total_sub": "선택한 앨범의 모든 사진 및 동영상",
"backup_controller_page_turn_off": "백업 비활성화",
"backup_controller_page_turn_on": "백업 활성화",
"backup_controller_page_uploading_file_info": "파일 정보 업로드 중",
"backup_err_only_album": "유일한 앨범은 제거할 수 없습니다.",
"backup_info_card_assets": "항목",
@@ -154,7 +154,7 @@
"client_cert_enter_password": "비밀번호 입력",
"client_cert_import": "가져오기",
"client_cert_import_success_msg": "클라이언트 인증서를 가져왔습니다.",
"client_cert_invalid_msg": "유효하지 않은 인증서 또는 패스프레이즈가 일치하지 않습니다.",
"client_cert_invalid_msg": "유효하지 않은 인증서이거나 비밀번호가 일치하지 않습니다.",
"client_cert_remove": "제거",
"client_cert_remove_msg": "클라이언트 인증서가 제거되었습니다.",
"client_cert_subtitle": "인증서 가져오기/제거는 로그인 전에만 가능합니다. PKCS12 (.p12, .pfx) 형식을 지원합니다.",
@@ -210,15 +210,11 @@
"delete_shared_link_dialog_title": "공유 링크 삭제",
"description_input_hint_text": "설명 추가...",
"description_input_submit_error": "설명을 변경하는 중 문제가 발생했습니다. 자세한 내용은 로그를 참조하세요.",
"download_error": "다운로드 중 문제가 발생했습니다.",
"download_started": "다운로드가 시작되었습니다.",
"download_sucess": "다운로드가 완료되었습니다.",
"download_sucess_android": "미디어가 DCIM/Immich에 저장되었습니다.",
"edit_date_time_dialog_date_time": "날짜 및 시간",
"edit_date_time_dialog_timezone": "시간대",
"edit_image_title": "편집",
"edit_location_dialog_title": "위치",
"error_saving_image": "오류: {}",
"error_saving_image": "오류입니다: {}",
"exif_bottom_sheet_description": "설명 추가...",
"exif_bottom_sheet_details": "상세 정보",
"exif_bottom_sheet_location": "위치",
@@ -255,7 +251,7 @@
"home_page_first_time_notice": "앱을 처음 사용하는 경우 타임라인에 앨범의 사진과 동영상을 채울 수 있도록 백업할 앨범을 선택하세요.",
"home_page_share_err_local": "기기의 항목은 링크로 공유할 수 없습니다. 건너뜁니다.",
"home_page_upload_err_limit": "한 번에 최대 30개의 항목만 업로드할 수 있습니다.",
"image_saved_successfully": "이미지 저장되었습니다.",
"image_saved_successfully": "이미지 저장",
"image_viewer_page_state_provider_download_error": "다운로드 오류",
"image_viewer_page_state_provider_download_started": "다운로드가 시작되었습니다.",
"image_viewer_page_state_provider_download_success": "다운로드 완료",
@@ -286,14 +282,14 @@
"login_form_back_button_text": "뒤로",
"login_form_button_text": "로그인",
"login_form_email_hint": "youremail@email.com",
"login_form_endpoint_hint": "http://your-server-ip:port/api",
"login_form_endpoint_hint": "https://your-server-ip:port/api",
"login_form_endpoint_url": "서버 엔드포인트 URL",
"login_form_err_http": "http:// 또는 https://로 시작해야 합니다.",
"login_form_err_invalid_email": "유효하지 않은 이메일",
"login_form_err_invalid_url": "잘못된 URL입니다.",
"login_form_err_leading_whitespace": "시작 부분에 공백이 있습니다.",
"login_form_err_trailing_whitespace": "끝 부분에 공백이 있습니다.",
"login_form_failed_get_oauth_server_config": "OAuth 로그인 중 문제 발생, 서버 URL을 확인세요.",
"login_form_err_leading_whitespace": "앞에 공백 문자가 있습니다.",
"login_form_err_trailing_whitespace": "뒤에 공백 문자가 있습니다.",
"login_form_failed_get_oauth_server_config": "OAuth 로그인 중 문제 발생, 서버 URL을 확인해주세요.",
"login_form_failed_get_oauth_server_disable": "이 서버는 OAuth 기능을 지원하지 않습니다.",
"login_form_failed_login": "로그인 오류. 서버 URL, 이메일 및 비밀번호를 확인하세요.",
"login_form_handshake_exception": "서버와 통신 중 인증서 예외가 발생했습니다. 자체 서명된 인증서를 사용 중이라면, 설정에서 자체 서명된 인증서 허용을 활성화하세요.",
@@ -347,7 +343,7 @@
"notification_permission_dialog_cancel": "취소",
"notification_permission_dialog_content": "알림을 활성화하려면 설정에서 알림 권한을 허용하세요.",
"notification_permission_dialog_settings": "설정",
"notification_permission_list_tile_content": "알림을 활성화하려면 권한을 부여하세요.",
"notification_permission_list_tile_content": "알림을 활성화하기 위해 권한을 부여하세요.",
"notification_permission_list_tile_enable_button": "알림 활성화",
"notification_permission_list_tile_title": "알림 권한",
"partner_list_user_photos": "{user}님의 사진",
@@ -375,7 +371,7 @@
"profile_drawer_app_logs": "로그",
"profile_drawer_client_out_of_date_major": "모바일 앱이 최신 버전이 아닙니다. 최신 버전으로 업데이트하세요.",
"profile_drawer_client_out_of_date_minor": "모바일 앱이 최신 버전이 아닙니다. 최신 버전으로 업데이트하세요.",
"profile_drawer_client_server_up_to_date": "클라이언트와 서버가 최신입니다.",
"profile_drawer_client_server_up_to_date": "모바일 앱과 서버가 최신 버전입니다.",
"profile_drawer_documentation": "문서",
"profile_drawer_github": "Github",
"profile_drawer_server_out_of_date_major": "서버 버전이 최신이 아닙니다. 최신 버전으로 업데이트하세요.",
@@ -393,7 +389,7 @@
"search_filter_camera_model": "모델명",
"search_filter_camera_title": "카메라 종류 선택",
"search_filter_date": "날짜",
"search_filter_date_interval": "{start} - {end}",
"search_filter_date_interval": "{start}에서 {end} 까지",
"search_filter_date_title": "날짜 범위 선택",
"search_filter_display_option_archive": "보관함",
"search_filter_display_option_favorite": "즐겨찾기",
@@ -415,8 +411,8 @@
"search_page_categories": "분류",
"search_page_favorites": "즐겨찾기",
"search_page_motion_photos": "모션 포토",
"search_page_no_objects": "사용 가능한 사물 정보 없",
"search_page_no_places": "사용 가능한 위치 정보 없",
"search_page_no_objects": "사물 정보습니다.",
"search_page_no_places": "장소 정보습니다.",
"search_page_people": "인물",
"search_page_person_add_name_dialog_cancel": "취소",
"search_page_person_add_name_dialog_hint": "이름",
@@ -439,7 +435,7 @@
"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": "제안",
"select_user_for_sharing_page_share_suggestions": "추천",
"server_info_box_app_version": "앱 버전",
"server_info_box_latest_release": "최신 버전",
"server_info_box_server_url": "서버 URL",
@@ -458,12 +454,12 @@
"setting_notifications_notify_minutes": "{}분 후",
"setting_notifications_notify_never": "알리지 않음",
"setting_notifications_notify_seconds": "{}초",
"setting_notifications_single_progress_subtitle": "개별 항목의 세 업로드 정보 표시",
"setting_notifications_single_progress_title": "백그라운드 백업 상세 진행률 표시",
"setting_notifications_single_progress_subtitle": " 항목의 세 업로드 정보 표시",
"setting_notifications_single_progress_title": "백그라운드 작업의 세부 진행률 표시",
"setting_notifications_subtitle": "알림 기본 설정 조정",
"setting_notifications_title": "알림",
"setting_notifications_total_progress_subtitle": "전체 업로드 진행률 (완료/전체)",
"setting_notifications_total_progress_title": "백그라운드 백업 전체 진행률 표시",
"setting_notifications_total_progress_title": "백그라운드 작업의 전체 진행률 표시",
"setting_pages_app_bar_settings": "설정",
"settings_require_restart": "설정을 적용하려면 Immich를 다시 시작하세요.",
"setting_video_viewer_looping_subtitle": "상세 보기에서 동영상을 자동으로 반복합니다.",
@@ -471,7 +467,7 @@
"setting_video_viewer_title": "동영상",
"share_add": "추가",
"share_add_photos": "사진 추가",
"share_add_title": "앨범명 추가",
"share_add_title": "앨범 제목 입력",
"share_assets_selected": "{}개 항목 선택됨",
"share_create_album": "앨범 생성",
"shared_album_activities_input_disable": "댓글이 비활성화되었습니다",
@@ -532,7 +528,7 @@
"shared_link_manage_links": "공유 링크 관리",
"shared_link_public_album": "공개 앨범",
"share_done": "완료",
"share_invite": "앨범으로 초대",
"share_invite": "앨범 초대",
"sharing_page_album": "공유 앨범",
"sharing_page_description": "공유 앨범을 만들어 주변 사람들과 사진 및 동영상을 공유하세요.",
"sharing_page_empty_list": "공유 앨범 없음",
@@ -541,8 +537,8 @@
"sharing_silver_appbar_share_partner": "파트너와 공유",
"sync": "동기화",
"sync_albums": "앨범 동기화",
"sync_albums_manual_subtitle": "업로드한 모든 동영상과 사진을 선택한 백업 앨범에 동기화",
"sync_upload_album_setting_subtitle": "선택한 앨범을 Immich에 생성하고 사진 및 동영상을 업로드하세요.",
"sync_albums_manual_subtitle": "업로드한 모든 동영상과 사진을 선택한 백업 앨범에 동기화합니다.",
"sync_upload_album_setting_subtitle": "Immich에서 선택한 앨범에 사진 및 동영상을 만들고 업로드하세요.",
"tab_controller_nav_library": "라이브러리",
"tab_controller_nav_photos": "사진",
"tab_controller_nav_search": "검색",
@@ -550,7 +546,7 @@
"theme_setting_asset_list_storage_indicator_title": "항목에 스토리지 동기화 여부 표시",
"theme_setting_asset_list_tiles_per_row_title": "한 줄에 표시할 항목 수 ({})",
"theme_setting_colorful_interface_subtitle": "배경에 대표 색상을 적용합니다.",
"theme_setting_colorful_interface_title": "미려한 인터페이스",
"theme_setting_colorful_interface_title": "컬러풀 인터페이스",
"theme_setting_dark_mode_switch": "다크 모드",
"theme_setting_image_viewer_quality_subtitle": "상세 보기 이미지 품질 조정",
"theme_setting_image_viewer_quality_title": "이미지 보기 품질",
@@ -563,7 +559,7 @@
"theme_setting_three_stage_loading_subtitle": "이 기능은 앱의 로드 성능을 향상시킬 수 있지만 더 많은 데이터를 사용합니다.",
"theme_setting_three_stage_loading_title": "3단계 로드 활성화",
"translated_text_options": "옵션",
"trash_emptied": "휴지통",
"trash_emptied": "휴지통 비우기",
"trash_page_delete": "삭제",
"trash_page_delete_all": "모두 삭제",
"trash_page_empty_trash_btn": "휴지통 비우기",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Delete Shared Link",
"description_input_hint_text": "Add description...",
"description_input_submit_error": "Error updating description, check the log for more details",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Dzēst Kopīgošanas saiti",
"description_input_hint_text": "Pievienot aprakstu...",
"description_input_submit_error": "Atjauninot aprakstu, radās kļūda; papildinformāciju skatiet žurnālā",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Datums un Laiks",
"edit_date_time_dialog_timezone": "Laika zona",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Delete Shared Link",
"description_input_hint_text": "Add description...",
"description_input_submit_error": "Error updating description, check the log for more details",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Slett delt link",
"description_input_hint_text": "Legg til beskrivelse ...",
"description_input_submit_error": "Feil ved oppdatering av beskrivelse, sjekk loggen for flere detaljer",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Dato og tid",
"edit_date_time_dialog_timezone": "Tidssone",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Verwijder gedeelde link",
"description_input_hint_text": "Beschrijving toevoegen...",
"description_input_submit_error": "Beschrijving bijwerken mislukt, controleer het logboek voor meer details",
"download_error": "Fout bij downloaden",
"download_started": "Download gestart",
"download_sucess": "Succesvol gedownload",
"download_sucess_android": "Het bestand is gedownload naar DCIM/Immich",
"edit_date_time_dialog_date_time": "Datum en tijd",
"edit_date_time_dialog_timezone": "Tijdzone",
"edit_image_title": "Bewerken",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Usuń udostępniony link",
"description_input_hint_text": "Dodaj opis...",
"description_input_submit_error": "Błąd aktualizacji opisu, sprawdź dziennik, aby uzyskać więcej szczegółów",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Data i godzina",
"edit_date_time_dialog_timezone": "Strefa czasowa",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Excluir link compartilhado",
"description_input_hint_text": "Adicionar descrição...",
"description_input_submit_error": "Erro ao atualizar a descrição, verifique o registo para obter mais detalhes",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Data e Hora",
"edit_date_time_dialog_timezone": "Fuso horário",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Șterge link distribuire",
"description_input_hint_text": "Adaugă descriere...",
"description_input_submit_error": "Eroare actualizare descriere, verifică log-urile pentru mai multe detalii",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Dată și Oră",
"edit_date_time_dialog_timezone": "Fus orar",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Удалить общую ссылку",
"description_input_hint_text": "Добавить описание...",
"description_input_submit_error": "Не удалось обновить описание, проверьте логи, чтобы узнать причину",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Дата и время",
"edit_date_time_dialog_timezone": "Часовой пояс",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Odstrániť zdieľaný odkaz",
"description_input_hint_text": "Pridať popis...",
"description_input_submit_error": "Chyba pri aktualizovaní popisu, zobrazte log pre viac detailov",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Dátum a čas",
"edit_date_time_dialog_timezone": "Časové pásmo",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Izbriši povezavo skupne rabe",
"description_input_hint_text": "Dodaj opis ...",
"description_input_submit_error": "Napaka pri posodabljanju opisa, preverite dnevnik za več podrobnosti",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Datum in ura",
"edit_date_time_dialog_timezone": "Časovni pas",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Delete Shared Link",
"description_input_hint_text": "Add description...",
"description_input_submit_error": "Error updating description, check the log for more details",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Delete Shared Link",
"description_input_hint_text": "Add description...",
"description_input_submit_error": "Error updating description, check the log for more details",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Delete Shared Link",
"description_input_hint_text": "Add description...",
"description_input_submit_error": "Error updating description, check the log for more details",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Ta Bort Delad Länk",
"description_input_hint_text": "Lägg till beskrivning...",
"description_input_submit_error": "Fel vid uppdatering av beskrivning, se loggen för fler detaljer",
"download_error": "Fel vid nedladdning",
"download_started": "Nedladdning påbörjad",
"download_sucess": "Nedladdning lyckades",
"download_sucess_android": "Media har laddats ner till DCIM/Immich",
"edit_date_time_dialog_date_time": "Datum och Tid",
"edit_date_time_dialog_timezone": "Tidszon",
"edit_image_title": "Redigera",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "ลบลิงก์ที่แชร์",
"description_input_hint_text": "เพื่มรายละเอียด...",
"description_input_submit_error": "อัพเดตรายละเอียดผิดพลาด ตรวจสอบ log เพื่อรายละเอียดเพิ่มเติม",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "วันและเวลา",
"edit_date_time_dialog_timezone": "เขดเวลา",
"edit_image_title": "Edit",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Видалити спільне посилання",
"description_input_hint_text": "Додати опис...",
"description_input_submit_error": "Помилка оновлення опису, перевірте логи для подробиць",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Дата і час",
"edit_date_time_dialog_timezone": "Часовий пояс",
"edit_image_title": "Edit",

View File

@@ -94,7 +94,7 @@
"backup_controller_page_background_turn_on": "Bật dịch vụ nền",
"backup_controller_page_background_wifi": "Chỉ khi dùng Wi-Fi",
"backup_controller_page_backup": "Sao lưu",
"backup_controller_page_backup_selected": "Đã chọn: ",
"backup_controller_page_backup_selected": "Đã chọn:",
"backup_controller_page_backup_sub": "Ảnh và video đã sao lưu",
"backup_controller_page_cancel": "Từ chối",
"backup_controller_page_created": "Tạo vào: {}",
@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Xoá liên kết đã chia sẻ",
"description_input_hint_text": "Thêm mô tả...",
"description_input_submit_error": "Cập nhật mô tả không thành công, vui lòng kiểm tra nhật ký để biết thêm chi tiết",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Ngày và Giờ",
"edit_date_time_dialog_timezone": "Múi giờ",
"edit_image_title": "Sửa",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "删除共享链接",
"description_input_hint_text": "添加描述...",
"description_input_submit_error": "更新描述时出错,请检查日志以获取更多详细信息",
"download_error": "下载出错",
"download_started": "开始下载",
"download_sucess": "下载成功",
"download_sucess_android": "媒体已下载至 DCIM/Immich",
"edit_date_time_dialog_date_time": "日期和时间",
"edit_date_time_dialog_timezone": "时区",
"edit_image_title": "编辑",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "删除共享链接",
"description_input_hint_text": "添加描述...",
"description_input_submit_error": "更新描述时出错,请检查日志以获取更多详细信息",
"download_error": "下载出错",
"download_started": "开始下载",
"download_sucess": "下载成功",
"download_sucess_android": "媒体已下载至 DCIM/Immich",
"edit_date_time_dialog_date_time": "日期和时间",
"edit_date_time_dialog_timezone": "时区",
"edit_image_title": "编辑",

View File

@@ -210,10 +210,6 @@
"delete_shared_link_dialog_title": "Delete Shared Link",
"description_input_hint_text": "Add description...",
"description_input_submit_error": "Error updating description, check the log for more details",
"download_error": "Download Error",
"download_started": "Download started",
"download_sucess": "Download success",
"download_sucess_android": "The media has been downloaded to DCIM/Immich",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",

View File

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

View File

@@ -9,6 +9,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_displaymode/flutter_displaymode.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/utils/sqlite.dart';
import 'package:timezone/data/latest.dart';
import 'package:immich_mobile/constants/locales.dart';
import 'package:immich_mobile/services/background.service.dart';
@@ -54,6 +55,7 @@ void main() async {
Future<void> initApp() async {
await EasyLocalization.ensureInitialized();
await openSqliteDatabase();
if (kReleaseMode && Platform.isAndroid) {
try {

View File

@@ -1,5 +1,3 @@
import 'dart:io';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
@@ -33,21 +31,19 @@ class ImageViewerStateNotifier extends StateNotifier<AssetViewerPageState> {
ImmichToast.show(
context: context,
msg: 'download_started'.tr(),
msg: 'image_viewer_page_state_provider_download_started'.tr(),
toastType: ToastType.info,
gravity: ToastGravity.BOTTOM,
);
bool isSuccess = await _imageViewerService.downloadAsset(asset);
bool isSuccess = await _imageViewerService.downloadAssetToDevice(asset);
if (isSuccess) {
state = state.copyWith(downloadAssetStatus: DownloadAssetStatus.success);
ImmichToast.show(
context: context,
msg: Platform.isAndroid
? 'download_sucess_android'.tr()
: 'download_sucess'.tr(),
msg: 'image_viewer_page_state_provider_download_success'.tr(),
toastType: ToastType.success,
gravity: ToastGravity.BOTTOM,
);
@@ -56,7 +52,7 @@ class ImageViewerStateNotifier extends StateNotifier<AssetViewerPageState> {
state = state.copyWith(downloadAssetStatus: DownloadAssetStatus.error);
ImmichToast.show(
context: context,
msg: 'download_error'.tr(),
msg: 'image_viewer_page_state_provider_download_error'.tr(),
toastType: ToastType.error,
gravity: ToastGravity.BOTTOM,
);

View File

@@ -8,6 +8,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/entities/asset.entity.dart';
import 'package:immich_mobile/entities/etag.entity.dart';
import 'package:immich_mobile/entities/exif_info.entity.dart';
import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/entities/user.entity.dart';
import 'package:immich_mobile/models/backup/backup_candidate.model.dart';
import 'package:immich_mobile/providers/api.provider.dart';
@@ -308,6 +309,18 @@ class AssetService {
useTimeFilter: false,
);
final duplicates = await _apiService.assetsApi.checkExistingAssets(
CheckExistingAssetsDto(
deviceAssetIds: candidates.map((c) => c.asset.id).toList(),
deviceId: Store.get(StoreKey.deviceId),
),
);
if (duplicates != null) {
candidates
.removeWhere((c) => !duplicates.existingIds.contains(c.asset.id));
}
await refreshRemoteAssets();
final remoteAssets = await _db.assets
.where()

View File

@@ -484,7 +484,7 @@ class BackupService {
),
);
if (shouldSyncAlbums) {
if (shouldSyncAlbums && !isDuplicate) {
await _albumService.syncUploadAlbums(
candidate.albumNames,
[responseBody['id'] as String],

View File

@@ -19,7 +19,7 @@ class ImageViewerService {
ImageViewerService(this._apiService);
Future<bool> downloadAsset(Asset asset) async {
Future<bool> downloadAssetToDevice(Asset asset) async {
File? imageFile;
File? videoFile;
try {
@@ -82,23 +82,18 @@ class ImageViewerService {
}
final AssetEntity? entity;
final relativePath = Platform.isAndroid ? 'DCIM/Immich' : null;
if (asset.isImage) {
entity = await PhotoManager.editor.saveImage(
res.bodyBytes,
title: asset.fileName,
relativePath: relativePath,
);
} else {
final tempDir = await getTemporaryDirectory();
videoFile = await File('${tempDir.path}/${asset.fileName}').create();
videoFile.writeAsBytesSync(res.bodyBytes);
entity = await PhotoManager.editor.saveVideo(
videoFile,
title: asset.fileName,
relativePath: relativePath,
);
entity = await PhotoManager.editor
.saveVideo(videoFile, title: asset.fileName);
}
return entity != null;
}

View File

@@ -0,0 +1,22 @@
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
Future<void> openSqliteDatabase() async {
final database = openDatabase(
// Set the path to the database. Note: Using the `join` function from the
// `path` package is best practice to ensure the path is correctly
// constructed for each platform.
join(await getDatabasesPath(), 'immich_database.db'),
// When the database is first created, create a table to store dogs.
onCreate: (db, version) {
// Run the CREATE TABLE statement on the database.
return db.execute(
'CREATE TABLE dogs(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)',
);
},
// Set the version. This executes the onCreate function and provides a
// path to perform database upgrades and downgrades.
version: 1,
);
}

View File

@@ -93,10 +93,6 @@ class GalleryAppBar extends ConsumerWidget {
);
}
handleDownloadAsset() {
ref.read(imageViewerStateProvider.notifier).downloadAsset(asset, context);
}
return IgnorePointer(
ignoring: !ref.watch(showControlsProvider),
child: AnimatedOpacity(
@@ -113,7 +109,13 @@ class GalleryAppBar extends ConsumerWidget {
onFavorite: toggleFavorite,
onRestorePressed: () => handleRestore(asset),
onUploadPressed: asset.isLocal ? () => handleUpload(asset) : null,
onDownloadPressed: asset.isLocal ? null : handleDownloadAsset,
onDownloadPressed: asset.isLocal
? null
: () =>
ref.read(imageViewerStateProvider.notifier).downloadAsset(
asset,
context,
),
onToggleMotionVideo: onToggleMotionVideo,
onAddToAlbumPressed: () => addToAlbum(asset),
onActivitiesPressed: handleActivities,

View File

@@ -3,9 +3,7 @@
.dart_tool/
.packages
build/
# Except for application packages
pubspec.lock
pubspec.lock # Except for application packages
doc/api/

View File

@@ -1 +1 @@
7.8.0
7.5.0

View File

@@ -3,8 +3,8 @@ Immich API
This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 1.114.0
- Generator version: 7.8.0
- API version: 1.113.1
- Generator version: 7.5.0
- Build package: org.openapitools.codegen.languages.DartClientCodegen
## Requirements
@@ -407,13 +407,11 @@ Class | Method | HTTP request | Description
- [SignUpDto](doc//SignUpDto.md)
- [SmartInfoResponseDto](doc//SmartInfoResponseDto.md)
- [SmartSearchDto](doc//SmartSearchDto.md)
- [SourceType](doc//SourceType.md)
- [StackCreateDto](doc//StackCreateDto.md)
- [StackResponseDto](doc//StackResponseDto.md)
- [StackUpdateDto](doc//StackUpdateDto.md)
- [SystemConfigDto](doc//SystemConfigDto.md)
- [SystemConfigFFmpegDto](doc//SystemConfigFFmpegDto.md)
- [SystemConfigFacesDto](doc//SystemConfigFacesDto.md)
- [SystemConfigImageDto](doc//SystemConfigImageDto.md)
- [SystemConfigJobDto](doc//SystemConfigJobDto.md)
- [SystemConfigLibraryDto](doc//SystemConfigLibraryDto.md)
@@ -422,7 +420,6 @@ Class | Method | HTTP request | Description
- [SystemConfigLoggingDto](doc//SystemConfigLoggingDto.md)
- [SystemConfigMachineLearningDto](doc//SystemConfigMachineLearningDto.md)
- [SystemConfigMapDto](doc//SystemConfigMapDto.md)
- [SystemConfigMetadataDto](doc//SystemConfigMetadataDto.md)
- [SystemConfigNewVersionCheckDto](doc//SystemConfigNewVersionCheckDto.md)
- [SystemConfigNotificationsDto](doc//SystemConfigNotificationsDto.md)
- [SystemConfigOAuthDto](doc//SystemConfigOAuthDto.md)

View File

@@ -221,13 +221,11 @@ part 'model/shared_link_type.dart';
part 'model/sign_up_dto.dart';
part 'model/smart_info_response_dto.dart';
part 'model/smart_search_dto.dart';
part 'model/source_type.dart';
part 'model/stack_create_dto.dart';
part 'model/stack_response_dto.dart';
part 'model/stack_update_dto.dart';
part 'model/system_config_dto.dart';
part 'model/system_config_f_fmpeg_dto.dart';
part 'model/system_config_faces_dto.dart';
part 'model/system_config_image_dto.dart';
part 'model/system_config_job_dto.dart';
part 'model/system_config_library_dto.dart';
@@ -236,7 +234,6 @@ part 'model/system_config_library_watch_dto.dart';
part 'model/system_config_logging_dto.dart';
part 'model/system_config_machine_learning_dto.dart';
part 'model/system_config_map_dto.dart';
part 'model/system_config_metadata_dto.dart';
part 'model/system_config_new_version_check_dto.dart';
part 'model/system_config_notifications_dto.dart';
part 'model/system_config_o_auth_dto.dart';

View File

@@ -497,8 +497,6 @@ class ApiClient {
return SmartInfoResponseDto.fromJson(value);
case 'SmartSearchDto':
return SmartSearchDto.fromJson(value);
case 'SourceType':
return SourceTypeTypeTransformer().decode(value);
case 'StackCreateDto':
return StackCreateDto.fromJson(value);
case 'StackResponseDto':
@@ -509,8 +507,6 @@ class ApiClient {
return SystemConfigDto.fromJson(value);
case 'SystemConfigFFmpegDto':
return SystemConfigFFmpegDto.fromJson(value);
case 'SystemConfigFacesDto':
return SystemConfigFacesDto.fromJson(value);
case 'SystemConfigImageDto':
return SystemConfigImageDto.fromJson(value);
case 'SystemConfigJobDto':
@@ -527,8 +523,6 @@ class ApiClient {
return SystemConfigMachineLearningDto.fromJson(value);
case 'SystemConfigMapDto':
return SystemConfigMapDto.fromJson(value);
case 'SystemConfigMetadataDto':
return SystemConfigMetadataDto.fromJson(value);
case 'SystemConfigNewVersionCheckDto':
return SystemConfigNewVersionCheckDto.fromJson(value);
case 'SystemConfigNotificationsDto':

View File

@@ -127,9 +127,6 @@ String parameterToString(dynamic value) {
if (value is SharedLinkType) {
return SharedLinkTypeTypeTransformer().encode(value).toString();
}
if (value is SourceType) {
return SourceTypeTypeTransformer().encode(value).toString();
}
if (value is TimeBucketSize) {
return TimeBucketSizeTypeTransformer().encode(value).toString();
}

View File

@@ -21,7 +21,6 @@ class AssetFaceResponseDto {
required this.imageHeight,
required this.imageWidth,
required this.person,
this.sourceType,
});
int boundingBoxX1;
@@ -40,14 +39,6 @@ class AssetFaceResponseDto {
PersonResponseDto? person;
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
SourceType? sourceType;
@override
bool operator ==(Object other) => identical(this, other) || other is AssetFaceResponseDto &&
other.boundingBoxX1 == boundingBoxX1 &&
@@ -57,8 +48,7 @@ class AssetFaceResponseDto {
other.id == id &&
other.imageHeight == imageHeight &&
other.imageWidth == imageWidth &&
other.person == person &&
other.sourceType == sourceType;
other.person == person;
@override
int get hashCode =>
@@ -70,11 +60,10 @@ class AssetFaceResponseDto {
(id.hashCode) +
(imageHeight.hashCode) +
(imageWidth.hashCode) +
(person == null ? 0 : person!.hashCode) +
(sourceType == null ? 0 : sourceType!.hashCode);
(person == null ? 0 : person!.hashCode);
@override
String toString() => 'AssetFaceResponseDto[boundingBoxX1=$boundingBoxX1, boundingBoxX2=$boundingBoxX2, boundingBoxY1=$boundingBoxY1, boundingBoxY2=$boundingBoxY2, id=$id, imageHeight=$imageHeight, imageWidth=$imageWidth, person=$person, sourceType=$sourceType]';
String toString() => 'AssetFaceResponseDto[boundingBoxX1=$boundingBoxX1, boundingBoxX2=$boundingBoxX2, boundingBoxY1=$boundingBoxY1, boundingBoxY2=$boundingBoxY2, id=$id, imageHeight=$imageHeight, imageWidth=$imageWidth, person=$person]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
@@ -90,11 +79,6 @@ class AssetFaceResponseDto {
} else {
// json[r'person'] = null;
}
if (this.sourceType != null) {
json[r'sourceType'] = this.sourceType;
} else {
// json[r'sourceType'] = null;
}
return json;
}
@@ -114,7 +98,6 @@ class AssetFaceResponseDto {
imageHeight: mapValueOfType<int>(json, r'imageHeight')!,
imageWidth: mapValueOfType<int>(json, r'imageWidth')!,
person: PersonResponseDto.fromJson(json[r'person']),
sourceType: SourceType.fromJson(json[r'sourceType']),
);
}
return null;

View File

@@ -20,7 +20,6 @@ class AssetFaceWithoutPersonResponseDto {
required this.id,
required this.imageHeight,
required this.imageWidth,
this.sourceType,
});
int boundingBoxX1;
@@ -37,14 +36,6 @@ class AssetFaceWithoutPersonResponseDto {
int imageWidth;
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
SourceType? sourceType;
@override
bool operator ==(Object other) => identical(this, other) || other is AssetFaceWithoutPersonResponseDto &&
other.boundingBoxX1 == boundingBoxX1 &&
@@ -53,8 +44,7 @@ class AssetFaceWithoutPersonResponseDto {
other.boundingBoxY2 == boundingBoxY2 &&
other.id == id &&
other.imageHeight == imageHeight &&
other.imageWidth == imageWidth &&
other.sourceType == sourceType;
other.imageWidth == imageWidth;
@override
int get hashCode =>
@@ -65,11 +55,10 @@ class AssetFaceWithoutPersonResponseDto {
(boundingBoxY2.hashCode) +
(id.hashCode) +
(imageHeight.hashCode) +
(imageWidth.hashCode) +
(sourceType == null ? 0 : sourceType!.hashCode);
(imageWidth.hashCode);
@override
String toString() => 'AssetFaceWithoutPersonResponseDto[boundingBoxX1=$boundingBoxX1, boundingBoxX2=$boundingBoxX2, boundingBoxY1=$boundingBoxY1, boundingBoxY2=$boundingBoxY2, id=$id, imageHeight=$imageHeight, imageWidth=$imageWidth, sourceType=$sourceType]';
String toString() => 'AssetFaceWithoutPersonResponseDto[boundingBoxX1=$boundingBoxX1, boundingBoxX2=$boundingBoxX2, boundingBoxY1=$boundingBoxY1, boundingBoxY2=$boundingBoxY2, id=$id, imageHeight=$imageHeight, imageWidth=$imageWidth]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
@@ -80,11 +69,6 @@ class AssetFaceWithoutPersonResponseDto {
json[r'id'] = this.id;
json[r'imageHeight'] = this.imageHeight;
json[r'imageWidth'] = this.imageWidth;
if (this.sourceType != null) {
json[r'sourceType'] = this.sourceType;
} else {
// json[r'sourceType'] = null;
}
return json;
}
@@ -103,7 +87,6 @@ class AssetFaceWithoutPersonResponseDto {
id: mapValueOfType<String>(json, r'id')!,
imageHeight: mapValueOfType<int>(json, r'imageHeight')!,
imageWidth: mapValueOfType<int>(json, r'imageWidth')!,
sourceType: SourceType.fromJson(json[r'sourceType']),
);
}
return null;

View File

@@ -17,7 +17,6 @@ class ServerFeaturesDto {
required this.duplicateDetection,
required this.email,
required this.facialRecognition,
required this.importFaces,
required this.map,
required this.oauth,
required this.oauthAutoLaunch,
@@ -37,8 +36,6 @@ class ServerFeaturesDto {
bool facialRecognition;
bool importFaces;
bool map;
bool oauth;
@@ -63,7 +60,6 @@ class ServerFeaturesDto {
other.duplicateDetection == duplicateDetection &&
other.email == email &&
other.facialRecognition == facialRecognition &&
other.importFaces == importFaces &&
other.map == map &&
other.oauth == oauth &&
other.oauthAutoLaunch == oauthAutoLaunch &&
@@ -81,7 +77,6 @@ class ServerFeaturesDto {
(duplicateDetection.hashCode) +
(email.hashCode) +
(facialRecognition.hashCode) +
(importFaces.hashCode) +
(map.hashCode) +
(oauth.hashCode) +
(oauthAutoLaunch.hashCode) +
@@ -93,7 +88,7 @@ class ServerFeaturesDto {
(trash.hashCode);
@override
String toString() => 'ServerFeaturesDto[configFile=$configFile, duplicateDetection=$duplicateDetection, email=$email, facialRecognition=$facialRecognition, importFaces=$importFaces, map=$map, oauth=$oauth, oauthAutoLaunch=$oauthAutoLaunch, passwordLogin=$passwordLogin, reverseGeocoding=$reverseGeocoding, search=$search, sidecar=$sidecar, smartSearch=$smartSearch, trash=$trash]';
String toString() => 'ServerFeaturesDto[configFile=$configFile, duplicateDetection=$duplicateDetection, email=$email, facialRecognition=$facialRecognition, map=$map, oauth=$oauth, oauthAutoLaunch=$oauthAutoLaunch, passwordLogin=$passwordLogin, reverseGeocoding=$reverseGeocoding, search=$search, sidecar=$sidecar, smartSearch=$smartSearch, trash=$trash]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
@@ -101,7 +96,6 @@ class ServerFeaturesDto {
json[r'duplicateDetection'] = this.duplicateDetection;
json[r'email'] = this.email;
json[r'facialRecognition'] = this.facialRecognition;
json[r'importFaces'] = this.importFaces;
json[r'map'] = this.map;
json[r'oauth'] = this.oauth;
json[r'oauthAutoLaunch'] = this.oauthAutoLaunch;
@@ -126,7 +120,6 @@ class ServerFeaturesDto {
duplicateDetection: mapValueOfType<bool>(json, r'duplicateDetection')!,
email: mapValueOfType<bool>(json, r'email')!,
facialRecognition: mapValueOfType<bool>(json, r'facialRecognition')!,
importFaces: mapValueOfType<bool>(json, r'importFaces')!,
map: mapValueOfType<bool>(json, r'map')!,
oauth: mapValueOfType<bool>(json, r'oauth')!,
oauthAutoLaunch: mapValueOfType<bool>(json, r'oauthAutoLaunch')!,
@@ -187,7 +180,6 @@ class ServerFeaturesDto {
'duplicateDetection',
'email',
'facialRecognition',
'importFaces',
'map',
'oauth',
'oauthAutoLaunch',

View File

@@ -1,85 +0,0 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class SourceType {
/// Instantiate a new enum with the provided [value].
const SourceType._(this.value);
/// The underlying value of this enum member.
final String value;
@override
String toString() => value;
String toJson() => value;
static const machineLearning = SourceType._(r'machine-learning');
static const exif = SourceType._(r'exif');
/// List of all possible values in this [enum][SourceType].
static const values = <SourceType>[
machineLearning,
exif,
];
static SourceType? fromJson(dynamic value) => SourceTypeTypeTransformer().decode(value);
static List<SourceType> listFromJson(dynamic json, {bool growable = false,}) {
final result = <SourceType>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = SourceType.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
}
/// Transformation class that can [encode] an instance of [SourceType] to String,
/// and [decode] dynamic data back to [SourceType].
class SourceTypeTypeTransformer {
factory SourceTypeTypeTransformer() => _instance ??= const SourceTypeTypeTransformer._();
const SourceTypeTypeTransformer._();
String encode(SourceType data) => data.value;
/// Decodes a [dynamic value][data] to a SourceType.
///
/// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully,
/// then null is returned. However, if [allowNull] is false and the [dynamic value][data]
/// cannot be decoded successfully, then an [UnimplementedError] is thrown.
///
/// The [allowNull] is very handy when an API changes and a new enum value is added or removed,
/// and users are still using an old app with the old code.
SourceType? decode(dynamic data, {bool allowNull = true}) {
if (data != null) {
switch (data) {
case r'machine-learning': return SourceType.machineLearning;
case r'exif': return SourceType.exif;
default:
if (!allowNull) {
throw ArgumentError('Unknown enum value to decode: $data');
}
}
}
return null;
}
/// Singleton [SourceTypeTypeTransformer] instance.
static SourceTypeTypeTransformer? _instance;
}

View File

@@ -20,7 +20,6 @@ class SystemConfigDto {
required this.logging,
required this.machineLearning,
required this.map,
required this.metadata,
required this.newVersionCheck,
required this.notifications,
required this.oauth,
@@ -47,8 +46,6 @@ class SystemConfigDto {
SystemConfigMapDto map;
SystemConfigMetadataDto metadata;
SystemConfigNewVersionCheckDto newVersionCheck;
SystemConfigNotificationsDto notifications;
@@ -78,7 +75,6 @@ class SystemConfigDto {
other.logging == logging &&
other.machineLearning == machineLearning &&
other.map == map &&
other.metadata == metadata &&
other.newVersionCheck == newVersionCheck &&
other.notifications == notifications &&
other.oauth == oauth &&
@@ -100,7 +96,6 @@ class SystemConfigDto {
(logging.hashCode) +
(machineLearning.hashCode) +
(map.hashCode) +
(metadata.hashCode) +
(newVersionCheck.hashCode) +
(notifications.hashCode) +
(oauth.hashCode) +
@@ -113,7 +108,7 @@ class SystemConfigDto {
(user.hashCode);
@override
String toString() => 'SystemConfigDto[ffmpeg=$ffmpeg, image=$image, job=$job, library_=$library_, logging=$logging, machineLearning=$machineLearning, map=$map, metadata=$metadata, newVersionCheck=$newVersionCheck, notifications=$notifications, oauth=$oauth, passwordLogin=$passwordLogin, reverseGeocoding=$reverseGeocoding, server=$server, storageTemplate=$storageTemplate, theme=$theme, trash=$trash, user=$user]';
String toString() => 'SystemConfigDto[ffmpeg=$ffmpeg, image=$image, job=$job, library_=$library_, logging=$logging, machineLearning=$machineLearning, map=$map, newVersionCheck=$newVersionCheck, notifications=$notifications, oauth=$oauth, passwordLogin=$passwordLogin, reverseGeocoding=$reverseGeocoding, server=$server, storageTemplate=$storageTemplate, theme=$theme, trash=$trash, user=$user]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
@@ -124,7 +119,6 @@ class SystemConfigDto {
json[r'logging'] = this.logging;
json[r'machineLearning'] = this.machineLearning;
json[r'map'] = this.map;
json[r'metadata'] = this.metadata;
json[r'newVersionCheck'] = this.newVersionCheck;
json[r'notifications'] = this.notifications;
json[r'oauth'] = this.oauth;
@@ -153,7 +147,6 @@ class SystemConfigDto {
logging: SystemConfigLoggingDto.fromJson(json[r'logging'])!,
machineLearning: SystemConfigMachineLearningDto.fromJson(json[r'machineLearning'])!,
map: SystemConfigMapDto.fromJson(json[r'map'])!,
metadata: SystemConfigMetadataDto.fromJson(json[r'metadata'])!,
newVersionCheck: SystemConfigNewVersionCheckDto.fromJson(json[r'newVersionCheck'])!,
notifications: SystemConfigNotificationsDto.fromJson(json[r'notifications'])!,
oauth: SystemConfigOAuthDto.fromJson(json[r'oauth'])!,
@@ -218,7 +211,6 @@ class SystemConfigDto {
'logging',
'machineLearning',
'map',
'metadata',
'newVersionCheck',
'notifications',
'oauth',

View File

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

View File

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

View File

@@ -7,11 +7,11 @@ version: '1.0.0'
description: 'OpenAPI API client'
homepage: 'homepage'
environment:
sdk: '>=2.12.0 <4.0.0'
sdk: '>=2.12.0 <3.0.0'
dependencies:
collection: '>=1.17.0 <2.0.0'
http: '>=0.13.0 <2.0.0'
collection: '^1.17.0'
http: '>=0.13.0 <0.14.0'
intl: any
meta: '>=1.1.8 <2.0.0'
meta: '^1.1.8'
immich_mobile:
path: ../

View File

@@ -1454,7 +1454,7 @@ packages:
source: hosted
version: "7.0.0"
sqflite:
dependency: transitive
dependency: "direct main"
description:
name: sqflite
sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d
@@ -1737,10 +1737,10 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc
url: "https://pub.dev"
source: hosted
version: "14.2.5"
version: "14.2.4"
wakelock_plus:
dependency: "direct main"
description:

View File

@@ -2,7 +2,7 @@ name: immich_mobile
description: Immich - selfhosted backup media file on mobile phone
publish_to: 'none'
version: 1.114.0+158
version: 1.113.1+157
environment:
sdk: '>=3.3.0 <4.0.0'
@@ -38,7 +38,7 @@ dependencies:
share_plus: ^10.0.0
flutter_displaymode: ^0.6.0
scrollable_positioned_list: ^0.3.8
path: ^1.8.3
path: ^1.9.0
path_provider: ^2.1.2
collection: ^1.18.0
http_parser: ^4.0.2
@@ -67,6 +67,7 @@ dependencies:
image_picker: ^1.0.7 # only used to select user profile image from system gallery -> we can simply select an image from within immich?
logging: ^1.2.0
file_picker: ^8.0.0+1
sqflite: ^2.3.3+1
# This is uncommented in F-Droid build script
# Taken from https://github.com/Myzel394/locus/blob/445013d22ec1d759027d4303bd65b30c5c8588c8/pubspec.yaml#L105

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash
OPENAPI_GENERATOR_VERSION=v7.8.0
OPENAPI_GENERATOR_VERSION=v7.5.0
# usage: ./bin/generate-open-api.sh

View File

@@ -7394,7 +7394,7 @@
"info": {
"title": "Immich",
"description": "Immich API",
"version": "1.114.0",
"version": "1.113.1",
"contact": {}
},
"tags": [],
@@ -8018,9 +8018,6 @@
}
],
"nullable": true
},
"sourceType": {
"$ref": "#/components/schemas/SourceType"
}
},
"required": [
@@ -8089,9 +8086,6 @@
},
"imageWidth": {
"type": "integer"
},
"sourceType": {
"$ref": "#/components/schemas/SourceType"
}
},
"required": [
@@ -10694,9 +10688,6 @@
"facialRecognition": {
"type": "boolean"
},
"importFaces": {
"type": "boolean"
},
"map": {
"type": "boolean"
},
@@ -10730,7 +10721,6 @@
"duplicateDetection",
"email",
"facialRecognition",
"importFaces",
"map",
"oauth",
"oauthAutoLaunch",
@@ -11239,13 +11229,6 @@
],
"type": "object"
},
"SourceType": {
"enum": [
"machine-learning",
"exif"
],
"type": "string"
},
"StackCreateDto": {
"properties": {
"assetIds": {
@@ -11316,9 +11299,6 @@
"map": {
"$ref": "#/components/schemas/SystemConfigMapDto"
},
"metadata": {
"$ref": "#/components/schemas/SystemConfigMetadataDto"
},
"newVersionCheck": {
"$ref": "#/components/schemas/SystemConfigNewVersionCheckDto"
},
@@ -11358,7 +11338,6 @@
"logging",
"machineLearning",
"map",
"metadata",
"newVersionCheck",
"notifications",
"oauth",
@@ -11485,17 +11464,6 @@
],
"type": "object"
},
"SystemConfigFacesDto": {
"properties": {
"import": {
"type": "boolean"
}
},
"required": [
"import"
],
"type": "object"
},
"SystemConfigImageDto": {
"properties": {
"colorspace": {
@@ -11688,17 +11656,6 @@
],
"type": "object"
},
"SystemConfigMetadataDto": {
"properties": {
"faces": {
"$ref": "#/components/schemas/SystemConfigFacesDto"
}
},
"required": [
"faces"
],
"type": "object"
},
"SystemConfigNewVersionCheckDto": {
"properties": {
"enabled": {

View File

@@ -2,6 +2,6 @@
"$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json",
"spaces": 2,
"generator-cli": {
"version": "7.8.0"
"version": "7.5.0"
}
}

View File

@@ -1,8 +1,8 @@
# Include code from immich_mobile
@@ -13,5 +13,5 @@
http: '>=0.13.0 <2.0.0'
http: '>=0.13.0 <0.14.0'
intl: any
meta: '>=1.1.8 <2.0.0'
meta: '^1.1.8'
-dev_dependencies:
- test: '>=1.21.6 <1.22.0'
+ immich_mobile:

View File

@@ -1,12 +1,12 @@
{
"name": "@immich/sdk",
"version": "1.114.0",
"version": "1.113.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@immich/sdk",
"version": "1.114.0",
"version": "1.113.1",
"license": "GNU Affero General Public License version 3",
"dependencies": {
"@oazapfts/runtime": "^1.0.2"

View File

@@ -1,6 +1,6 @@
{
"name": "@immich/sdk",
"version": "1.114.0",
"version": "1.113.1",
"description": "Auto-generated TypeScript SDK for the Immich API",
"type": "module",
"main": "./build/index.js",

View File

@@ -1,6 +1,6 @@
/**
* Immich
* 1.114.0
* 1.113.1
* DO NOT MODIFY - This file has been generated using oazapfts.
* See https://www.npmjs.com/package/oazapfts
*/
@@ -207,7 +207,6 @@ export type AssetFaceWithoutPersonResponseDto = {
id: string;
imageHeight: number;
imageWidth: number;
sourceType?: SourceType;
};
export type PersonWithFacesResponseDto = {
birthDate: string | null;
@@ -509,7 +508,6 @@ export type AssetFaceResponseDto = {
imageHeight: number;
imageWidth: number;
person: (PersonResponseDto) | null;
sourceType?: SourceType;
};
export type FaceDto = {
id: string;
@@ -895,7 +893,6 @@ export type ServerFeaturesDto = {
duplicateDetection: boolean;
email: boolean;
facialRecognition: boolean;
importFaces: boolean;
map: boolean;
oauth: boolean;
oauthAutoLaunch: boolean;
@@ -1125,12 +1122,6 @@ export type SystemConfigMapDto = {
enabled: boolean;
lightStyle: string;
};
export type SystemConfigFacesDto = {
"import": boolean;
};
export type SystemConfigMetadataDto = {
faces: SystemConfigFacesDto;
};
export type SystemConfigNewVersionCheckDto = {
enabled: boolean;
};
@@ -1187,7 +1178,6 @@ export type SystemConfigDto = {
logging: SystemConfigLoggingDto;
machineLearning: SystemConfigMachineLearningDto;
map: SystemConfigMapDto;
metadata: SystemConfigMetadataDto;
newVersionCheck: SystemConfigNewVersionCheckDto;
notifications: SystemConfigNotificationsDto;
oauth: SystemConfigOAuthDto;
@@ -3236,10 +3226,6 @@ export enum AlbumUserRole {
Editor = "editor",
Viewer = "viewer"
}
export enum SourceType {
MachineLearning = "machine-learning",
Exif = "exif"
}
export enum AssetTypeEnum {
Image = "IMAGE",
Video = "VIDEO",

View File

@@ -1,12 +1,12 @@
{
"name": "immich",
"version": "1.114.0",
"version": "1.113.1",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "immich",
"version": "1.114.0",
"version": "1.113.1",
"license": "GNU Affero General Public License version 3",
"dependencies": {
"@nestjs/bullmq": "^10.0.1",
@@ -24,7 +24,7 @@
"@opentelemetry/context-async-hooks": "^1.24.0",
"@opentelemetry/exporter-prometheus": "^0.53.0",
"@opentelemetry/sdk-node": "^0.53.0",
"@react-email/components": "^0.0.24",
"@react-email/components": "^0.0.23",
"@socket.io/redis-adapter": "^8.3.0",
"archiver": "^7.0.0",
"async-lock": "^1.4.0",
@@ -5070,9 +5070,9 @@
}
},
"node_modules/@react-email/code-block": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/@react-email/code-block/-/code-block-0.0.8.tgz",
"integrity": "sha512-WbuAEpTnB262i9C3SGPmmErgZ4iU5KIpqLUjr7uBJijqldLqZc5x39e8wPWaRdF7NLcShmrc/+G7GJgI1bdC5w==",
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/@react-email/code-block/-/code-block-0.0.7.tgz",
"integrity": "sha512-3lYLwn9rK16I4JmTR/sTzAJMVHzUmmcT1PT27+TXnQyBCfpfDV+VockSg1qhsgCusA/u6j0C97BMsa96AWEbbw==",
"dependencies": {
"prismjs": "1.29.0"
},
@@ -5106,13 +5106,13 @@
}
},
"node_modules/@react-email/components": {
"version": "0.0.24",
"resolved": "https://registry.npmjs.org/@react-email/components/-/components-0.0.24.tgz",
"integrity": "sha512-/DNmfTREaT59UFdkHoIK3BewJ214LfRxmduiil3m7POj+gougkItANu1+BMmgbUATxjf7jH1WoBxo9x/rhFEFw==",
"version": "0.0.23",
"resolved": "https://registry.npmjs.org/@react-email/components/-/components-0.0.23.tgz",
"integrity": "sha512-RcBoffx2IZG6quLBXo5sj3fF47rKmmkiMhG1ZBua4nFjHYlmW8j1uUMyO5HNglxIF9E52NYq4sF7XeZRp9jYjg==",
"dependencies": {
"@react-email/body": "0.0.10",
"@react-email/button": "0.0.17",
"@react-email/code-block": "0.0.8",
"@react-email/code-block": "0.0.7",
"@react-email/code-inline": "0.0.4",
"@react-email/column": "0.0.12",
"@react-email/container": "0.0.14",
@@ -5125,7 +5125,7 @@
"@react-email/link": "0.0.10",
"@react-email/markdown": "0.0.12",
"@react-email/preview": "0.0.11",
"@react-email/render": "1.0.1",
"@react-email/render": "1.0.0",
"@react-email/row": "0.0.10",
"@react-email/section": "0.0.14",
"@react-email/tailwind": "0.1.0",
@@ -5249,9 +5249,9 @@
}
},
"node_modules/@react-email/render": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@react-email/render/-/render-1.0.1.tgz",
"integrity": "sha512-W3gTrcmLOVYnG80QuUp22ReIT/xfLsVJ+n7ghSlG2BITB8evNABn1AO2rGQoXuK84zKtDAlxCdm3hRyIpZdGSA==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@react-email/render/-/render-1.0.0.tgz",
"integrity": "sha512-seN2p3JRUSZhwIUiymh9N6ZfhRZ14ywOraQqAokY63DkDeHZW2pA2a6nWpNc/igfOcNyt09Wsoi1Aj0esxhdzw==",
"dependencies": {
"html-to-text": "9.0.5",
"js-beautify": "^1.14.11",
@@ -19280,9 +19280,9 @@
"requires": {}
},
"@react-email/code-block": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/@react-email/code-block/-/code-block-0.0.8.tgz",
"integrity": "sha512-WbuAEpTnB262i9C3SGPmmErgZ4iU5KIpqLUjr7uBJijqldLqZc5x39e8wPWaRdF7NLcShmrc/+G7GJgI1bdC5w==",
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/@react-email/code-block/-/code-block-0.0.7.tgz",
"integrity": "sha512-3lYLwn9rK16I4JmTR/sTzAJMVHzUmmcT1PT27+TXnQyBCfpfDV+VockSg1qhsgCusA/u6j0C97BMsa96AWEbbw==",
"requires": {
"prismjs": "1.29.0"
}
@@ -19300,13 +19300,13 @@
"requires": {}
},
"@react-email/components": {
"version": "0.0.24",
"resolved": "https://registry.npmjs.org/@react-email/components/-/components-0.0.24.tgz",
"integrity": "sha512-/DNmfTREaT59UFdkHoIK3BewJ214LfRxmduiil3m7POj+gougkItANu1+BMmgbUATxjf7jH1WoBxo9x/rhFEFw==",
"version": "0.0.23",
"resolved": "https://registry.npmjs.org/@react-email/components/-/components-0.0.23.tgz",
"integrity": "sha512-RcBoffx2IZG6quLBXo5sj3fF47rKmmkiMhG1ZBua4nFjHYlmW8j1uUMyO5HNglxIF9E52NYq4sF7XeZRp9jYjg==",
"requires": {
"@react-email/body": "0.0.10",
"@react-email/button": "0.0.17",
"@react-email/code-block": "0.0.8",
"@react-email/code-block": "0.0.7",
"@react-email/code-inline": "0.0.4",
"@react-email/column": "0.0.12",
"@react-email/container": "0.0.14",
@@ -19319,7 +19319,7 @@
"@react-email/link": "0.0.10",
"@react-email/markdown": "0.0.12",
"@react-email/preview": "0.0.11",
"@react-email/render": "1.0.1",
"@react-email/render": "1.0.0",
"@react-email/row": "0.0.10",
"@react-email/section": "0.0.14",
"@react-email/tailwind": "0.1.0",
@@ -19389,9 +19389,9 @@
"requires": {}
},
"@react-email/render": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@react-email/render/-/render-1.0.1.tgz",
"integrity": "sha512-W3gTrcmLOVYnG80QuUp22ReIT/xfLsVJ+n7ghSlG2BITB8evNABn1AO2rGQoXuK84zKtDAlxCdm3hRyIpZdGSA==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@react-email/render/-/render-1.0.0.tgz",
"integrity": "sha512-seN2p3JRUSZhwIUiymh9N6ZfhRZ14ywOraQqAokY63DkDeHZW2pA2a6nWpNc/igfOcNyt09Wsoi1Aj0esxhdzw==",
"requires": {
"html-to-text": "9.0.5",
"js-beautify": "^1.14.11",

View File

@@ -1,6 +1,6 @@
{
"name": "immich",
"version": "1.114.0",
"version": "1.113.1",
"description": "",
"author": "",
"private": true,
@@ -50,7 +50,7 @@
"@opentelemetry/context-async-hooks": "^1.24.0",
"@opentelemetry/exporter-prometheus": "^0.53.0",
"@opentelemetry/sdk-node": "^0.53.0",
"@react-email/components": "^0.0.24",
"@react-email/components": "^0.0.23",
"@socket.io/redis-adapter": "^8.3.0",
"archiver": "^7.0.0",
"async-lock": "^1.4.0",

View File

@@ -18,11 +18,10 @@ import { ILoggerRepository } from 'src/interfaces/logger.interface';
import { AuthGuard } from 'src/middleware/auth.guard';
import { ErrorInterceptor } from 'src/middleware/error.interceptor';
import { FileUploadInterceptor } from 'src/middleware/file-upload.interceptor';
import { GlobalExceptionFilter } from 'src/middleware/global-exception.filter';
import { HttpExceptionFilter } from 'src/middleware/http-exception.filter';
import { LoggingInterceptor } from 'src/middleware/logging.interceptor';
import { repositories } from 'src/repositories';
import { services } from 'src/services';
import { DatabaseService } from 'src/services/database.service';
import { setupEventHandlers } from 'src/utils/events';
import { otelConfig } from 'src/utils/instrumentation';
@@ -30,7 +29,7 @@ const common = [...services, ...repositories];
const middleware = [
FileUploadInterceptor,
{ provide: APP_FILTER, useClass: GlobalExceptionFilter },
{ provide: APP_FILTER, useClass: HttpExceptionFilter },
{ provide: APP_PIPE, useValue: new ValidationPipe({ transform: true, whitelist: true }) },
{ provide: APP_INTERCEPTOR, useClass: LoggingInterceptor },
{ provide: APP_INTERCEPTOR, useClass: ErrorInterceptor },
@@ -44,17 +43,7 @@ const imports = [
ConfigModule.forRoot(immichAppConfig),
EventEmitterModule.forRoot(),
OpenTelemetryModule.forRoot(otelConfig),
TypeOrmModule.forRootAsync({
inject: [ModuleRef],
useFactory: (moduleRef: ModuleRef) => {
return {
...databaseConfig,
poolErrorHandler: (error) => {
moduleRef.get(DatabaseService, { strict: false }).handleConnectionError(error);
},
};
},
}),
TypeOrmModule.forRoot(databaseConfig),
TypeOrmModule.forFeature(entities),
];

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