mirror of
https://github.com/samsonjs/immich.git
synced 2026-03-25 09:15:56 +00:00
feat: make memories slideshow duration configurable (#22783)
This commit is contained in:
parent
4905bba694
commit
9cc88ed2a6
11 changed files with 37 additions and 2 deletions
|
|
@ -2027,6 +2027,7 @@
|
|||
"third_party_resources": "Third-Party Resources",
|
||||
"time": "Time",
|
||||
"time_based_memories": "Time-based memories",
|
||||
"time_based_memories_duration": "Number of seconds to display each image.",
|
||||
"timeline": "Timeline",
|
||||
"timezone": "Timezone",
|
||||
"to_archive": "Archive",
|
||||
|
|
|
|||
BIN
mobile/openapi/lib/model/memories_response.dart
generated
BIN
mobile/openapi/lib/model/memories_response.dart
generated
Binary file not shown.
BIN
mobile/openapi/lib/model/memories_update.dart
generated
BIN
mobile/openapi/lib/model/memories_update.dart
generated
Binary file not shown.
|
|
@ -12646,18 +12646,27 @@
|
|||
},
|
||||
"MemoriesResponse": {
|
||||
"properties": {
|
||||
"duration": {
|
||||
"default": 5,
|
||||
"type": "integer"
|
||||
},
|
||||
"enabled": {
|
||||
"default": true,
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"duration",
|
||||
"enabled"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
"MemoriesUpdate": {
|
||||
"properties": {
|
||||
"duration": {
|
||||
"minimum": 1,
|
||||
"type": "integer"
|
||||
},
|
||||
"enabled": {
|
||||
"type": "boolean"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -152,6 +152,7 @@ export type FoldersResponse = {
|
|||
sidebarWeb: boolean;
|
||||
};
|
||||
export type MemoriesResponse = {
|
||||
duration: number;
|
||||
enabled: boolean;
|
||||
};
|
||||
export type PeopleResponse = {
|
||||
|
|
@ -209,6 +210,7 @@ export type FoldersUpdate = {
|
|||
sidebarWeb?: boolean;
|
||||
};
|
||||
export type MemoriesUpdate = {
|
||||
duration?: number;
|
||||
enabled?: boolean;
|
||||
};
|
||||
export type PeopleUpdate = {
|
||||
|
|
|
|||
|
|
@ -13,6 +13,12 @@ class AvatarUpdate {
|
|||
class MemoriesUpdate {
|
||||
@ValidateBoolean({ optional: true })
|
||||
enabled?: boolean;
|
||||
|
||||
@Optional()
|
||||
@IsInt()
|
||||
@IsPositive()
|
||||
@ApiProperty({ type: 'integer' })
|
||||
duration?: number;
|
||||
}
|
||||
|
||||
class RatingsUpdate {
|
||||
|
|
@ -166,6 +172,9 @@ class RatingsResponse {
|
|||
|
||||
class MemoriesResponse {
|
||||
enabled: boolean = true;
|
||||
|
||||
@ApiProperty({ type: 'integer' })
|
||||
duration: number = 5;
|
||||
}
|
||||
|
||||
class FoldersResponse {
|
||||
|
|
|
|||
|
|
@ -497,6 +497,7 @@ export interface UserPreferences {
|
|||
};
|
||||
memories: {
|
||||
enabled: boolean;
|
||||
duration: number;
|
||||
};
|
||||
people: {
|
||||
enabled: boolean;
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ const getDefaultPreferences = (): UserPreferences => {
|
|||
},
|
||||
memories: {
|
||||
enabled: true,
|
||||
duration: 5,
|
||||
},
|
||||
people: {
|
||||
enabled: true,
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@
|
|||
});
|
||||
} else {
|
||||
progressBarController = new Tween<number>(0, {
|
||||
duration: (from: number, to: number) => (to ? 5000 * (to - from) : 0),
|
||||
duration: (from: number, to: number) => (to ? $preferences.memories.duration * 1000 * (to - from) : 0),
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
<script lang="ts">
|
||||
import SettingAccordion from '$lib/components/shared-components/settings/setting-accordion.svelte';
|
||||
import SettingInputField from '$lib/components/shared-components/settings/setting-input-field.svelte';
|
||||
import SettingSelect from '$lib/components/shared-components/settings/setting-select.svelte';
|
||||
import SettingSwitch from '$lib/components/shared-components/settings/setting-switch.svelte';
|
||||
import { SettingInputFieldType } from '$lib/constants';
|
||||
import { preferences } from '$lib/stores/user.store';
|
||||
import { handleError } from '$lib/utils/handle-error';
|
||||
import { AssetOrder, updateMyPreferences } from '@immich/sdk';
|
||||
|
|
@ -18,6 +20,7 @@
|
|||
|
||||
// Memories
|
||||
let memoriesEnabled = $state($preferences?.memories?.enabled ?? true);
|
||||
let memoriesDuration = $state($preferences?.memories?.duration ?? 5);
|
||||
|
||||
// People
|
||||
let peopleEnabled = $state($preferences?.people?.enabled ?? false);
|
||||
|
|
@ -43,7 +46,7 @@
|
|||
userPreferencesUpdateDto: {
|
||||
albums: { defaultAssetOrder },
|
||||
folders: { enabled: foldersEnabled, sidebarWeb: foldersSidebar },
|
||||
memories: { enabled: memoriesEnabled },
|
||||
memories: { enabled: memoriesEnabled, duration: memoriesDuration },
|
||||
people: { enabled: peopleEnabled, sidebarWeb: peopleSidebar },
|
||||
ratings: { enabled: ratingsEnabled },
|
||||
sharedLinks: { enabled: sharedLinksEnabled, sidebarWeb: sharedLinkSidebar },
|
||||
|
|
@ -103,6 +106,14 @@
|
|||
<div class="ms-4 mt-6">
|
||||
<SettingSwitch title={$t('enable')} bind:checked={memoriesEnabled} />
|
||||
</div>
|
||||
<div class="ms-4 mt-6">
|
||||
<SettingInputField
|
||||
inputType={SettingInputFieldType.NUMBER}
|
||||
label={$t('duration')}
|
||||
description={$t('time_based_memories_duration')}
|
||||
bind:value={memoriesDuration}
|
||||
/>
|
||||
</div>
|
||||
</SettingAccordion>
|
||||
|
||||
<SettingAccordion key="people" title={$t('people')} subtitle={$t('people_feature_description')}>
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ export const preferencesFactory = Sync.makeFactory<UserPreferencesResponseDto>({
|
|||
},
|
||||
memories: {
|
||||
enabled: false,
|
||||
duration: 5,
|
||||
},
|
||||
people: {
|
||||
enabled: false,
|
||||
|
|
|
|||
Loading…
Reference in a new issue