mirror of
https://github.com/immich-app/immich.git
synced 2026-05-22 15:42:32 -04:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 541f4987c7 |
@@ -91,7 +91,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
@@ -159,14 +159,14 @@ jobs:
|
|||||||
|
|
||||||
- name: Comment APK download link on PR
|
- name: Comment APK download link on PR
|
||||||
if: ${{ github.event_name == 'pull_request' && !github.event.pull_request.head.repo.fork }}
|
if: ${{ github.event_name == 'pull_request' && !github.event.pull_request.head.repo.fork }}
|
||||||
uses: immich-app/devtools/actions/sticky-comment@0135acd12ad9f3369b94a2aa3c0ae8c835a4e926 # sticky-comment-action-v1.0.0
|
uses: mshick/add-pr-comment@8e4927817251f1ff60c001f04568532b38e0b4a0 # v3.11.0
|
||||||
env:
|
env:
|
||||||
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
||||||
APK_URL: ${{ steps.upload-apk.outputs.artifact-url }}
|
APK_URL: ${{ steps.upload-apk.outputs.artifact-url }}
|
||||||
with:
|
with:
|
||||||
id: mobile-android-apk
|
github-token: ${{ steps.token.outputs.token }}
|
||||||
token: ${{ steps.token.outputs.token }}
|
message-id: 'mobile-android-apk'
|
||||||
body: |
|
message: |
|
||||||
📱 **Android release APK (universal)** — `${{ env.HEAD_SHA }}`
|
📱 **Android release APK (universal)** — `${{ env.HEAD_SHA }}`
|
||||||
|
|
||||||
Download: ${{ env.APK_URL }}
|
Download: ${{ env.APK_URL }}
|
||||||
@@ -216,7 +216,7 @@ jobs:
|
|||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
@@ -231,7 +231,7 @@ jobs:
|
|||||||
run: mise //mobile:codegen:pigeon
|
run: mise //mobile:codegen:pigeon
|
||||||
|
|
||||||
- name: Setup Ruby
|
- name: Setup Ruby
|
||||||
uses: ruby/setup-ruby@6aaa311d81eba98ae12eaffbcb63296ace0efcde # v1.307.0
|
uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
|
||||||
with:
|
with:
|
||||||
ruby-version: '3.3'
|
ruby-version: '3.3'
|
||||||
bundler-cache: true
|
bundler-cache: true
|
||||||
@@ -288,6 +288,7 @@ jobs:
|
|||||||
APP_STORE_CONNECT_API_KEY_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ID }}
|
APP_STORE_CONNECT_API_KEY_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ID }}
|
||||||
APP_STORE_CONNECT_API_KEY_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ISSUER_ID }}
|
APP_STORE_CONNECT_API_KEY_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ISSUER_ID }}
|
||||||
ENVIRONMENT: ${{ inputs.environment || 'development' }}
|
ENVIRONMENT: ${{ inputs.environment || 'development' }}
|
||||||
|
BUNDLE_ID_SUFFIX: ${{ inputs.environment == 'production' && '' || 'development' }}
|
||||||
GITHUB_REF: ${{ github.ref }}
|
GITHUB_REF: ${{ github.ref }}
|
||||||
FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT: 120
|
FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT: 120
|
||||||
FASTLANE_XCODEBUILD_SETTINGS_RETRIES: 6
|
FASTLANE_XCODEBUILD_SETTINGS_RETRIES: 6
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ jobs:
|
|||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Check for breaking API changes
|
- name: Check for breaking API changes
|
||||||
uses: oasdiff/oasdiff-action/breaking@6147a58e5d1249a12f42fc864ab791d571a30015 # v0.0.47
|
uses: oasdiff/oasdiff-action/breaking@26ccb332c67a45ca649de9faf60552ef1b8260d9 # v0.0.46
|
||||||
with:
|
with:
|
||||||
base: https://raw.githubusercontent.com/${{ github.repository }}/main/open-api/immich-openapi-specs.json
|
base: https://raw.githubusercontent.com/${{ github.repository }}/main/open-api/immich-openapi-specs.json
|
||||||
revision: open-api/immich-openapi-specs.json
|
revision: open-api/immich-openapi-specs.json
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ jobs:
|
|||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@68bde559dea0fdcac2102bfdf6230c5f70eb485e # v4.35.4
|
uses: github/codeql-action/init@e46ed2cbd01164d986452f91f178727624ae40d7 # v4.35.3
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
@@ -70,7 +70,7 @@ jobs:
|
|||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@68bde559dea0fdcac2102bfdf6230c5f70eb485e # v4.35.4
|
uses: github/codeql-action/autobuild@e46ed2cbd01164d986452f91f178727624ae40d7 # v4.35.3
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||||
@@ -83,6 +83,6 @@ jobs:
|
|||||||
# ./location_of_script_within_repo/buildscript.sh
|
# ./location_of_script_within_repo/buildscript.sh
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@68bde559dea0fdcac2102bfdf6230c5f70eb485e # v4.35.4
|
uses: github/codeql-action/analyze@e46ed2cbd01164d986452f91f178727624ae40d7 # v4.35.3
|
||||||
with:
|
with:
|
||||||
category: '/language:${{matrix.language}}'
|
category: '/language:${{matrix.language}}'
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
@@ -213,11 +213,12 @@ jobs:
|
|||||||
run: 'mise run //deployment:tf apply'
|
run: 'mise run //deployment:tf apply'
|
||||||
|
|
||||||
- name: Comment
|
- name: Comment
|
||||||
uses: immich-app/devtools/actions/sticky-comment@0135acd12ad9f3369b94a2aa3c0ae8c835a4e926 # sticky-comment-action-v1.0.0
|
uses: actions-cool/maintain-one-comment@909842216bc8e8658364c572ec52100f4c2cc50a # v3.3.0
|
||||||
if: ${{ steps.parameters.outputs.event == 'pr' }}
|
if: ${{ steps.parameters.outputs.event == 'pr' }}
|
||||||
with:
|
with:
|
||||||
id: docs-pr-url
|
|
||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
number: ${{ fromJson(needs.checks.outputs.parameters).pr_number }}
|
number: ${{ fromJson(needs.checks.outputs.parameters).pr_number }}
|
||||||
body: |
|
body: |
|
||||||
📖 Documentation deployed to [${{ steps.docs-output.outputs.subdomain }}](https://${{ steps.docs-output.outputs.subdomain }})
|
📖 Documentation deployed to [${{ steps.docs-output.outputs.subdomain }}](https://${{ steps.docs-output.outputs.subdomain }})
|
||||||
|
emojis: 'rocket'
|
||||||
|
body-include: '<!-- Docs PR URL -->'
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
@@ -44,8 +44,9 @@ jobs:
|
|||||||
run: 'mise run //deployment:tf destroy -- -refresh=false'
|
run: 'mise run //deployment:tf destroy -- -refresh=false'
|
||||||
|
|
||||||
- name: Comment
|
- name: Comment
|
||||||
uses: immich-app/devtools/actions/sticky-comment@0135acd12ad9f3369b94a2aa3c0ae8c835a4e926 # sticky-comment-action-v1.0.0
|
uses: actions-cool/maintain-one-comment@909842216bc8e8658364c572ec52100f4c2cc50a # v3.3.0
|
||||||
with:
|
with:
|
||||||
id: docs-pr-url
|
|
||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
number: ${{ github.event.number }}
|
||||||
delete: true
|
delete: true
|
||||||
|
body-include: '<!-- Docs PR URL -->'
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ jobs:
|
|||||||
- name: Generate a token
|
- name: Generate a token
|
||||||
id: generate_token
|
id: generate_token
|
||||||
if: ${{ inputs.skip != true }}
|
if: ${{ inputs.skip != true }}
|
||||||
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
|
uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
|
||||||
with:
|
with:
|
||||||
client-id: ${{ secrets.PUSH_O_MATIC_APP_CLIENT_ID }}
|
client-id: ${{ secrets.PUSH_O_MATIC_APP_CLIENT_ID }}
|
||||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||||
|
|||||||
@@ -13,4 +13,3 @@ jobs:
|
|||||||
actions: read
|
actions: read
|
||||||
contents: read
|
contents: read
|
||||||
security-events: write
|
security-events: write
|
||||||
secrets: inherit
|
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ jobs:
|
|||||||
ref: main
|
ref: main
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
@@ -119,7 +119,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Generate a token
|
- name: Generate a token
|
||||||
id: generate-token
|
id: generate-token
|
||||||
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
|
uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
|
||||||
with:
|
with:
|
||||||
client-id: ${{ secrets.PUSH_O_MATIC_APP_CLIENT_ID }}
|
client-id: ${{ secrets.PUSH_O_MATIC_APP_CLIENT_ID }}
|
||||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||||
|
|||||||
@@ -19,11 +19,11 @@ jobs:
|
|||||||
client-id: ${{ secrets.PUSH_O_MATIC_APP_CLIENT_ID }}
|
client-id: ${{ secrets.PUSH_O_MATIC_APP_CLIENT_ID }}
|
||||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||||
|
|
||||||
- uses: immich-app/devtools/actions/sticky-comment@0135acd12ad9f3369b94a2aa3c0ae8c835a4e926 # sticky-comment-action-v1.0.0
|
- uses: mshick/add-pr-comment@8e4927817251f1ff60c001f04568532b38e0b4a0 # v3.11.0
|
||||||
with:
|
with:
|
||||||
id: preview-status
|
github-token: ${{ steps.token.outputs.token }}
|
||||||
token: ${{ steps.token.outputs.token }}
|
message-id: 'preview-status'
|
||||||
body: 'Deploying preview environment to https://pr-${{ github.event.pull_request.number }}.preview.internal.immich.build/'
|
message: 'Deploying preview environment to https://pr-${{ github.event.pull_request.number }}.preview.internal.immich.build/'
|
||||||
|
|
||||||
remove-label:
|
remove-label:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -48,16 +48,16 @@ jobs:
|
|||||||
name: 'preview'
|
name: 'preview'
|
||||||
})
|
})
|
||||||
|
|
||||||
- uses: immich-app/devtools/actions/sticky-comment@0135acd12ad9f3369b94a2aa3c0ae8c835a4e926 # sticky-comment-action-v1.0.0
|
- uses: mshick/add-pr-comment@8e4927817251f1ff60c001f04568532b38e0b4a0 # v3.11.0
|
||||||
if: ${{ github.event.pull_request.head.repo.fork }}
|
if: ${{ github.event.pull_request.head.repo.fork }}
|
||||||
with:
|
with:
|
||||||
id: preview-status
|
github-token: ${{ steps.token.outputs.token }}
|
||||||
token: ${{ steps.token.outputs.token }}
|
message-id: 'preview-status'
|
||||||
body: 'PRs from forks cannot have preview environments.'
|
message: 'PRs from forks cannot have preview environments.'
|
||||||
|
|
||||||
- uses: immich-app/devtools/actions/sticky-comment@0135acd12ad9f3369b94a2aa3c0ae8c835a4e926 # sticky-comment-action-v1.0.0
|
- uses: mshick/add-pr-comment@8e4927817251f1ff60c001f04568532b38e0b4a0 # v3.11.0
|
||||||
if: ${{ !github.event.pull_request.head.repo.fork }}
|
if: ${{ !github.event.pull_request.head.repo.fork }}
|
||||||
with:
|
with:
|
||||||
id: preview-status
|
github-token: ${{ steps.token.outputs.token }}
|
||||||
token: ${{ steps.token.outputs.token }}
|
message-id: 'preview-status'
|
||||||
body: 'Preview environment has been removed.'
|
message: 'Preview environment has been removed.'
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
|
|||||||
+13
-20
@@ -30,32 +30,25 @@ jobs:
|
|||||||
filters: |
|
filters: |
|
||||||
i18n:
|
i18n:
|
||||||
- 'i18n/**'
|
- 'i18n/**'
|
||||||
- 'mise.toml'
|
|
||||||
web:
|
web:
|
||||||
- 'web/**'
|
- 'web/**'
|
||||||
- 'i18n/**'
|
- 'i18n/**'
|
||||||
- 'packages/sdk/**'
|
- 'packages/sdk/**'
|
||||||
- 'pnpm-lock.yaml'
|
- 'pnpm-lock.yaml'
|
||||||
- 'mise.toml'
|
|
||||||
server:
|
server:
|
||||||
- 'server/**'
|
- 'server/**'
|
||||||
- 'pnpm-lock.yaml'
|
- 'pnpm-lock.yaml'
|
||||||
- 'mise.toml'
|
|
||||||
cli:
|
cli:
|
||||||
- 'packages/cli/**'
|
- 'packages/cli/**'
|
||||||
- 'packages/sdk/**'
|
- 'packages/sdk/**'
|
||||||
- 'pnpm-lock.yaml'
|
- 'pnpm-lock.yaml'
|
||||||
- 'mise.toml'
|
|
||||||
e2e:
|
e2e:
|
||||||
- 'e2e/**'
|
- 'e2e/**'
|
||||||
- 'pnpm-lock.yaml'
|
- 'pnpm-lock.yaml'
|
||||||
- 'mise.toml'
|
|
||||||
mobile:
|
mobile:
|
||||||
- 'mobile/**'
|
- 'mobile/**'
|
||||||
- 'mise.toml'
|
|
||||||
machine-learning:
|
machine-learning:
|
||||||
- 'machine-learning/**'
|
- 'machine-learning/**'
|
||||||
- 'mise.toml'
|
|
||||||
.github:
|
.github:
|
||||||
- '.github/**'
|
- '.github/**'
|
||||||
force-filters: |
|
force-filters: |
|
||||||
@@ -83,7 +76,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
@@ -114,7 +107,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
@@ -145,7 +138,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
@@ -189,7 +182,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
@@ -227,7 +220,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
@@ -255,7 +248,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
@@ -305,7 +298,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
@@ -338,7 +331,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
@@ -557,7 +550,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
@@ -594,7 +587,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
@@ -625,7 +618,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
@@ -676,7 +669,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
@@ -734,7 +727,7 @@ jobs:
|
|||||||
token: ${{ steps.token.outputs.token }}
|
token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
- name: Setup Mise
|
- name: Setup Mise
|
||||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
uses: immich-app/devtools/actions/use-mise@cf6e190bacde3d7bda59372a786b36ac7d01536a # use-mise-action-v2.0.1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.token.outputs.token }}
|
github_token: ${{ steps.token.outputs.token }}
|
||||||
|
|
||||||
|
|||||||
@@ -1,65 +0,0 @@
|
|||||||
# @generated - this file is auto-generated by `mise lock` https://mise.en.dev/dev-tools/mise-lock.html
|
|
||||||
|
|
||||||
[[tools.opentofu]]
|
|
||||||
version = "1.11.6"
|
|
||||||
backend = "aqua:opentofu/opentofu"
|
|
||||||
|
|
||||||
[tools.opentofu."platforms.linux-arm64"]
|
|
||||||
checksum = "sha256:d4f2ab15776925864b049bb329d69682851de6f5204f256e9fa86d07a0308850"
|
|
||||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_linux_arm64.tar.gz"
|
|
||||||
|
|
||||||
[tools.opentofu."platforms.linux-arm64-musl"]
|
|
||||||
checksum = "sha256:d4f2ab15776925864b049bb329d69682851de6f5204f256e9fa86d07a0308850"
|
|
||||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_linux_arm64.tar.gz"
|
|
||||||
|
|
||||||
[tools.opentofu."platforms.linux-x64"]
|
|
||||||
checksum = "sha256:02800fafa2753a9f50c38483e2fdf5bc353fd62895eb9e25eec9a5145df3a69e"
|
|
||||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_linux_amd64.tar.gz"
|
|
||||||
|
|
||||||
[tools.opentofu."platforms.linux-x64-musl"]
|
|
||||||
checksum = "sha256:02800fafa2753a9f50c38483e2fdf5bc353fd62895eb9e25eec9a5145df3a69e"
|
|
||||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_linux_amd64.tar.gz"
|
|
||||||
|
|
||||||
[tools.opentofu."platforms.macos-arm64"]
|
|
||||||
checksum = "sha256:62d7fa8539e13b444827aa0a3b90c5972da5c47e8f8882d9dcf2e430e78840c1"
|
|
||||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_darwin_arm64.tar.gz"
|
|
||||||
|
|
||||||
[tools.opentofu."platforms.macos-x64"]
|
|
||||||
checksum = "sha256:1408cdef1c380f914565e6b4bb70794c6b163f195fcb233357f3d6c5745906b6"
|
|
||||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_darwin_amd64.tar.gz"
|
|
||||||
|
|
||||||
[tools.opentofu."platforms.windows-x64"]
|
|
||||||
checksum = "sha256:27323f70c875b8251bfd7e61a4cffc3ebff4e56ed1e611b955016f0c7077367e"
|
|
||||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_windows_amd64.tar.gz"
|
|
||||||
|
|
||||||
[[tools.terragrunt]]
|
|
||||||
version = "1.0.3"
|
|
||||||
backend = "aqua:gruntwork-io/terragrunt"
|
|
||||||
|
|
||||||
[tools.terragrunt."platforms.linux-arm64"]
|
|
||||||
checksum = "sha256:e5b60ab05b5214db694e6bc215d8124fb626e277cdb56b86f6147ae110d510fe"
|
|
||||||
url = "https://github.com/gruntwork-io/terragrunt/releases/download/v1.0.3/terragrunt_linux_arm64.tar.gz"
|
|
||||||
|
|
||||||
[tools.terragrunt."platforms.linux-arm64-musl"]
|
|
||||||
checksum = "sha256:e5b60ab05b5214db694e6bc215d8124fb626e277cdb56b86f6147ae110d510fe"
|
|
||||||
url = "https://github.com/gruntwork-io/terragrunt/releases/download/v1.0.3/terragrunt_linux_arm64.tar.gz"
|
|
||||||
|
|
||||||
[tools.terragrunt."platforms.linux-x64"]
|
|
||||||
checksum = "sha256:6d48049baf82e0bf9c804368dc85cbfeadc10955e33777e9e8de3e020b94b073"
|
|
||||||
url = "https://github.com/gruntwork-io/terragrunt/releases/download/v1.0.3/terragrunt_linux_amd64.tar.gz"
|
|
||||||
|
|
||||||
[tools.terragrunt."platforms.linux-x64-musl"]
|
|
||||||
checksum = "sha256:6d48049baf82e0bf9c804368dc85cbfeadc10955e33777e9e8de3e020b94b073"
|
|
||||||
url = "https://github.com/gruntwork-io/terragrunt/releases/download/v1.0.3/terragrunt_linux_amd64.tar.gz"
|
|
||||||
|
|
||||||
[tools.terragrunt."platforms.macos-arm64"]
|
|
||||||
checksum = "sha256:aacb5be2ca5475300cbce246dfbd8a45eb47510fbaa70fab8561c49ef5db03aa"
|
|
||||||
url = "https://github.com/gruntwork-io/terragrunt/releases/download/v1.0.3/terragrunt_darwin_arm64.tar.gz"
|
|
||||||
|
|
||||||
[tools.terragrunt."platforms.macos-x64"]
|
|
||||||
checksum = "sha256:3133c2251e191aede8e3dd2a5b3aee2e91c5f08f88f117aee40eed9a24c8ef6b"
|
|
||||||
url = "https://github.com/gruntwork-io/terragrunt/releases/download/v1.0.3/terragrunt_darwin_amd64.tar.gz"
|
|
||||||
|
|
||||||
[tools.terragrunt."platforms.windows-x64"]
|
|
||||||
checksum = "sha256:183b2745b4e04980a6bfa4450ff81956a12596ca22d70f7aaa793980f5b036db"
|
|
||||||
url = "https://github.com/gruntwork-io/terragrunt/releases/download/v1.0.3/terragrunt_windows_amd64.exe.tar.gz"
|
|
||||||
@@ -10,6 +10,7 @@ const config = {
|
|||||||
url: 'https://docs.immich.app',
|
url: 'https://docs.immich.app',
|
||||||
baseUrl: '/',
|
baseUrl: '/',
|
||||||
onBrokenLinks: 'throw',
|
onBrokenLinks: 'throw',
|
||||||
|
onBrokenMarkdownLinks: 'warn',
|
||||||
favicon: 'img/favicon.png',
|
favicon: 'img/favicon.png',
|
||||||
|
|
||||||
// GitHub pages deployment config.
|
// GitHub pages deployment config.
|
||||||
@@ -28,9 +29,6 @@ const config = {
|
|||||||
// Mermaid diagrams
|
// Mermaid diagrams
|
||||||
markdown: {
|
markdown: {
|
||||||
mermaid: true,
|
mermaid: true,
|
||||||
hooks: {
|
|
||||||
onBrokenMarkdownLinks: 'warn',
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
themes: ['@docusaurus/theme-mermaid'],
|
themes: ['@docusaurus/theme-mermaid'],
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
# @generated - this file is auto-generated by `mise lock` https://mise.en.dev/dev-tools/mise-lock.html
|
|
||||||
|
|
||||||
[[tools.wrangler]]
|
|
||||||
version = "4.66.0"
|
|
||||||
backend = "npm:wrangler"
|
|
||||||
+1
-1
@@ -28,4 +28,4 @@ run = "prettier --write ."
|
|||||||
run = "wrangler pages deploy build --project-name=${PROJECT_NAME} --branch=${BRANCH_NAME}"
|
run = "wrangler pages deploy build --project-name=${PROJECT_NAME} --branch=${BRANCH_NAME}"
|
||||||
|
|
||||||
[tools]
|
[tools]
|
||||||
wrangler = "4.91.0"
|
wrangler = "4.66.0"
|
||||||
|
|||||||
+1
-1
@@ -32,7 +32,7 @@
|
|||||||
"@playwright/test": "^1.44.1",
|
"@playwright/test": "^1.44.1",
|
||||||
"@socket.io/component-emitter": "^3.1.2",
|
"@socket.io/component-emitter": "^3.1.2",
|
||||||
"@types/luxon": "^3.4.2",
|
"@types/luxon": "^3.4.2",
|
||||||
"@types/node": "^24.12.4",
|
"@types/node": "^24.12.2",
|
||||||
"@types/pg": "^8.15.1",
|
"@types/pg": "^8.15.1",
|
||||||
"@types/pngjs": "^6.0.4",
|
"@types/pngjs": "^6.0.4",
|
||||||
"@types/supertest": "^7.0.0",
|
"@types/supertest": "^7.0.0",
|
||||||
|
|||||||
@@ -1,72 +0,0 @@
|
|||||||
# @generated - this file is auto-generated by `mise lock` https://mise.en.dev/dev-tools/mise-lock.html
|
|
||||||
|
|
||||||
[[tools.python]]
|
|
||||||
version = "3.11.15"
|
|
||||||
backend = "core:python"
|
|
||||||
|
|
||||||
[tools.python."platforms.linux-arm64"]
|
|
||||||
checksum = "sha256:243f794278eff6adba96ed3677ec6877175df84c25f140e17f09f9be82d0f12a"
|
|
||||||
url = "https://github.com/astral-sh/python-build-standalone/releases/download/20260510/cpython-3.11.15+20260510-aarch64-unknown-linux-gnu-install_only_stripped.tar.gz"
|
|
||||||
provenance = "github-attestations"
|
|
||||||
|
|
||||||
[tools.python."platforms.linux-arm64-musl"]
|
|
||||||
checksum = "sha256:52b4c52094ff8b383a45c694acf4c5c0e883152be6d5229a35a8186ce907c6eb"
|
|
||||||
url = "https://github.com/astral-sh/python-build-standalone/releases/download/20260510/cpython-3.11.15+20260510-aarch64-unknown-linux-musl-install_only_stripped.tar.gz"
|
|
||||||
provenance = "github-attestations"
|
|
||||||
|
|
||||||
[tools.python."platforms.linux-x64"]
|
|
||||||
checksum = "sha256:171dffd8c0f66e8a0725364a7428015b22fc18dd298b24f541392e17dd0e561f"
|
|
||||||
url = "https://github.com/astral-sh/python-build-standalone/releases/download/20260510/cpython-3.11.15+20260510-x86_64-unknown-linux-gnu-install_only_stripped.tar.gz"
|
|
||||||
provenance = "github-attestations"
|
|
||||||
|
|
||||||
[tools.python."platforms.linux-x64-musl"]
|
|
||||||
checksum = "sha256:2ac90fef8917ebd14826a6d667593a06cf0ae5f745ba9b1147dc086dd35f5284"
|
|
||||||
url = "https://github.com/astral-sh/python-build-standalone/releases/download/20260510/cpython-3.11.15+20260510-x86_64-unknown-linux-musl-install_only_stripped.tar.gz"
|
|
||||||
provenance = "github-attestations"
|
|
||||||
|
|
||||||
[tools.python."platforms.macos-arm64"]
|
|
||||||
checksum = "sha256:fdfc363b538662eb7441a14e06f72c4a992c56af7f401f5730ea5081f8f8ad6e"
|
|
||||||
url = "https://github.com/astral-sh/python-build-standalone/releases/download/20260510/cpython-3.11.15+20260510-aarch64-apple-darwin-install_only_stripped.tar.gz"
|
|
||||||
provenance = "github-attestations"
|
|
||||||
|
|
||||||
[tools.python."platforms.macos-x64"]
|
|
||||||
checksum = "sha256:5f1eb247cbca2c0ad5ccbf6d299a4f54b31b5c63b492d74c3531dc4344a42f88"
|
|
||||||
url = "https://github.com/astral-sh/python-build-standalone/releases/download/20260510/cpython-3.11.15+20260510-x86_64-apple-darwin-install_only_stripped.tar.gz"
|
|
||||||
provenance = "github-attestations"
|
|
||||||
|
|
||||||
[tools.python."platforms.windows-x64"]
|
|
||||||
checksum = "sha256:756d7f148498b8822f6aedf44a020613576f09983161f346ad36dcef6238cdc3"
|
|
||||||
url = "https://github.com/astral-sh/python-build-standalone/releases/download/20260510/cpython-3.11.15+20260510-x86_64-pc-windows-msvc-install_only_stripped.tar.gz"
|
|
||||||
provenance = "github-attestations"
|
|
||||||
|
|
||||||
[[tools.uv]]
|
|
||||||
version = "0.8.15"
|
|
||||||
backend = "aqua:astral-sh/uv"
|
|
||||||
|
|
||||||
[tools.uv."platforms.linux-arm64"]
|
|
||||||
checksum = "sha256:23ea21a05c62c4c307ce691f29bff2f15c94c4f07f2b83d9b356f0664bc8b3a2"
|
|
||||||
url = "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-aarch64-unknown-linux-musl.tar.gz"
|
|
||||||
|
|
||||||
[tools.uv."platforms.linux-arm64-musl"]
|
|
||||||
checksum = "sha256:23ea21a05c62c4c307ce691f29bff2f15c94c4f07f2b83d9b356f0664bc8b3a2"
|
|
||||||
url = "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-aarch64-unknown-linux-musl.tar.gz"
|
|
||||||
|
|
||||||
[tools.uv."platforms.linux-x64"]
|
|
||||||
checksum = "sha256:d0fec58f3124e05e0a1af0f6541abfce4333253cdaf23c7b6bb2e6128bf138ea"
|
|
||||||
url = "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-x86_64-unknown-linux-musl.tar.gz"
|
|
||||||
|
|
||||||
[tools.uv."platforms.linux-x64-musl"]
|
|
||||||
checksum = "sha256:d0fec58f3124e05e0a1af0f6541abfce4333253cdaf23c7b6bb2e6128bf138ea"
|
|
||||||
url = "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-x86_64-unknown-linux-musl.tar.gz"
|
|
||||||
|
|
||||||
[tools.uv."platforms.macos-arm64"]
|
|
||||||
checksum = "sha256:103367962c5cb00bf7370d84cbaa3fec5a9807be9cc833ea9d8eea400c119fa2"
|
|
||||||
url = "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-aarch64-apple-darwin.tar.gz"
|
|
||||||
|
|
||||||
[tools.uv."platforms.macos-x64"]
|
|
||||||
checksum = "sha256:2bbef70982e97dfc36454de173f35ec1a5e83ae11e3885df6a50db3fd76171cb"
|
|
||||||
url = "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-x86_64-apple-darwin.tar.gz"
|
|
||||||
|
|
||||||
[tools.uv."platforms.windows-x64"]
|
|
||||||
checksum = "sha256:459d95892a5cc5c21779532f4f41b9238594b79e312a5142da2148ecfa10e705"
|
|
||||||
url = "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-x86_64-pc-windows-msvc.zip"
|
|
||||||
@@ -1,332 +0,0 @@
|
|||||||
# @generated - this file is auto-generated by `mise lock` https://mise.en.dev/dev-tools/mise-lock.html
|
|
||||||
|
|
||||||
[[tools."aqua:flutter/flutter"]]
|
|
||||||
version = "3.41.9"
|
|
||||||
backend = "aqua:flutter/flutter"
|
|
||||||
|
|
||||||
[[tools.flutter]]
|
|
||||||
version = "3.41.9-stable"
|
|
||||||
backend = "asdf:flutter"
|
|
||||||
|
|
||||||
[[tools."github:CQLabs/homebrew-dcm"]]
|
|
||||||
version = "1.37.0"
|
|
||||||
backend = "github:CQLabs/homebrew-dcm"
|
|
||||||
|
|
||||||
[tools."github:CQLabs/homebrew-dcm"."platforms.linux-arm64"]
|
|
||||||
checksum = "sha256:253da2512b149913dfe345bf9a62a79acb2d730f66e71162ba4a92dfc4224b82"
|
|
||||||
url = "https://github.com/CQLabs/homebrew-dcm/releases/download/1.37.0/dcm-linux-arm-release.zip"
|
|
||||||
url_api = "https://api.github.com/repos/CQLabs/homebrew-dcm/releases/assets/404543838"
|
|
||||||
|
|
||||||
[tools."github:CQLabs/homebrew-dcm"."platforms.linux-arm64-musl"]
|
|
||||||
checksum = "sha256:253da2512b149913dfe345bf9a62a79acb2d730f66e71162ba4a92dfc4224b82"
|
|
||||||
url = "https://github.com/CQLabs/homebrew-dcm/releases/download/1.37.0/dcm-linux-arm-release.zip"
|
|
||||||
url_api = "https://api.github.com/repos/CQLabs/homebrew-dcm/releases/assets/404543838"
|
|
||||||
|
|
||||||
[tools."github:CQLabs/homebrew-dcm"."platforms.linux-x64"]
|
|
||||||
checksum = "sha256:477e086d4099c12f21e5ccd83b005d5fb945dd4cac4fd127fd9a08d7649af1cf"
|
|
||||||
url = "https://github.com/CQLabs/homebrew-dcm/releases/download/1.37.0/dcm-linux-x64-release.zip"
|
|
||||||
url_api = "https://api.github.com/repos/CQLabs/homebrew-dcm/releases/assets/404543797"
|
|
||||||
|
|
||||||
[tools."github:CQLabs/homebrew-dcm"."platforms.linux-x64-musl"]
|
|
||||||
checksum = "sha256:477e086d4099c12f21e5ccd83b005d5fb945dd4cac4fd127fd9a08d7649af1cf"
|
|
||||||
url = "https://github.com/CQLabs/homebrew-dcm/releases/download/1.37.0/dcm-linux-x64-release.zip"
|
|
||||||
url_api = "https://api.github.com/repos/CQLabs/homebrew-dcm/releases/assets/404543797"
|
|
||||||
|
|
||||||
[tools."github:CQLabs/homebrew-dcm"."platforms.macos-arm64"]
|
|
||||||
checksum = "sha256:30bede64367d09067093cc57af6ec9496d7717898138ded5cb98a16ac8dd9d93"
|
|
||||||
url = "https://github.com/CQLabs/homebrew-dcm/releases/download/1.37.0/dcm-macos-arm-release.zip"
|
|
||||||
url_api = "https://api.github.com/repos/CQLabs/homebrew-dcm/releases/assets/404543757"
|
|
||||||
|
|
||||||
[tools."github:CQLabs/homebrew-dcm"."platforms.macos-x64"]
|
|
||||||
checksum = "sha256:e56cb99872be7445a4de1d37e5438ca70e3bcd83be7a2b9b385e3538881f8068"
|
|
||||||
url = "https://github.com/CQLabs/homebrew-dcm/releases/download/1.37.0/dcm-macos-x64-release.zip"
|
|
||||||
url_api = "https://api.github.com/repos/CQLabs/homebrew-dcm/releases/assets/404543727"
|
|
||||||
|
|
||||||
[tools."github:CQLabs/homebrew-dcm"."platforms.windows-x64"]
|
|
||||||
checksum = "sha256:f133470daa3fb0427f039b424392af7e917d7e7db6b556aa2a968ab0e31587da"
|
|
||||||
url = "https://github.com/CQLabs/homebrew-dcm/releases/download/1.37.0/dcm-windows-release.zip"
|
|
||||||
url_api = "https://api.github.com/repos/CQLabs/homebrew-dcm/releases/assets/404543660"
|
|
||||||
|
|
||||||
[[tools."github:extism/cli"]]
|
|
||||||
version = "1.6.3"
|
|
||||||
backend = "github:extism/cli"
|
|
||||||
|
|
||||||
[tools."github:extism/cli"."platforms.linux-arm64"]
|
|
||||||
checksum = "sha256:d92f830c9be39637569feacb04e9750c28848df6d9a219db94152a9b4eb9452b"
|
|
||||||
url = "https://github.com/extism/cli/releases/download/v1.6.3/extism-v1.6.3-linux-arm64.tar.gz"
|
|
||||||
url_api = "https://api.github.com/repos/extism/cli/releases/assets/275694030"
|
|
||||||
|
|
||||||
[tools."github:extism/cli"."platforms.linux-arm64-musl"]
|
|
||||||
checksum = "sha256:d92f830c9be39637569feacb04e9750c28848df6d9a219db94152a9b4eb9452b"
|
|
||||||
url = "https://github.com/extism/cli/releases/download/v1.6.3/extism-v1.6.3-linux-arm64.tar.gz"
|
|
||||||
url_api = "https://api.github.com/repos/extism/cli/releases/assets/275694030"
|
|
||||||
|
|
||||||
[tools."github:extism/cli"."platforms.linux-x64"]
|
|
||||||
checksum = "sha256:34e7ae9bfded6e2c32dee83f70a4e50d34f9d3e80d1762b09625fe82e214d02d"
|
|
||||||
url = "https://github.com/extism/cli/releases/download/v1.6.3/extism-v1.6.3-linux-amd64.tar.gz"
|
|
||||||
url_api = "https://api.github.com/repos/extism/cli/releases/assets/275694025"
|
|
||||||
|
|
||||||
[tools."github:extism/cli"."platforms.linux-x64-musl"]
|
|
||||||
checksum = "sha256:34e7ae9bfded6e2c32dee83f70a4e50d34f9d3e80d1762b09625fe82e214d02d"
|
|
||||||
url = "https://github.com/extism/cli/releases/download/v1.6.3/extism-v1.6.3-linux-amd64.tar.gz"
|
|
||||||
url_api = "https://api.github.com/repos/extism/cli/releases/assets/275694025"
|
|
||||||
|
|
||||||
[tools."github:extism/cli"."platforms.macos-arm64"]
|
|
||||||
checksum = "sha256:b4ddbc575b5ac000115247f781723f9b9f284ed87b29c600539d72161b5b29fc"
|
|
||||||
url = "https://github.com/extism/cli/releases/download/v1.6.3/extism-v1.6.3-darwin-arm64.tar.gz"
|
|
||||||
url_api = "https://api.github.com/repos/extism/cli/releases/assets/275694029"
|
|
||||||
|
|
||||||
[tools."github:extism/cli"."platforms.macos-x64"]
|
|
||||||
checksum = "sha256:9a2f71b6e6009685a622cc3084e52d2a1a8e23c98d29ffa72e666e9dc699855f"
|
|
||||||
url = "https://github.com/extism/cli/releases/download/v1.6.3/extism-v1.6.3-darwin-amd64.tar.gz"
|
|
||||||
url_api = "https://api.github.com/repos/extism/cli/releases/assets/275694026"
|
|
||||||
|
|
||||||
[tools."github:extism/cli"."platforms.windows-x64"]
|
|
||||||
checksum = "sha256:47e4ed2782445b2b08a4d1ac127211588f8b4d1fc25fd6481d4cb65151b5213c"
|
|
||||||
url = "https://github.com/extism/cli/releases/download/v1.6.3/extism-v1.6.3-windows-amd64.zip"
|
|
||||||
url_api = "https://api.github.com/repos/extism/cli/releases/assets/275694035"
|
|
||||||
|
|
||||||
[[tools."github:extism/js-pdk"]]
|
|
||||||
version = "1.6.0"
|
|
||||||
backend = "github:extism/js-pdk"
|
|
||||||
|
|
||||||
[tools."github:extism/js-pdk"."platforms.linux-arm64"]
|
|
||||||
checksum = "sha256:15a186250e68d6bff4ec839fff275d45a90e383a69209dcc1239eb9e3aee6e1b"
|
|
||||||
url = "https://github.com/extism/js-pdk/releases/download/v1.6.0/extism-js-aarch64-linux-v1.6.0.gz"
|
|
||||||
url_api = "https://api.github.com/repos/extism/js-pdk/releases/assets/353223214"
|
|
||||||
|
|
||||||
[tools."github:extism/js-pdk"."platforms.linux-arm64-musl"]
|
|
||||||
checksum = "sha256:15a186250e68d6bff4ec839fff275d45a90e383a69209dcc1239eb9e3aee6e1b"
|
|
||||||
url = "https://github.com/extism/js-pdk/releases/download/v1.6.0/extism-js-aarch64-linux-v1.6.0.gz"
|
|
||||||
url_api = "https://api.github.com/repos/extism/js-pdk/releases/assets/353223214"
|
|
||||||
|
|
||||||
[tools."github:extism/js-pdk"."platforms.linux-x64"]
|
|
||||||
checksum = "sha256:4ded271ccf465031ccd0dc35e7a140e134d7f30721671cc4a8e1ff805d4aad68"
|
|
||||||
url = "https://github.com/extism/js-pdk/releases/download/v1.6.0/extism-js-x86_64-linux-v1.6.0.gz"
|
|
||||||
url_api = "https://api.github.com/repos/extism/js-pdk/releases/assets/353223119"
|
|
||||||
|
|
||||||
[tools."github:extism/js-pdk"."platforms.linux-x64-musl"]
|
|
||||||
checksum = "sha256:4ded271ccf465031ccd0dc35e7a140e134d7f30721671cc4a8e1ff805d4aad68"
|
|
||||||
url = "https://github.com/extism/js-pdk/releases/download/v1.6.0/extism-js-x86_64-linux-v1.6.0.gz"
|
|
||||||
url_api = "https://api.github.com/repos/extism/js-pdk/releases/assets/353223119"
|
|
||||||
|
|
||||||
[tools."github:extism/js-pdk"."platforms.macos-arm64"]
|
|
||||||
checksum = "sha256:548e25bda3971a07c32d78a249135cf8cb7b3eede101e878e06e53e01ac2e0ce"
|
|
||||||
url = "https://github.com/extism/js-pdk/releases/download/v1.6.0/extism-js-aarch64-macos-v1.6.0.gz"
|
|
||||||
url_api = "https://api.github.com/repos/extism/js-pdk/releases/assets/353223215"
|
|
||||||
|
|
||||||
[tools."github:extism/js-pdk"."platforms.macos-x64"]
|
|
||||||
checksum = "sha256:d85a875c2a071f0c29fe572764c52c3a499f157ab7f9efac8939a4364390e29b"
|
|
||||||
url = "https://github.com/extism/js-pdk/releases/download/v1.6.0/extism-js-x86_64-macos-v1.6.0.gz"
|
|
||||||
url_api = "https://api.github.com/repos/extism/js-pdk/releases/assets/353223239"
|
|
||||||
|
|
||||||
[tools."github:extism/js-pdk"."platforms.windows-x64"]
|
|
||||||
checksum = "sha256:97b7b746141e4777e1ca2b76febdeb16dc9d314ff6a4257df05a476b67228acc"
|
|
||||||
url = "https://github.com/extism/js-pdk/releases/download/v1.6.0/extism-js-x86_64-windows-v1.6.0.gz"
|
|
||||||
url_api = "https://api.github.com/repos/extism/js-pdk/releases/assets/353224133"
|
|
||||||
|
|
||||||
[[tools."github:jellyfin/jellyfin-ffmpeg"]]
|
|
||||||
version = "7.1.3-6"
|
|
||||||
backend = "github:jellyfin/jellyfin-ffmpeg"
|
|
||||||
|
|
||||||
[tools."github:jellyfin/jellyfin-ffmpeg"."platforms.linux-arm64"]
|
|
||||||
checksum = "sha256:bea03c670e8cc5bfe9edc0c5d624d4735421610cef5e808db93e7d8596952886"
|
|
||||||
url = "https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v7.1.3-6/jellyfin-ffmpeg_7.1.3-6_portable_linuxarm64-gpl.tar.xz"
|
|
||||||
url_api = "https://api.github.com/repos/jellyfin/jellyfin-ffmpeg/releases/assets/409048876"
|
|
||||||
|
|
||||||
[tools."github:jellyfin/jellyfin-ffmpeg"."platforms.linux-arm64-musl"]
|
|
||||||
checksum = "sha256:bea03c670e8cc5bfe9edc0c5d624d4735421610cef5e808db93e7d8596952886"
|
|
||||||
url = "https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v7.1.3-6/jellyfin-ffmpeg_7.1.3-6_portable_linuxarm64-gpl.tar.xz"
|
|
||||||
url_api = "https://api.github.com/repos/jellyfin/jellyfin-ffmpeg/releases/assets/409048876"
|
|
||||||
|
|
||||||
[tools."github:jellyfin/jellyfin-ffmpeg"."platforms.linux-x64"]
|
|
||||||
checksum = "sha256:39e99a7927468a6abec5f65d00f55010e8ff2ae3c2605294f179c94f6ae21af2"
|
|
||||||
url = "https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v7.1.3-6/jellyfin-ffmpeg_7.1.3-6_portable_linux64-gpl.tar.xz"
|
|
||||||
url_api = "https://api.github.com/repos/jellyfin/jellyfin-ffmpeg/releases/assets/409048879"
|
|
||||||
|
|
||||||
[tools."github:jellyfin/jellyfin-ffmpeg"."platforms.linux-x64-musl"]
|
|
||||||
checksum = "sha256:39e99a7927468a6abec5f65d00f55010e8ff2ae3c2605294f179c94f6ae21af2"
|
|
||||||
url = "https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v7.1.3-6/jellyfin-ffmpeg_7.1.3-6_portable_linux64-gpl.tar.xz"
|
|
||||||
url_api = "https://api.github.com/repos/jellyfin/jellyfin-ffmpeg/releases/assets/409048879"
|
|
||||||
|
|
||||||
[tools."github:jellyfin/jellyfin-ffmpeg"."platforms.macos-arm64"]
|
|
||||||
checksum = "sha256:e024d5e78d5414e75f0181036cd21373fafb9270c72894dfd7dbda2572439820"
|
|
||||||
url = "https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v7.1.3-6/jellyfin-ffmpeg_7.1.3-6_portable_macarm64-gpl.tar.xz"
|
|
||||||
url_api = "https://api.github.com/repos/jellyfin/jellyfin-ffmpeg/releases/assets/408995838"
|
|
||||||
|
|
||||||
[tools."github:jellyfin/jellyfin-ffmpeg"."platforms.macos-x64"]
|
|
||||||
checksum = "sha256:066ede9774aaae97a18098aaeea8b7e0d286653eb8618f640476e99c59a536c2"
|
|
||||||
url = "https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v7.1.3-6/jellyfin-ffmpeg_7.1.3-6_portable_mac64-gpl.tar.xz"
|
|
||||||
url_api = "https://api.github.com/repos/jellyfin/jellyfin-ffmpeg/releases/assets/408995889"
|
|
||||||
|
|
||||||
[tools."github:jellyfin/jellyfin-ffmpeg"."platforms.windows-x64"]
|
|
||||||
checksum = "sha256:7b7168149689610296f3a187c717056ce0786cc125a31caf28056737e9ba1cc1"
|
|
||||||
url = "https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v7.1.3-6/jellyfin-ffmpeg_7.1.3-6_portable_win64-clang-gpl.zip"
|
|
||||||
url_api = "https://api.github.com/repos/jellyfin/jellyfin-ffmpeg/releases/assets/409036094"
|
|
||||||
|
|
||||||
[[tools."github:webassembly/binaryen"]]
|
|
||||||
version = "version_124"
|
|
||||||
backend = "github:webassembly/binaryen"
|
|
||||||
|
|
||||||
[tools."github:webassembly/binaryen"."platforms.linux-arm64"]
|
|
||||||
checksum = "sha256:6291bd9a57d8e046f3bc099a4db386c147433a87f71c783a901c5b1792e38de3"
|
|
||||||
url = "https://github.com/WebAssembly/binaryen/releases/download/version_124/binaryen-version_124-aarch64-linux.tar.gz"
|
|
||||||
url_api = "https://api.github.com/repos/WebAssembly/binaryen/releases/assets/288927659"
|
|
||||||
|
|
||||||
[tools."github:webassembly/binaryen"."platforms.linux-arm64-musl"]
|
|
||||||
checksum = "sha256:6291bd9a57d8e046f3bc099a4db386c147433a87f71c783a901c5b1792e38de3"
|
|
||||||
url = "https://github.com/WebAssembly/binaryen/releases/download/version_124/binaryen-version_124-aarch64-linux.tar.gz"
|
|
||||||
url_api = "https://api.github.com/repos/WebAssembly/binaryen/releases/assets/288927659"
|
|
||||||
|
|
||||||
[tools."github:webassembly/binaryen"."platforms.linux-x64"]
|
|
||||||
checksum = "sha256:0290c3779fedf592b8da0ded3032ff55c41a2b7bfa2d6bf7b7bac6f0e6e28963"
|
|
||||||
url = "https://github.com/WebAssembly/binaryen/releases/download/version_124/binaryen-version_124-x86_64-linux.tar.gz"
|
|
||||||
url_api = "https://api.github.com/repos/WebAssembly/binaryen/releases/assets/288926769"
|
|
||||||
|
|
||||||
[tools."github:webassembly/binaryen"."platforms.linux-x64-musl"]
|
|
||||||
checksum = "sha256:0290c3779fedf592b8da0ded3032ff55c41a2b7bfa2d6bf7b7bac6f0e6e28963"
|
|
||||||
url = "https://github.com/WebAssembly/binaryen/releases/download/version_124/binaryen-version_124-x86_64-linux.tar.gz"
|
|
||||||
url_api = "https://api.github.com/repos/WebAssembly/binaryen/releases/assets/288926769"
|
|
||||||
|
|
||||||
[tools."github:webassembly/binaryen"."platforms.macos-arm64"]
|
|
||||||
checksum = "sha256:86a2c960ff62c6d2ea6009d1f89745c22c70100d394a095eab45eb941bdaa24c"
|
|
||||||
url = "https://github.com/WebAssembly/binaryen/releases/download/version_124/binaryen-version_124-arm64-macos.tar.gz"
|
|
||||||
url_api = "https://api.github.com/repos/WebAssembly/binaryen/releases/assets/288926134"
|
|
||||||
|
|
||||||
[tools."github:webassembly/binaryen"."platforms.macos-x64"]
|
|
||||||
checksum = "sha256:b389bb0731758d86c3cb266d01d28a12725c23bd3cabc3df34faa162af0887e9"
|
|
||||||
url = "https://github.com/WebAssembly/binaryen/releases/download/version_124/binaryen-version_124-x86_64-macos.tar.gz"
|
|
||||||
url_api = "https://api.github.com/repos/WebAssembly/binaryen/releases/assets/288926135"
|
|
||||||
|
|
||||||
[tools."github:webassembly/binaryen"."platforms.windows-x64"]
|
|
||||||
checksum = "sha256:b5e1d2a1ad3c03229ddc89823848f4a1c11f9c6402a51fa26f0aaa5f1d7a2203"
|
|
||||||
url = "https://github.com/WebAssembly/binaryen/releases/download/version_124/binaryen-version_124-x86_64-windows.tar.gz"
|
|
||||||
url_api = "https://api.github.com/repos/WebAssembly/binaryen/releases/assets/288925833"
|
|
||||||
|
|
||||||
[[tools.java]]
|
|
||||||
version = "21.0.2"
|
|
||||||
backend = "core:java"
|
|
||||||
|
|
||||||
[tools.java."platforms.linux-arm64"]
|
|
||||||
checksum = "sha256:08db1392a48d4eb5ea5315cf8f18b89dbaf36cda663ba882cf03c704c9257ec2"
|
|
||||||
url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_linux-aarch64_bin.tar.gz"
|
|
||||||
|
|
||||||
[tools.java."platforms.linux-x64"]
|
|
||||||
checksum = "sha256:a2def047a73941e01a73739f92755f86b895811afb1f91243db214cff5bdac3f"
|
|
||||||
url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_linux-x64_bin.tar.gz"
|
|
||||||
|
|
||||||
[tools.java."platforms.macos-arm64"]
|
|
||||||
checksum = "sha256:b3d588e16ec1e0ef9805d8a696591bd518a5cea62567da8f53b5ce32d11d22e4"
|
|
||||||
url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_macos-aarch64_bin.tar.gz"
|
|
||||||
|
|
||||||
[tools.java."platforms.macos-x64"]
|
|
||||||
checksum = "sha256:8fd09e15dc406387a0aba70bf5d99692874e999bf9cd9208b452b5d76ac922d3"
|
|
||||||
url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_macos-x64_bin.tar.gz"
|
|
||||||
|
|
||||||
[tools.java."platforms.windows-x64"]
|
|
||||||
checksum = "sha256:b6c17e747ae78cdd6de4d7532b3164b277daee97c007d3eaa2b39cca99882664"
|
|
||||||
url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_windows-x64_bin.zip"
|
|
||||||
|
|
||||||
[[tools.node]]
|
|
||||||
version = "24.15.0"
|
|
||||||
backend = "core:node"
|
|
||||||
|
|
||||||
[tools.node."platforms.linux-arm64"]
|
|
||||||
checksum = "sha256:73afc234d558c24919875f51c2d1ea002a2ada4ea6f83601a383869fefa64eed"
|
|
||||||
url = "https://nodejs.org/dist/v24.15.0/node-v24.15.0-linux-arm64.tar.gz"
|
|
||||||
|
|
||||||
[tools.node."platforms.linux-arm64-musl"]
|
|
||||||
checksum = "sha256:31e98aa960a067da91edffd5d93bc46657b5d2a8029612c359f5f2ac0060152a"
|
|
||||||
url = "https://unofficial-builds.nodejs.org/download/release/v24.15.0/node-v24.15.0-linux-arm64-musl.tar.gz"
|
|
||||||
|
|
||||||
[tools.node."platforms.linux-x64"]
|
|
||||||
checksum = "sha256:44836872d9aec49f1e6b52a9a922872db9a2b02d235a616a5681b6a85fec8d89"
|
|
||||||
url = "https://nodejs.org/dist/v24.15.0/node-v24.15.0-linux-x64.tar.gz"
|
|
||||||
|
|
||||||
[tools.node."platforms.linux-x64-musl"]
|
|
||||||
checksum = "sha256:f55af5bd489c5347b113ca6594cae00a54b30ba57ac5875324311bfc6f4762e3"
|
|
||||||
url = "https://unofficial-builds.nodejs.org/download/release/v24.15.0/node-v24.15.0-linux-x64-musl.tar.gz"
|
|
||||||
|
|
||||||
[tools.node."platforms.macos-arm64"]
|
|
||||||
checksum = "sha256:372331b969779ab5d15b949884fc6eaf88d5afe87bde8ba881d6400b9100ffc4"
|
|
||||||
url = "https://nodejs.org/dist/v24.15.0/node-v24.15.0-darwin-arm64.tar.gz"
|
|
||||||
|
|
||||||
[tools.node."platforms.macos-x64"]
|
|
||||||
checksum = "sha256:ffd5ee293467927f3ee731a553eb88fd1f48cf74eebc2d74a6babe4af228673b"
|
|
||||||
url = "https://nodejs.org/dist/v24.15.0/node-v24.15.0-darwin-x64.tar.gz"
|
|
||||||
|
|
||||||
[tools.node."platforms.windows-x64"]
|
|
||||||
checksum = "sha256:cc5149eabd53779ce1e7bdc5401643622d0c7e6800ade18928a767e940bb0e62"
|
|
||||||
url = "https://nodejs.org/dist/v24.15.0/node-v24.15.0-win-x64.zip"
|
|
||||||
|
|
||||||
[[tools."npm:oazapfts"]]
|
|
||||||
version = "7.5.0"
|
|
||||||
backend = "npm:oazapfts"
|
|
||||||
|
|
||||||
[[tools.opentofu]]
|
|
||||||
version = "1.11.6"
|
|
||||||
backend = "aqua:opentofu/opentofu"
|
|
||||||
|
|
||||||
[tools.opentofu."platforms.linux-arm64"]
|
|
||||||
checksum = "sha256:d4f2ab15776925864b049bb329d69682851de6f5204f256e9fa86d07a0308850"
|
|
||||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_linux_arm64.tar.gz"
|
|
||||||
|
|
||||||
[tools.opentofu."platforms.linux-arm64-musl"]
|
|
||||||
checksum = "sha256:d4f2ab15776925864b049bb329d69682851de6f5204f256e9fa86d07a0308850"
|
|
||||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_linux_arm64.tar.gz"
|
|
||||||
|
|
||||||
[tools.opentofu."platforms.linux-x64"]
|
|
||||||
checksum = "sha256:02800fafa2753a9f50c38483e2fdf5bc353fd62895eb9e25eec9a5145df3a69e"
|
|
||||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_linux_amd64.tar.gz"
|
|
||||||
|
|
||||||
[tools.opentofu."platforms.linux-x64-musl"]
|
|
||||||
checksum = "sha256:02800fafa2753a9f50c38483e2fdf5bc353fd62895eb9e25eec9a5145df3a69e"
|
|
||||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_linux_amd64.tar.gz"
|
|
||||||
|
|
||||||
[tools.opentofu."platforms.macos-arm64"]
|
|
||||||
checksum = "sha256:62d7fa8539e13b444827aa0a3b90c5972da5c47e8f8882d9dcf2e430e78840c1"
|
|
||||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_darwin_arm64.tar.gz"
|
|
||||||
|
|
||||||
[tools.opentofu."platforms.macos-x64"]
|
|
||||||
checksum = "sha256:1408cdef1c380f914565e6b4bb70794c6b163f195fcb233357f3d6c5745906b6"
|
|
||||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_darwin_amd64.tar.gz"
|
|
||||||
|
|
||||||
[tools.opentofu."platforms.windows-x64"]
|
|
||||||
checksum = "sha256:27323f70c875b8251bfd7e61a4cffc3ebff4e56ed1e611b955016f0c7077367e"
|
|
||||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_windows_amd64.tar.gz"
|
|
||||||
|
|
||||||
[[tools.pnpm]]
|
|
||||||
version = "10.33.4"
|
|
||||||
backend = "aqua:pnpm/pnpm"
|
|
||||||
|
|
||||||
[[tools.terragrunt]]
|
|
||||||
version = "1.0.3"
|
|
||||||
backend = "aqua:gruntwork-io/terragrunt"
|
|
||||||
|
|
||||||
[tools.terragrunt."platforms.linux-arm64"]
|
|
||||||
checksum = "sha256:e5b60ab05b5214db694e6bc215d8124fb626e277cdb56b86f6147ae110d510fe"
|
|
||||||
url = "https://github.com/gruntwork-io/terragrunt/releases/download/v1.0.3/terragrunt_linux_arm64.tar.gz"
|
|
||||||
|
|
||||||
[tools.terragrunt."platforms.linux-arm64-musl"]
|
|
||||||
checksum = "sha256:e5b60ab05b5214db694e6bc215d8124fb626e277cdb56b86f6147ae110d510fe"
|
|
||||||
url = "https://github.com/gruntwork-io/terragrunt/releases/download/v1.0.3/terragrunt_linux_arm64.tar.gz"
|
|
||||||
|
|
||||||
[tools.terragrunt."platforms.linux-x64"]
|
|
||||||
checksum = "sha256:6d48049baf82e0bf9c804368dc85cbfeadc10955e33777e9e8de3e020b94b073"
|
|
||||||
url = "https://github.com/gruntwork-io/terragrunt/releases/download/v1.0.3/terragrunt_linux_amd64.tar.gz"
|
|
||||||
|
|
||||||
[tools.terragrunt."platforms.linux-x64-musl"]
|
|
||||||
checksum = "sha256:6d48049baf82e0bf9c804368dc85cbfeadc10955e33777e9e8de3e020b94b073"
|
|
||||||
url = "https://github.com/gruntwork-io/terragrunt/releases/download/v1.0.3/terragrunt_linux_amd64.tar.gz"
|
|
||||||
|
|
||||||
[tools.terragrunt."platforms.macos-arm64"]
|
|
||||||
checksum = "sha256:aacb5be2ca5475300cbce246dfbd8a45eb47510fbaa70fab8561c49ef5db03aa"
|
|
||||||
url = "https://github.com/gruntwork-io/terragrunt/releases/download/v1.0.3/terragrunt_darwin_arm64.tar.gz"
|
|
||||||
|
|
||||||
[tools.terragrunt."platforms.macos-x64"]
|
|
||||||
checksum = "sha256:3133c2251e191aede8e3dd2a5b3aee2e91c5f08f88f117aee40eed9a24c8ef6b"
|
|
||||||
url = "https://github.com/gruntwork-io/terragrunt/releases/download/v1.0.3/terragrunt_darwin_amd64.tar.gz"
|
|
||||||
|
|
||||||
[tools.terragrunt."platforms.windows-x64"]
|
|
||||||
checksum = "sha256:183b2745b4e04980a6bfa4450ff81956a12596ca22d70f7aaa793980f5b036db"
|
|
||||||
url = "https://github.com/gruntwork-io/terragrunt/releases/download/v1.0.3/terragrunt_windows_amd64.exe.tar.gz"
|
|
||||||
@@ -16,8 +16,8 @@ config_roots = [
|
|||||||
|
|
||||||
[tools]
|
[tools]
|
||||||
node = "24.15.0"
|
node = "24.15.0"
|
||||||
"aqua:flutter/flutter" = "3.41.9"
|
flutter = "3.41.9"
|
||||||
pnpm = "10.33.4"
|
pnpm = "10.33.1"
|
||||||
terragrunt = "1.0.3"
|
terragrunt = "1.0.3"
|
||||||
opentofu = "1.11.6"
|
opentofu = "1.11.6"
|
||||||
java = "21.0.2"
|
java = "21.0.2"
|
||||||
@@ -50,12 +50,11 @@ macos-arm64 = { asset_pattern = "jellyfin-ffmpeg_*_portable_macarm64-gpl.tar.xz"
|
|||||||
[settings]
|
[settings]
|
||||||
experimental = true
|
experimental = true
|
||||||
pin = true
|
pin = true
|
||||||
lockfile = true
|
|
||||||
|
|
||||||
[tasks.plugins]
|
[tasks.plugins]
|
||||||
run = [
|
run = [
|
||||||
"pnpm --filter @immich/plugin-sdk --filter @immich/plugin-core install --frozen-lockfile",
|
"pnpm --filter @immich/plugin-sdk --filter @immich/plugin-core install --frozen-lockfile",
|
||||||
"pnpm --filter @immich/plugin-sdk --filter @immich/plugin-core build",
|
"pnpm --filter @immich/plugin-sdk --filter @immich/plugin-core build"
|
||||||
]
|
]
|
||||||
|
|
||||||
[tasks.open-api-typescript]
|
[tasks.open-api-typescript]
|
||||||
@@ -77,8 +76,8 @@ run = [
|
|||||||
{ task = "//server:install" },
|
{ task = "//server:install" },
|
||||||
{ task = "//server:build" },
|
{ task = "//server:build" },
|
||||||
{ task = "//server:sync-open-api" },
|
{ task = "//server:sync-open-api" },
|
||||||
{ task = ":open-api-typescript" },
|
{ task = ":open-api-typescript"},
|
||||||
{ task = ":open-api-dart" },
|
{ task = ":open-api-dart"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[tasks.sql]
|
[tasks.sql]
|
||||||
|
|||||||
@@ -89,13 +89,6 @@ flutter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
constraints {
|
|
||||||
implementation("androidx.glance:glance-appwidget") {
|
|
||||||
version { strictly libs.versions.glance.get() }
|
|
||||||
because 'home_widget requests 1.+ which can resolve to pre-releases incompatible with our compileSdk/AGP'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
implementation libs.okhttp
|
implementation libs.okhttp
|
||||||
implementation libs.cronet.embedded
|
implementation libs.cronet.embedded
|
||||||
implementation libs.media3.datasource.okhttp
|
implementation libs.media3.datasource.okhttp
|
||||||
|
|||||||
@@ -315,7 +315,6 @@ interface NetworkApi {
|
|||||||
fun hasCertificate(): Boolean
|
fun hasCertificate(): Boolean
|
||||||
fun getClientPointer(): Long
|
fun getClientPointer(): Long
|
||||||
fun setRequestHeaders(headers: Map<String, String>, serverUrls: List<String>, token: String?)
|
fun setRequestHeaders(headers: Map<String, String>, serverUrls: List<String>, token: String?)
|
||||||
fun getAppGroupId(): String
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
/** The codec used by NetworkApi. */
|
/** The codec used by NetworkApi. */
|
||||||
@@ -431,21 +430,6 @@ interface NetworkApi {
|
|||||||
channel.setMessageHandler(null)
|
channel.setMessageHandler(null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
run {
|
|
||||||
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.immich_mobile.NetworkApi.getAppGroupId$separatedMessageChannelSuffix", codec)
|
|
||||||
if (api != null) {
|
|
||||||
channel.setMessageHandler { _, reply ->
|
|
||||||
val wrapped: List<Any?> = try {
|
|
||||||
listOf(api.getAppGroupId())
|
|
||||||
} catch (exception: Throwable) {
|
|
||||||
NetworkPigeonUtils.wrapError(exception)
|
|
||||||
}
|
|
||||||
reply.reply(wrapped)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
channel.setMessageHandler(null)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class NetworkApiPlugin : FlutterPlugin, ActivityAware {
|
|||||||
private var networkApi: NetworkApiImpl? = null
|
private var networkApi: NetworkApiImpl? = null
|
||||||
|
|
||||||
override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
|
override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
|
||||||
networkApi = NetworkApiImpl(binding.applicationContext)
|
networkApi = NetworkApiImpl()
|
||||||
NetworkApi.setUp(binding.binaryMessenger, networkApi)
|
NetworkApi.setUp(binding.binaryMessenger, networkApi)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,11 +39,9 @@ class NetworkApiPlugin : FlutterPlugin, ActivityAware {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class NetworkApiImpl(private val context: Context) : NetworkApi {
|
private class NetworkApiImpl : NetworkApi {
|
||||||
var activity: Activity? = null
|
var activity: Activity? = null
|
||||||
|
|
||||||
override fun getAppGroupId(): String = context.packageName
|
|
||||||
|
|
||||||
override fun addCertificate(clientData: ClientCertData, callback: (Result<Unit>) -> Unit) {
|
override fun addCertificate(clientData: ClientCertData, callback: (Result<Unit>) -> Unit) {
|
||||||
try {
|
try {
|
||||||
HttpClientManager.setKeyEntry(clientData.data, clientData.password.toCharArray())
|
HttpClientManager.setKeyEntry(clientData.data, clientData.password.toCharArray())
|
||||||
|
|||||||
@@ -718,7 +718,6 @@
|
|||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
CUSTOM_GROUP_ID = group.app.immich.share.profile;
|
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
@@ -751,6 +750,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 240;
|
CURRENT_PROJECT_VERSION = 240;
|
||||||
|
CUSTOM_GROUP_ID = group.app.immich.share;
|
||||||
DEVELOPMENT_TEAM = 2W7AC6T8T5;
|
DEVELOPMENT_TEAM = 2W7AC6T8T5;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
@@ -801,7 +801,6 @@
|
|||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
CUSTOM_GROUP_ID = group.app.immich.share.debug;
|
|
||||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
ENABLE_TESTABILITY = YES;
|
ENABLE_TESTABILITY = YES;
|
||||||
@@ -861,7 +860,6 @@
|
|||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
CUSTOM_GROUP_ID = group.app.immich.share;
|
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
@@ -896,6 +894,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 240;
|
CURRENT_PROJECT_VERSION = 240;
|
||||||
|
CUSTOM_GROUP_ID = group.app.immich.share;
|
||||||
DEVELOPMENT_TEAM = 2W7AC6T8T5;
|
DEVELOPMENT_TEAM = 2W7AC6T8T5;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
@@ -925,6 +924,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 240;
|
CURRENT_PROJECT_VERSION = 240;
|
||||||
|
CUSTOM_GROUP_ID = group.app.immich.share;
|
||||||
DEVELOPMENT_TEAM = 2W7AC6T8T5;
|
DEVELOPMENT_TEAM = 2W7AC6T8T5;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
@@ -1080,6 +1080,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 240;
|
CURRENT_PROJECT_VERSION = 240;
|
||||||
|
CUSTOM_GROUP_ID = group.app.immich.share;
|
||||||
DEVELOPMENT_TEAM = 2W7AC6T8T5;
|
DEVELOPMENT_TEAM = 2W7AC6T8T5;
|
||||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu17;
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
@@ -1123,6 +1124,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 240;
|
CURRENT_PROJECT_VERSION = 240;
|
||||||
|
CUSTOM_GROUP_ID = group.app.immich.share;
|
||||||
DEVELOPMENT_TEAM = 2W7AC6T8T5;
|
DEVELOPMENT_TEAM = 2W7AC6T8T5;
|
||||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu17;
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
@@ -1163,6 +1165,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 240;
|
CURRENT_PROJECT_VERSION = 240;
|
||||||
|
CUSTOM_GROUP_ID = group.app.immich.share;
|
||||||
DEVELOPMENT_TEAM = 2W7AC6T8T5;
|
DEVELOPMENT_TEAM = 2W7AC6T8T5;
|
||||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu17;
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
|
|||||||
Generated
-14
@@ -288,7 +288,6 @@ protocol NetworkApi {
|
|||||||
func hasCertificate() throws -> Bool
|
func hasCertificate() throws -> Bool
|
||||||
func getClientPointer() throws -> Int64
|
func getClientPointer() throws -> Int64
|
||||||
func setRequestHeaders(headers: [String: String], serverUrls: [String], token: String?) throws
|
func setRequestHeaders(headers: [String: String], serverUrls: [String], token: String?) throws
|
||||||
func getAppGroupId() throws -> String
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generated setup class from Pigeon to handle messages through the `binaryMessenger`.
|
/// Generated setup class from Pigeon to handle messages through the `binaryMessenger`.
|
||||||
@@ -389,18 +388,5 @@ class NetworkApiSetup {
|
|||||||
} else {
|
} else {
|
||||||
setRequestHeadersChannel.setMessageHandler(nil)
|
setRequestHeadersChannel.setMessageHandler(nil)
|
||||||
}
|
}
|
||||||
let getAppGroupIdChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NetworkApi.getAppGroupId\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
|
|
||||||
if let api = api {
|
|
||||||
getAppGroupIdChannel.setMessageHandler { _, reply in
|
|
||||||
do {
|
|
||||||
let result = try api.getAppGroupId()
|
|
||||||
reply(wrapResult(result))
|
|
||||||
} catch {
|
|
||||||
reply(wrapError(error))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
getAppGroupIdChannel.setMessageHandler(nil)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,10 +61,6 @@ class NetworkApiImpl: NetworkApi {
|
|||||||
return Int64(Int(bitPattern: pointer))
|
return Int64(Int(bitPattern: pointer))
|
||||||
}
|
}
|
||||||
|
|
||||||
func getAppGroupId() throws -> String {
|
|
||||||
return Bundle.main.object(forInfoDictionaryKey: "AppGroupId") as! String
|
|
||||||
}
|
|
||||||
|
|
||||||
func setRequestHeaders(headers: [String : String], serverUrls: [String], token: String?) throws {
|
func setRequestHeaders(headers: [String : String], serverUrls: [String], token: String?) throws {
|
||||||
URLSessionManager.setServerUrls(serverUrls)
|
URLSessionManager.setServerUrls(serverUrls)
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import native_video_player
|
|||||||
let CLIENT_CERT_LABEL = "app.alextran.immich.client_identity"
|
let CLIENT_CERT_LABEL = "app.alextran.immich.client_identity"
|
||||||
let HEADERS_KEY = "immich.request_headers"
|
let HEADERS_KEY = "immich.request_headers"
|
||||||
let SERVER_URLS_KEY = "immich.server_urls"
|
let SERVER_URLS_KEY = "immich.server_urls"
|
||||||
let APP_GROUP = Bundle.main.object(forInfoDictionaryKey: "AppGroupId") as! String
|
let APP_GROUP = "group.app.immich.share"
|
||||||
let COOKIE_EXPIRY_DAYS: TimeInterval = 400
|
let COOKIE_EXPIRY_DAYS: TimeInterval = 400
|
||||||
|
|
||||||
enum AuthCookie: CaseIterable {
|
enum AuthCookie: CaseIterable {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.application-groups</key>
|
<key>com.apple.security.application-groups</key>
|
||||||
<array>
|
<array>
|
||||||
<string>$(CUSTOM_GROUP_ID)</string>
|
<string>group.app.immich.share</string>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.application-groups</key>
|
<key>com.apple.security.application-groups</key>
|
||||||
<array>
|
<array>
|
||||||
<string>$(CUSTOM_GROUP_ID)</string>
|
<string>group.app.immich.share</string>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<dict>
|
<dict>
|
||||||
<key>com.apple.security.application-groups</key>
|
<key>com.apple.security.application-groups</key>
|
||||||
<array>
|
<array>
|
||||||
<string>$(CUSTOM_GROUP_ID)</string>
|
<string>group.app.immich.share</string>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
@@ -2,7 +2,7 @@ import Foundation
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
import WidgetKit
|
import WidgetKit
|
||||||
|
|
||||||
let IMMICH_SHARE_GROUP = Bundle.main.object(forInfoDictionaryKey: "AppGroupId") as! String
|
let IMMICH_SHARE_GROUP = "group.app.immich.share"
|
||||||
|
|
||||||
enum WidgetError: Error, Codable {
|
enum WidgetError: Error, Codable {
|
||||||
case noLogin
|
case noLogin
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<key>AppGroupId</key>
|
|
||||||
<string>$(CUSTOM_GROUP_ID)</string>
|
|
||||||
<key>NSAppTransportSecurity</key>
|
<key>NSAppTransportSecurity</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>NSAllowsArbitraryLoads</key>
|
<key>NSAllowsArbitraryLoads</key>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<dict>
|
<dict>
|
||||||
<key>com.apple.security.application-groups</key>
|
<key>com.apple.security.application-groups</key>
|
||||||
<array>
|
<array>
|
||||||
<string>$(CUSTOM_GROUP_ID)</string>
|
<string>group.app.immich.share</string>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
@@ -21,7 +21,6 @@ platform :ios do
|
|||||||
CODE_SIGN_IDENTITY = "Apple Distribution: FUTO Holdings, Inc. (#{TEAM_ID})"
|
CODE_SIGN_IDENTITY = "Apple Distribution: FUTO Holdings, Inc. (#{TEAM_ID})"
|
||||||
BASE_BUNDLE_ID = "app.alextran.immich"
|
BASE_BUNDLE_ID = "app.alextran.immich"
|
||||||
DEV_BUNDLE_ID = "tech.futo.immich.testflight"
|
DEV_BUNDLE_ID = "tech.futo.immich.testflight"
|
||||||
DEV_GROUP_ID = "group.app.immich.share.testflight"
|
|
||||||
|
|
||||||
# Helper method to get App Store Connect API key
|
# Helper method to get App Store Connect API key
|
||||||
def get_api_key
|
def get_api_key
|
||||||
@@ -34,13 +33,6 @@ platform :ios do
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Helper method to assemble xcargs with optional CUSTOM_GROUP_ID override
|
|
||||||
def build_xcargs(group_id: nil)
|
|
||||||
args = "-skipMacroValidation CODE_SIGN_IDENTITY='#{CODE_SIGN_IDENTITY}' CODE_SIGN_STYLE=Manual"
|
|
||||||
args += " CUSTOM_GROUP_ID='#{group_id}'" if group_id
|
|
||||||
args
|
|
||||||
end
|
|
||||||
|
|
||||||
# Helper method to get version from pubspec.yaml
|
# Helper method to get version from pubspec.yaml
|
||||||
def get_version_from_pubspec
|
def get_version_from_pubspec
|
||||||
require 'yaml'
|
require 'yaml'
|
||||||
@@ -97,8 +89,7 @@ end
|
|||||||
version_number: nil,
|
version_number: nil,
|
||||||
profile_name_main:,
|
profile_name_main:,
|
||||||
profile_name_share:,
|
profile_name_share:,
|
||||||
profile_name_widget:,
|
profile_name_widget:
|
||||||
group_id: nil
|
|
||||||
)
|
)
|
||||||
app_identifier = base_bundle_id
|
app_identifier = base_bundle_id
|
||||||
|
|
||||||
@@ -106,7 +97,7 @@ end
|
|||||||
if version_number
|
if version_number
|
||||||
increment_version_number(version_number: version_number)
|
increment_version_number(version_number: version_number)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Increment build number
|
# Increment build number
|
||||||
increment_build_number(
|
increment_build_number(
|
||||||
build_number: latest_testflight_build_number(
|
build_number: latest_testflight_build_number(
|
||||||
@@ -115,14 +106,14 @@ end
|
|||||||
) + 1,
|
) + 1,
|
||||||
xcodeproj: "./Runner.xcodeproj"
|
xcodeproj: "./Runner.xcodeproj"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Build the app
|
# Build the app
|
||||||
build_app(
|
build_app(
|
||||||
scheme: "Runner",
|
scheme: "Runner",
|
||||||
workspace: "Runner.xcworkspace",
|
workspace: "Runner.xcworkspace",
|
||||||
configuration: configuration,
|
configuration: configuration,
|
||||||
export_method: "app-store",
|
export_method: "app-store",
|
||||||
xcargs: build_xcargs(group_id: group_id),
|
xcargs: "-skipMacroValidation CODE_SIGN_IDENTITY='#{CODE_SIGN_IDENTITY}' CODE_SIGN_STYLE=Manual",
|
||||||
export_options: {
|
export_options: {
|
||||||
provisioningProfiles: {
|
provisioningProfiles: {
|
||||||
"#{app_identifier}" => profile_name_main,
|
"#{app_identifier}" => profile_name_main,
|
||||||
@@ -174,8 +165,7 @@ end
|
|||||||
distribute_external: false,
|
distribute_external: false,
|
||||||
profile_name_main: main_profile_name,
|
profile_name_main: main_profile_name,
|
||||||
profile_name_share: share_profile_name,
|
profile_name_share: share_profile_name,
|
||||||
profile_name_widget: widget_profile_name,
|
profile_name_widget: widget_profile_name
|
||||||
group_id: DEV_GROUP_ID
|
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -284,7 +274,7 @@ end
|
|||||||
configuration: "Release",
|
configuration: "Release",
|
||||||
export_method: "app-store",
|
export_method: "app-store",
|
||||||
skip_package_ipa: true,
|
skip_package_ipa: true,
|
||||||
xcargs: build_xcargs(group_id: DEV_GROUP_ID),
|
xcargs: "-skipMacroValidation CODE_SIGN_IDENTITY='#{CODE_SIGN_IDENTITY}' CODE_SIGN_STYLE=Manual",
|
||||||
export_options: {
|
export_options: {
|
||||||
provisioningProfiles: {
|
provisioningProfiles: {
|
||||||
DEV_BUNDLE_ID => main_profile_name,
|
DEV_BUNDLE_ID => main_profile_name,
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ const int kTimelineAssetLoadBatchSize = 1024;
|
|||||||
const int kTimelineAssetLoadOppositeSize = 64;
|
const int kTimelineAssetLoadOppositeSize = 64;
|
||||||
|
|
||||||
// Widget keys
|
// Widget keys
|
||||||
|
const String appShareGroupId = "group.app.immich.share";
|
||||||
const String kWidgetAuthToken = "widget_auth_token";
|
const String kWidgetAuthToken = "widget_auth_token";
|
||||||
const String kWidgetServerEndpoint = "widget_server_url";
|
const String kWidgetServerEndpoint = "widget_server_url";
|
||||||
const String kWidgetCustomHeaders = "widget_custom_headers";
|
const String kWidgetCustomHeaders = "widget_custom_headers";
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import 'package:immich_mobile/domain/models/metadata_key.dart';
|
||||||
import 'package:immich_mobile/providers/album/album_sort_by_options.provider.dart';
|
import 'package:immich_mobile/providers/album/album_sort_by_options.provider.dart';
|
||||||
|
|
||||||
class AlbumConfig {
|
class AlbumConfig {
|
||||||
@@ -5,7 +6,12 @@ class AlbumConfig {
|
|||||||
final bool isReverse;
|
final bool isReverse;
|
||||||
final bool isGrid;
|
final bool isGrid;
|
||||||
|
|
||||||
const AlbumConfig({this.sortMode = AlbumSortMode.mostRecent, this.isReverse = true, this.isGrid = false});
|
const AlbumConfig({required this.sortMode, required this.isReverse, required this.isGrid});
|
||||||
|
|
||||||
|
AlbumConfig.defaults()
|
||||||
|
: sortMode = MetadataKey.albumSortMode.defaultValue,
|
||||||
|
isReverse = MetadataKey.albumIsReverse.defaultValue,
|
||||||
|
isGrid = MetadataKey.albumIsGrid.defaultValue;
|
||||||
|
|
||||||
AlbumConfig copyWith({AlbumSortMode? sortMode, bool? isReverse, bool? isGrid}) => AlbumConfig(
|
AlbumConfig copyWith({AlbumSortMode? sortMode, bool? isReverse, bool? isGrid}) => AlbumConfig(
|
||||||
sortMode: sortMode ?? this.sortMode,
|
sortMode: sortMode ?? this.sortMode,
|
||||||
|
|||||||
@@ -20,17 +20,28 @@ class AppConfig {
|
|||||||
final BackupConfig backup;
|
final BackupConfig backup;
|
||||||
|
|
||||||
const AppConfig({
|
const AppConfig({
|
||||||
this.theme = const .new(),
|
required this.theme,
|
||||||
this.cleanup = const .new(),
|
required this.cleanup,
|
||||||
this.map = const .new(),
|
required this.map,
|
||||||
this.timeline = const .new(),
|
required this.timeline,
|
||||||
this.image = const .new(),
|
required this.image,
|
||||||
this.viewer = const .new(),
|
required this.viewer,
|
||||||
this.slideshow = const .new(),
|
required this.slideshow,
|
||||||
this.album = const .new(),
|
required this.album,
|
||||||
this.backup = const .new(),
|
required this.backup,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
AppConfig.defaults()
|
||||||
|
: theme = .defaults(),
|
||||||
|
cleanup = .defaults(),
|
||||||
|
map = .defaults(),
|
||||||
|
timeline = .defaults(),
|
||||||
|
image = .defaults(),
|
||||||
|
viewer = .defaults(),
|
||||||
|
slideshow = .defaults(),
|
||||||
|
album = .defaults(),
|
||||||
|
backup = .defaults();
|
||||||
|
|
||||||
AppConfig copyWith({
|
AppConfig copyWith({
|
||||||
ThemeConfig? theme,
|
ThemeConfig? theme,
|
||||||
CleanupConfig? cleanup,
|
CleanupConfig? cleanup,
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import 'package:immich_mobile/domain/models/metadata_key.dart';
|
||||||
|
|
||||||
class BackupConfig {
|
class BackupConfig {
|
||||||
final bool enabled;
|
final bool enabled;
|
||||||
final bool useCellularForVideos;
|
final bool useCellularForVideos;
|
||||||
@@ -7,14 +9,22 @@ class BackupConfig {
|
|||||||
final bool syncAlbums;
|
final bool syncAlbums;
|
||||||
|
|
||||||
const BackupConfig({
|
const BackupConfig({
|
||||||
this.enabled = false,
|
required this.enabled,
|
||||||
this.useCellularForVideos = false,
|
required this.useCellularForVideos,
|
||||||
this.useCellularForPhotos = false,
|
required this.useCellularForPhotos,
|
||||||
this.requireCharging = false,
|
required this.requireCharging,
|
||||||
this.triggerDelay = 30,
|
required this.triggerDelay,
|
||||||
this.syncAlbums = false,
|
required this.syncAlbums,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
BackupConfig.defaults()
|
||||||
|
: enabled = MetadataKey.backupEnabled.defaultValue,
|
||||||
|
useCellularForVideos = MetadataKey.backupUseCellularForVideos.defaultValue,
|
||||||
|
useCellularForPhotos = MetadataKey.backupUseCellularForPhotos.defaultValue,
|
||||||
|
requireCharging = MetadataKey.backupRequireCharging.defaultValue,
|
||||||
|
triggerDelay = MetadataKey.backupTriggerDelay.defaultValue,
|
||||||
|
syncAlbums = MetadataKey.backupSyncAlbums.defaultValue;
|
||||||
|
|
||||||
BackupConfig copyWith({
|
BackupConfig copyWith({
|
||||||
bool? enabled,
|
bool? enabled,
|
||||||
bool? useCellularForVideos,
|
bool? useCellularForVideos,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'package:immich_mobile/constants/enums.dart';
|
import 'package:immich_mobile/constants/enums.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/metadata_key.dart';
|
||||||
|
|
||||||
class CleanupConfig {
|
class CleanupConfig {
|
||||||
final bool keepFavorites;
|
final bool keepFavorites;
|
||||||
@@ -8,13 +9,20 @@ class CleanupConfig {
|
|||||||
final bool defaultsInitialized;
|
final bool defaultsInitialized;
|
||||||
|
|
||||||
const CleanupConfig({
|
const CleanupConfig({
|
||||||
this.keepFavorites = true,
|
required this.keepFavorites,
|
||||||
this.keepMediaType = AssetKeepType.none,
|
required this.keepMediaType,
|
||||||
this.keepAlbumIds = const [],
|
required this.keepAlbumIds,
|
||||||
this.cutoffDaysAgo = -1,
|
required this.cutoffDaysAgo,
|
||||||
this.defaultsInitialized = false,
|
required this.defaultsInitialized,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
CleanupConfig.defaults()
|
||||||
|
: keepFavorites = MetadataKey.cleanupKeepFavorites.defaultValue,
|
||||||
|
keepMediaType = MetadataKey.cleanupKeepMediaType.defaultValue,
|
||||||
|
keepAlbumIds = MetadataKey.cleanupKeepAlbumIds.defaultValue,
|
||||||
|
cutoffDaysAgo = MetadataKey.cleanupCutoffDaysAgo.defaultValue,
|
||||||
|
defaultsInitialized = MetadataKey.cleanupDefaultsInitialized.defaultValue;
|
||||||
|
|
||||||
CleanupConfig copyWith({
|
CleanupConfig copyWith({
|
||||||
bool? keepFavorites,
|
bool? keepFavorites,
|
||||||
AssetKeepType? keepMediaType,
|
AssetKeepType? keepMediaType,
|
||||||
|
|||||||
@@ -1,8 +1,14 @@
|
|||||||
|
import 'package:immich_mobile/domain/models/metadata_key.dart';
|
||||||
|
|
||||||
class ImageConfig {
|
class ImageConfig {
|
||||||
final bool preferRemote;
|
final bool preferRemote;
|
||||||
final bool loadOriginal;
|
final bool loadOriginal;
|
||||||
|
|
||||||
const ImageConfig({this.preferRemote = false, this.loadOriginal = false});
|
const ImageConfig({required this.preferRemote, required this.loadOriginal});
|
||||||
|
|
||||||
|
ImageConfig.defaults()
|
||||||
|
: preferRemote = MetadataKey.imagePreferRemote.defaultValue,
|
||||||
|
loadOriginal = MetadataKey.imageLoadOriginal.defaultValue;
|
||||||
|
|
||||||
ImageConfig copyWith({bool? preferRemote, bool? loadOriginal}) =>
|
ImageConfig copyWith({bool? preferRemote, bool? loadOriginal}) =>
|
||||||
ImageConfig(preferRemote: preferRemote ?? this.preferRemote, loadOriginal: loadOriginal ?? this.loadOriginal);
|
ImageConfig(preferRemote: preferRemote ?? this.preferRemote, loadOriginal: loadOriginal ?? this.loadOriginal);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/metadata_key.dart';
|
||||||
|
|
||||||
class MapConfig {
|
class MapConfig {
|
||||||
final int relativeDays;
|
final int relativeDays;
|
||||||
@@ -8,13 +9,20 @@ class MapConfig {
|
|||||||
final bool withPartners;
|
final bool withPartners;
|
||||||
|
|
||||||
const MapConfig({
|
const MapConfig({
|
||||||
this.relativeDays = 0,
|
required this.relativeDays,
|
||||||
this.favoritesOnly = false,
|
required this.favoritesOnly,
|
||||||
this.includeArchived = false,
|
required this.includeArchived,
|
||||||
this.themeMode = ThemeMode.system,
|
required this.themeMode,
|
||||||
this.withPartners = false,
|
required this.withPartners,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
MapConfig.defaults()
|
||||||
|
: relativeDays = MetadataKey.mapRelativeDate.defaultValue,
|
||||||
|
favoritesOnly = MetadataKey.mapShowFavoriteOnly.defaultValue,
|
||||||
|
includeArchived = MetadataKey.mapIncludeArchived.defaultValue,
|
||||||
|
themeMode = MetadataKey.mapThemeMode.defaultValue,
|
||||||
|
withPartners = MetadataKey.mapWithPartners.defaultValue;
|
||||||
|
|
||||||
MapConfig copyWith({
|
MapConfig copyWith({
|
||||||
int? relativeDays,
|
int? relativeDays,
|
||||||
bool? favoritesOnly,
|
bool? favoritesOnly,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/metadata_key.dart';
|
||||||
|
|
||||||
class NetworkConfig {
|
class NetworkConfig {
|
||||||
final bool autoEndpointSwitching;
|
final bool autoEndpointSwitching;
|
||||||
@@ -8,13 +9,20 @@ class NetworkConfig {
|
|||||||
final Map<String, String> customHeaders;
|
final Map<String, String> customHeaders;
|
||||||
|
|
||||||
const NetworkConfig({
|
const NetworkConfig({
|
||||||
this.autoEndpointSwitching = false,
|
required this.autoEndpointSwitching,
|
||||||
this.preferredWifiName,
|
this.preferredWifiName,
|
||||||
this.localEndpoint,
|
this.localEndpoint,
|
||||||
this.externalEndpointList = const [],
|
required this.externalEndpointList,
|
||||||
this.customHeaders = const {},
|
required this.customHeaders,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
NetworkConfig.defaults()
|
||||||
|
: autoEndpointSwitching = MetadataKey.networkAutoEndpointSwitching.defaultValue,
|
||||||
|
preferredWifiName = MetadataKey.networkPreferredWifiName.defaultValue,
|
||||||
|
localEndpoint = MetadataKey.networkLocalEndpoint.defaultValue,
|
||||||
|
externalEndpointList = MetadataKey.networkExternalEndpointList.defaultValue,
|
||||||
|
customHeaders = MetadataKey.networkCustomHeaders.defaultValue;
|
||||||
|
|
||||||
NetworkConfig copyWith({
|
NetworkConfig copyWith({
|
||||||
bool? autoEndpointSwitching,
|
bool? autoEndpointSwitching,
|
||||||
String? preferredWifiName,
|
String? preferredWifiName,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'package:immich_mobile/constants/enums.dart';
|
import 'package:immich_mobile/constants/enums.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/metadata_key.dart';
|
||||||
|
|
||||||
class SlideshowConfig {
|
class SlideshowConfig {
|
||||||
final bool transition;
|
final bool transition;
|
||||||
@@ -8,13 +9,20 @@ class SlideshowConfig {
|
|||||||
final SlideshowDirection direction;
|
final SlideshowDirection direction;
|
||||||
|
|
||||||
const SlideshowConfig({
|
const SlideshowConfig({
|
||||||
this.transition = true,
|
required this.transition,
|
||||||
this.repeat = true,
|
required this.repeat,
|
||||||
this.duration = 5,
|
required this.duration,
|
||||||
this.look = SlideshowLook.contain,
|
required this.look,
|
||||||
this.direction = SlideshowDirection.forward,
|
required this.direction,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
SlideshowConfig.defaults()
|
||||||
|
: transition = MetadataKey.slideshowTransition.defaultValue,
|
||||||
|
repeat = MetadataKey.slideshowRepeat.defaultValue,
|
||||||
|
duration = MetadataKey.slideshowDuration.defaultValue,
|
||||||
|
look = MetadataKey.slideshowLook.defaultValue,
|
||||||
|
direction = MetadataKey.slideshowDirection.defaultValue;
|
||||||
|
|
||||||
SlideshowConfig copyWith({
|
SlideshowConfig copyWith({
|
||||||
bool? transition,
|
bool? transition,
|
||||||
bool? repeat,
|
bool? repeat,
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
import 'package:immich_mobile/domain/models/config/network_config.dart';
|
import 'package:immich_mobile/domain/models/config/network_config.dart';
|
||||||
import 'package:immich_mobile/domain/models/log.model.dart';
|
import 'package:immich_mobile/domain/models/log.model.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/metadata_key.dart';
|
||||||
|
|
||||||
class SystemConfig {
|
class SystemConfig {
|
||||||
final LogLevel logLevel;
|
final LogLevel logLevel;
|
||||||
final NetworkConfig network;
|
final NetworkConfig network;
|
||||||
|
|
||||||
const SystemConfig({this.logLevel = .info, this.network = const .new()});
|
const SystemConfig({required this.logLevel, required this.network});
|
||||||
|
|
||||||
|
SystemConfig.defaults() : logLevel = MetadataKey.logLevel.defaultValue, network = NetworkConfig.defaults();
|
||||||
|
|
||||||
SystemConfig copyWith({LogLevel? logLevel, NetworkConfig? network}) =>
|
SystemConfig copyWith({LogLevel? logLevel, NetworkConfig? network}) =>
|
||||||
SystemConfig(logLevel: logLevel ?? this.logLevel, network: network ?? this.network);
|
SystemConfig(logLevel: logLevel ?? this.logLevel, network: network ?? this.network);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:immich_mobile/constants/colors.dart';
|
import 'package:immich_mobile/constants/colors.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/metadata_key.dart';
|
||||||
|
|
||||||
class ThemeConfig {
|
class ThemeConfig {
|
||||||
final ThemeMode mode;
|
final ThemeMode mode;
|
||||||
@@ -8,12 +9,18 @@ class ThemeConfig {
|
|||||||
final bool colorfulInterface;
|
final bool colorfulInterface;
|
||||||
|
|
||||||
const ThemeConfig({
|
const ThemeConfig({
|
||||||
this.mode = .system,
|
required this.mode,
|
||||||
this.primaryColor = .indigo,
|
required this.primaryColor,
|
||||||
this.dynamicTheme = false,
|
required this.dynamicTheme,
|
||||||
this.colorfulInterface = true,
|
required this.colorfulInterface,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ThemeConfig.defaults()
|
||||||
|
: mode = MetadataKey.themeMode.defaultValue,
|
||||||
|
primaryColor = MetadataKey.themePrimaryColor.defaultValue,
|
||||||
|
dynamicTheme = MetadataKey.themeDynamic.defaultValue,
|
||||||
|
colorfulInterface = MetadataKey.themeColorfulInterface.defaultValue;
|
||||||
|
|
||||||
ThemeConfig copyWith({
|
ThemeConfig copyWith({
|
||||||
ThemeMode? mode,
|
ThemeMode? mode,
|
||||||
ImmichColorPreset? primaryColor,
|
ImmichColorPreset? primaryColor,
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import 'package:immich_mobile/domain/models/metadata_key.dart';
|
||||||
import 'package:immich_mobile/domain/models/timeline.model.dart';
|
import 'package:immich_mobile/domain/models/timeline.model.dart';
|
||||||
|
|
||||||
class TimelineConfig {
|
class TimelineConfig {
|
||||||
@@ -5,7 +6,12 @@ class TimelineConfig {
|
|||||||
final GroupAssetsBy groupAssetsBy;
|
final GroupAssetsBy groupAssetsBy;
|
||||||
final bool storageIndicator;
|
final bool storageIndicator;
|
||||||
|
|
||||||
const TimelineConfig({this.tilesPerRow = 4, this.groupAssetsBy = GroupAssetsBy.day, this.storageIndicator = true});
|
const TimelineConfig({required this.tilesPerRow, required this.groupAssetsBy, required this.storageIndicator});
|
||||||
|
|
||||||
|
TimelineConfig.defaults()
|
||||||
|
: tilesPerRow = MetadataKey.timelineTilesPerRow.defaultValue,
|
||||||
|
groupAssetsBy = MetadataKey.timelineGroupAssetsBy.defaultValue,
|
||||||
|
storageIndicator = MetadataKey.timelineStorageIndicator.defaultValue;
|
||||||
|
|
||||||
TimelineConfig copyWith({int? tilesPerRow, GroupAssetsBy? groupAssetsBy, bool? storageIndicator}) => TimelineConfig(
|
TimelineConfig copyWith({int? tilesPerRow, GroupAssetsBy? groupAssetsBy, bool? storageIndicator}) => TimelineConfig(
|
||||||
tilesPerRow: tilesPerRow ?? this.tilesPerRow,
|
tilesPerRow: tilesPerRow ?? this.tilesPerRow,
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import 'package:immich_mobile/domain/models/metadata_key.dart';
|
||||||
|
|
||||||
class ViewerConfig {
|
class ViewerConfig {
|
||||||
final bool loopVideo;
|
final bool loopVideo;
|
||||||
final bool loadOriginalVideo;
|
final bool loadOriginalVideo;
|
||||||
@@ -5,12 +7,18 @@ class ViewerConfig {
|
|||||||
final bool tapToNavigate;
|
final bool tapToNavigate;
|
||||||
|
|
||||||
const ViewerConfig({
|
const ViewerConfig({
|
||||||
this.loopVideo = true,
|
required this.loopVideo,
|
||||||
this.loadOriginalVideo = false,
|
required this.loadOriginalVideo,
|
||||||
this.autoPlayVideo = true,
|
required this.autoPlayVideo,
|
||||||
this.tapToNavigate = false,
|
required this.tapToNavigate,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ViewerConfig.defaults()
|
||||||
|
: loopVideo = MetadataKey.viewerLoopVideo.defaultValue,
|
||||||
|
loadOriginalVideo = MetadataKey.viewerLoadOriginalVideo.defaultValue,
|
||||||
|
autoPlayVideo = MetadataKey.viewerAutoPlayVideo.defaultValue,
|
||||||
|
tapToNavigate = MetadataKey.viewerTapToNavigate.defaultValue;
|
||||||
|
|
||||||
ViewerConfig copyWith({bool? loopVideo, bool? loadOriginalVideo, bool? autoPlayVideo, bool? tapToNavigate}) =>
|
ViewerConfig copyWith({bool? loopVideo, bool? loadOriginalVideo, bool? autoPlayVideo, bool? tapToNavigate}) =>
|
||||||
ViewerConfig(
|
ViewerConfig(
|
||||||
loopVideo: loopVideo ?? this.loopVideo,
|
loopVideo: loopVideo ?? this.loopVideo,
|
||||||
|
|||||||
@@ -20,106 +20,79 @@ enum MetadataDomain<T extends Object> {
|
|||||||
|
|
||||||
enum MetadataKey<T extends Object> {
|
enum MetadataKey<T extends Object> {
|
||||||
// Theme
|
// Theme
|
||||||
themePrimaryColor<ImmichColorPreset>(.appConfig, 'theme.primaryColor', .indigo, _EnumCodec(ImmichColorPreset.values)),
|
themePrimaryColor<ImmichColorPreset>(.appConfig, .indigo, _EnumCodec(ImmichColorPreset.values)),
|
||||||
themeMode<ThemeMode>(.appConfig, 'theme.mode', .system, _EnumCodec(ThemeMode.values)),
|
themeMode<ThemeMode>(.appConfig, .system, _EnumCodec(ThemeMode.values)),
|
||||||
themeDynamic<bool>(.appConfig, 'theme.dynamic', false),
|
themeDynamic<bool>(.appConfig, false),
|
||||||
themeColorfulInterface<bool>(.appConfig, 'theme.colorfulInterface', true),
|
themeColorfulInterface<bool>(.appConfig, true),
|
||||||
|
|
||||||
// Image
|
// Image
|
||||||
imagePreferRemote<bool>(.appConfig, 'image.preferRemote', false),
|
imagePreferRemote<bool>(.appConfig, false),
|
||||||
imageLoadOriginal<bool>(.appConfig, 'image.loadOriginal', false),
|
imageLoadOriginal<bool>(.appConfig, false),
|
||||||
|
|
||||||
// Viewer
|
// Viewer
|
||||||
viewerLoopVideo<bool>(.appConfig, 'viewer.loopVideo', true),
|
viewerLoopVideo<bool>(.appConfig, true),
|
||||||
viewerLoadOriginalVideo<bool>(.appConfig, 'viewer.loadOriginalVideo', false),
|
viewerLoadOriginalVideo<bool>(.appConfig, false),
|
||||||
viewerAutoPlayVideo<bool>(.appConfig, 'viewer.autoPlayVideo', true),
|
viewerAutoPlayVideo<bool>(.appConfig, true),
|
||||||
viewerTapToNavigate<bool>(.appConfig, 'viewer.tapToNavigate', false),
|
viewerTapToNavigate<bool>(.appConfig, false),
|
||||||
|
|
||||||
// Network
|
// Network
|
||||||
networkAutoEndpointSwitching<bool>(.systemConfig, 'network.autoEndpointSwitching', false),
|
networkAutoEndpointSwitching<bool>(.systemConfig, false),
|
||||||
networkPreferredWifiName<String>(.systemConfig, 'network.preferredWifiName', ''),
|
networkPreferredWifiName<String>(.systemConfig, ''),
|
||||||
networkLocalEndpoint<String>(.systemConfig, 'network.localEndpoint', ''),
|
networkLocalEndpoint<String>(.systemConfig, ''),
|
||||||
networkExternalEndpointList<List<String>>(
|
networkExternalEndpointList<List<String>>(.systemConfig, [], _ListCodec(_PrimitiveCodec.string)),
|
||||||
.systemConfig,
|
|
||||||
'network.externalEndpointList',
|
|
||||||
[],
|
|
||||||
_ListCodec(_PrimitiveCodec.string),
|
|
||||||
),
|
|
||||||
networkCustomHeaders<Map<String, String>>(
|
networkCustomHeaders<Map<String, String>>(
|
||||||
.systemConfig,
|
.systemConfig,
|
||||||
'network.customHeaders',
|
|
||||||
{},
|
{},
|
||||||
_MapCodec(_PrimitiveCodec.string, _PrimitiveCodec.string),
|
_MapCodec(_PrimitiveCodec.string, _PrimitiveCodec.string),
|
||||||
),
|
),
|
||||||
|
|
||||||
// Album
|
// Album
|
||||||
albumSortMode<AlbumSortMode>(
|
albumSortMode<AlbumSortMode>(.appConfig, AlbumSortMode.mostRecent, _EnumCodec(AlbumSortMode.values)),
|
||||||
.appConfig,
|
albumIsReverse<bool>(.appConfig, true),
|
||||||
'album.sortMode',
|
albumIsGrid<bool>(.appConfig, false),
|
||||||
AlbumSortMode.mostRecent,
|
|
||||||
_EnumCodec(AlbumSortMode.values),
|
|
||||||
),
|
|
||||||
albumIsReverse<bool>(.appConfig, 'album.isReverse', true),
|
|
||||||
albumIsGrid<bool>(.appConfig, 'album.isGrid', false),
|
|
||||||
|
|
||||||
// Backup
|
// Backup
|
||||||
backupEnabled<bool>(.appConfig, 'backup.enabled', false),
|
backupEnabled<bool>(.appConfig, false),
|
||||||
backupUseCellularForVideos<bool>(.appConfig, 'backup.useCellularForVideos', false),
|
backupUseCellularForVideos<bool>(.appConfig, false),
|
||||||
backupUseCellularForPhotos<bool>(.appConfig, 'backup.useCellularForPhotos', false),
|
backupUseCellularForPhotos<bool>(.appConfig, false),
|
||||||
backupRequireCharging<bool>(.appConfig, 'backup.requireCharging', false),
|
backupRequireCharging<bool>(.appConfig, false),
|
||||||
backupTriggerDelay<int>(.appConfig, 'backup.triggerDelay', 30),
|
backupTriggerDelay<int>(.appConfig, 30),
|
||||||
backupSyncAlbums<bool>(.appConfig, 'backup.syncAlbums', false),
|
backupSyncAlbums<bool>(.appConfig, false),
|
||||||
|
|
||||||
// Timeline
|
// Timeline
|
||||||
timelineTilesPerRow<int>(.appConfig, 'timeline.tilesPerRow', 4),
|
timelineTilesPerRow<int>(.appConfig, 4),
|
||||||
timelineGroupAssetsBy<GroupAssetsBy>(
|
timelineGroupAssetsBy<GroupAssetsBy>(.appConfig, GroupAssetsBy.day, _EnumCodec(GroupAssetsBy.values)),
|
||||||
.appConfig,
|
timelineStorageIndicator<bool>(.appConfig, true),
|
||||||
'timeline.groupAssetsBy',
|
|
||||||
GroupAssetsBy.day,
|
|
||||||
_EnumCodec(GroupAssetsBy.values),
|
|
||||||
),
|
|
||||||
timelineStorageIndicator<bool>(.appConfig, 'timeline.storageIndicator', true),
|
|
||||||
|
|
||||||
// Log
|
// Log
|
||||||
logLevel<LogLevel>(.systemConfig, 'log.level', .info, _EnumCodec(LogLevel.values)),
|
logLevel<LogLevel>(.systemConfig, .info, _EnumCodec(LogLevel.values)),
|
||||||
|
|
||||||
// Map
|
// Map
|
||||||
mapShowFavoriteOnly<bool>(.appConfig, 'map.showFavoriteOnly', false),
|
mapShowFavoriteOnly<bool>(.appConfig, false),
|
||||||
mapRelativeDate<int>(.appConfig, 'map.relativeDate', 0),
|
mapRelativeDate<int>(.appConfig, 0),
|
||||||
mapIncludeArchived<bool>(.appConfig, 'map.includeArchived', false),
|
mapIncludeArchived<bool>(.appConfig, false),
|
||||||
mapThemeMode<ThemeMode>(.appConfig, 'map.themeMode', .system, _EnumCodec(ThemeMode.values)),
|
mapThemeMode<ThemeMode>(.appConfig, .system, _EnumCodec(ThemeMode.values)),
|
||||||
mapWithPartners<bool>(.appConfig, 'map.withPartners', false),
|
mapWithPartners<bool>(.appConfig, false),
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
cleanupKeepFavorites<bool>(.appConfig, 'cleanup.keepFavorites', true),
|
cleanupKeepFavorites<bool>(.appConfig, true),
|
||||||
cleanupKeepMediaType<AssetKeepType>(
|
cleanupKeepMediaType<AssetKeepType>(.appConfig, AssetKeepType.none, _EnumCodec(AssetKeepType.values)),
|
||||||
.appConfig,
|
cleanupKeepAlbumIds<List<String>>(.appConfig, [], _ListCodec(_PrimitiveCodec.string)),
|
||||||
'cleanup.keepMediaType',
|
cleanupCutoffDaysAgo<int>(.appConfig, -1),
|
||||||
AssetKeepType.none,
|
cleanupDefaultsInitialized<bool>(.appConfig, false),
|
||||||
_EnumCodec(AssetKeepType.values),
|
|
||||||
),
|
|
||||||
cleanupKeepAlbumIds<List<String>>(.appConfig, 'cleanup.keepAlbumIds', [], _ListCodec(_PrimitiveCodec.string)),
|
|
||||||
cleanupCutoffDaysAgo<int>(.appConfig, 'cleanup.cutoffDaysAgo', -1),
|
|
||||||
cleanupDefaultsInitialized<bool>(.appConfig, 'cleanup.defaultsInitialized', false),
|
|
||||||
|
|
||||||
// Slideshow
|
// Slideshow
|
||||||
slideshowTransition<bool>(.appConfig, 'slideshow.transition', true),
|
slideshowTransition<bool>(.appConfig, true),
|
||||||
slideshowRepeat<bool>(.appConfig, 'slideshow.repeat', true),
|
slideshowRepeat<bool>(.appConfig, true),
|
||||||
slideshowDuration<int>(.appConfig, 'slideshow.duration', 5),
|
slideshowDuration<int>(.appConfig, 5),
|
||||||
slideshowLook<SlideshowLook>(.appConfig, 'slideshow.look', SlideshowLook.contain, _EnumCodec(SlideshowLook.values)),
|
slideshowLook<SlideshowLook>(.appConfig, SlideshowLook.contain, _EnumCodec(SlideshowLook.values)),
|
||||||
slideshowDirection<SlideshowDirection>(
|
slideshowDirection<SlideshowDirection>(.appConfig, SlideshowDirection.forward, _EnumCodec(SlideshowDirection.values));
|
||||||
.appConfig,
|
|
||||||
'slideshow.direction',
|
|
||||||
SlideshowDirection.forward,
|
|
||||||
_EnumCodec(SlideshowDirection.values),
|
|
||||||
);
|
|
||||||
|
|
||||||
final MetadataDomain domain;
|
final MetadataDomain domain;
|
||||||
final String name;
|
|
||||||
final T defaultValue;
|
final T defaultValue;
|
||||||
final _MetadataCodec<T>? _codecOverride;
|
final _MetadataCodec<T>? _codecOverride;
|
||||||
|
|
||||||
const MetadataKey(this.domain, this.name, this.defaultValue, [this._codecOverride]);
|
const MetadataKey(this.domain, this.defaultValue, [this._codecOverride]);
|
||||||
|
|
||||||
String get key => '${domain.prefix}.$name';
|
String get key => '${domain.prefix}.$name';
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ class BackgroundWorkerFgService {
|
|||||||
_foregroundHostApi.saveNotificationMessage(title, body);
|
_foregroundHostApi.saveNotificationMessage(title, body);
|
||||||
|
|
||||||
Future<void> configure({int? minimumDelaySeconds, bool? requireCharging}) {
|
Future<void> configure({int? minimumDelaySeconds, bool? requireCharging}) {
|
||||||
final backup = MetadataRepository.instance.appConfig.backup;
|
final backup = MetadataStore.appConfig.backup;
|
||||||
return _foregroundHostApi.configure(
|
return _foregroundHostApi.configure(
|
||||||
BackgroundWorkerSettings(
|
BackgroundWorkerSettings(
|
||||||
minimumDelaySeconds: minimumDelaySeconds ?? backup.triggerDelay,
|
minimumDelaySeconds: minimumDelaySeconds ?? backup.triggerDelay,
|
||||||
@@ -69,7 +69,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
|
|||||||
BackgroundWorkerFlutterApi.setUp(this);
|
BackgroundWorkerFlutterApi.setUp(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool get _isBackupEnabled => MetadataRepository.instance.appConfig.backup.enabled;
|
bool get _isBackupEnabled => MetadataStore.appConfig.backup.enabled;
|
||||||
|
|
||||||
Future<void> init() async {
|
Future<void> init() async {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -6,12 +6,7 @@ import 'package:immich_mobile/extensions/string_extensions.dart';
|
|||||||
import 'package:immich_mobile/infrastructure/entities/metadata.entity.drift.dart';
|
import 'package:immich_mobile/infrastructure/entities/metadata.entity.drift.dart';
|
||||||
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
|
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
|
||||||
|
|
||||||
class MetadataRepository extends DriftDatabaseRepository {
|
abstract final class MetadataStore {
|
||||||
final Drift _db;
|
|
||||||
final Map<MetadataKey, Object> _cache = {};
|
|
||||||
|
|
||||||
MetadataRepository._(this._db) : super(_db);
|
|
||||||
|
|
||||||
static MetadataRepository? _instance;
|
static MetadataRepository? _instance;
|
||||||
|
|
||||||
static MetadataRepository get instance {
|
static MetadataRepository get instance {
|
||||||
@@ -22,26 +17,36 @@ class MetadataRepository extends DriftDatabaseRepository {
|
|||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
AppConfig _appConfig = const .new();
|
|
||||||
AppConfig get appConfig => _appConfig;
|
|
||||||
|
|
||||||
SystemConfig _systemConfig = const .new();
|
|
||||||
SystemConfig get systemConfig => _systemConfig;
|
|
||||||
|
|
||||||
static Future<MetadataRepository> ensureInitialized(Drift db) async {
|
static Future<MetadataRepository> ensureInitialized(Drift db) async {
|
||||||
if (_instance == null) {
|
if (_instance == null) {
|
||||||
final instance = MetadataRepository._(db);
|
final instance = MetadataRepository(db);
|
||||||
await instance._hydrate();
|
await instance._hydrate();
|
||||||
_instance = instance;
|
_instance = instance;
|
||||||
}
|
}
|
||||||
return _instance!;
|
return _instance!;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<void> refresh() async {
|
static AppConfig get appConfig => instance.appConfig;
|
||||||
instance._cache.clear();
|
static SystemConfig get systemConfig => instance.systemConfig;
|
||||||
instance._appConfig = const .new();
|
}
|
||||||
instance._systemConfig = const .new();
|
|
||||||
await instance._hydrate();
|
class MetadataRepository extends DriftDatabaseRepository {
|
||||||
|
final Drift _db;
|
||||||
|
final Map<MetadataKey, Object> _cache = {};
|
||||||
|
|
||||||
|
MetadataRepository(this._db) : super(_db);
|
||||||
|
|
||||||
|
AppConfig _appConfig = AppConfig.defaults();
|
||||||
|
AppConfig get appConfig => _appConfig;
|
||||||
|
|
||||||
|
SystemConfig _systemConfig = SystemConfig.defaults();
|
||||||
|
SystemConfig get systemConfig => _systemConfig;
|
||||||
|
|
||||||
|
Future<void> refresh() async {
|
||||||
|
_cache.clear();
|
||||||
|
_appConfig = AppConfig.defaults();
|
||||||
|
_systemConfig = SystemConfig.defaults();
|
||||||
|
await _hydrate();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _hydrate() async => _hydrateCache(await _db.select(_db.metadataEntity).get());
|
Future<void> _hydrate() async => _hydrateCache(await _db.select(_db.metadataEntity).get());
|
||||||
@@ -52,6 +57,9 @@ class MetadataRepository extends DriftDatabaseRepository {
|
|||||||
if (_read(key) == value) {
|
if (_read(key) == value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (value == key.defaultValue) {
|
||||||
|
return delete(key);
|
||||||
|
}
|
||||||
|
|
||||||
await _db
|
await _db
|
||||||
.into(_db.metadataEntity)
|
.into(_db.metadataEntity)
|
||||||
@@ -74,7 +82,10 @@ class MetadataRepository extends DriftDatabaseRepository {
|
|||||||
final query = _db.select(_db.metadataEntity)..where((t) => t.key.like('${domain.prefix}.%'));
|
final query = _db.select(_db.metadataEntity)..where((t) => t.key.like('${domain.prefix}.%'));
|
||||||
return query.watch().map((rows) {
|
return query.watch().map((rows) {
|
||||||
_hydrateCache(rows);
|
_hydrateCache(rows);
|
||||||
return domain.config(this);
|
return switch (domain) {
|
||||||
|
.appConfig => _appConfig as T,
|
||||||
|
.systemConfig => _systemConfig as T,
|
||||||
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,84 +105,74 @@ class MetadataRepository extends DriftDatabaseRepository {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_cache[key] = value;
|
_cache[key] = value;
|
||||||
key.domain.rebuild(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension<T extends Object> on MetadataDomain<T> {
|
switch (key.domain) {
|
||||||
T config(MetadataRepository repo) => switch (this) {
|
|
||||||
.appConfig => repo._appConfig as T,
|
|
||||||
.systemConfig => repo._systemConfig as T,
|
|
||||||
};
|
|
||||||
|
|
||||||
void rebuild(MetadataRepository repo) {
|
|
||||||
switch (this) {
|
|
||||||
case .appConfig:
|
case .appConfig:
|
||||||
repo._appConfig = .new(
|
_appConfig = _buildAppConfig();
|
||||||
theme: .new(
|
|
||||||
mode: repo._read(.themeMode),
|
|
||||||
primaryColor: repo._read(.themePrimaryColor),
|
|
||||||
dynamicTheme: repo._read(.themeDynamic),
|
|
||||||
colorfulInterface: repo._read(.themeColorfulInterface),
|
|
||||||
),
|
|
||||||
cleanup: .new(
|
|
||||||
keepFavorites: repo._read(.cleanupKeepFavorites),
|
|
||||||
keepMediaType: repo._read(.cleanupKeepMediaType),
|
|
||||||
keepAlbumIds: repo._read(.cleanupKeepAlbumIds),
|
|
||||||
cutoffDaysAgo: repo._read(.cleanupCutoffDaysAgo),
|
|
||||||
defaultsInitialized: repo._read(.cleanupDefaultsInitialized),
|
|
||||||
),
|
|
||||||
map: .new(
|
|
||||||
relativeDays: repo._read(.mapRelativeDate),
|
|
||||||
favoritesOnly: repo._read(.mapShowFavoriteOnly),
|
|
||||||
includeArchived: repo._read(.mapIncludeArchived),
|
|
||||||
themeMode: repo._read(.mapThemeMode),
|
|
||||||
withPartners: repo._read(.mapWithPartners),
|
|
||||||
),
|
|
||||||
timeline: .new(
|
|
||||||
tilesPerRow: repo._read(.timelineTilesPerRow),
|
|
||||||
groupAssetsBy: repo._read(.timelineGroupAssetsBy),
|
|
||||||
storageIndicator: repo._read(.timelineStorageIndicator),
|
|
||||||
),
|
|
||||||
image: .new(preferRemote: repo._read(.imagePreferRemote), loadOriginal: repo._read(.imageLoadOriginal)),
|
|
||||||
viewer: .new(
|
|
||||||
loopVideo: repo._read(.viewerLoopVideo),
|
|
||||||
loadOriginalVideo: repo._read(.viewerLoadOriginalVideo),
|
|
||||||
autoPlayVideo: repo._read(.viewerAutoPlayVideo),
|
|
||||||
tapToNavigate: repo._read(.viewerTapToNavigate),
|
|
||||||
),
|
|
||||||
slideshow: .new(
|
|
||||||
transition: repo._read(.slideshowTransition),
|
|
||||||
repeat: repo._read(.slideshowRepeat),
|
|
||||||
duration: repo._read(.slideshowDuration),
|
|
||||||
look: repo._read(.slideshowLook),
|
|
||||||
direction: repo._read(.slideshowDirection),
|
|
||||||
),
|
|
||||||
album: .new(
|
|
||||||
sortMode: repo._read(.albumSortMode),
|
|
||||||
isReverse: repo._read(.albumIsReverse),
|
|
||||||
isGrid: repo._read(.albumIsGrid),
|
|
||||||
),
|
|
||||||
backup: .new(
|
|
||||||
enabled: repo._read(.backupEnabled),
|
|
||||||
useCellularForVideos: repo._read(.backupUseCellularForVideos),
|
|
||||||
useCellularForPhotos: repo._read(.backupUseCellularForPhotos),
|
|
||||||
requireCharging: repo._read(.backupRequireCharging),
|
|
||||||
triggerDelay: repo._read(.backupTriggerDelay),
|
|
||||||
syncAlbums: repo._read(.backupSyncAlbums),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
case .systemConfig:
|
case .systemConfig:
|
||||||
repo._systemConfig = .new(
|
_systemConfig = _buildSystemConfig();
|
||||||
logLevel: repo._read(.logLevel),
|
|
||||||
network: .new(
|
|
||||||
autoEndpointSwitching: repo._read(.networkAutoEndpointSwitching),
|
|
||||||
preferredWifiName: repo._read(.networkPreferredWifiName).nullIfEmpty,
|
|
||||||
localEndpoint: repo._read(.networkLocalEndpoint).nullIfEmpty,
|
|
||||||
externalEndpointList: repo._read(.networkExternalEndpointList),
|
|
||||||
customHeaders: repo._read(.networkCustomHeaders),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AppConfig _buildAppConfig() => .new(
|
||||||
|
theme: .new(
|
||||||
|
mode: _read(.themeMode),
|
||||||
|
primaryColor: _read(.themePrimaryColor),
|
||||||
|
dynamicTheme: _read(.themeDynamic),
|
||||||
|
colorfulInterface: _read(.themeColorfulInterface),
|
||||||
|
),
|
||||||
|
cleanup: .new(
|
||||||
|
keepFavorites: _read(.cleanupKeepFavorites),
|
||||||
|
keepMediaType: _read(.cleanupKeepMediaType),
|
||||||
|
keepAlbumIds: _read(.cleanupKeepAlbumIds),
|
||||||
|
cutoffDaysAgo: _read(.cleanupCutoffDaysAgo),
|
||||||
|
defaultsInitialized: _read(.cleanupDefaultsInitialized),
|
||||||
|
),
|
||||||
|
map: .new(
|
||||||
|
relativeDays: _read(.mapRelativeDate),
|
||||||
|
favoritesOnly: _read(.mapShowFavoriteOnly),
|
||||||
|
includeArchived: _read(.mapIncludeArchived),
|
||||||
|
themeMode: _read(.mapThemeMode),
|
||||||
|
withPartners: _read(.mapWithPartners),
|
||||||
|
),
|
||||||
|
timeline: .new(
|
||||||
|
tilesPerRow: _read(.timelineTilesPerRow),
|
||||||
|
groupAssetsBy: _read(.timelineGroupAssetsBy),
|
||||||
|
storageIndicator: _read(.timelineStorageIndicator),
|
||||||
|
),
|
||||||
|
image: .new(preferRemote: _read(.imagePreferRemote), loadOriginal: _read(.imageLoadOriginal)),
|
||||||
|
viewer: .new(
|
||||||
|
loopVideo: _read(.viewerLoopVideo),
|
||||||
|
loadOriginalVideo: _read(.viewerLoadOriginalVideo),
|
||||||
|
autoPlayVideo: _read(.viewerAutoPlayVideo),
|
||||||
|
tapToNavigate: _read(.viewerTapToNavigate),
|
||||||
|
),
|
||||||
|
slideshow: .new(
|
||||||
|
transition: _read(.slideshowTransition),
|
||||||
|
repeat: _read(.slideshowRepeat),
|
||||||
|
duration: _read(.slideshowDuration),
|
||||||
|
look: _read(.slideshowLook),
|
||||||
|
direction: _read(.slideshowDirection),
|
||||||
|
),
|
||||||
|
album: .new(sortMode: _read(.albumSortMode), isReverse: _read(.albumIsReverse), isGrid: _read(.albumIsGrid)),
|
||||||
|
backup: .new(
|
||||||
|
enabled: _read(.backupEnabled),
|
||||||
|
useCellularForVideos: _read(.backupUseCellularForVideos),
|
||||||
|
useCellularForPhotos: _read(.backupUseCellularForPhotos),
|
||||||
|
requireCharging: _read(.backupRequireCharging),
|
||||||
|
triggerDelay: _read(.backupTriggerDelay),
|
||||||
|
syncAlbums: _read(.backupSyncAlbums),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
SystemConfig _buildSystemConfig() => .new(
|
||||||
|
logLevel: _read(.logLevel),
|
||||||
|
network: .new(
|
||||||
|
autoEndpointSwitching: _read(.networkAutoEndpointSwitching),
|
||||||
|
preferredWifiName: _read(.networkPreferredWifiName).nullIfEmpty,
|
||||||
|
localEndpoint: _read(.networkLocalEndpoint).nullIfEmpty,
|
||||||
|
externalEndpointList: _read(.networkExternalEndpointList),
|
||||||
|
customHeaders: _read(.networkCustomHeaders),
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ class _DriftBackupAlbumSelectionPageState extends ConsumerState<DriftBackupAlbum
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final isBackupEnabled = MetadataRepository.instance.appConfig.backup.enabled;
|
final isBackupEnabled = MetadataStore.appConfig.backup.enabled;
|
||||||
await ref.read(driftBackupProvider.notifier).getBackupStatus(user.id);
|
await ref.read(driftBackupProvider.notifier).getBackupStatus(user.id);
|
||||||
final currentTotalAssetCount = ref.read(driftBackupProvider.select((p) => p.totalCount));
|
final currentTotalAssetCount = ref.read(driftBackupProvider.select((p) => p.totalCount));
|
||||||
final totalChanged = currentTotalAssetCount != _initialTotalAssetCount;
|
final totalChanged = currentTotalAssetCount != _initialTotalAssetCount;
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class DriftBackupOptionsPage extends ConsumerWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await ref.read(driftBackupProvider.notifier).getBackupStatus(currentUser.id);
|
await ref.read(driftBackupProvider.notifier).getBackupStatus(currentUser.id);
|
||||||
final isBackupEnabled = MetadataRepository.instance.appConfig.backup.enabled;
|
final isBackupEnabled = MetadataStore.appConfig.backup.enabled;
|
||||||
if (!isBackupEnabled) {
|
if (!isBackupEnabled) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -341,7 +341,7 @@ class SplashScreenPageState extends ConsumerState<SplashScreenPage> {
|
|||||||
await backgroundManager.hashAssets();
|
await backgroundManager.hashAssets();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MetadataRepository.instance.appConfig.backup.syncAlbums) {
|
if (MetadataStore.appConfig.backup.syncAlbums) {
|
||||||
await backgroundManager.syncLinkedAlbum();
|
await backgroundManager.syncLinkedAlbum();
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -370,7 +370,7 @@ class SplashScreenPageState extends ConsumerState<SplashScreenPage> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _resumeBackup(DriftBackupNotifier notifier) async {
|
Future<void> _resumeBackup(DriftBackupNotifier notifier) async {
|
||||||
final isEnableBackup = MetadataRepository.instance.appConfig.backup.enabled;
|
final isEnableBackup = MetadataStore.appConfig.backup.enabled;
|
||||||
|
|
||||||
if (isEnableBackup) {
|
if (isEnableBackup) {
|
||||||
final currentUser = Store.tryGet(StoreKey.currentUser);
|
final currentUser = Store.tryGet(StoreKey.currentUser);
|
||||||
|
|||||||
Generated
-19
@@ -309,23 +309,4 @@ class NetworkApi {
|
|||||||
|
|
||||||
_extractReplyValueOrThrow(pigeonVar_replyList, pigeonVar_channelName, isNullValid: true);
|
_extractReplyValueOrThrow(pigeonVar_replyList, pigeonVar_channelName, isNullValid: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> getAppGroupId() async {
|
|
||||||
final pigeonVar_channelName =
|
|
||||||
'dev.flutter.pigeon.immich_mobile.NetworkApi.getAppGroupId$pigeonVar_messageChannelSuffix';
|
|
||||||
final pigeonVar_channel = BasicMessageChannel<Object?>(
|
|
||||||
pigeonVar_channelName,
|
|
||||||
pigeonChannelCodec,
|
|
||||||
binaryMessenger: pigeonVar_binaryMessenger,
|
|
||||||
);
|
|
||||||
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
|
|
||||||
final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;
|
|
||||||
|
|
||||||
final Object? pigeonVar_replyValue = _extractReplyValueOrThrow(
|
|
||||||
pigeonVar_replyList,
|
|
||||||
pigeonVar_channelName,
|
|
||||||
isNullValid: false,
|
|
||||||
);
|
|
||||||
return pigeonVar_replyValue! as String;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ import 'package:immich_mobile/extensions/platform_extensions.dart';
|
|||||||
import 'package:immich_mobile/infrastructure/repositories/storage.repository.dart';
|
import 'package:immich_mobile/infrastructure/repositories/storage.repository.dart';
|
||||||
import 'package:immich_mobile/providers/asset_viewer/asset_viewer.provider.dart';
|
import 'package:immich_mobile/providers/asset_viewer/asset_viewer.provider.dart';
|
||||||
import 'package:immich_mobile/providers/asset_viewer/is_motion_video_playing.provider.dart';
|
import 'package:immich_mobile/providers/asset_viewer/is_motion_video_playing.provider.dart';
|
||||||
|
import 'package:immich_mobile/providers/infrastructure/metadata.provider.dart';
|
||||||
import 'package:immich_mobile/providers/asset_viewer/video_player_provider.dart';
|
import 'package:immich_mobile/providers/asset_viewer/video_player_provider.dart';
|
||||||
import 'package:immich_mobile/providers/cast.provider.dart';
|
import 'package:immich_mobile/providers/cast.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/metadata.provider.dart';
|
|
||||||
import 'package:immich_mobile/services/api.service.dart';
|
import 'package:immich_mobile/services/api.service.dart';
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
import 'package:native_video_player/native_video_player.dart';
|
import 'package:native_video_player/native_video_player.dart';
|
||||||
|
|||||||
@@ -188,6 +188,4 @@ ImageProvider? getThumbnailImageProvider(BaseAsset asset, {Size size = kThumbnai
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool _shouldUseLocalAsset(BaseAsset asset) =>
|
bool _shouldUseLocalAsset(BaseAsset asset) =>
|
||||||
asset.hasLocal &&
|
asset.hasLocal && (!asset.hasRemote || !MetadataStore.appConfig.image.preferRemote) && !asset.isEdited;
|
||||||
(!asset.hasRemote || !MetadataRepository.instance.appConfig.image.preferRemote) &&
|
|
||||||
!asset.isEdited;
|
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ class LocalFullImageProvider extends CancellableImageProvider<LocalFullImageProv
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final loadOriginal = MetadataRepository.instance.appConfig.image.loadOriginal;
|
final loadOriginal = MetadataStore.appConfig.image.loadOriginal;
|
||||||
final devicePixelRatio = PlatformDispatcher.instance.views.first.devicePixelRatio;
|
final devicePixelRatio = PlatformDispatcher.instance.views.first.devicePixelRatio;
|
||||||
var request = this.request = LocalImageRequest(
|
var request = this.request = LocalImageRequest(
|
||||||
localId: key.id,
|
localId: key.id,
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ class RemoteFullImageProvider extends CancellableImageProvider<RemoteFullImagePr
|
|||||||
edited: key.edited,
|
edited: key.edited,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
final loadOriginal = assetType == AssetType.image && MetadataRepository.instance.appConfig.image.loadOriginal;
|
final loadOriginal = assetType == AssetType.image && MetadataStore.appConfig.image.loadOriginal;
|
||||||
yield* loadRequest(previewRequest, decode, isFinal: !loadOriginal);
|
yield* loadRequest(previewRequest, decode, isFinal: !loadOriginal);
|
||||||
|
|
||||||
if (!loadOriginal) {
|
if (!loadOriginal) {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import 'package:immich_mobile/domain/models/store.model.dart';
|
|||||||
import 'package:immich_mobile/domain/models/user.model.dart';
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/domain/services/user.service.dart';
|
import 'package:immich_mobile/domain/services/user.service.dart';
|
||||||
import 'package:immich_mobile/entities/store.entity.dart';
|
import 'package:immich_mobile/entities/store.entity.dart';
|
||||||
|
import 'package:immich_mobile/infrastructure/repositories/metadata.repository.dart';
|
||||||
import 'package:immich_mobile/models/auth/auth_state.model.dart';
|
import 'package:immich_mobile/models/auth/auth_state.model.dart';
|
||||||
import 'package:immich_mobile/models/auth/login_response.model.dart';
|
import 'package:immich_mobile/models/auth/login_response.model.dart';
|
||||||
import 'package:immich_mobile/providers/api.provider.dart';
|
import 'package:immich_mobile/providers/api.provider.dart';
|
||||||
@@ -130,7 +131,7 @@ class AuthNotifier extends StateNotifier<AuthState> {
|
|||||||
await _apiService.updateHeaders();
|
await _apiService.updateHeaders();
|
||||||
|
|
||||||
final serverEndpoint = Store.get(StoreKey.serverEndpoint);
|
final serverEndpoint = Store.get(StoreKey.serverEndpoint);
|
||||||
final headerMap = _ref.read(metadataProvider).systemConfig.network.customHeaders;
|
final headerMap = MetadataStore.systemConfig.network.customHeaders;
|
||||||
final customHeaders = headerMap.isEmpty ? null : jsonEncode(headerMap);
|
final customHeaders = headerMap.isEmpty ? null : jsonEncode(headerMap);
|
||||||
await _widgetService.writeCredentials(serverEndpoint, accessToken, customHeaders);
|
await _widgetService.writeCredentials(serverEndpoint, accessToken, customHeaders);
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import 'package:immich_mobile/domain/models/config/app_config.dart';
|
|||||||
import 'package:immich_mobile/domain/models/config/system_config.dart';
|
import 'package:immich_mobile/domain/models/config/system_config.dart';
|
||||||
import 'package:immich_mobile/infrastructure/repositories/metadata.repository.dart';
|
import 'package:immich_mobile/infrastructure/repositories/metadata.repository.dart';
|
||||||
|
|
||||||
final metadataProvider = Provider.autoDispose<MetadataRepository>((_) => MetadataRepository.instance);
|
final metadataProvider = Provider.autoDispose<MetadataRepository>((_) => MetadataStore.instance);
|
||||||
|
|
||||||
final appConfigProvider = Provider.autoDispose<AppConfig>((ref) {
|
final appConfigProvider = Provider.autoDispose<AppConfig>((ref) {
|
||||||
final repo = ref.watch(metadataProvider);
|
final repo = ref.watch(metadataProvider);
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import 'package:home_widget/home_widget.dart';
|
import 'package:home_widget/home_widget.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/platform.provider.dart';
|
|
||||||
|
|
||||||
final widgetRepositoryProvider = Provider((_) => const WidgetRepository());
|
final widgetRepositoryProvider = Provider((_) => const WidgetRepository());
|
||||||
|
|
||||||
@@ -15,7 +14,7 @@ class WidgetRepository {
|
|||||||
await HomeWidget.updateWidget(iOSName: iosName, qualifiedAndroidName: androidName);
|
await HomeWidget.updateWidget(iOSName: iosName, qualifiedAndroidName: androidName);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> setAppGroupId() async {
|
Future<void> setAppGroupId(String appGroupId) async {
|
||||||
await HomeWidget.setAppGroupId(await networkApi.getAppGroupId());
|
await HomeWidget.setAppGroupId(appGroupId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ class ApiService {
|
|||||||
if (serverEndpoint != null && serverEndpoint.isNotEmpty) {
|
if (serverEndpoint != null && serverEndpoint.isNotEmpty) {
|
||||||
urls.add(serverEndpoint);
|
urls.add(serverEndpoint);
|
||||||
}
|
}
|
||||||
final network = MetadataRepository.instance.systemConfig.network;
|
final network = MetadataStore.systemConfig.network;
|
||||||
final localEndpoint = network.localEndpoint;
|
final localEndpoint = network.localEndpoint;
|
||||||
if (localEndpoint != null) {
|
if (localEndpoint != null) {
|
||||||
urls.add(localEndpoint);
|
urls.add(localEndpoint);
|
||||||
@@ -191,7 +191,7 @@ class ApiService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static Map<String, String> getRequestHeaders() {
|
static Map<String, String> getRequestHeaders() {
|
||||||
return MetadataRepository.instance.systemConfig.network.customHeaders;
|
return MetadataStore.systemConfig.network.customHeaders;
|
||||||
}
|
}
|
||||||
|
|
||||||
ApiClient get apiClient => _apiClient;
|
ApiClient get apiClient => _apiClient;
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ class AuthService {
|
|||||||
_log.severe("Error clearing local data", error, stackTrace);
|
_log.severe("Error clearing local data", error, stackTrace);
|
||||||
});
|
});
|
||||||
|
|
||||||
await MetadataRepository.instance.write(MetadataKey.backupEnabled, false);
|
await MetadataStore.instance.write(MetadataKey.backupEnabled, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -359,7 +359,7 @@ class BackgroundUploadService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool _shouldRequireWiFi(LocalAsset asset) {
|
bool _shouldRequireWiFi(LocalAsset asset) {
|
||||||
final backup = MetadataRepository.instance.appConfig.backup;
|
final backup = MetadataStore.appConfig.backup;
|
||||||
if (asset.isVideo && backup.useCellularForVideos) {
|
if (asset.isVideo && backup.useCellularForVideos) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -451,7 +451,7 @@ class ForegroundUploadService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool _shouldRequireWiFi(LocalAsset asset) {
|
bool _shouldRequireWiFi(LocalAsset asset) {
|
||||||
final backup = MetadataRepository.instance.appConfig.backup;
|
final backup = MetadataStore.appConfig.backup;
|
||||||
if (asset.isVideo && backup.useCellularForVideos) {
|
if (asset.isVideo && backup.useCellularForVideos) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ class WidgetService {
|
|||||||
const WidgetService(this._repository);
|
const WidgetService(this._repository);
|
||||||
|
|
||||||
Future<void> writeCredentials(String serverURL, String sessionKey, String? customHeaders) async {
|
Future<void> writeCredentials(String serverURL, String sessionKey, String? customHeaders) async {
|
||||||
await _repository.setAppGroupId();
|
await _repository.setAppGroupId(appShareGroupId);
|
||||||
await _repository.saveData(kWidgetServerEndpoint, serverURL);
|
await _repository.saveData(kWidgetServerEndpoint, serverURL);
|
||||||
await _repository.saveData(kWidgetAuthToken, sessionKey);
|
await _repository.saveData(kWidgetAuthToken, sessionKey);
|
||||||
|
|
||||||
@@ -25,7 +25,7 @@ class WidgetService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> clearCredentials() async {
|
Future<void> clearCredentials() async {
|
||||||
await _repository.setAppGroupId();
|
await _repository.setAppGroupId(appShareGroupId);
|
||||||
await _repository.saveData(kWidgetServerEndpoint, "");
|
await _repository.saveData(kWidgetServerEndpoint, "");
|
||||||
await _repository.saveData(kWidgetAuthToken, "");
|
await _repository.saveData(kWidgetAuthToken, "");
|
||||||
await _repository.saveData(kWidgetCustomHeaders, "");
|
await _repository.saveData(kWidgetCustomHeaders, "");
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ abstract final class Bootstrap {
|
|||||||
|
|
||||||
await StoreService.init(storeRepository: storeRepo, listenUpdates: listenStoreUpdates);
|
await StoreService.init(storeRepository: storeRepo, listenUpdates: listenStoreUpdates);
|
||||||
|
|
||||||
final metadataRepo = await MetadataRepository.ensureInitialized(drift);
|
final metadataRepo = await MetadataStore.ensureInitialized(drift);
|
||||||
|
|
||||||
await LogService.init(
|
await LogService.init(
|
||||||
logRepository: LogRepository(logDb),
|
logRepository: LogRepository(logDb),
|
||||||
|
|||||||
@@ -267,6 +267,9 @@ class _StoreMigrator {
|
|||||||
Future<void> complete() async {
|
Future<void> complete() async {
|
||||||
await _db.batch((batch) {
|
await _db.batch((batch) {
|
||||||
for (final entry in _cache.entries) {
|
for (final entry in _cache.entries) {
|
||||||
|
if (entry.value == entry.key.defaultValue) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
batch.insert(
|
batch.insert(
|
||||||
_db.metadataEntity,
|
_db.metadataEntity,
|
||||||
MetadataEntityCompanion(key: Value(entry.key.key), value: Value(entry.key.encode(entry.value))),
|
MetadataEntityCompanion(key: Value(entry.key.key), value: Value(entry.key.encode(entry.value))),
|
||||||
|
|||||||
@@ -187,7 +187,7 @@ class LoginForm extends HookConsumerWidget {
|
|||||||
await backgroundManager.syncRemote();
|
await backgroundManager.syncRemote();
|
||||||
await backgroundManager.hashAssets();
|
await backgroundManager.hashAssets();
|
||||||
|
|
||||||
if (MetadataRepository.instance.appConfig.backup.syncAlbums) {
|
if (MetadataStore.appConfig.backup.syncAlbums) {
|
||||||
await backgroundManager.syncLinkedAlbum();
|
await backgroundManager.syncLinkedAlbum();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-8
@@ -1,26 +1,26 @@
|
|||||||
.PHONY: build watch create_app_icon create_splash build_release_android pigeon test analyze format migration translation
|
.PHONY: build watch create_app_icon create_splash build_release_android pigeon test analyze format migration translation
|
||||||
|
|
||||||
build:
|
build:
|
||||||
@printf "This command has been removed. Please use:\n\n mise codegen # or mise //mobile:codegen:dart from another directory\n\n" >&2 && exit 1
|
@printf "This command has been removed. Please use:\n\n mise codegen # or mise //:mobile:codegen:dart from another directory\n\n" >&2 && exit 1
|
||||||
|
|
||||||
pigeon:
|
pigeon:
|
||||||
@printf "This command has been removed. Please use:\n\n mise pigeon # or mise //mobile:codegen:pigeon from another directory\n\n" >&2 && exit 1
|
@printf "This command has been removed. Please use:\n\n mise pigeon # or mise //:mobile:codegen:pigeon from another directory\n\n" >&2 && exit 1
|
||||||
|
|
||||||
|
|
||||||
build_release_android:
|
build_release_android:
|
||||||
@printf "This command has been removed. Please use:\n\n mise run build:android # or mise //mobile:build:android from another directory\n\n" >&2 && exit 1
|
@printf "This command has been removed. Please use:\n\n mise run build:android # or mise //:mobile:build:android from another directory\n\n" >&2 && exit 1
|
||||||
|
|
||||||
migration:
|
migration:
|
||||||
@printf "This command has been removed. Please use:\n\n mise migration # or mise //mobile:drift:migration from another directory\n\n" >&2 && exit 1
|
@printf "This command has been removed. Please use:\n\n mise migration # or mise //:mobile:drift:migration from another directory\n\n" >&2 && exit 1
|
||||||
|
|
||||||
translation:
|
translation:
|
||||||
@printf "This command has been removed. Please use:\n\n mise translation # or mise //mobile:codegen:translation from another directory\n\n" >&2 && exit 1
|
@printf "This command has been removed. Please use:\n\n mise translation # or mise //:mobile:codegen:translation from another directory\n\n" >&2 && exit 1
|
||||||
|
|
||||||
analyze:
|
analyze:
|
||||||
@printf "This command has been removed. Please use:\n\n mise analyze # or mise //mobile:lint from another directory\n\n" >&2 && exit 1
|
@printf "This command has been removed. Please use:\n\n mise analyze # or mise //:mobile:lint from another directory\n\n" >&2 && exit 1
|
||||||
|
|
||||||
format:
|
format:
|
||||||
@printf "This command has been removed. Please use:\n\n mise format # or mise //mobile:format from another directory\n\n" >&2 && exit 1
|
@printf "This command has been removed. Please use:\n\n mise format # or mise //:mobile:format from another directory\n\n" >&2 && exit 1
|
||||||
|
|
||||||
test:
|
test:
|
||||||
@printf "This command has been removed. Please use:\n\n mise test # or mise //mobile:test from another directory\n\n" >&2 && exit 1
|
@printf "This command has been removed. Please use:\n\n mise test # or mise //:mobile:test from another directory\n\n" >&2 && exit 1
|
||||||
|
|||||||
@@ -5,10 +5,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: async
|
name: async
|
||||||
sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37
|
sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.13.1"
|
version: "2.13.0"
|
||||||
boolean_selector:
|
boolean_selector:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -103,10 +103,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: meta
|
name: meta
|
||||||
sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349"
|
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.18.0"
|
version: "1.17.0"
|
||||||
path:
|
path:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -124,10 +124,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: source_span
|
name: source_span
|
||||||
sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab"
|
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.10.2"
|
version: "1.10.1"
|
||||||
stack_trace:
|
stack_trace:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -164,10 +164,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e"
|
sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.11"
|
version: "0.7.10"
|
||||||
vector_math:
|
vector_math:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -180,10 +180,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vm_service
|
name: vm_service
|
||||||
sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360"
|
sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "15.2.0"
|
version: "15.0.2"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=3.11.0 <4.0.0"
|
dart: ">=3.11.0 <4.0.0"
|
||||||
flutter: ">=3.18.0-18.0.pre.54"
|
flutter: ">=3.18.0-18.0.pre.54"
|
||||||
|
|||||||
@@ -5,10 +5,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: async
|
name: async
|
||||||
sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37
|
sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.13.1"
|
version: "2.13.0"
|
||||||
boolean_selector:
|
boolean_selector:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -77,10 +77,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: ffi
|
name: ffi
|
||||||
sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45"
|
sha256: d07d37192dbf97461359c1518788f203b0c9102cfd2c35a716b823741219542c
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.0"
|
version: "2.1.5"
|
||||||
file:
|
file:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -124,10 +124,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: go_router
|
name: go_router
|
||||||
sha256: "92d8cee7c57dff0a6c409c05597b460002434eccf7424a712283225b3962d03f"
|
sha256: "5540e4a3f416dd4a93458257b908eb88353cbd0fb5b0a3d1bd7d849ba1e88735"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "17.2.3"
|
version: "17.2.1"
|
||||||
immich_ui:
|
immich_ui:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -211,10 +211,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: meta
|
name: meta
|
||||||
sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349"
|
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.18.0"
|
version: "1.17.0"
|
||||||
path:
|
path:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -248,10 +248,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: source_span
|
name: source_span
|
||||||
sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab"
|
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.10.2"
|
version: "1.10.1"
|
||||||
stack_trace:
|
stack_trace:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -312,10 +312,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e"
|
sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.11"
|
version: "0.7.10"
|
||||||
typed_data:
|
typed_data:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -328,10 +328,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: uuid
|
name: uuid
|
||||||
sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489"
|
sha256: a11b666489b1954e01d992f3d601b1804a33937b5a8fe677bd26b8a9f96f96e8
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.5.3"
|
version: "4.5.2"
|
||||||
vector_math:
|
vector_math:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -344,10 +344,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vm_service
|
name: vm_service
|
||||||
sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360"
|
sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "15.2.0"
|
version: "15.0.2"
|
||||||
web:
|
web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -44,6 +44,4 @@ abstract class NetworkApi {
|
|||||||
int getClientPointer();
|
int getClientPointer();
|
||||||
|
|
||||||
void setRequestHeaders(Map<String, String> headers, List<String> serverUrls, String? token);
|
void setRequestHeaders(Map<String, String> headers, List<String> serverUrls, String? token);
|
||||||
|
|
||||||
String getAppGroupId();
|
|
||||||
}
|
}
|
||||||
|
|||||||
+36
-44
@@ -133,10 +133,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: build
|
name: build
|
||||||
sha256: a156715e7cd728130c592f30552575908aae5b100005fbc1f0fb16b3c03a3d10
|
sha256: aadd943f4f8cc946882c954c187e6115a84c98c81ad1d9c6cbf0895a8c85da9c
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.6"
|
version: "4.0.5"
|
||||||
build_config:
|
build_config:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -157,10 +157,10 @@ packages:
|
|||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: build_runner
|
name: build_runner
|
||||||
sha256: "1523ce62448ebac2c15a8ba5fbad8acac169788658a7dd2a1c2d9c2a9318b9a6"
|
sha256: "521daf8d189deb79ba474e43a696b41c49fb3987818dbacf3308f1e03673a75e"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.15.0"
|
version: "2.13.1"
|
||||||
built_collection:
|
built_collection:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -173,10 +173,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: built_value
|
name: built_value
|
||||||
sha256: "34e4067d30ce212937df995f03b69992eea683539ceeac7f679a1f1eba055b56"
|
sha256: "0730c18c770d05636a8f945c32a4d7d81cb6e0f0148c8db4ad12e7748f7e49af"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "8.12.6"
|
version: "8.12.5"
|
||||||
cast:
|
cast:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -358,18 +358,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: drift
|
name: drift
|
||||||
sha256: "8033500116b24398fba0cca0369cc31678cd627c01e41753a61186911cea743e"
|
sha256: "055c249d1f91be5a47fe447f88afc24c4ca6f4cd6c5ed66767b4797d48acc2e5"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.33.0"
|
version: "2.32.1"
|
||||||
drift_dev:
|
drift_dev:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: drift_dev
|
name: drift_dev
|
||||||
sha256: b3dd5b75e30522a91da8abda9f5bb17230cb038097f6d15fa75d42bb563428aa
|
sha256: "88a9de3af8571518148a6d8a513b57779fd1e60a026d3ab8a481a878fba01d91"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.33.0"
|
version: "2.32.1"
|
||||||
drift_flutter:
|
drift_flutter:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -613,10 +613,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_svg
|
name: flutter_svg
|
||||||
sha256: "35882981abcbfb8c15b286f0cd690ff25bac12d95eff3e25ee207f37d4c42e7f"
|
sha256: "1ded017b39c8e15c8948ea855070a5ff8ff8b3d5e83f3446e02d6bb12add7ad9"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.0"
|
version: "2.2.4"
|
||||||
flutter_test:
|
flutter_test:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description: flutter
|
description: flutter
|
||||||
@@ -772,10 +772,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: hooks
|
name: hooks
|
||||||
sha256: "025f060e86d2d4c3c47b56e33caf7f93bf9283340f26d23424ebcfccf34f621e"
|
sha256: e79ed1e8e1929bc6ecb6ec85f0cb519c887aa5b423705ded0d0f2d9226def388
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.3"
|
version: "1.0.2"
|
||||||
hooks_riverpod:
|
hooks_riverpod:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -844,18 +844,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: image_picker
|
name: image_picker
|
||||||
sha256: "91c025426c2881c551100bce834e201c835a170151545f58d17da5180ca7d9ac"
|
sha256: "784210112be18ea55f69d7076e2c656a4e24949fa9e76429fe53af0c0f4fa320"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.2"
|
version: "1.2.1"
|
||||||
image_picker_android:
|
image_picker_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: image_picker_android
|
name: image_picker_android
|
||||||
sha256: d5b3e1774af29c9ab00103afb0d4614070f924d2e0057ac867ec98800114793f
|
sha256: "66810af8e99b2657ee98e5c6f02064f69bb63f7a70e343937f70946c5f8c6622"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.8.13+17"
|
version: "0.8.13+16"
|
||||||
image_picker_for_web:
|
image_picker_for_web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -952,10 +952,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: json_annotation
|
name: json_annotation
|
||||||
sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80"
|
sha256: cb09e7dac6210041fad964ed7fbee004f14258b4eca4040f72d1234062ace4c8
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.12.0"
|
version: "4.11.0"
|
||||||
leak_tracker:
|
leak_tracker:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -984,10 +984,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: lean_builder
|
name: lean_builder
|
||||||
sha256: c16e95ddf7b2d49dd551357b7212fe2ce9f13ec7ad1b1e660c157184031e96c0
|
sha256: ee4117b03e93a4eb83e1a78c8e7a1dc22188d43bb142309982be48673a1b3a53
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.10"
|
version: "0.1.7"
|
||||||
lints:
|
lints:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1429,14 +1429,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.1.0"
|
version: "4.1.0"
|
||||||
record_use:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: record_use
|
|
||||||
sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "0.6.0"
|
|
||||||
riverpod:
|
riverpod:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1615,10 +1607,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: source_gen
|
name: source_gen
|
||||||
sha256: ec37cc0e6694374cbef59ed79685572c870a54ede6fa30a3e420feb3adffea02
|
sha256: "732792cfd197d2161a65bb029606a46e0a18ff30ef9e141a7a82172b05ea8ecd"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.2.3"
|
version: "4.2.2"
|
||||||
source_span:
|
source_span:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1655,10 +1647,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: sqlparser
|
name: sqlparser
|
||||||
sha256: ecdc06d4a7d79dcbc928d99afd2f7f5b0f98a637c46f89be83d911617f759978
|
sha256: ab2b467425f1d4f3acfa5fd11a08226f7d6c26ff102c06be1807e1dff34e050b
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.44.4"
|
version: "0.44.3"
|
||||||
stack_trace:
|
stack_trace:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1815,10 +1807,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_web
|
name: url_launcher_web
|
||||||
sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34"
|
sha256: d0412fcf4c6b31ecfdb7762359b7206ffba3bbffd396c6d9f9c4616ece476c1f
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.3"
|
version: "2.4.2"
|
||||||
url_launcher_windows:
|
url_launcher_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1839,10 +1831,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vector_graphics
|
name: vector_graphics
|
||||||
sha256: "2306c03da2ba81724afeb589c351ebbc0aa7d86005925be8f8735856dbe5e42d"
|
sha256: "81da85e9ca8885ade47f9685b953cb098970d11be4821ac765580a6607ea4373"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.2"
|
version: "1.1.21"
|
||||||
vector_graphics_codec:
|
vector_graphics_codec:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1855,10 +1847,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vector_graphics_compiler
|
name: vector_graphics_compiler
|
||||||
sha256: b9b3f391857781aa96acacef96066f2f49b4cd03cf9fce3ca4d8da2ef5ea129e
|
sha256: "5a88dd14c0954a5398af544651c7fb51b457a2a556949bfb25369b210ef73a74"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.3"
|
version: "1.2.0"
|
||||||
vector_math:
|
vector_math:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1871,10 +1863,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vm_service
|
name: vm_service
|
||||||
sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360"
|
sha256: "046d3928e16fa4dc46e8350415661755ab759d9fc97fc21b5ab295f71e4f0499"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "15.2.0"
|
version: "15.1.0"
|
||||||
wakelock_plus:
|
wakelock_plus:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -1887,10 +1879,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: wakelock_plus_platform_interface
|
name: wakelock_plus_platform_interface
|
||||||
sha256: b13f99e992e7ae6a152e16c5559d3c07ff445b13330192662494e614ca3e7d7b
|
sha256: "14b2e5b9e35c2631e656913c47adecdd71633ae92896a27a64c8f1fcfabc21cc"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.5.1"
|
version: "1.5.0"
|
||||||
watcher:
|
watcher:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -39,7 +39,9 @@ void main() {
|
|||||||
registerFallbackValue(LogLevel.info);
|
registerFallbackValue(LogLevel.info);
|
||||||
|
|
||||||
when(() => mockLogRepo.truncate(limit: any(named: 'limit'))).thenAnswer((_) async => {});
|
when(() => mockLogRepo.truncate(limit: any(named: 'limit'))).thenAnswer((_) async => {});
|
||||||
when(() => mockMetadataRepository.systemConfig).thenReturn(const SystemConfig(logLevel: LogLevel.fine));
|
when(
|
||||||
|
() => mockMetadataRepository.systemConfig,
|
||||||
|
).thenReturn(SystemConfig(logLevel: LogLevel.fine, network: .defaults()));
|
||||||
when(() => mockMetadataRepository.write<LogLevel, LogLevel>(MetadataKey.logLevel, any())).thenAnswer((_) async {});
|
when(() => mockMetadataRepository.write<LogLevel, LogLevel>(MetadataKey.logLevel, any())).thenAnswer((_) async {});
|
||||||
when(() => mockLogRepo.getAll()).thenAnswer((_) async => []);
|
when(() => mockLogRepo.getAll()).thenAnswer((_) async => []);
|
||||||
when(() => mockLogRepo.insert(any())).thenAnswer((_) async => true);
|
when(() => mockLogRepo.insert(any())).thenAnswer((_) async => true);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ void main() {
|
|||||||
|
|
||||||
setUpAll(() async {
|
setUpAll(() async {
|
||||||
ctx = MediumRepositoryContext();
|
ctx = MediumRepositoryContext();
|
||||||
sut = await MetadataRepository.ensureInitialized(ctx.db);
|
sut = MetadataRepository(ctx.db);
|
||||||
});
|
});
|
||||||
|
|
||||||
tearDownAll(() async {
|
tearDownAll(() async {
|
||||||
@@ -23,7 +23,7 @@ void main() {
|
|||||||
|
|
||||||
setUp(() async {
|
setUp(() async {
|
||||||
await ctx.db.delete(ctx.db.metadataEntity).go();
|
await ctx.db.delete(ctx.db.metadataEntity).go();
|
||||||
await MetadataRepository.refresh();
|
await sut.refresh();
|
||||||
});
|
});
|
||||||
|
|
||||||
group('defaults', () {
|
group('defaults', () {
|
||||||
@@ -78,7 +78,7 @@ void main() {
|
|||||||
// Cache hasn't seen this row yet — view still returns the default.
|
// Cache hasn't seen this row yet — view still returns the default.
|
||||||
expect(sut.appConfig.theme.mode, ThemeMode.system);
|
expect(sut.appConfig.theme.mode, ThemeMode.system);
|
||||||
|
|
||||||
await MetadataRepository.refresh();
|
await sut.refresh();
|
||||||
expect(sut.appConfig.theme.mode, ThemeMode.dark);
|
expect(sut.appConfig.theme.mode, ThemeMode.dark);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -88,7 +88,7 @@ void main() {
|
|||||||
await ctx.db.delete(ctx.db.metadataEntity).go();
|
await ctx.db.delete(ctx.db.metadataEntity).go();
|
||||||
expect(sut.appConfig.theme.mode, ThemeMode.dark);
|
expect(sut.appConfig.theme.mode, ThemeMode.dark);
|
||||||
|
|
||||||
await MetadataRepository.refresh();
|
await sut.refresh();
|
||||||
expect(sut.appConfig.theme.mode, ThemeMode.system);
|
expect(sut.appConfig.theme.mode, ThemeMode.system);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -103,7 +103,7 @@ void main() {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
await MetadataRepository.refresh();
|
await sut.refresh();
|
||||||
expect(sut.appConfig.theme.mode, ThemeMode.system);
|
expect(sut.appConfig.theme.mode, ThemeMode.system);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ void main() {
|
|||||||
);
|
);
|
||||||
db = Drift(DatabaseConnection(NativeDatabase.memory(), closeStreamsSynchronously: true));
|
db = Drift(DatabaseConnection(NativeDatabase.memory(), closeStreamsSynchronously: true));
|
||||||
await StoreService.init(storeRepository: DriftStoreRepository(db));
|
await StoreService.init(storeRepository: DriftStoreRepository(db));
|
||||||
await MetadataRepository.ensureInitialized(db);
|
await MetadataStore.ensureInitialized(db);
|
||||||
|
|
||||||
await Store.put(StoreKey.serverEndpoint, 'http://test-server.com');
|
await Store.put(StoreKey.serverEndpoint, 'http://test-server.com');
|
||||||
await Store.put(StoreKey.deviceId, 'test-device-id');
|
await Store.put(StoreKey.deviceId, 'test-device-id');
|
||||||
|
|||||||
@@ -11,6 +11,9 @@
|
|||||||
"required": true,
|
"required": true,
|
||||||
"in": "query",
|
"in": "query",
|
||||||
"description": "Album ID",
|
"description": "Album ID",
|
||||||
|
"x-nestjs_zod-parent-metadata": {
|
||||||
|
"description": "Activity search"
|
||||||
|
},
|
||||||
"schema": {
|
"schema": {
|
||||||
"format": "uuid",
|
"format": "uuid",
|
||||||
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
|
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
|
||||||
@@ -22,6 +25,9 @@
|
|||||||
"required": false,
|
"required": false,
|
||||||
"in": "query",
|
"in": "query",
|
||||||
"description": "Asset ID (if activity is for an asset)",
|
"description": "Asset ID (if activity is for an asset)",
|
||||||
|
"x-nestjs_zod-parent-metadata": {
|
||||||
|
"description": "Activity search"
|
||||||
|
},
|
||||||
"schema": {
|
"schema": {
|
||||||
"format": "uuid",
|
"format": "uuid",
|
||||||
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
|
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
|
||||||
@@ -32,6 +38,9 @@
|
|||||||
"name": "level",
|
"name": "level",
|
||||||
"required": false,
|
"required": false,
|
||||||
"in": "query",
|
"in": "query",
|
||||||
|
"x-nestjs_zod-parent-metadata": {
|
||||||
|
"description": "Activity search"
|
||||||
|
},
|
||||||
"schema": {
|
"schema": {
|
||||||
"$ref": "#/components/schemas/ReactionLevel"
|
"$ref": "#/components/schemas/ReactionLevel"
|
||||||
}
|
}
|
||||||
@@ -40,6 +49,9 @@
|
|||||||
"name": "type",
|
"name": "type",
|
||||||
"required": false,
|
"required": false,
|
||||||
"in": "query",
|
"in": "query",
|
||||||
|
"x-nestjs_zod-parent-metadata": {
|
||||||
|
"description": "Activity search"
|
||||||
|
},
|
||||||
"schema": {
|
"schema": {
|
||||||
"$ref": "#/components/schemas/ReactionType"
|
"$ref": "#/components/schemas/ReactionType"
|
||||||
}
|
}
|
||||||
@@ -49,6 +61,9 @@
|
|||||||
"required": false,
|
"required": false,
|
||||||
"in": "query",
|
"in": "query",
|
||||||
"description": "Filter by user ID",
|
"description": "Filter by user ID",
|
||||||
|
"x-nestjs_zod-parent-metadata": {
|
||||||
|
"description": "Activity search"
|
||||||
|
},
|
||||||
"schema": {
|
"schema": {
|
||||||
"format": "uuid",
|
"format": "uuid",
|
||||||
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
|
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
|
||||||
@@ -172,6 +187,9 @@
|
|||||||
"required": true,
|
"required": true,
|
||||||
"in": "query",
|
"in": "query",
|
||||||
"description": "Album ID",
|
"description": "Album ID",
|
||||||
|
"x-nestjs_zod-parent-metadata": {
|
||||||
|
"description": "Activity"
|
||||||
|
},
|
||||||
"schema": {
|
"schema": {
|
||||||
"format": "uuid",
|
"format": "uuid",
|
||||||
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
|
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
|
||||||
@@ -183,6 +201,9 @@
|
|||||||
"required": false,
|
"required": false,
|
||||||
"in": "query",
|
"in": "query",
|
||||||
"description": "Asset ID (if activity is for an asset)",
|
"description": "Asset ID (if activity is for an asset)",
|
||||||
|
"x-nestjs_zod-parent-metadata": {
|
||||||
|
"description": "Activity"
|
||||||
|
},
|
||||||
"schema": {
|
"schema": {
|
||||||
"format": "uuid",
|
"format": "uuid",
|
||||||
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
|
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@
|
|||||||
"format": "prettier --cache --check i18n/",
|
"format": "prettier --cache --check i18n/",
|
||||||
"format:fix": "prettier --cache --write --list-different i18n"
|
"format:fix": "prettier --cache --write --list-different i18n"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@10.33.4+sha512.1c67b3b359b2d408119ba1ed289f34b8fc3c6873412bec6fd264fbdc82489e510fcbecb9ce9d22dae7f3b76269d8441046014bdca53b9979cd7a561ad631b800",
|
"packageManager": "pnpm@10.33.1+sha512.05ba3c1d5d1c18f68df06470d74055e62d41fc110a0c660db1b2dfb2785327f04cf0f68345d4609bc52089e7fa0343c31593b2f9594e2c5d5da426230acc9820",
|
||||||
"engines": {
|
"engines": {
|
||||||
"pnpm": ">=10.0.0"
|
"pnpm": ">=10.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
"@types/lodash-es": "^4.17.12",
|
"@types/lodash-es": "^4.17.12",
|
||||||
"@types/micromatch": "^4.0.9",
|
"@types/micromatch": "^4.0.9",
|
||||||
"@types/mock-fs": "^4.13.1",
|
"@types/mock-fs": "^4.13.1",
|
||||||
"@types/node": "^24.12.4",
|
"@types/node": "^24.12.2",
|
||||||
"@vitest/coverage-v8": "^4.0.0",
|
"@vitest/coverage-v8": "^4.0.0",
|
||||||
"byte-size": "^9.0.0",
|
"byte-size": "^9.0.0",
|
||||||
"cli-progress": "^3.12.0",
|
"cli-progress": "^3.12.0",
|
||||||
|
|||||||
@@ -13,5 +13,5 @@
|
|||||||
"oidc-provider": "^9.0.0",
|
"oidc-provider": "^9.0.0",
|
||||||
"tsx": "^4.20.6"
|
"tsx": "^4.20.6"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@10.33.4"
|
"packageManager": "pnpm@10.33.1"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,11 +24,11 @@
|
|||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "",
|
"author": "",
|
||||||
"license": "GNU Affero General Public License version 3",
|
"license": "GNU Affero General Public License version 3",
|
||||||
"packageManager": "pnpm@10.33.4",
|
"packageManager": "pnpm@10.30.3",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@extism/js-pdk": "^1.1.1",
|
"@extism/js-pdk": "^1.1.1",
|
||||||
"@types/node": "^24.12.4",
|
"@types/node": "^24.11.0",
|
||||||
"esbuild": "^0.28.0",
|
"esbuild": "^0.27.3",
|
||||||
"tsc-alias": "^1.8.16",
|
"tsc-alias": "^1.8.16",
|
||||||
"typescript": "^5.9.3"
|
"typescript": "^5.9.3"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
"@oazapfts/runtime": "^1.0.2"
|
"@oazapfts/runtime": "^1.0.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^24.12.4",
|
"@types/node": "^24.12.2",
|
||||||
"typescript": "^6.0.0"
|
"typescript": "^6.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+4091
-4447
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -55,7 +55,7 @@ FROM builder AS plugins
|
|||||||
|
|
||||||
ARG TARGETPLATFORM
|
ARG TARGETPLATFORM
|
||||||
|
|
||||||
COPY --from=ghcr.io/jdx/mise:2026.5.11@sha256:2ba959e4827f845fe0c4cfb4814089e790dc513040ef74f9e14925f446412a51 /usr/local/bin/mise /usr/local/bin/mise
|
COPY --from=ghcr.io/jdx/mise:2026.3.12@sha256:0210678cbf58413806531a27adb2c7daf1c37238e56e8f7ea381d73521571775 /usr/local/bin/mise /usr/local/bin/mise
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY ./mise.toml ./mise.toml
|
COPY ./mise.toml ./mise.toml
|
||||||
|
|||||||
+8
-8
@@ -49,14 +49,14 @@
|
|||||||
"@nestjs/websockets": "^11.0.4",
|
"@nestjs/websockets": "^11.0.4",
|
||||||
"@opentelemetry/api": "^1.9.0",
|
"@opentelemetry/api": "^1.9.0",
|
||||||
"@opentelemetry/context-async-hooks": "^2.0.0",
|
"@opentelemetry/context-async-hooks": "^2.0.0",
|
||||||
"@opentelemetry/exporter-prometheus": "^0.218.0",
|
"@opentelemetry/exporter-prometheus": "^0.217.0",
|
||||||
"@opentelemetry/instrumentation-http": "^0.218.0",
|
"@opentelemetry/instrumentation-http": "^0.215.0",
|
||||||
"@opentelemetry/instrumentation-ioredis": "^0.66.0",
|
"@opentelemetry/instrumentation-ioredis": "^0.63.0",
|
||||||
"@opentelemetry/instrumentation-nestjs-core": "^0.64.0",
|
"@opentelemetry/instrumentation-nestjs-core": "^0.61.0",
|
||||||
"@opentelemetry/instrumentation-pg": "^0.70.0",
|
"@opentelemetry/instrumentation-pg": "^0.67.0",
|
||||||
"@opentelemetry/resources": "^2.0.1",
|
"@opentelemetry/resources": "^2.0.1",
|
||||||
"@opentelemetry/sdk-metrics": "^2.0.1",
|
"@opentelemetry/sdk-metrics": "^2.0.1",
|
||||||
"@opentelemetry/sdk-node": "^0.218.0",
|
"@opentelemetry/sdk-node": "^0.217.0",
|
||||||
"@opentelemetry/semantic-conventions": "^1.34.0",
|
"@opentelemetry/semantic-conventions": "^1.34.0",
|
||||||
"@react-email/components": "^1.0.0",
|
"@react-email/components": "^1.0.0",
|
||||||
"@react-email/render": "^2.0.0",
|
"@react-email/render": "^2.0.0",
|
||||||
@@ -116,7 +116,7 @@
|
|||||||
"ua-parser-js": "^2.0.0",
|
"ua-parser-js": "^2.0.0",
|
||||||
"uuid": "^14.0.0",
|
"uuid": "^14.0.0",
|
||||||
"validator": "^13.12.0",
|
"validator": "^13.12.0",
|
||||||
"zod": "4.3.6"
|
"zod": "^4.3.6"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/js": "^10.0.0",
|
"@eslint/js": "^10.0.0",
|
||||||
@@ -138,7 +138,7 @@
|
|||||||
"@types/luxon": "^3.6.2",
|
"@types/luxon": "^3.6.2",
|
||||||
"@types/mock-fs": "^4.13.1",
|
"@types/mock-fs": "^4.13.1",
|
||||||
"@types/multer": "^2.0.0",
|
"@types/multer": "^2.0.0",
|
||||||
"@types/node": "^24.12.4",
|
"@types/node": "^24.12.2",
|
||||||
"@types/nodemailer": "^8.0.0",
|
"@types/nodemailer": "^8.0.0",
|
||||||
"@types/picomatch": "^4.0.0",
|
"@types/picomatch": "^4.0.0",
|
||||||
"@types/pngjs": "^6.0.5",
|
"@types/pngjs": "^6.0.5",
|
||||||
|
|||||||
@@ -36,16 +36,18 @@ const ActivityStatisticsResponseSchema = z
|
|||||||
})
|
})
|
||||||
.meta({ id: 'ActivityStatisticsResponseDto' });
|
.meta({ id: 'ActivityStatisticsResponseDto' });
|
||||||
|
|
||||||
const ActivitySchema = z.object({
|
const ActivitySchema = z
|
||||||
albumId: z.uuidv4().describe('Album ID'),
|
.object({
|
||||||
assetId: z.uuidv4().optional().describe('Asset ID (if activity is for an asset)'),
|
albumId: z.uuidv4().describe('Album ID'),
|
||||||
});
|
assetId: z.uuidv4().optional().describe('Asset ID (if activity is for an asset)'),
|
||||||
|
})
|
||||||
|
.describe('Activity');
|
||||||
|
|
||||||
const ActivitySearchSchema = ActivitySchema.extend({
|
const ActivitySearchSchema = ActivitySchema.extend({
|
||||||
type: ReactionTypeSchema.optional(),
|
type: ReactionTypeSchema.optional(),
|
||||||
level: ReactionLevelSchema.optional(),
|
level: ReactionLevelSchema.optional(),
|
||||||
userId: z.uuidv4().optional().describe('Filter by user ID'),
|
userId: z.uuidv4().optional().describe('Filter by user ID'),
|
||||||
});
|
}).describe('Activity search');
|
||||||
|
|
||||||
const ActivityCreateSchema = ActivitySchema.extend({
|
const ActivityCreateSchema = ActivitySchema.extend({
|
||||||
type: ReactionTypeSchema,
|
type: ReactionTypeSchema,
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ export class NotificationTable {
|
|||||||
type!: Generated<NotificationType>;
|
type!: Generated<NotificationType>;
|
||||||
|
|
||||||
@Column({ type: 'jsonb', nullable: true })
|
@Column({ type: 'jsonb', nullable: true })
|
||||||
data!: unknown | null;
|
data!: any | null;
|
||||||
|
|
||||||
@Column()
|
@Column()
|
||||||
title!: string;
|
title!: string;
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
import { INestApplication } from '@nestjs/common';
|
import { INestApplication } from '@nestjs/common';
|
||||||
import {
|
import {
|
||||||
ApiBodyOptions,
|
|
||||||
DocumentBuilder,
|
DocumentBuilder,
|
||||||
OpenAPIObject,
|
OpenAPIObject,
|
||||||
SwaggerCustomOptions,
|
SwaggerCustomOptions,
|
||||||
SwaggerDocumentOptions,
|
SwaggerDocumentOptions,
|
||||||
SwaggerModule,
|
SwaggerModule,
|
||||||
} from '@nestjs/swagger';
|
} from '@nestjs/swagger';
|
||||||
|
import {
|
||||||
|
OperationObject,
|
||||||
|
ReferenceObject,
|
||||||
|
SchemaObject,
|
||||||
|
} from '@nestjs/swagger/dist/interfaces/open-api-spec.interface';
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import { cleanupOpenApiDoc } from 'nestjs-zod';
|
import { cleanupOpenApiDoc } from 'nestjs-zod';
|
||||||
import { writeFileSync } from 'node:fs';
|
import { writeFileSync } from 'node:fs';
|
||||||
@@ -19,11 +23,6 @@ import { extraSyncModels } from 'src/dtos/sync.dto';
|
|||||||
import { ApiCustomExtension, ImmichCookie, ImmichHeader, MetadataKey } from 'src/enum';
|
import { ApiCustomExtension, ImmichCookie, ImmichHeader, MetadataKey } from 'src/enum';
|
||||||
import { LoggingRepository } from 'src/repositories/logging.repository';
|
import { LoggingRepository } from 'src/repositories/logging.repository';
|
||||||
|
|
||||||
type OperationObject = NonNullable<OpenAPIObject['paths'][string]['get']>;
|
|
||||||
type ReferenceOrSchemaObject = Extract<ApiBodyOptions, { schema: unknown }>['schema'];
|
|
||||||
type ReferenceObject = Extract<ReferenceOrSchemaObject, { $ref: unknown }>;
|
|
||||||
type SchemaObject = Exclude<ReferenceOrSchemaObject, ReferenceObject>;
|
|
||||||
|
|
||||||
export class ImmichStartupError extends Error {}
|
export class ImmichStartupError extends Error {}
|
||||||
export const isStartUpError = (error: unknown): error is ImmichStartupError => error instanceof ImmichStartupError;
|
export const isStartUpError = (error: unknown): error is ImmichStartupError => error instanceof ImmichStartupError;
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -76,7 +76,7 @@
|
|||||||
"@sveltejs/adapter-static": "^3.0.8",
|
"@sveltejs/adapter-static": "^3.0.8",
|
||||||
"@sveltejs/enhanced-img": "^0.10.4",
|
"@sveltejs/enhanced-img": "^0.10.4",
|
||||||
"@sveltejs/kit": "^2.56.1",
|
"@sveltejs/kit": "^2.56.1",
|
||||||
"@sveltejs/vite-plugin-svelte": "7.1.2",
|
"@sveltejs/vite-plugin-svelte": "7.0.0",
|
||||||
"@tailwindcss/vite": "^4.2.4",
|
"@tailwindcss/vite": "^4.2.4",
|
||||||
"@testing-library/jest-dom": "^6.4.2",
|
"@testing-library/jest-dom": "^6.4.2",
|
||||||
"@testing-library/svelte": "^5.2.8",
|
"@testing-library/svelte": "^5.2.8",
|
||||||
|
|||||||
+1
-1
@@ -34,7 +34,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
@utility immich-form-input {
|
@utility immich-form-input {
|
||||||
@apply bg-gray-100 ring-1 ring-gray-200 transition outline-none focus-within:ring-primary focus-within:ring-1 disabled:cursor-not-allowed dark:bg-gray-800 dark:ring-neutral-900 dark:focus-within:ring-primary flex w-full items-center rounded-lg disabled:bg-gray-300 disabled:text-dark dark:disabled:bg-gray-900 dark:disabled:text-gray-200 flex-1 py-2.5 text-base pl-4 pr-4;
|
@apply bg-gray-100 ring-1 ring-gray-200 transition outline-none focus-within:ring-1 disabled:cursor-not-allowed dark:bg-gray-800 dark:ring-neutral-900 flex w-full items-center rounded-lg disabled:bg-gray-300 disabled:text-dark dark:disabled:bg-gray-900 dark:disabled:text-gray-200 flex-1 py-2.5 text-base pl-4 pr-4;
|
||||||
}
|
}
|
||||||
|
|
||||||
@utility immich-form-label {
|
@utility immich-form-label {
|
||||||
|
|||||||
+1
-145
@@ -1,35 +1,17 @@
|
|||||||
import { defaultProvider, screencastManager, themeManager, ThemePreference, type ActionItem } from '@immich/ui';
|
import { defaultProvider, screencastManager, themeManager, ThemePreference, type ActionItem } from '@immich/ui';
|
||||||
import {
|
import {
|
||||||
mdiAccountMultipleOutline,
|
mdiAccountMultipleOutline,
|
||||||
mdiAccountOutline,
|
|
||||||
mdiArchiveArrowDownOutline,
|
|
||||||
mdiBookshelf,
|
mdiBookshelf,
|
||||||
mdiCog,
|
mdiCog,
|
||||||
mdiContentDuplicate,
|
|
||||||
mdiCrosshairsGps,
|
|
||||||
mdiFolderOutline,
|
|
||||||
mdiHeartOutline,
|
|
||||||
mdiImageAlbum,
|
|
||||||
mdiImageMultipleOutline,
|
|
||||||
mdiImageSizeSelectLarge,
|
|
||||||
mdiKeyboard,
|
mdiKeyboard,
|
||||||
mdiLink,
|
|
||||||
mdiLockOutline,
|
|
||||||
mdiMagnify,
|
|
||||||
mdiMapOutline,
|
|
||||||
mdiServer,
|
mdiServer,
|
||||||
mdiStateMachine,
|
|
||||||
mdiSync,
|
mdiSync,
|
||||||
mdiTagMultipleOutline,
|
|
||||||
mdiThemeLightDark,
|
mdiThemeLightDark,
|
||||||
mdiToolboxOutline,
|
|
||||||
mdiTrashCanOutline,
|
|
||||||
} from '@mdi/js';
|
} from '@mdi/js';
|
||||||
import type { MessageFormatter } from 'svelte-i18n';
|
import type { MessageFormatter } from 'svelte-i18n';
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
import { page } from '$app/state';
|
import { page } from '$app/state';
|
||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
import { featureFlagsManager } from '$lib/managers/feature-flags-manager.svelte';
|
|
||||||
import { Route } from '$lib/route';
|
import { Route } from '$lib/route';
|
||||||
import { copyToClipboard } from '$lib/utils';
|
import { copyToClipboard } from '$lib/utils';
|
||||||
|
|
||||||
@@ -67,133 +49,7 @@ export const getPagesProvider = ($t: MessageFormatter) => {
|
|||||||
},
|
},
|
||||||
].map((route) => ({ ...route, $if: () => authManager.authenticated && authManager.user.isAdmin }));
|
].map((route) => ({ ...route, $if: () => authManager.authenticated && authManager.user.isAdmin }));
|
||||||
|
|
||||||
const userPages: ActionItem[] = [
|
return defaultProvider({ name: $t('page'), actions: adminPages });
|
||||||
{
|
|
||||||
title: $t('photos'),
|
|
||||||
icon: mdiImageMultipleOutline,
|
|
||||||
onAction: () => goto(Route.photos()),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: $t('explore'),
|
|
||||||
icon: mdiMagnify,
|
|
||||||
onAction: () => goto(Route.explore()),
|
|
||||||
$if: () => authManager.authenticated && featureFlagsManager.value.search,
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
title: $t('map'),
|
|
||||||
icon: mdiMapOutline,
|
|
||||||
onAction: () => goto(Route.map()),
|
|
||||||
$if: () => authManager.authenticated && featureFlagsManager.value.map,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: $t('people'),
|
|
||||||
description: $t('people_feature_description'),
|
|
||||||
icon: mdiAccountOutline,
|
|
||||||
onAction: () => goto(Route.people()),
|
|
||||||
$if: () => authManager.authenticated && authManager.preferences.people.enabled,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: $t('shared_links'),
|
|
||||||
icon: mdiLink,
|
|
||||||
onAction: () => goto(Route.sharedLinks()),
|
|
||||||
$if: () => authManager.authenticated && authManager.preferences.sharedLinks.enabled,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: $t('recently_added'),
|
|
||||||
icon: mdiMagnify,
|
|
||||||
onAction: () => goto(Route.recentlyAdded()),
|
|
||||||
$if: () => authManager.authenticated,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: $t('sharing'),
|
|
||||||
icon: mdiAccountMultipleOutline,
|
|
||||||
onAction: () => goto(Route.sharing()),
|
|
||||||
$if: () => authManager.authenticated,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: $t('favorites'),
|
|
||||||
icon: mdiHeartOutline,
|
|
||||||
onAction: () => goto(Route.favorites()),
|
|
||||||
$if: () => authManager.authenticated,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: $t('albums'),
|
|
||||||
description: $t('albums_feature_description'),
|
|
||||||
icon: mdiImageAlbum,
|
|
||||||
onAction: () => goto(Route.albums()),
|
|
||||||
$if: () => authManager.authenticated,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: $t('tags'),
|
|
||||||
description: $t('tag_feature_description'),
|
|
||||||
icon: mdiTagMultipleOutline,
|
|
||||||
onAction: () => goto(Route.tags()),
|
|
||||||
$if: () => authManager.authenticated && authManager.preferences.tags.enabled,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: $t('folders'),
|
|
||||||
description: $t('folders_feature_description'),
|
|
||||||
icon: mdiFolderOutline,
|
|
||||||
onAction: () => goto(Route.folders()),
|
|
||||||
$if: () => authManager.authenticated && authManager.preferences.folders.enabled,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: $t('utilities'),
|
|
||||||
icon: mdiToolboxOutline,
|
|
||||||
onAction: () => goto(Route.utilities()),
|
|
||||||
$if: () => authManager.authenticated,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: $t('archive'),
|
|
||||||
icon: mdiArchiveArrowDownOutline,
|
|
||||||
onAction: () => goto(Route.archive()),
|
|
||||||
$if: () => authManager.authenticated,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: $t('locked_folder'),
|
|
||||||
icon: mdiLockOutline,
|
|
||||||
onAction: () => goto(Route.locked()),
|
|
||||||
$if: () => authManager.authenticated,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: $t('trash'),
|
|
||||||
icon: mdiTrashCanOutline,
|
|
||||||
onAction: () => goto(Route.trash()),
|
|
||||||
$if: () => authManager.authenticated && featureFlagsManager.value.trash,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: $t('admin.user_settings'),
|
|
||||||
icon: mdiCog,
|
|
||||||
onAction: () => goto(Route.userSettings()),
|
|
||||||
$if: () => authManager.authenticated,
|
|
||||||
},
|
|
||||||
].map((route) => ({ $if: () => authManager.authenticated, ...route }));
|
|
||||||
|
|
||||||
const utilityPages: ActionItem[] = [
|
|
||||||
{
|
|
||||||
title: $t('review_duplicates'),
|
|
||||||
icon: mdiContentDuplicate,
|
|
||||||
onAction: () => goto(Route.duplicatesUtility()),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: $t('review_large_files'),
|
|
||||||
icon: mdiImageSizeSelectLarge,
|
|
||||||
onAction: () => goto(Route.largeFileUtility()),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: $t('manage_geolocation'),
|
|
||||||
icon: mdiCrosshairsGps,
|
|
||||||
onAction: () => goto(Route.geolocationUtility()),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: $t('workflows'),
|
|
||||||
icon: mdiStateMachine,
|
|
||||||
onAction: () => goto(Route.workflows()),
|
|
||||||
},
|
|
||||||
].map((route) => ({ ...route, $if: () => authManager.authenticated }));
|
|
||||||
|
|
||||||
return defaultProvider({ name: $t('page'), actions: [...userPages, ...utilityPages, ...adminPages] });
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const getMyImmichLink = () => {
|
const getMyImmichLink = () => {
|
||||||
|
|||||||
@@ -128,7 +128,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{#if innerHeight}
|
{#if innerHeight}
|
||||||
<div
|
<div
|
||||||
class="relative w-full immich-scrollbar overflow-y-auto px-2"
|
class="relative w-full overflow-y-auto px-2 immich-scrollbar"
|
||||||
style="height: {divHeight}px;padding-bottom: {chatHeight}px"
|
style="height: {divHeight}px;padding-bottom: {chatHeight}px"
|
||||||
>
|
>
|
||||||
{#each activityManager.activities as reaction, index (reaction.id)}
|
{#each activityManager.activities as reaction, index (reaction.id)}
|
||||||
|
|||||||
@@ -153,7 +153,7 @@
|
|||||||
<LoadingSpinner />
|
<LoadingSpinner />
|
||||||
</div>
|
</div>
|
||||||
{:else}
|
{:else}
|
||||||
<div class="mt-4 flex immich-scrollbar flex-wrap gap-2 overflow-y-auto">
|
<div class="mt-4 flex flex-wrap gap-2 overflow-y-auto immich-scrollbar">
|
||||||
{#each showPeople as person (person.id)}
|
{#each showPeople as person (person.id)}
|
||||||
{#if !editedFace.person || person.id !== editedFace.person.id}
|
{#if !editedFace.person || person.id !== editedFace.person.id}
|
||||||
<div class="w-fit">
|
<div class="w-fit">
|
||||||
|
|||||||
@@ -64,7 +64,7 @@
|
|||||||
<div
|
<div
|
||||||
bind:this={menuScrollView}
|
bind:this={menuScrollView}
|
||||||
class={[
|
class={[
|
||||||
'fixed z-1 w-max max-w-75 min-w-50 immich-scrollbar rounded-lg bg-slate-100 shadow-lg duration-250 ease-in-out',
|
'fixed z-1 w-max max-w-75 min-w-50 rounded-lg bg-slate-100 shadow-lg duration-250 ease-in-out immich-scrollbar',
|
||||||
position.needScrollBar ? 'overflow-auto' : 'overflow-hidden',
|
position.needScrollBar ? 'overflow-auto' : 'overflow-hidden',
|
||||||
]}
|
]}
|
||||||
style:left="{position.left}px"
|
style:left="{position.left}px"
|
||||||
|
|||||||
@@ -72,14 +72,14 @@
|
|||||||
? filterPeople(people, name)
|
? filterPeople(people, name)
|
||||||
: filterPeople(people, name).slice(0, numberOfPeople)}
|
: filterPeople(people, name).slice(0, numberOfPeople)}
|
||||||
|
|
||||||
<div id="people-selection" class="-mb-4 max-h-60 immich-scrollbar overflow-y-auto">
|
<div id="people-selection" class="-mb-4 max-h-60 overflow-y-auto immich-scrollbar">
|
||||||
<div class="flex w-full items-center justify-between gap-6">
|
<div class="flex w-full items-center justify-between gap-6">
|
||||||
<Text class="py-3" fontWeight="medium">{$t('people')}</Text>
|
<Text class="py-3" fontWeight="medium">{$t('people')}</Text>
|
||||||
<SearchBar bind:name placeholder={$t('filter_people')} showLoadingSpinner={false} />
|
<SearchBar bind:name placeholder={$t('filter_people')} showLoadingSpinner={false} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<SingleGridRow
|
<SingleGridRow
|
||||||
class="space-between mt-2 grid immich-scrollbar grid-auto-fill-20 gap-1 overflow-y-auto"
|
class="space-between mt-2 grid grid-auto-fill-20 gap-1 overflow-y-auto immich-scrollbar"
|
||||||
bind:itemCount={numberOfPeople}
|
bind:itemCount={numberOfPeople}
|
||||||
>
|
>
|
||||||
{#each peopleList as person (person.id)}
|
{#each peopleList as person (person.id)}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<div
|
<div
|
||||||
class="w-full immich-scrollbar overflow-y-auto rounded-2xl border border-gray-100 bg-gray-50 p-2 dark:border-gray-900 dark:bg-immich-dark-gray/50"
|
class="w-full overflow-y-auto rounded-2xl border border-gray-100 bg-gray-50 p-2 immich-scrollbar dark:border-gray-900 dark:bg-immich-dark-gray/50"
|
||||||
>
|
>
|
||||||
<ol class="flex items-center gap-2">
|
<ol class="flex items-center gap-2">
|
||||||
<li>
|
<li>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user