From 7557387189b8aab1abbcc7501c5b037be54fdf22 Mon Sep 17 00:00:00 2001 From: Kevin Gatera Date: Sun, 8 Mar 2026 22:30:29 -0400 Subject: [PATCH] Fix Postgres listening stats regression Before the new minified listening stats path could return 502 because PlaybackSession.afterFind assumed Sequelize model instances even for raw stats rows, and some payloads could serialize invalid totals. After this hotfix the stats helper returns successfully again, with the current dataset benchmarking at about 124ms for full stats and 101ms for minified stats instead of crashing. --- server/models/PlaybackSession.js | 10 ++++++---- server/routers/ApiRouter.js | 8 ++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/server/models/PlaybackSession.js b/server/models/PlaybackSession.js index 14303a036..26b702d8c 100644 --- a/server/models/PlaybackSession.js +++ b/server/models/PlaybackSession.js @@ -273,18 +273,20 @@ class PlaybackSession extends Model { if (!Array.isArray(findResult)) findResult = [findResult] for (const instance of findResult) { + const values = instance?.dataValues + if (instance.mediaItemType === 'book' && instance.book !== undefined) { instance.mediaItem = instance.book - instance.dataValues.mediaItem = instance.dataValues.book + if (values) values.mediaItem = values.book } else if (instance.mediaItemType === 'podcastEpisode' && instance.podcastEpisode !== undefined) { instance.mediaItem = instance.podcastEpisode - instance.dataValues.mediaItem = instance.dataValues.podcastEpisode + if (values) values.mediaItem = values.podcastEpisode } // To prevent mistakes: delete instance.book - delete instance.dataValues.book + if (values) delete values.book delete instance.podcastEpisode - delete instance.dataValues.podcastEpisode + if (values) delete values.podcastEpisode } }) } diff --git a/server/routers/ApiRouter.js b/server/routers/ApiRouter.js index 6487a2151..d6117a04e 100644 --- a/server/routers/ApiRouter.js +++ b/server/routers/ApiRouter.js @@ -583,10 +583,10 @@ class ApiRouter { if (includeRecentSessions) listeningStats.recentSessions = recentSessions listeningSessions.forEach((s) => { const libraryItemId = s.extraData?.libraryItemId || null - let sessionTimeListening = s.timeListening - if (typeof sessionTimeListening == 'string') { - sessionTimeListening = Number(sessionTimeListening) - } + const numericListening = Number(s.timeListening) + const sessionTimeListening = Number.isFinite(numericListening) + ? numericListening + : 0 if (s.dayOfWeek) { if (!listeningStats.dayOfWeek[s.dayOfWeek]) listeningStats.dayOfWeek[s.dayOfWeek] = 0