From 38890942a1db26d9eceb079072e769b6d2727542 Mon Sep 17 00:00:00 2001 From: Ramon <20274410+ram130@users.noreply.github.com> Date: Thu, 19 Mar 2026 04:52:03 -0400 Subject: [PATCH 1/2] fix: robust Trakt continue-watching sort + new episode priority boost --- .../mergeTraktContinueWatching.ts | 27 +++++++++++++++++-- src/services/traktService.ts | 2 +- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/components/home/continueWatching/mergeTraktContinueWatching.ts b/src/components/home/continueWatching/mergeTraktContinueWatching.ts index b4b8e304..07e548d6 100644 --- a/src/components/home/continueWatching/mergeTraktContinueWatching.ts +++ b/src/components/home/continueWatching/mergeTraktContinueWatching.ts @@ -91,8 +91,31 @@ export async function mergeTraktContinueWatching({ const thirtyDaysAgo = Date.now() - (30 * 24 * 60 * 60 * 1000); const sortedPlaybackItems = [...playbackItems] - .sort((a, b) => new Date(b.paused_at).getTime() - new Date(a.paused_at).getTime()) - .slice(0, 30); + .sort((a, b) => { + const getBaseTime = (item: any) => + new Date( + item.paused_at || + item.updated_at || + item.last_watched_at || + 0 + ).getTime(); + + const getPriorityTime = (item: any) => { + const base = getBaseTime(item); + // NEW EPISODE PRIORITY BOOST + if (item.episode && (item.progress ?? 0) < 1) { + const aired = new Date(item.episode.first_aired || 0).getTime(); + const daysSinceAired = (Date.now() - aired) / (1000 * 60 * 60 * 24); + if (daysSinceAired >= 0 && daysSinceAired < 60) { + return base + 1000000000; // boost to top on aired ep + } + } + return base; + }; + + return getPriorityTime(b) - getPriorityTime(a); + }) + .slice(0, 30); for (const item of sortedPlaybackItems) { try { diff --git a/src/services/traktService.ts b/src/services/traktService.ts index 1fa3081f..1ff45ab6 100644 --- a/src/services/traktService.ts +++ b/src/services/traktService.ts @@ -1396,7 +1396,7 @@ export class TraktService { */ public async getPlaybackProgressWithImages(type?: 'movies' | 'shows'): Promise { try { - const endpoint = type ? `/sync/playback/${type}?extended=images` : '/sync/playback?extended=images'; + const endpoint = type ? `/sync/playback/${type}?extended=full,images` : '/sync/playback?extended=full,images'; return this.apiRequest(endpoint); } catch (error) { logger.error('[TraktService] Failed to get playback progress with images:', error); From 75301a1d27f46a80ff595c7db3fae9a3f66541f4 Mon Sep 17 00:00:00 2001 From: Ramon <20274410+ram130@users.noreply.github.com> Date: Thu, 19 Mar 2026 05:05:11 -0400 Subject: [PATCH 2/2] fix: robust Trakt continue-watching sort + new episode priority boost --- src/services/traktService.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/services/traktService.ts b/src/services/traktService.ts index 1ff45ab6..1c7f7406 100644 --- a/src/services/traktService.ts +++ b/src/services/traktService.ts @@ -1396,6 +1396,8 @@ export class TraktService { */ public async getPlaybackProgressWithImages(type?: 'movies' | 'shows'): Promise { try { + // extended=full,images so we receive episode.first_aired (needed for the new-episode priority boost + // in mergeTraktContinueWatching.ts — brand-new/recently-aired episodes now jump to the top of Continue Watching). const endpoint = type ? `/sync/playback/${type}?extended=full,images` : '/sync/playback?extended=full,images'; return this.apiRequest(endpoint); } catch (error) {