1
0
forked from Cutlery/immich

Merge branch 'main' of https://github.com/immich-app/immich into feat/offline-files-job

This commit is contained in:
Jonathan Jogenfors 2024-03-14 20:43:56 +01:00
commit 68a49258cb
8 changed files with 39 additions and 29 deletions

View File

@ -58,7 +58,7 @@ jobs:
uses: docker/setup-qemu-action@v3.0.0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3.1.0
uses: docker/setup-buildx-action@v3.2.0
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
@ -87,7 +87,7 @@ jobs:
type=raw,value=latest,enable=${{ github.event_name == 'workflow_dispatch' }}
- name: Build and push image
uses: docker/build-push-action@v5.2.0
uses: docker/build-push-action@v5.3.0
with:
file: cli/Dockerfile
platforms: linux/amd64,linux/arm64

View File

@ -66,7 +66,7 @@ jobs:
uses: docker/setup-qemu-action@v3.0.0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3.1.0
uses: docker/setup-buildx-action@v3.2.0
# Workaround to fix error:
# failed to push: failed to copy: io: read/write on closed pipe
# See https://github.com/docker/build-push-action/issues/761
@ -121,7 +121,7 @@ jobs:
fi
- name: Build and push image
uses: docker/build-push-action@v5.2.0
uses: docker/build-push-action@v5.3.0
with:
context: ${{ matrix.context }}
file: ${{ matrix.file }}

View File

@ -211,8 +211,8 @@ class AlbumViewerAppbar extends HookConsumerWidget
return SafeArea(
child: Padding(
padding: const EdgeInsets.only(top: 24.0),
child: Column(
mainAxisSize: MainAxisSize.min,
child: ListView(
shrinkWrap: true,
children: [
...buildBottomSheetActions(),
if (onAddPhotos != null) ...commonActions,

View File

@ -142,6 +142,7 @@ class AlbumOptionsPage extends HookConsumerWidget {
buildSharedUsersList() {
return ListView.builder(
primary: false,
shrinkWrap: true,
itemCount: sharedUsers.value.length,
itemBuilder: (context, index) {
@ -188,9 +189,7 @@ class AlbumOptionsPage extends HookConsumerWidget {
centerTitle: true,
title: Text("translated_text_options".tr()),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
body: ListView(
children: [
if (isOwner && album.shared)
SwitchListTile.adaptive(

View File

@ -63,8 +63,7 @@ class SelectAdditionalUserForSharingPage extends HookConsumerWidget {
),
);
}
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
return ListView(
children: [
Wrap(
children: [...usersChip],
@ -81,6 +80,7 @@ class SelectAdditionalUserForSharingPage extends HookConsumerWidget {
),
),
ListView.builder(
primary: false,
shrinkWrap: true,
itemBuilder: ((context, index) {
return ListTile(

View File

@ -90,8 +90,7 @@ class SelectUserForSharingPage extends HookConsumerWidget {
),
);
}
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
return ListView(
children: [
Wrap(
children: [...usersChip],
@ -108,6 +107,7 @@ class SelectUserForSharingPage extends HookConsumerWidget {
).tr(),
),
ListView.builder(
primary: false,
shrinkWrap: true,
itemBuilder: ((context, index) {
return ListTile(

View File

@ -428,10 +428,8 @@ class SharedLinkEditPage extends HookConsumerWidget {
leading: const CloseButton(),
centerTitle: false,
),
resizeToAvoidBottomInset: false,
body: SafeArea(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
child: ListView(
children: [
Padding(
padding: const EdgeInsets.all(padding),
@ -487,7 +485,10 @@ class SharedLinkEditPage extends HookConsumerWidget {
Align(
alignment: Alignment.bottomRight,
child: Padding(
padding: const EdgeInsets.only(right: padding + 10),
padding: const EdgeInsets.only(
right: padding + 10,
bottom: padding,
),
child: ElevatedButton(
onPressed:
existingLink != null ? handleEditLink : handleNewLink,
@ -508,6 +509,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
padding: const EdgeInsets.only(
left: padding,
right: padding,
bottom: padding,
),
child: buildNewLinkField(),
),

View File

@ -299,12 +299,18 @@ export class LibraryService extends EventEmitter {
}
private async scanAssets(libraryId: string, assetPaths: string[], ownerId: string, force = false) {
this.logger.verbose(`Queuing refresh of ${assetPaths.length} asset(s)`);
// We perform this in batches to save on memory when performing large refreshes (greater than 1M assets)
const batchSize = 5000;
for (let i = 0; i < assetPaths.length; i += batchSize) {
const batch = assetPaths.slice(i, i + batchSize);
await this.jobRepository.queueAll(
assetPaths.map((assetPath) => ({
batch.map((assetPath) => ({
name: JobName.LIBRARY_SCAN_ASSET,
data: {
id: libraryId,
assetPath: path.normalize(assetPath),
assetPath: assetPath,
ownerId,
force,
},
@ -312,6 +318,9 @@ export class LibraryService extends EventEmitter {
);
}
this.logger.debug('Asset refresh queue completed');
}
private async validateImportPath(importPath: string): Promise<ValidateLibraryImportPathResponseDto> {
const validation = new ValidateLibraryImportPathResponseDto();
validation.importPath = importPath;
@ -664,7 +673,7 @@ export class LibraryService extends EventEmitter {
return false;
}
this.logger.verbose(`Refreshing library: ${job.id}`);
this.logger.log(`Refreshing library: ${job.id}`);
const pathValidation = await Promise.all(
library.importPaths.map(async (importPath) => await this.validateImportPath(importPath)),