diff --git a/immichFrame.Web/src/lib/components/home-page/home-page.svelte b/immichFrame.Web/src/lib/components/home-page/home-page.svelte index da7379d1..4b103365 100644 --- a/immichFrame.Web/src/lib/components/home-page/home-page.svelte +++ b/immichFrame.Web/src/lib/components/home-page/home-page.svelte @@ -180,7 +180,10 @@ } const useSplit = shouldUseSplitView(assetBacklog); - const next = assetBacklog.splice(0, useSplit ? 2 : 1); + let next = assetBacklog.splice(0, useSplit ? 2 : 1); + + next = removeDuplicateFromNextAssets(next); + assetBacklog = [...assetBacklog]; if (displayingAssets.length) { @@ -196,6 +199,40 @@ assetsState = await pickAssets(next); } + function removeDuplicateFromNextAssets(next: api.AssetResponseDto[]): api.AssetResponseDto[]{ + if(isDuplicate(next)){ + const nextPortrait = tryPopNextNonDuplicatePortraitInBacklog([next[0]]); + let result = [next[0]]; + if(nextPortrait !== undefined) { + result.push(nextPortrait); + } + return result; + } + return next; + } + + function isDuplicate(next: api.AssetResponseDto[]): boolean{ + const seen = new Set(); + + for(const item of next){ + if(seen.has(item.id)){ + return true; + } + seen.add(item.id); + } + return false; + } + + function tryPopNextNonDuplicatePortraitInBacklog(next: api.AssetResponseDto[]): api.AssetResponseDto | undefined{ + for(let i = 0; i < assetBacklog.length; i++){ + const backlogAsset = assetBacklog[i]; + if(!isPortrait(backlogAsset)) continue; + if(isDuplicate([...next, backlogAsset])) continue; + return assetBacklog.splice(i, 1)[0]; + } + return undefined; + } + async function getPreviousAssets() { if (!assetHistory.length) { return;