From 0782146682788c6b8ae883108b86690136c88c5d Mon Sep 17 00:00:00 2001 From: advplyr Date: Fri, 25 Oct 2024 17:27:50 -0500 Subject: [PATCH] Update:Pass mark as finished library settings to media progress update #837 --- server/managers/PlaybackSessionManager.js | 33 ++++++++++++++++++----- server/models/Library.js | 7 +++++ server/models/MediaProgress.js | 8 +++--- 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/server/managers/PlaybackSessionManager.js b/server/managers/PlaybackSessionManager.js index 2ffda937..33a3ccd2 100644 --- a/server/managers/PlaybackSessionManager.js +++ b/server/managers/PlaybackSessionManager.js @@ -119,6 +119,7 @@ class PlaybackSessionManager { * @returns */ async syncLocalSession(user, sessionJson, deviceInfo) { + // TODO: Combine libraryItem query with library query const libraryItem = await Database.libraryItemModel.getOldById(sessionJson.libraryItemId) const episode = sessionJson.episodeId && libraryItem && libraryItem.isPodcast ? libraryItem.media.getEpisode(sessionJson.episodeId) : null if (!libraryItem || (libraryItem.isPodcast && !episode)) { @@ -130,6 +131,16 @@ class PlaybackSessionManager { } } + const library = await Database.libraryModel.findByPk(libraryItem.libraryId) + if (!library) { + Logger.error(`[PlaybackSessionManager] syncLocalSession: Library not found for session "${sessionJson.displayTitle}" (${sessionJson.id})`) + return { + id: sessionJson.id, + success: false, + error: 'Library not found' + } + } + sessionJson.userId = user.id sessionJson.serverVersion = serverVersion @@ -199,7 +210,9 @@ class PlaybackSessionManager { const updateResponse = await user.createUpdateMediaProgressFromPayload({ libraryItemId: libraryItem.id, episodeId: session.episodeId, - ...session.mediaProgressObject + ...session.mediaProgressObject, + markAsFinishedPercentComplete: library.librarySettings.markAsFinishedPercentComplete, + markAsFinishedTimeRemaining: library.librarySettings.markAsFinishedTimeRemaining }) result.progressSynced = !!updateResponse.mediaProgress if (result.progressSynced) { @@ -211,7 +224,9 @@ class PlaybackSessionManager { const updateResponse = await user.createUpdateMediaProgressFromPayload({ libraryItemId: libraryItem.id, episodeId: session.episodeId, - ...session.mediaProgressObject + ...session.mediaProgressObject, + markAsFinishedPercentComplete: library.librarySettings.markAsFinishedPercentComplete, + markAsFinishedTimeRemaining: library.librarySettings.markAsFinishedTimeRemaining }) result.progressSynced = !!updateResponse.mediaProgress if (result.progressSynced) { @@ -330,12 +345,19 @@ class PlaybackSessionManager { * @returns */ async syncSession(user, session, syncData) { + // TODO: Combine libraryItem query with library query const libraryItem = await Database.libraryItemModel.getOldById(session.libraryItemId) if (!libraryItem) { Logger.error(`[PlaybackSessionManager] syncSession Library Item not found "${session.libraryItemId}"`) return null } + const library = await Database.libraryModel.findByPk(libraryItem.libraryId) + if (!library) { + Logger.error(`[PlaybackSessionManager] syncSession Library not found "${libraryItem.libraryId}"`) + return null + } + session.currentTime = syncData.currentTime session.addListeningTime(syncData.timeListened) Logger.debug(`[PlaybackSessionManager] syncSession "${session.id}" (Device: ${session.deviceDescription}) | Total Time Listened: ${session.timeListening}`) @@ -346,10 +368,9 @@ class PlaybackSessionManager { // duration no longer required (v2.15.1) but used if available duration: syncData.duration || libraryItem.media.duration || 0, currentTime: syncData.currentTime, - progress: session.progress - // TODO: Add support for passing in these values from library settings - // markAsFinishedTimeRemaining: 5, - // markAsFinishedPercentComplete: 95 + progress: session.progress, + markAsFinishedTimeRemaining: library.librarySettings.markAsFinishedTimeRemaining, + markAsFinishedPercentComplete: library.librarySettings.markAsFinishedPercentComplete }) if (updateResponse.mediaProgress) { SocketAuthority.clientEmitter(user.id, 'user_item_progress_updated', { diff --git a/server/models/Library.js b/server/models/Library.js index 36d462cf..4a69e4cd 100644 --- a/server/models/Library.js +++ b/server/models/Library.js @@ -202,6 +202,13 @@ class Library extends Model { return this.extraData?.lastScanMetadataPrecedence || [] } + /** + * @returns {LibrarySettingsObject} + */ + get librarySettings() { + return this.settings || Library.getDefaultLibrarySettingsForMediaType(this.mediaType) + } + /** * TODO: Update to use new model */ diff --git a/server/models/MediaProgress.js b/server/models/MediaProgress.js index 72c7f7e2..d6a527f7 100644 --- a/server/models/MediaProgress.js +++ b/server/models/MediaProgress.js @@ -231,8 +231,8 @@ class MediaProgress extends Model { // Check if progress is far enough to mark as finished // - If markAsFinishedPercentComplete is provided, use that otherwise use markAsFinishedTimeRemaining (default 10 seconds) let shouldMarkAsFinished = false - if (!this.isFinished && this.duration) { - if (!isNullOrNaN(progressPayload.markAsFinishedPercentComplete)) { + if (this.duration) { + if (!isNullOrNaN(progressPayload.markAsFinishedPercentComplete) && progressPayload.markAsFinishedPercentComplete > 0) { const markAsFinishedPercentComplete = Number(progressPayload.markAsFinishedPercentComplete) / 100 shouldMarkAsFinished = markAsFinishedPercentComplete < this.progress if (shouldMarkAsFinished) { @@ -247,12 +247,12 @@ class MediaProgress extends Model { } } - if (shouldMarkAsFinished) { + if (!this.isFinished && shouldMarkAsFinished) { this.isFinished = true this.finishedAt = this.finishedAt || Date.now() this.extraData.progress = 1 this.changed('extraData', true) - } else if (this.isFinished && this.changed('currentTime') && this.currentTime < this.duration) { + } else if (this.isFinished && this.changed('currentTime') && !shouldMarkAsFinished) { this.isFinished = false this.finishedAt = null }