feat: make memories slideshow duration configurable (#22783)

This commit is contained in:
Mees Frensel 2025-11-08 23:46:43 +01:00 committed by GitHub
parent 4905bba694
commit 9cc88ed2a6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 37 additions and 2 deletions

View file

@ -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",

Binary file not shown.

Binary file not shown.

View file

@ -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"
}

View file

@ -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 = {

View file

@ -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 {

View file

@ -497,6 +497,7 @@ export interface UserPreferences {
};
memories: {
enabled: boolean;
duration: number;
};
people: {
enabled: boolean;

View file

@ -16,6 +16,7 @@ const getDefaultPreferences = (): UserPreferences => {
},
memories: {
enabled: true,
duration: 5,
},
people: {
enabled: true,

View file

@ -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),
});
}
};

View file

@ -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')}>

View file

@ -23,6 +23,7 @@ export const preferencesFactory = Sync.makeFactory<UserPreferencesResponseDto>({
},
memories: {
enabled: false,
duration: 5,
},
people: {
enabled: false,