Compare commits

...

14 Commits

Author SHA1 Message Date
Jason Rasmussen
002c82b8fc fix(web): do not notify on patch releases 2025-10-02 12:22:18 -04:00
gablilli
1086623457 chore: replace immich.app/docs with docs.immich.app globally (#22428)
* fix: es

* fix(readme): fix docs link

* fix(readme): fix main readme's docs link

* fix: main readme

* fix: replace immich.app/docs with docs.immich.app globally
2025-10-02 10:42:14 -05:00
shenlong
a2b25b7a74 fix: show only owned assets in places and map (#22585)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-10-02 10:41:14 -05:00
shenlong
950f268cb0 fix: remove new timeline version check (#22584)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-10-02 10:38:54 -05:00
shenlong
5ece0e5e56 fix: do not delete asset on share (#22578)
fix: do not delete local asset on share

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-10-02 10:34:59 -05:00
renovate[bot]
00ce6354f0 chore(deps): update node.js to v22.20.0 (#22496)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-02 09:17:40 +00:00
Kenny at FUTO
9b938d8954 feat(docs): add one-click install docs page (#22553)
* feat(docs): add one-click install docs page
2025-10-01 17:24:21 -05:00
github-actions
e4234af3b3 chore: version v2.0.0 2025-10-01 21:19:34 +00:00
Jason Rasmussen
1618902ebd chore: remove warnings (#22549) 2025-10-01 21:14:51 +00:00
Alex
83e783bbc2 chore: update readme (#22548)
Removed disclaimer section and replaced it with a warning.
2025-10-01 16:13:38 -05:00
Jason Rasmussen
7dbdc7a635 chore: remove warning banner (#22547) 2025-10-01 21:06:22 +00:00
Jason Rasmussen
7a4bfc21c9 fix(docs): open graph tags (#22542) 2025-10-01 16:30:52 +00:00
Guillermo
b3f38301bf fix: missing email button padding (#22529)
Signed-off-by: Guillermo Guirao Aguilar <ggaguilar@gmail.com>
2025-10-01 09:03:22 -05:00
Alex
1f7201fbd3 fix(server): Revert update libmimalloc path (#22345) (#22526)
* Revert "fix(server): update libmimalloc path (#22345)"

This reverts commit 38226fd240.

* add comments
2025-10-01 13:58:24 +00:00
77 changed files with 307 additions and 205 deletions

2
.github/.nvmrc vendored
View File

@@ -1 +1 @@
22.19.0 22.20.0

View File

@@ -38,26 +38,25 @@
<a href="readme_i18n/README_th_TH.md">ภาษาไทย</a> <a href="readme_i18n/README_th_TH.md">ภาษาไทย</a>
</p> </p>
## Disclaimer
- ⚠️ The project is under **very active** development. > [!WARNING]
- ⚠️ Expect bugs and breaking changes. > ⚠️ Always follow [3-2-1](https://www.backblaze.com/blog/the-3-2-1-backup-strategy/) backup plan for your precious photos and videos!
- ⚠️ **Do not use the app as the only way to store your photos and videos.** >
- ⚠️ Always follow [3-2-1](https://www.backblaze.com/blog/the-3-2-1-backup-strategy/) backup plan for your precious photos and videos!
> [!NOTE] > [!NOTE]
> You can find the main documentation, including installation guides, at https://immich.app/. > You can find the main documentation, including installation guides, at https://immich.app/.
## Links ## Links
- [Documentation](https://immich.app/docs) - [Documentation](https://docs.immich.app/)
- [About](https://immich.app/docs/overview/introduction) - [About](https://docs.immich.app/overview/introduction)
- [Installation](https://immich.app/docs/install/requirements) - [Installation](https://docs.immich.app/install/requirements)
- [Roadmap](https://immich.app/roadmap) - [Roadmap](https://immich.app/roadmap)
- [Demo](#demo) - [Demo](#demo)
- [Features](#features) - [Features](#features)
- [Translations](https://immich.app/docs/developer/translations) - [Translations](https://docs.immich.app/developer/translations)
- [Contributing](https://immich.app/docs/overview/support-the-project) - [Contributing](https://docs.immich.app/overview/support-the-project)
## Demo ## Demo
@@ -106,7 +105,7 @@ Access the demo [here](https://demo.immich.app). For the mobile app, you can use
## Translations ## Translations
Read more about translations [here](https://immich.app/docs/developer/translations). Read more about translations [here](https://docs.immich.app/developer/translations).
<a href="https://hosted.weblate.org/engage/immich/"> <a href="https://hosted.weblate.org/engage/immich/">
<img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="Translation status" /> <img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="Translation status" />

View File

@@ -1 +1 @@
22.19.0 22.20.0

View File

@@ -1,6 +1,6 @@
A command-line interface for interfacing with the self-hosted photo manager [Immich](https://immich.app/). A command-line interface for interfacing with the self-hosted photo manager [Immich](https://immich.app/).
Please see the [Immich CLI documentation](https://immich.app/docs/features/command-line-interface). Please see the [Immich CLI documentation](https://docs.immich.app/features/command-line-interface).
# For developers # For developers

View File

@@ -1,6 +1,6 @@
{ {
"name": "@immich/cli", "name": "@immich/cli",
"version": "2.2.94", "version": "2.2.95",
"description": "Command Line Interface (CLI) for Immich", "description": "Command Line Interface (CLI) for Immich",
"type": "module", "type": "module",
"exports": "./dist/index.js", "exports": "./dist/index.js",
@@ -68,6 +68,6 @@
"micromatch": "^4.0.8" "micromatch": "^4.0.8"
}, },
"volta": { "volta": {
"node": "22.19.0" "node": "22.20.0"
} }
} }

View File

@@ -1,5 +1,5 @@
# #
# WARNING: To install Immich, follow our guide: https://immich.app/docs/install/docker-compose # WARNING: To install Immich, follow our guide: https://docs.immich.app/install/docker-compose
# #
# Make sure to use the docker-compose.yml of the current release: # Make sure to use the docker-compose.yml of the current release:
# #
@@ -8,8 +8,8 @@
# The compose file on main may not be compatible with the latest release. # The compose file on main may not be compatible with the latest release.
# For development see: # For development see:
# - https://immich.app/docs/developer/setup # - https://docs.immich.app/developer/setup
# - https://immich.app/docs/developer/troubleshooting # - https://docs.immich.app/developer/troubleshooting
name: immich-dev name: immich-dev
@@ -55,8 +55,8 @@ services:
IMMICH_BUILD_IMAGE_URL: https://github.com/immich-app/immich/pkgs/container/immich-server IMMICH_BUILD_IMAGE_URL: https://github.com/immich-app/immich/pkgs/container/immich-server
IMMICH_THIRD_PARTY_SOURCE_URL: https://github.com/immich-app/immich/ IMMICH_THIRD_PARTY_SOURCE_URL: https://github.com/immich-app/immich/
IMMICH_THIRD_PARTY_BUG_FEATURE_URL: https://github.com/immich-app/immich/issues IMMICH_THIRD_PARTY_BUG_FEATURE_URL: https://github.com/immich-app/immich/issues
IMMICH_THIRD_PARTY_DOCUMENTATION_URL: https://immich.app/docs IMMICH_THIRD_PARTY_DOCUMENTATION_URL: https://docs.immich.app
IMMICH_THIRD_PARTY_SUPPORT_URL: https://immich.app/docs/community-guides IMMICH_THIRD_PARTY_SUPPORT_URL: https://docs.immich.app/community-guides
ulimits: ulimits:
nofile: nofile:
soft: 1048576 soft: 1048576

View File

@@ -1,5 +1,5 @@
# #
# WARNING: To install Immich, follow our guide: https://immich.app/docs/install/docker-compose # WARNING: To install Immich, follow our guide: https://docs.immich.app/install/docker-compose
# #
# Make sure to use the docker-compose.yml of the current release: # Make sure to use the docker-compose.yml of the current release:
# #

View File

@@ -1,5 +1,5 @@
# #
# WARNING: To install Immich, follow our guide: https://immich.app/docs/install/docker-compose # WARNING: To install Immich, follow our guide: https://docs.immich.app/install/docker-compose
# #
# Make sure to use the docker-compose.yml of the current release: # Make sure to use the docker-compose.yml of the current release:
# #
@@ -36,7 +36,7 @@ services:
# For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag. # For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
# Example tag: ${IMMICH_VERSION:-release}-cuda # Example tag: ${IMMICH_VERSION:-release}-cuda
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release} image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
# extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration # extends: # uncomment this section for hardware acceleration - see https://docs.immich.app/features/ml-hardware-acceleration
# file: hwaccel.ml.yml # file: hwaccel.ml.yml
# service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable # service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable
volumes: volumes:

View File

@@ -1,4 +1,4 @@
# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables # You can find documentation for all the supported env variables at https://docs.immich.app/install/environment-variables
# The location where your uploaded files are stored # The location where your uploaded files are stored
UPLOAD_LOCATION=./library UPLOAD_LOCATION=./library

View File

@@ -4,7 +4,7 @@
# you can inline the config for a backend by copying its contents # you can inline the config for a backend by copying its contents
# into the immich-machine-learning service in the docker-compose.yml file. # into the immich-machine-learning service in the docker-compose.yml file.
# See https://immich.app/docs/features/ml-hardware-acceleration for info on usage. # See https://docs.immich.app/features/ml-hardware-acceleration for info on usage.
services: services:
armnn: armnn:

View File

@@ -4,7 +4,7 @@
# you can inline the config for a backend by copying its contents # you can inline the config for a backend by copying its contents
# into the immich-microservices service in the docker-compose.yml file. # into the immich-microservices service in the docker-compose.yml file.
# See https://immich.app/docs/features/hardware-transcoding for more info on using hardware transcoding. # See https://docs.immich.app/features/hardware-transcoding for more info on using hardware transcoding.
services: services:
cpu: {} cpu: {}

View File

@@ -1 +1 @@
22.19.0 22.20.0

View File

@@ -0,0 +1,32 @@
---
sidebar_position: 65
---
# One-Click [Cloud Service]
:::note
This version of Immich is provided via cloud service provider's one-click marketplaces. Hosting costs are set by the cloud service providers.
Support for these are provided by the individual cloud service providers.
**Please report issues to the corresponding [Github Repository][github].**
:::
## Installation
Simply goto the providers marketplace and choose Immich, then follow the provided instructions.
## One-Click Immich marketplace providers
### DigitalOcean
https://marketplace.digitalocean.com/apps/immich
### Vultr
https://www.vultr.com/marketplace/apps/immich
## Issues
For issues, open an issue on the associated [GitHub Repository][github].
[github]: https://github.com/imagegenius/docker-immich/

View File

@@ -4,9 +4,7 @@ sidebar_position: 95
# Upgrading # Upgrading
:::danger Read the release notes :::tip Breaking changes
Immich is currently under heavy development, which means you can expect [breaking changes][breaking] and bugs. You should read the release notes prior to updating and take special care when using automated tools like [Watchtower][watchtower].
You can see versions that had breaking changes [here][breaking]. You can see versions that had breaking changes [here][breaking].
::: :::

View File

@@ -1,7 +1,6 @@
Now that you have imported some pictures, you should setup server backups to preserve your memories. Now that you have imported some pictures, you should setup server backups to preserve your memories.
You can do so by following our [backup guide](/administration/backup-and-restore.md). You can do so by following our [backup guide](/administration/backup-and-restore.md).
:::danger :::info
Immich is still under heavy development _and_ handles very important data. A 3-2-1 backup strategy is still crucial. The team has the responsibility to ensure that the application doesnt cause loss of your precious memories; however, we cannot guarantee that hard drives will not fail, or an electrical event causes unexpected shutdown of your server/system, leading to data loss. Therefore, we still encourage users to follow best practices when safeguarding their data. Keep multiple copies of your most precious data: at least two local copies and one copy offsite in cold storage.
It is essential that you set up good backups, and test them.
::: :::

View File

@@ -7,7 +7,7 @@ const prism = require('prism-react-renderer');
const config = { const config = {
title: 'Immich', title: 'Immich',
tagline: 'High performance self-hosted photo and video backup solution directly from your mobile phone', tagline: 'High performance self-hosted photo and video backup solution directly from your mobile phone',
url: 'https://immich.app', url: 'https://docs.immich.app',
baseUrl: '/', baseUrl: '/',
onBrokenLinks: 'throw', onBrokenLinks: 'throw',
onBrokenMarkdownLinks: 'warn', onBrokenMarkdownLinks: 'warn',
@@ -65,11 +65,6 @@ const config = {
themeConfig: themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */ /** @type {import('@docusaurus/preset-classic').ThemeConfig} */
({ ({
announcementBar: {
id: 'site_announcement_immich',
content: `⚠️ The project is under <strong>very active</strong> development. Expect bugs and changes. Do not use it as <strong>the only way</strong> to store your photos and videos!`,
isCloseable: false,
},
docs: { docs: {
sidebar: { sidebar: {
autoCollapseCategories: false, autoCollapseCategories: false,

View File

@@ -57,6 +57,6 @@
"node": ">=20" "node": ">=20"
}, },
"volta": { "volta": {
"node": "22.19.0" "node": "22.20.0"
} }
} }

View File

@@ -1,4 +1,8 @@
[ [
{
"label": "v2.0.0",
"url": "https://docs.v2.0.0.archive.immich.app"
},
{ {
"label": "v1.144.1", "label": "v1.144.1",
"url": "https://docs.v1.144.1.archive.immich.app" "url": "https://docs.v1.144.1.archive.immich.app"

View File

@@ -1 +1 @@
22.19.0 22.20.0

View File

@@ -1,6 +1,6 @@
{ {
"name": "immich-e2e", "name": "immich-e2e",
"version": "1.144.1", "version": "2.0.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"type": "module", "type": "module",
@@ -52,6 +52,6 @@
"vitest": "^3.0.0" "vitest": "^3.0.0"
}, },
"volta": { "volta": {
"node": "22.19.0" "node": "22.20.0"
} }
} }

View File

@@ -1,6 +1,6 @@
[project] [project]
name = "immich-ml" name = "immich-ml"
version = "1.144.1" version = "2.0.0"
description = "" description = ""
authors = [{ name = "Hau Tran", email = "alex.tran1502@gmail.com" }] authors = [{ name = "Hau Tran", email = "alex.tran1502@gmail.com" }]
requires-python = ">=3.10,<4.0" requires-python = ">=3.10,<4.0"

View File

@@ -1,5 +1,5 @@
[tools] [tools]
node = "22.19.0" node = "22.20.0"
flutter = "3.35.4" flutter = "3.35.4"
pnpm = "10.15.1" pnpm = "10.15.1"

View File

@@ -84,4 +84,4 @@ Below is how your code needs to be structured:
## Contributing ## Contributing
Please refer to the [architecture](https://immich.app/docs/developer/architecture/) for contributing to the mobile app! Please refer to the [architecture](https://docs.immich.app/developer/architecture/) for contributing to the mobile app!

View File

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

View File

@@ -22,7 +22,7 @@ platform :ios do
path: "./Runner.xcodeproj", path: "./Runner.xcodeproj",
) )
increment_version_number( increment_version_number(
version_number: "1.144.1" version_number: "2.0.0"
) )
increment_build_number( increment_build_number(
build_number: latest_testflight_build_number + 1, build_number: latest_testflight_build_number + 1,

View File

@@ -84,8 +84,8 @@ class AssetService {
return 1.0; return 1.0;
} }
Future<List<(String, String)>> getPlaces() { Future<List<(String, String)>> getPlaces(String userId) {
return _remoteAssetRepository.getPlaces(); return _remoteAssetRepository.getPlaces(userId);
} }
Future<(int local, int remote)> getAssetCounts() async { Future<(int local, int remote)> getAssetCounts() async {

View File

@@ -59,7 +59,8 @@ class TimelineFactory {
TimelineService fromAssets(List<BaseAsset> assets) => TimelineService(_timelineRepository.fromAssets(assets)); TimelineService fromAssets(List<BaseAsset> assets) => TimelineService(_timelineRepository.fromAssets(assets));
TimelineService map(LatLngBounds bounds) => TimelineService(_timelineRepository.map(bounds, groupBy)); TimelineService map(String userId, LatLngBounds bounds) =>
TimelineService(_timelineRepository.map(userId, bounds, groupBy));
} }
class TimelineService { class TimelineService {

View File

@@ -81,9 +81,11 @@ class RemoteAssetRepository extends DriftDatabaseRepository {
.getSingleOrNull(); .getSingleOrNull();
} }
Future<List<(String, String)>> getPlaces() { Future<List<(String, String)>> getPlaces(String userId) {
final asset = Subquery( final asset = Subquery(
_db.remoteAssetEntity.select()..orderBy([(row) => OrderingTerm.desc(row.createdAt)]), _db.remoteAssetEntity.select()
..where((row) => row.ownerId.equals(userId))
..orderBy([(row) => OrderingTerm.desc(row.createdAt)]),
"asset", "asset",
); );

View File

@@ -431,12 +431,16 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
return query.map((row) => row.readTable(_db.remoteAssetEntity).toDto()).get(); return query.map((row) => row.readTable(_db.remoteAssetEntity).toDto()).get();
} }
TimelineQuery map(LatLngBounds bounds, GroupAssetsBy groupBy) => ( TimelineQuery map(String userId, LatLngBounds bounds, GroupAssetsBy groupBy) => (
bucketSource: () => _watchMapBucket(bounds, groupBy: groupBy), bucketSource: () => _watchMapBucket(userId, bounds, groupBy: groupBy),
assetSource: (offset, count) => _getMapBucketAssets(bounds, offset: offset, count: count), assetSource: (offset, count) => _getMapBucketAssets(userId, bounds, offset: offset, count: count),
); );
Stream<List<Bucket>> _watchMapBucket(LatLngBounds bounds, {GroupAssetsBy groupBy = GroupAssetsBy.day}) { Stream<List<Bucket>> _watchMapBucket(
String userId,
LatLngBounds bounds, {
GroupAssetsBy groupBy = GroupAssetsBy.day,
}) {
if (groupBy == GroupAssetsBy.none) { if (groupBy == GroupAssetsBy.none) {
// TODO: Support GroupAssetsBy.none // TODO: Support GroupAssetsBy.none
throw UnsupportedError("GroupAssetsBy.none is not supported for _watchMapBucket"); throw UnsupportedError("GroupAssetsBy.none is not supported for _watchMapBucket");
@@ -455,7 +459,8 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
), ),
]) ])
..where( ..where(
_db.remoteExifEntity.inBounds(bounds) & _db.remoteAssetEntity.ownerId.equals(userId) &
_db.remoteExifEntity.inBounds(bounds) &
_db.remoteAssetEntity.visibility.equalsValue(AssetVisibility.timeline) & _db.remoteAssetEntity.visibility.equalsValue(AssetVisibility.timeline) &
_db.remoteAssetEntity.deletedAt.isNull(), _db.remoteAssetEntity.deletedAt.isNull(),
) )
@@ -469,7 +474,12 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
}).watch(); }).watch();
} }
Future<List<BaseAsset>> _getMapBucketAssets(LatLngBounds bounds, {required int offset, required int count}) { Future<List<BaseAsset>> _getMapBucketAssets(
String userId,
LatLngBounds bounds, {
required int offset,
required int count,
}) {
final query = final query =
_db.remoteAssetEntity.select().join([ _db.remoteAssetEntity.select().join([
innerJoin( innerJoin(
@@ -479,7 +489,8 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
), ),
]) ])
..where( ..where(
_db.remoteExifEntity.inBounds(bounds) & _db.remoteAssetEntity.ownerId.equals(userId) &
_db.remoteExifEntity.inBounds(bounds) &
_db.remoteAssetEntity.visibility.equalsValue(AssetVisibility.timeline) & _db.remoteAssetEntity.visibility.equalsValue(AssetVisibility.timeline) &
_db.remoteAssetEntity.deletedAt.isNull(), _db.remoteAssetEntity.deletedAt.isNull(),
) )

View File

@@ -5,6 +5,7 @@ import 'package:immich_mobile/presentation/widgets/bottom_sheet/base_bottom_shee
import 'package:immich_mobile/presentation/widgets/map/map.state.dart'; import 'package:immich_mobile/presentation/widgets/map/map.state.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart'; import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart'; import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
class MapBottomSheet extends StatelessWidget { class MapBottomSheet extends StatelessWidget {
const MapBottomSheet({super.key}); const MapBottomSheet({super.key});
@@ -32,8 +33,13 @@ class _ScopedMapTimeline extends StatelessWidget {
return ProviderScope( return ProviderScope(
overrides: [ overrides: [
timelineServiceProvider.overrideWith((ref) { timelineServiceProvider.overrideWith((ref) {
final user = ref.watch(currentUserProvider);
if (user == null) {
throw Exception('User must be logged in to access archive');
}
final bounds = ref.watch(mapStateProvider).bounds; final bounds = ref.watch(mapStateProvider).bounds;
final timelineService = ref.watch(timelineFactoryProvider).map(bounds); final timelineService = ref.watch(timelineFactoryProvider).map(user.id, bounds);
ref.onDispose(timelineService.dispose); ref.onDispose(timelineService.dispose);
return timelineService; return timelineService;
}), }),

View File

@@ -3,6 +3,7 @@ import 'package:immich_mobile/domain/services/asset.service.dart';
import 'package:immich_mobile/infrastructure/repositories/local_asset.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/local_asset.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/remote_asset.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/remote_asset.repository.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
final localAssetRepository = Provider<DriftLocalAssetRepository>( final localAssetRepository = Provider<DriftLocalAssetRepository>(
(ref) => DriftLocalAssetRepository(ref.watch(driftProvider)), (ref) => DriftLocalAssetRepository(ref.watch(driftProvider)),
@@ -19,9 +20,13 @@ final assetServiceProvider = Provider(
), ),
); );
final placesProvider = FutureProvider<List<(String, String)>>( final placesProvider = FutureProvider<List<(String, String)>>((ref) {
(ref) => AssetService( final assetService = ref.watch(assetServiceProvider);
remoteAssetRepository: ref.watch(remoteAssetRepositoryProvider), final auth = ref.watch(currentUserProvider);
localAssetRepository: ref.watch(localAssetRepository),
).getPlaces(), if (auth == null) {
); return Future.value(const []);
}
return assetService.getPlaces(auth.id);
});

View File

@@ -8,6 +8,7 @@ import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/asset.entity.dart' as asset_entity; import 'package:immich_mobile/entities/asset.entity.dart' as asset_entity;
import 'package:immich_mobile/entities/store.entity.dart'; import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/platform_extensions.dart';
import 'package:immich_mobile/extensions/response_extensions.dart'; import 'package:immich_mobile/extensions/response_extensions.dart';
import 'package:immich_mobile/repositories/asset_api.repository.dart'; import 'package:immich_mobile/repositories/asset_api.repository.dart';
import 'package:immich_mobile/utils/hash.dart'; import 'package:immich_mobile/utils/hash.dart';
@@ -72,6 +73,7 @@ class AssetMediaRepository {
// TODO: make this more efficient // TODO: make this more efficient
Future<int> shareAssets(List<BaseAsset> assets, BuildContext context) async { Future<int> shareAssets(List<BaseAsset> assets, BuildContext context) async {
final downloadedXFiles = <XFile>[]; final downloadedXFiles = <XFile>[];
final tempFiles = <File>[];
for (var asset in assets) { for (var asset in assets) {
final localId = (asset is LocalAsset) final localId = (asset is LocalAsset)
@@ -82,6 +84,9 @@ class AssetMediaRepository {
if (localId != null) { if (localId != null) {
File? f = await AssetEntity(id: localId, width: 1, height: 1, typeInt: 0).originFile; File? f = await AssetEntity(id: localId, width: 1, height: 1, typeInt: 0).originFile;
downloadedXFiles.add(XFile(f!.path)); downloadedXFiles.add(XFile(f!.path));
if (CurrentPlatform.isIOS) {
tempFiles.add(f);
}
} else if (asset is RemoteAsset) { } else if (asset is RemoteAsset) {
final tempDir = await getTemporaryDirectory(); final tempDir = await getTemporaryDirectory();
final name = asset.name; final name = asset.name;
@@ -95,6 +100,7 @@ class AssetMediaRepository {
await tempFile.writeAsBytes(res.bodyBytes); await tempFile.writeAsBytes(res.bodyBytes);
downloadedXFiles.add(XFile(tempFile.path)); downloadedXFiles.add(XFile(tempFile.path));
tempFiles.add(tempFile);
} else { } else {
_log.warning("Asset type not supported for sharing: $asset"); _log.warning("Asset type not supported for sharing: $asset");
continue; continue;
@@ -113,9 +119,9 @@ class AssetMediaRepository {
downloadedXFiles, downloadedXFiles,
sharePositionOrigin: Rect.fromPoints(Offset.zero, Offset(size.width / 3, size.height)), sharePositionOrigin: Rect.fromPoints(Offset.zero, Offset(size.width / 3, size.height)),
).then((result) async { ).then((result) async {
for (var file in downloadedXFiles) { for (var file in tempFiles) {
try { try {
await File(file.path).delete(); await file.delete();
} catch (e) { } catch (e) {
_log.warning("Failed to delete temporary file: ${file.path}", e); _log.warning("Failed to delete temporary file: ${file.path}", e);
} }

View File

@@ -1,12 +1,10 @@
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/providers/app_settings.provider.dart'; import 'package:immich_mobile/providers/app_settings.provider.dart';
import 'package:immich_mobile/providers/auth.provider.dart'; import 'package:immich_mobile/providers/auth.provider.dart';
import 'package:immich_mobile/providers/server_info.provider.dart';
import 'package:immich_mobile/routing/router.dart'; import 'package:immich_mobile/routing/router.dart';
import 'package:immich_mobile/services/app_settings.service.dart'; import 'package:immich_mobile/services/app_settings.service.dart';
@@ -16,10 +14,9 @@ class BetaTimelineListTile extends ConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final betaTimelineValue = ref.watch(appSettingsServiceProvider).getSetting<bool>(AppSettingsEnum.betaTimeline); final betaTimelineValue = ref.watch(appSettingsServiceProvider).getSetting<bool>(AppSettingsEnum.betaTimeline);
final serverInfo = ref.watch(serverInfoProvider);
final auth = ref.watch(authProvider); final auth = ref.watch(authProvider);
if (!auth.isAuthenticated || (serverInfo.serverVersion.minor < 136 && kReleaseMode)) { if (!auth.isAuthenticated) {
return const SizedBox.shrink(); return const SizedBox.shrink();
} }

View File

@@ -3,7 +3,7 @@ Immich API
This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 1.144.1 - API version: 2.0.0
- Generator version: 7.8.0 - Generator version: 7.8.0
- Build package: org.openapitools.codegen.languages.DartClientCodegen - Build package: org.openapitools.codegen.languages.DartClientCodegen

View File

@@ -2,7 +2,7 @@ name: immich_mobile
description: Immich - selfhosted backup media file on mobile phone description: Immich - selfhosted backup media file on mobile phone
publish_to: 'none' publish_to: 'none'
version: 1.144.1+3019 version: 2.0.0+3020
environment: environment:
sdk: '>=3.8.0 <4.0.0' sdk: '>=3.8.0 <4.0.0'

View File

@@ -9858,7 +9858,7 @@
"info": { "info": {
"title": "Immich", "title": "Immich",
"description": "Immich API", "description": "Immich API",
"version": "1.144.1", "version": "2.0.0",
"contact": {} "contact": {}
}, },
"tags": [], "tags": [],

View File

@@ -1 +1 @@
22.19.0 22.20.0

View File

@@ -1,6 +1,6 @@
{ {
"name": "@immich/sdk", "name": "@immich/sdk",
"version": "1.144.1", "version": "2.0.0",
"description": "Auto-generated TypeScript SDK for the Immich API", "description": "Auto-generated TypeScript SDK for the Immich API",
"type": "module", "type": "module",
"main": "./build/index.js", "main": "./build/index.js",
@@ -28,6 +28,6 @@
"directory": "open-api/typescript-sdk" "directory": "open-api/typescript-sdk"
}, },
"volta": { "volta": {
"node": "22.19.0" "node": "22.20.0"
} }
} }

View File

@@ -1,6 +1,6 @@
/** /**
* Immich * Immich
* 1.144.1 * 2.0.0
* DO NOT MODIFY - This file has been generated using oazapfts. * DO NOT MODIFY - This file has been generated using oazapfts.
* See https://www.npmjs.com/package/oazapfts * See https://www.npmjs.com/package/oazapfts
*/ */

View File

@@ -46,13 +46,13 @@
## محتوى ## محتوى
- [الوثائق الرسمية](https://immich.app/docs) - [الوثائق الرسمية](https://docs.immich.app)
- [خريطة الطريق](https://github.com/orgs/immich-app/projects/1) - [خريطة الطريق](https://github.com/orgs/immich-app/projects/1)
- [تجريبي](#demo) - [تجريبي](#demo)
- [سمات](#features) - [سمات](#features)
- [مقدمة](https://immich.app/docs/overview/introduction) - [مقدمة](https://docs.immich.app/overview/introduction)
- [تعليمات التحميل](https://immich.app/docs/install/requirements) - [تعليمات التحميل](https://docs.immich.app/install/requirements)
- [قواعد المساهمة](https://immich.app/docs/overview/support-the-project) - [قواعد المساهمة](https://docs.immich.app/overview/support-the-project)
## توثيق ## توثيق

View File

@@ -44,13 +44,13 @@
## Contingut ## Contingut
- [Documentació oficial](https://immich.app/docs) - [Documentació oficial](https://docs.immich.app)
- [Mapa de ruta](https://github.com/orgs/immich-app/projects/1) - [Mapa de ruta](https://github.com/orgs/immich-app/projects/1)
- [Demo](#demo) - [Demo](#demo)
- [Funcionalitats](#funcionalitats) - [Funcionalitats](#funcionalitats)
- [Introducció](https://immich.app/docs/overview/introduction) - [Introducció](https://docs.immich.app/overview/introduction)
- [Instal·lació](https://immich.app/docs/install/requirements) - [Instal·lació](https://docs.immich.app/install/requirements)
- [Directrius de contribució](https://immich.app/docs/overview/support-the-project) - [Directrius de contribució](https://docs.immich.app/overview/support-the-project)
## Documentació ## Documentació

View File

@@ -50,14 +50,14 @@
## Inhalt ## Inhalt
- [Offizielle Dokumentation](https://immich.app/docs) - [Offizielle Dokumentation](https://docs.immich.app)
- [Über Immich](https://immich.app/docs/overview/introduction) - [Über Immich](https://docs.immich.app/overview/introduction)
- [Installation](https://immich.app/docs/install/requirements) - [Installation](https://docs.immich.app/install/requirements)
- [Roadmap](https://github.com/orgs/immich-app/projects/1) - [Roadmap](https://github.com/orgs/immich-app/projects/1)
- [Demo](#demo) - [Demo](#demo)
- [Funktionen](#funktionen) - [Funktionen](#funktionen)
- [Übersetzungen](https://immich.app/docs/developer/translations) - [Übersetzungen](https://docs.immich.app/developer/translations)
- [Beitragsrichtlinien](https://immich.app/docs/overview/support-the-project) - [Beitragsrichtlinien](https://docs.immich.app/overview/support-the-project)
## Demo ## Demo
@@ -107,7 +107,7 @@ Die Web-Demo kannst Du unter https://demo.immich.app finden. Für die Handy-App
## Übersetzungen ## Übersetzungen
Mehr zum Thema Übersetzungen kannst du [hier](https://immich.app/docs/developer/translations) erfahren. Mehr zum Thema Übersetzungen kannst du [hier](https://docs.immich.app/developer/translations) erfahren.
<a href="https://hosted.weblate.org/engage/immich/"> <a href="https://hosted.weblate.org/engage/immich/">
<img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="Translation status" /> <img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="Translation status" />

View File

@@ -45,13 +45,13 @@
## Contenido ## Contenido
- [Documentación oficial](https://immich.app/docs) - [Documentación oficial](https://docs.immich.app)
- [Hoja de ruta](https://github.com/orgs/immich-app/projects/1) - [Hoja de ruta](https://github.com/orgs/immich-app/projects/1)
- [Demo](#demo) - [Demo](#demo)
- [Funciones](#funciones) - [Funciones](#funciones)
- [Introducción](https://immich.app/docs/overview/introduction) - [Introducción](https://docs.immich.app/overview/introduction)
- [Instalación](https://immich.app/docs/install/requirements) - [Instalación](https://docs.immich.app/install/requirements)
- [Directrices para contribuir](https://immich.app/docs/overview/support-the-project) - [Directrices para contribuir](https://docs.immich.app/overview/support-the-project)
## Documentación ## Documentación
@@ -99,7 +99,7 @@ contraseña: demo
## Traducciones ## Traducciones
Lea mas acerca de las traducciones [acá](https://immich.app/docs/developer/translations). Lea mas acerca de las traducciones [acá](https://docs.immich.app/developer/translations).
<a href="https://hosted.weblate.org/engage/immich/"> <a href="https://hosted.weblate.org/engage/immich/">
<img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="Translation status" /> <img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="Translation status" />

View File

@@ -45,13 +45,13 @@
## Sommaire ## Sommaire
- [Documentation officielle](https://immich.app/docs) - [Documentation officielle](https://docs.immich.app)
- [Feuille de route](https://github.com/orgs/immich-app/projects/1) - [Feuille de route](https://github.com/orgs/immich-app/projects/1)
- [Démo](#démo) - [Démo](#démo)
- [Fonctionnalités](#fonctionnalités) - [Fonctionnalités](#fonctionnalités)
- [Introduction](https://immich.app/docs/overview/introduction) - [Introduction](https://docs.immich.app/overview/introduction)
- [Installation](https://immich.app/docs/install/requirements) - [Installation](https://docs.immich.app/install/requirements)
- [Contribution](https://immich.app/docs/overview/support-the-project) - [Contribution](https://docs.immich.app/overview/support-the-project)
## Documentation ## Documentation

View File

@@ -49,14 +49,14 @@
## Link utili ## Link utili
- [Documentazione](https://immich.app/docs) - [Documentazione](https://docs.immich.app)
- [Informazioni](https://immich.app/docs/overview/introduction) - [Informazioni](https://docs.immich.app/overview/introduction)
- [Installazione](https://immich.app/docs/install/requirements) - [Installazione](https://docs.immich.app/install/requirements)
- [Roadmap](https://immich.app/roadmap) - [Roadmap](https://immich.app/roadmap)
- [Demo](#demo) - [Demo](#demo)
- [Funzionalità](#funzionalità) - [Funzionalità](#funzionalità)
- [Traduzioni](https://immich.app/docs/developer/translations) - [Traduzioni](https://docs.immich.app/developer/translations)
- [Contribuire](https://immich.app/docs/overview/support-the-project) - [Contribuire](https://docs.immich.app/overview/support-the-project)
## Demo ## Demo
@@ -106,7 +106,7 @@ Per lapp mobile puoi usare `https://demo.immich.app` come `Server Endpoint UR
## Traduzioni ## Traduzioni
Scopri di più sulle traduzioni [qui](https://immich.app/docs/developer/translations). Scopri di più sulle traduzioni [qui](https://docs.immich.app/developer/translations).
<a href="https://hosted.weblate.org/engage/immich/"> <a href="https://hosted.weblate.org/engage/immich/">
<img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="Stato traduzioni" /> <img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="Stato traduzioni" />

View File

@@ -44,13 +44,13 @@
## コンテンツ ## コンテンツ
- [公式ドキュメント](https://immich.app/docs) - [公式ドキュメント](https://docs.immich.app)
- [ロードマップ](https://github.com/orgs/immich-app/projects/1) - [ロードマップ](https://github.com/orgs/immich-app/projects/1)
- [デモ](#デモ) - [デモ](#デモ)
- [機能](#機能) - [機能](#機能)
- [紹介](https://immich.app/docs/overview/introduction) - [紹介](https://docs.immich.app/overview/introduction)
- [インストール](https://immich.app/docs/install/requirements) - [インストール](https://docs.immich.app/install/requirements)
- [コントリビューションガイド](https://immich.app/docs/overview/support-the-project) - [コントリビューションガイド](https://docs.immich.app/overview/support-the-project)
## ドキュメント ## ドキュメント

View File

@@ -50,14 +50,14 @@
## 링크 ## 링크
- [문서](https://immich.app/docs) - [문서](https://docs.immich.app)
- [소개](https://immich.app/docs/overview/introduction) - [소개](https://docs.immich.app/overview/introduction)
- [설치](https://immich.app/docs/install/requirements) - [설치](https://docs.immich.app/install/requirements)
- [로드맵](https://immich.app/roadmap) - [로드맵](https://immich.app/roadmap)
- [데모](#데모) - [데모](#데모)
- [기능](#기능) - [기능](#기능)
- [번역](https://immich.app/docs/developer/tranlations) - [번역](https://docs.immich.app/developer/tranlations)
- [기여](https://immich.app/docs/overview/support-the-project) - [기여](https://docs.immich.app/overview/support-the-project)
## 데모 ## 데모
@@ -104,7 +104,7 @@
## 번역 ## 번역
번역에 대한 자세한 정보는 [이곳](https://immich.app/docs/developer/translations)에서 확인하세요. 번역에 대한 자세한 정보는 [이곳](https://docs.immich.app/developer/translations)에서 확인하세요.
<a href="https://hosted.weblate.org/engage/immich/"> <a href="https://hosted.weblate.org/engage/immich/">
<img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="번역 현황" /> <img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="번역 현황" />

View File

@@ -45,13 +45,13 @@
## Inhoud ## Inhoud
- [Officiële documentatie](https://immich.app/docs) - [Officiële documentatie](https://docs.immich.app)
- [Toekomstplannen](https://github.com/orgs/immich-app/projects/1) - [Toekomstplannen](https://github.com/orgs/immich-app/projects/1)
- [Demo](#demo) - [Demo](#demo)
- [Functies](#functies) - [Functies](#functies)
- [Introductie](https://immich.app/docs/overview/introduction) - [Introductie](https://docs.immich.app/overview/introduction)
- [Installatie](https://immich.app/docs/install/requirements) - [Installatie](https://docs.immich.app/install/requirements)
- [Richtlijnen voor bijdragen](https://immich.app/docs/overview/support-the-project) - [Richtlijnen voor bijdragen](https://docs.immich.app/overview/support-the-project)
## Documentatie ## Documentatie
@@ -102,7 +102,7 @@ Je kunt de demo [hier](https://demo.immich.app/) bekijken. Voor de mobiele app k
## Vertalingen ## Vertalingen
Je kunt [hier](https://immich.app/docs/developer/translations) meer over vertalingen lezen. Je kunt [hier](https://docs.immich.app/developer/translations) meer over vertalingen lezen.
## Repository activiteit ## Repository activiteit

View File

@@ -55,14 +55,14 @@
## Links ## Links
- [Documentação](https://immich.app/docs) - [Documentação](https://docs.immich.app)
- [Sobre](https://immich.app/docs/overview/introduction) - [Sobre](https://docs.immich.app/overview/introduction)
- [Instalação](https://immich.app/docs/install/requirements) - [Instalação](https://docs.immich.app/install/requirements)
- [Roadmap](https://github.com/orgs/immich-app/projects/1) - [Roadmap](https://github.com/orgs/immich-app/projects/1)
- [Demonstração](#demonstração) - [Demonstração](#demonstração)
- [Funcionalidades](#funcionalidades) - [Funcionalidades](#funcionalidades)
- [Traduções](https://immich.app/docs/developer/translations) - [Traduções](https://docs.immich.app/developer/translations)
- [Diretrizes de Contribuição](https://immich.app/docs/overview/support-the-project) - [Diretrizes de Contribuição](https://docs.immich.app/overview/support-the-project)
## Demonstração ## Demonstração
@@ -115,7 +115,7 @@ Acesse a demonstração [aqui](https://demo.immich.app). No aplicativo para disp
## Traduções ## Traduções
Leia mais sobre as traduções Leia mais sobre as traduções
[aqui](https://immich.app/docs/developer/translations). [aqui](https://docs.immich.app/developer/translations).
<a href="https://hosted.weblate.org/engage/immich/"> <a href="https://hosted.weblate.org/engage/immich/">
<img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="Status da tradução" /> <img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="Status da tradução" />

View File

@@ -51,14 +51,14 @@
## Содержание ## Содержание
- [Официальная документация](https://immich.app/docs) - [Официальная документация](https://docs.immich.app)
- [Введение](https://immich.app/docs/overview/introduction) - [Введение](https://docs.immich.app/overview/introduction)
- [Установка](https://immich.app/docs/install/requirements) - [Установка](https://docs.immich.app/install/requirements)
- [План разработки](https://github.com/orgs/immich-app/projects/1) - [План разработки](https://github.com/orgs/immich-app/projects/1)
- [Демо](#demo) - [Демо](#demo)
- [Возможности](#features) - [Возможности](#features)
- [Перевод](https://immich.app/docs/developer/translations) - [Перевод](https://docs.immich.app/developer/translations)
- [Гид по участию и поддержке проекта](https://immich.app/docs/overview/support-the-project) - [Гид по участию и поддержке проекта](https://docs.immich.app/overview/support-the-project)
## Демо ## Демо
@@ -107,7 +107,7 @@
## Перевод ## Перевод
Всё про перевод проекта [Здесь](https://immich.app/docs/developer/translations). Всё про перевод проекта [Здесь](https://docs.immich.app/developer/translations).
<a href="https://hosted.weblate.org/engage/immich/"> <a href="https://hosted.weblate.org/engage/immich/">
<img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="Translation status" /> <img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="Translation status" />

View File

@@ -46,13 +46,13 @@
## Innehåll ## Innehåll
- [Officiell Dokumentation](https://immich.app/docs) - [Officiell Dokumentation](https://docs.immich.app)
- [Roadmap](https://github.com/orgs/immich-app/projects/1) - [Roadmap](https://github.com/orgs/immich-app/projects/1)
- [Demo](#demo) - [Demo](#demo)
- [Funktioner](#features) - [Funktioner](#features)
- [Introduktion](https://immich.app/docs/overview/introduction) - [Introduktion](https://docs.immich.app/overview/introduction)
- [Installation](https://immich.app/docs/install/requirements) - [Installation](https://docs.immich.app/install/requirements)
- [Riktlinjer för Bidrag](https://immich.app/docs/overview/support-the-project) - [Riktlinjer för Bidrag](https://docs.immich.app/overview/support-the-project)
## Dokumentation ## Dokumentation

View File

@@ -52,14 +52,14 @@
## ลิงก์ ## ลิงก์
- [คู่มือ](https://immich.app/docs) - [คู่มือ](https://docs.immich.app)
- [เกี่ยวกับ](https://immich.app/docs/overview/introduction) - [เกี่ยวกับ](https://docs.immich.app/overview/introduction)
- [การติดตั้ง](https://immich.app/docs/install/requirements) - [การติดตั้ง](https://docs.immich.app/install/requirements)
- [โรดแมป](https://immich.app/roadmap) - [โรดแมป](https://immich.app/roadmap)
- [สาธิต](#สาธิต) - [สาธิต](#สาธิต)
- [คุณสมบัติ](#คุณสมบัติ) - [คุณสมบัติ](#คุณสมบัติ)
- [การแปลภาษา](https://immich.app/docs/developer/translations) - [การแปลภาษา](https://docs.immich.app/developer/translations)
- [สนับสนุนโพรเจกต์](https://immich.app/docs/overview/support-the-project) - [สนับสนุนโพรเจกต์](https://docs.immich.app/overview/support-the-project)
## สาธิต ## สาธิต
@@ -106,7 +106,7 @@
## การแปลภาษา ## การแปลภาษา
อ่านเพิ่มเติมเกี่ยวกับการแปล [ที่นี่](https://immich.app/docs/developer/translations) อ่านเพิ่มเติมเกี่ยวกับการแปล [ที่นี่](https://docs.immich.app/developer/translations)
<a href="https://hosted.weblate.org/engage/immich/"> <a href="https://hosted.weblate.org/engage/immich/">
<img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="สถานะการแปล" /> <img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="สถานะการแปล" />

View File

@@ -44,13 +44,13 @@
## Content ## Content
- [Resmi Belgeler](https://immich.app/docs) - [Resmi Belgeler](https://docs.immich.app)
- [Yol Haritası](https://github.com/orgs/immich-app/projects/1) - [Yol Haritası](https://github.com/orgs/immich-app/projects/1)
- [Demo](#demo) - [Demo](#demo)
- [Özellikler](#özellikler) - [Özellikler](#özellikler)
- [Giriş](https://immich.app/docs/overview/introduction) - [Giriş](https://docs.immich.app/overview/introduction)
- [Kurulum](https://immich.app/docs/install/requirements) - [Kurulum](https://docs.immich.app/install/requirements)
- [Katkı Sağlama Rehberi](https://immich.app/docs/overview/support-the-project) - [Katkı Sağlama Rehberi](https://docs.immich.app/overview/support-the-project)
## Belgeler ## Belgeler

View File

@@ -50,14 +50,14 @@
## Посилання ## Посилання
- [Документація](https://immich.app/docs) - [Документація](https://docs.immich.app)
- [Про проєкт](https://immich.app/docs/overview/introduction) - [Про проєкт](https://docs.immich.app/overview/introduction)
- [Встановлення](https://immich.app/docs/install/requirements) - [Встановлення](https://docs.immich.app/install/requirements)
- [Дорожня карта](https://immich.app/roadmap) - [Дорожня карта](https://immich.app/roadmap)
- [Демо](#демо) - [Демо](#демо)
- [Функції](#функції) - [Функції](#функції)
- [Переклади](https://immich.app/docs/developer/translations) - [Переклади](https://docs.immich.app/developer/translations)
- [Гід для розробки проєкту](https://immich.app/docs/overview/support-the-project) - [Гід для розробки проєкту](https://docs.immich.app/overview/support-the-project)
## Демо ## Демо
@@ -106,7 +106,7 @@
## Переклади ## Переклади
Більше про переклади [тут](https://immich.app/docs/developer/translations). Більше про переклади [тут](https://docs.immich.app/developer/translations).
<a href="https://hosted.weblate.org/engage/immich/"> <a href="https://hosted.weblate.org/engage/immich/">
<img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="Статус перекладів" /> <img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="Статус перекладів" />

View File

@@ -52,14 +52,14 @@
## Liên kết ## Liên kết
- [Tài liệu](https://immich.app/docs) - [Tài liệu](https://docs.immich.app)
- [Giới thiệu](https://immich.app/docs/overview/introduction) - [Giới thiệu](https://docs.immich.app/overview/introduction)
- [Cài đặt](https://immich.app/docs/install/requirements) - [Cài đặt](https://docs.immich.app/install/requirements)
- [Lộ trình](https://immich.app/roadmap) - [Lộ trình](https://immich.app/roadmap)
- [Demo](#demo) - [Demo](#demo)
- [Tính năng](#Tính-năng) - [Tính năng](#Tính-năng)
- [Dịch thuật](https://immich.app/docs/developer/translations) - [Dịch thuật](https://docs.immich.app/developer/translations)
- [Đóng góp](https://immich.app/docs/overview/support-the-project) - [Đóng góp](https://docs.immich.app/overview/support-the-project)
## Demo ## Demo
@@ -106,7 +106,7 @@ Truy cập bản demo [tại đây](https://demo.immich.app). Đối với ứng
## Dịch thuật ## Dịch thuật
Đọc thêm về dịch thuật [tại đây](https://immich.app/docs/developer/translations). Đọc thêm về dịch thuật [tại đây](https://docs.immich.app/developer/translations).
<a href="https://hosted.weblate.org/engage/immich/"> <a href="https://hosted.weblate.org/engage/immich/">
<img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="Tình trạng dịch thuật" /> <img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="Tình trạng dịch thuật" />

View File

@@ -54,14 +54,14 @@
## 目录 ## 目录
- [官方文档](https://immich.app/docs) - [官方文档](https://docs.immich.app)
- [项目总览](https://immich.app/docs/overview/introduction) - [项目总览](https://docs.immich.app/overview/introduction)
- [安装教程](https://immich.app/docs/install/requirements) - [安装教程](https://docs.immich.app/install/requirements)
- [路线图](https://immich.app/roadmap) - [路线图](https://immich.app/roadmap)
- [在线演示](#示例) - [在线演示](#示例)
- [功能特性](#功能特性) - [功能特性](#功能特性)
- [多语言](https://immich.app/docs/developer/translations) - [多语言](https://docs.immich.app/developer/translations)
- [贡献者](https://immich.app/docs/overview/support-the-project) - [贡献者](https://docs.immich.app/overview/support-the-project)
## 示例 ## 示例
@@ -110,7 +110,7 @@
## 多语言 ## 多语言
关于翻译的更多信息请参见[此处](https://immich.app/docs/developer/translations)。 关于翻译的更多信息请参见[此处](https://docs.immich.app/developer/translations)。
<a href="https://hosted.weblate.org/engage/immich/"> <a href="https://hosted.weblate.org/engage/immich/">
<img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="翻译进度" /> <img src="https://hosted.weblate.org/widget/immich/immich/multi-auto.svg" alt="翻译进度" />

View File

@@ -1 +1 @@
22.19.0 22.20.0

View File

@@ -1,12 +1,13 @@
#!/usr/bin/env bash #!/usr/bin/env bash
echo "Initializing Immich $IMMICH_SOURCE_REF" echo "Initializing Immich $IMMICH_SOURCE_REF"
lib_path="/usr/lib/$(arch)-linux-gnu/libmimalloc.so.3" # TODO: Update to mimalloc v3 when verified memory isn't released issue is fixed
if [ -f "$lib_path" ]; then # lib_path="/usr/lib/$(arch)-linux-gnu/libmimalloc.so.3"
export LD_PRELOAD="$lib_path" # if [ -f "$lib_path" ]; then
else # export LD_PRELOAD="$lib_path"
echo "skipping libmimalloc - path not found $lib_path" # else
fi # echo "skipping libmimalloc - path not found $lib_path"
# fi
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/lib/jellyfin-ffmpeg/lib" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/lib/jellyfin-ffmpeg/lib"
SERVER_HOME="$(readlink -f "$(dirname "$0")/..")" SERVER_HOME="$(readlink -f "$(dirname "$0")/..")"

View File

@@ -1,6 +1,6 @@
{ {
"name": "immich", "name": "immich",
"version": "1.144.1", "version": "2.0.0",
"description": "", "description": "",
"author": "", "author": "",
"private": true, "private": true,
@@ -161,7 +161,7 @@
"vitest": "^3.0.0" "vitest": "^3.0.0"
}, },
"volta": { "volta": {
"node": "22.19.0" "node": "22.20.0"
}, },
"overrides": { "overrides": {
"sharp": "^0.34.3" "sharp": "^0.34.3"

View File

@@ -29,8 +29,8 @@ export const AlbumUpdateEmail = ({
</Text> </Text>
<Text> <Text>
New media has been added to <strong>{albumName}</strong>, New media has been added to <strong>{albumName}</strong>.
<br /> check it out! <br /> Check it out!
</Text> </Text>
</> </>
); );

View File

@@ -1,12 +1,12 @@
import React from 'react'; import React from 'react';
import { Button, ButtonProps } from '@react-email/components'; import { Button, ButtonProps, Text } from '@react-email/components';
export const ImmichButton = ({ children, ...props }: ButtonProps) => ( export const ImmichButton = ({ children, ...props }: ButtonProps) => (
<Button <Button
{...props} {...props}
className="py-3 px-8 border bg-immich-primary rounded-full no-underline hover:no-underline text-white hover:text-gray-50 font-bold uppercase" className="border bg-immich-primary rounded-full no-underline hover:no-underline text-white hover:text-gray-50 font-bold uppercase"
> >
{children} <Text className="my-3 mx-8">{children}</Text>
</Button> </Button>
); );

View File

@@ -22,7 +22,7 @@ const messages = {
The ${name} extension version is ${version}, which means it is a nightly release. The ${name} extension version is ${version}, which means it is a nightly release.
Please run 'DROP EXTENSION IF EXISTS ${extension}' and switch to a release version. Please run 'DROP EXTENSION IF EXISTS ${extension}' and switch to a release version.
See https://immich.app/docs/guides/database-queries for how to query the database.`, See https://docs.immich.app/guides/database-queries for how to query the database.`,
outOfRange: ({ name, version, range }: OutOfRangeArgs) => outOfRange: ({ name, version, range }: OutOfRangeArgs) =>
`The ${name} extension version is ${version}, but Immich only supports ${range}. `The ${name} extension version is ${version}, but Immich only supports ${range}.
Please change ${name} to a compatible version in the Postgres instance.`, Please change ${name} to a compatible version in the Postgres instance.`,
@@ -32,20 +32,20 @@ const messages = {
If the Postgres instance already has ${name} installed, Immich may not have the necessary permissions to activate it. If the Postgres instance already has ${name} installed, Immich may not have the necessary permissions to activate it.
In this case, please run 'CREATE EXTENSION IF NOT EXISTS ${extension} CASCADE' manually as a superuser. In this case, please run 'CREATE EXTENSION IF NOT EXISTS ${extension} CASCADE' manually as a superuser.
See https://immich.app/docs/guides/database-queries for how to query the database.`, See https://docs.immich.app/guides/database-queries for how to query the database.`,
updateFailed: ({ name, extension, availableVersion }: UpdateFailedArgs) => updateFailed: ({ name, extension, availableVersion }: UpdateFailedArgs) =>
`The ${name} extension can be updated to ${availableVersion}. `The ${name} extension can be updated to ${availableVersion}.
Immich attempted to update the extension, but failed to do so. Immich attempted to update the extension, but failed to do so.
This may be because Immich does not have the necessary permissions to update the extension. This may be because Immich does not have the necessary permissions to update the extension.
Please run 'ALTER EXTENSION ${extension} UPDATE' manually as a superuser. Please run 'ALTER EXTENSION ${extension} UPDATE' manually as a superuser.
See https://immich.app/docs/guides/database-queries for how to query the database.`, See https://docs.immich.app/guides/database-queries for how to query the database.`,
dropFailed: ({ name, extension }: DropFailedArgs) => dropFailed: ({ name, extension }: DropFailedArgs) =>
`The ${name} extension is no longer needed, but could not be dropped. `The ${name} extension is no longer needed, but could not be dropped.
This may be because Immich does not have the necessary permissions to drop the extension. This may be because Immich does not have the necessary permissions to drop the extension.
Please run 'DROP EXTENSION ${extension};' manually as a superuser. Please run 'DROP EXTENSION ${extension};' manually as a superuser.
See https://immich.app/docs/guides/database-queries for how to query the database.`, See https://docs.immich.app/guides/database-queries for how to query the database.`,
restartRequired: ({ name, availableVersion }: RestartRequiredArgs) => restartRequired: ({ name, availableVersion }: RestartRequiredArgs) =>
`The ${name} extension has been updated to ${availableVersion}. `The ${name} extension has been updated to ${availableVersion}.
Please restart the Postgres instance to complete the update.`, Please restart the Postgres instance to complete the update.`,
@@ -55,7 +55,7 @@ const messages = {
If ${name} ${installedVersion} is compatible with Immich, please ensure the Postgres instance has this available.`, If ${name} ${installedVersion} is compatible with Immich, please ensure the Postgres instance has this available.`,
deprecatedExtension: (name: string) => deprecatedExtension: (name: string) =>
`DEPRECATION WARNING: The ${name} extension is deprecated and support for it will be removed very soon. `DEPRECATION WARNING: The ${name} extension is deprecated and support for it will be removed very soon.
See https://immich.app/docs/install/upgrading#migrating-to-vectorchord in order to switch to the VectorChord extension instead.`, See https://docs.immich.app/install/upgrading#migrating-to-vectorchord in order to switch to the VectorChord extension instead.`,
}; };
@Injectable() @Injectable()

View File

@@ -15,7 +15,7 @@ import { BaseService } from 'src/services/base.service';
import { JobOf, SystemFlags } from 'src/types'; import { JobOf, SystemFlags } from 'src/types';
import { ImmichStartupError } from 'src/utils/misc'; import { ImmichStartupError } from 'src/utils/misc';
const docsMessage = `Please see https://immich.app/docs/administration/system-integrity#folder-checks for more information.`; const docsMessage = `Please see https://docs.immich.app/administration/system-integrity#folder-checks for more information.`;
@Injectable() @Injectable()
export class StorageService extends BaseService { export class StorageService extends BaseService {

View File

@@ -1 +1 @@
22.19.0 22.20.0

View File

@@ -1,6 +1,6 @@
{ {
"name": "immich-web", "name": "immich-web",
"version": "1.144.1", "version": "2.0.0",
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"type": "module", "type": "module",
"scripts": { "scripts": {
@@ -107,6 +107,6 @@
"vitest": "^3.0.0" "vitest": "^3.0.0"
}, },
"volta": { "volta": {
"node": "22.19.0" "node": "22.20.0"
} }
} }

View File

@@ -86,7 +86,7 @@
<FormatMessage key="admin.oauth_settings_more_details"> <FormatMessage key="admin.oauth_settings_more_details">
{#snippet children({ message })} {#snippet children({ message })}
<a <a
href="https://immich.app/docs/administration/oauth" href="https://docs.immich.app/administration/oauth"
class="underline" class="underline"
target="_blank" target="_blank"
rel="noreferrer" rel="noreferrer"

View File

@@ -67,7 +67,7 @@
<FormatMessage key="admin.map_manage_reverse_geocoding_settings"> <FormatMessage key="admin.map_manage_reverse_geocoding_settings">
{#snippet children({ message })} {#snippet children({ message })}
<a <a
href="https://immich.app/docs/features/reverse-geocoding" href="https://docs.immich.app/features/reverse-geocoding"
class="underline" class="underline"
target="_blank" target="_blank"
rel="noreferrer" rel="noreferrer"

View File

@@ -119,7 +119,7 @@
{#snippet children({ tag, message })} {#snippet children({ tag, message })}
{#if tag === 'template-link'} {#if tag === 'template-link'}
<a <a
href="https://immich.app/docs/administration/storage-template" href="https://docs.immich.app/administration/storage-template"
class="underline" class="underline"
target="_blank" target="_blank"
rel="noreferrer" rel="noreferrer"
@@ -128,7 +128,7 @@
</a> </a>
{:else if tag === 'implications-link'} {:else if tag === 'implications-link'}
<a <a
href="https://immich.app/docs/administration/backup-and-restore#asset-types-and-storage-locations" href="https://docs.immich.app/administration/backup-and-restore#asset-types-and-storage-locations"
class="underline" class="underline"
target="_blank" target="_blank"
rel="noreferrer" rel="noreferrer"

View File

@@ -91,7 +91,7 @@
</a> </a>
<a <a
href="https://immich.app/docs/guides/docker-help" href="https://docs.immich.app/guides/docker-help"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
class="flex grow basis-0 justify-center p-4" class="flex grow basis-0 justify-center p-4"

View File

@@ -53,7 +53,7 @@
<FormatMessage key="admin.backup_onboarding_footer"> <FormatMessage key="admin.backup_onboarding_footer">
{#snippet children({ message })} {#snippet children({ message })}
<a <a
href="https://immich.app/docs/administration/backup-and-restore/" href="https://docs.immich.app/administration/backup-and-restore/"
class="underline" class="underline"
target="_blank" target="_blank"
rel="noreferrer" rel="noreferrer"

View File

@@ -21,7 +21,7 @@
<p> <p>
<FormatMessage key="admin.storage_template_onboarding_description_v2"> <FormatMessage key="admin.storage_template_onboarding_description_v2">
{#snippet children({ message })} {#snippet children({ message })}
<a class="underline" href="https://immich.app/docs/administration/storage-template">{message}</a> <a class="underline" href="https://docs.immich.app/administration/storage-template">{message}</a>
{/snippet} {/snippet}
</FormatMessage> </FormatMessage>
</p> </p>

View File

@@ -19,7 +19,7 @@
<FormatMessage key="admin.authentication_settings_reenable"> <FormatMessage key="admin.authentication_settings_reenable">
{#snippet children({ message })} {#snippet children({ message })}
<a <a
href="https://immich.app/docs/administration/server-commands" href="https://docs.immich.app/administration/server-commands"
rel="noreferrer" rel="noreferrer"
target="_blank" target="_blank"
class="underline" class="underline"

View File

@@ -18,7 +18,7 @@
<p>{$t('official_immich_resources')}</p> <p>{$t('official_immich_resources')}</p>
<div class="flex flex-col sm:grid sm:grid-cols-2 gap-2 mt-5"> <div class="flex flex-col sm:grid sm:grid-cols-2 gap-2 mt-5">
<div> <div>
<a href="https://{info.version}.archive.immich.app/docs/overview/introduction" target="_blank" rel="noreferrer"> <a href="https://{info.version}.archive.docs.immich.app/overview/introduction" target="_blank" rel="noreferrer">
<Icon icon={mdiInformationOutline} size="1.5em" class="inline-block" /> <Icon icon={mdiInformationOutline} size="1.5em" class="inline-block" />
<p class="font-medium text-primary text-sm underline inline-block" id="documentation-label"> <p class="font-medium text-primary text-sm underline inline-block" id="documentation-label">
{$t('documentation')} {$t('documentation')}

View File

@@ -25,7 +25,7 @@ export interface Events {
on_person_thumbnail: (personId: string) => void; on_person_thumbnail: (personId: string) => void;
on_server_version: (serverVersion: ServerVersionResponseDto) => void; on_server_version: (serverVersion: ServerVersionResponseDto) => void;
on_config_update: () => void; on_config_update: () => void;
on_new_release: (newRelase: ReleaseEvent) => void; on_new_release: (newRelease: ReleaseEvent) => void;
on_session_delete: (sessionId: string) => void; on_session_delete: (sessionId: string) => void;
on_notification: (notification: NotificationDto) => void; on_notification: (notification: NotificationDto) => void;
} }

25
web/src/lib/utils.spec.ts Normal file
View File

@@ -0,0 +1,25 @@
import { getReleaseType } from '$lib/utils';
describe('utils', () => {
describe(getReleaseType.name, () => {
it('should return "major" for major version changes', () => {
expect(getReleaseType({ major: 1, minor: 0, patch: 0 }, { major: 2, minor: 0, patch: 0 })).toBe('major');
expect(getReleaseType({ major: 1, minor: 0, patch: 0 }, { major: 3, minor: 2, patch: 1 })).toBe('major');
});
it('should return "minor" for minor version changes', () => {
expect(getReleaseType({ major: 1, minor: 0, patch: 0 }, { major: 1, minor: 1, patch: 0 })).toBe('minor');
expect(getReleaseType({ major: 1, minor: 0, patch: 0 }, { major: 1, minor: 2, patch: 1 })).toBe('minor');
});
it('should return "patch" for patch version changes', () => {
expect(getReleaseType({ major: 1, minor: 0, patch: 0 }, { major: 1, minor: 0, patch: 1 })).toBe('patch');
expect(getReleaseType({ major: 1, minor: 0, patch: 0 }, { major: 1, minor: 0, patch: 5 })).toBe('patch');
});
it('should return "none" for matching versions', () => {
expect(getReleaseType({ major: 1, minor: 0, patch: 0 }, { major: 1, minor: 0, patch: 0 })).toBe('none');
expect(getReleaseType({ major: 1, minor: 2, patch: 3 }, { major: 1, minor: 2, patch: 3 })).toBe('none');
});
});
});

View File

@@ -21,6 +21,7 @@ import {
unlinkOAuthAccount, unlinkOAuthAccount,
type MemoryResponseDto, type MemoryResponseDto,
type PersonResponseDto, type PersonResponseDto,
type ServerVersionResponseDto,
type SharedLinkResponseDto, type SharedLinkResponseDto,
type UserResponseDto, type UserResponseDto,
} from '@immich/sdk'; } from '@immich/sdk';
@@ -385,3 +386,22 @@ export function createDateFormatter(localeCode: string | undefined): DateFormatt
}, },
}; };
} }
export const getReleaseType = (
current: ServerVersionResponseDto,
newVersion: ServerVersionResponseDto,
): 'major' | 'minor' | 'patch' | 'none' => {
if (current.major !== newVersion.major) {
return 'major';
}
if (current.minor !== newVersion.minor) {
return 'minor';
}
if (current.patch !== newVersion.patch) {
return 'patch';
}
return 'none';
};

View File

@@ -18,7 +18,7 @@
websocketStore, websocketStore,
type ReleaseEvent, type ReleaseEvent,
} from '$lib/stores/websocket'; } from '$lib/stores/websocket';
import { copyToClipboard } from '$lib/utils'; import { copyToClipboard, getReleaseType } from '$lib/utils';
import { isAssetViewerRoute } from '$lib/utils/navigation'; import { isAssetViewerRoute } from '$lib/utils/navigation';
import type { ServerVersionResponseDto } from '@immich/sdk'; import type { ServerVersionResponseDto } from '@immich/sdk';
import { modalManager, setTranslations } from '@immich/ui'; import { modalManager, setTranslations } from '@immich/ui';
@@ -85,8 +85,9 @@
const releaseVersion = semverToName(release.releaseVersion); const releaseVersion = semverToName(release.releaseVersion);
const serverVersion = semverToName(release.serverVersion); const serverVersion = semverToName(release.serverVersion);
const type = getReleaseType(release.serverVersion, release.releaseVersion);
if (localStorage.getItem('appVersion') === releaseVersion) { if (type === 'none' || type === 'patch' || localStorage.getItem('appVersion') === releaseVersion) {
return; return;
} }