Update:Pass mark as finished library settings to media progress update #837

This commit is contained in:
advplyr 2024-10-25 17:27:50 -05:00
parent 91aea4f754
commit 0782146682
3 changed files with 38 additions and 10 deletions

View File

@ -119,6 +119,7 @@ class PlaybackSessionManager {
* @returns * @returns
*/ */
async syncLocalSession(user, sessionJson, deviceInfo) { async syncLocalSession(user, sessionJson, deviceInfo) {
// TODO: Combine libraryItem query with library query
const libraryItem = await Database.libraryItemModel.getOldById(sessionJson.libraryItemId) const libraryItem = await Database.libraryItemModel.getOldById(sessionJson.libraryItemId)
const episode = sessionJson.episodeId && libraryItem && libraryItem.isPodcast ? libraryItem.media.getEpisode(sessionJson.episodeId) : null const episode = sessionJson.episodeId && libraryItem && libraryItem.isPodcast ? libraryItem.media.getEpisode(sessionJson.episodeId) : null
if (!libraryItem || (libraryItem.isPodcast && !episode)) { 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.userId = user.id
sessionJson.serverVersion = serverVersion sessionJson.serverVersion = serverVersion
@ -199,7 +210,9 @@ class PlaybackSessionManager {
const updateResponse = await user.createUpdateMediaProgressFromPayload({ const updateResponse = await user.createUpdateMediaProgressFromPayload({
libraryItemId: libraryItem.id, libraryItemId: libraryItem.id,
episodeId: session.episodeId, episodeId: session.episodeId,
...session.mediaProgressObject ...session.mediaProgressObject,
markAsFinishedPercentComplete: library.librarySettings.markAsFinishedPercentComplete,
markAsFinishedTimeRemaining: library.librarySettings.markAsFinishedTimeRemaining
}) })
result.progressSynced = !!updateResponse.mediaProgress result.progressSynced = !!updateResponse.mediaProgress
if (result.progressSynced) { if (result.progressSynced) {
@ -211,7 +224,9 @@ class PlaybackSessionManager {
const updateResponse = await user.createUpdateMediaProgressFromPayload({ const updateResponse = await user.createUpdateMediaProgressFromPayload({
libraryItemId: libraryItem.id, libraryItemId: libraryItem.id,
episodeId: session.episodeId, episodeId: session.episodeId,
...session.mediaProgressObject ...session.mediaProgressObject,
markAsFinishedPercentComplete: library.librarySettings.markAsFinishedPercentComplete,
markAsFinishedTimeRemaining: library.librarySettings.markAsFinishedTimeRemaining
}) })
result.progressSynced = !!updateResponse.mediaProgress result.progressSynced = !!updateResponse.mediaProgress
if (result.progressSynced) { if (result.progressSynced) {
@ -330,12 +345,19 @@ class PlaybackSessionManager {
* @returns * @returns
*/ */
async syncSession(user, session, syncData) { async syncSession(user, session, syncData) {
// TODO: Combine libraryItem query with library query
const libraryItem = await Database.libraryItemModel.getOldById(session.libraryItemId) const libraryItem = await Database.libraryItemModel.getOldById(session.libraryItemId)
if (!libraryItem) { if (!libraryItem) {
Logger.error(`[PlaybackSessionManager] syncSession Library Item not found "${session.libraryItemId}"`) Logger.error(`[PlaybackSessionManager] syncSession Library Item not found "${session.libraryItemId}"`)
return null 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.currentTime = syncData.currentTime
session.addListeningTime(syncData.timeListened) session.addListeningTime(syncData.timeListened)
Logger.debug(`[PlaybackSessionManager] syncSession "${session.id}" (Device: ${session.deviceDescription}) | Total Time Listened: ${session.timeListening}`) 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 no longer required (v2.15.1) but used if available
duration: syncData.duration || libraryItem.media.duration || 0, duration: syncData.duration || libraryItem.media.duration || 0,
currentTime: syncData.currentTime, currentTime: syncData.currentTime,
progress: session.progress progress: session.progress,
// TODO: Add support for passing in these values from library settings markAsFinishedTimeRemaining: library.librarySettings.markAsFinishedTimeRemaining,
// markAsFinishedTimeRemaining: 5, markAsFinishedPercentComplete: library.librarySettings.markAsFinishedPercentComplete
// markAsFinishedPercentComplete: 95
}) })
if (updateResponse.mediaProgress) { if (updateResponse.mediaProgress) {
SocketAuthority.clientEmitter(user.id, 'user_item_progress_updated', { SocketAuthority.clientEmitter(user.id, 'user_item_progress_updated', {

View File

@ -202,6 +202,13 @@ class Library extends Model {
return this.extraData?.lastScanMetadataPrecedence || [] return this.extraData?.lastScanMetadataPrecedence || []
} }
/**
* @returns {LibrarySettingsObject}
*/
get librarySettings() {
return this.settings || Library.getDefaultLibrarySettingsForMediaType(this.mediaType)
}
/** /**
* TODO: Update to use new model * TODO: Update to use new model
*/ */

View File

@ -231,8 +231,8 @@ class MediaProgress extends Model {
// Check if progress is far enough to mark as finished // Check if progress is far enough to mark as finished
// - If markAsFinishedPercentComplete is provided, use that otherwise use markAsFinishedTimeRemaining (default 10 seconds) // - If markAsFinishedPercentComplete is provided, use that otherwise use markAsFinishedTimeRemaining (default 10 seconds)
let shouldMarkAsFinished = false let shouldMarkAsFinished = false
if (!this.isFinished && this.duration) { if (this.duration) {
if (!isNullOrNaN(progressPayload.markAsFinishedPercentComplete)) { if (!isNullOrNaN(progressPayload.markAsFinishedPercentComplete) && progressPayload.markAsFinishedPercentComplete > 0) {
const markAsFinishedPercentComplete = Number(progressPayload.markAsFinishedPercentComplete) / 100 const markAsFinishedPercentComplete = Number(progressPayload.markAsFinishedPercentComplete) / 100
shouldMarkAsFinished = markAsFinishedPercentComplete < this.progress shouldMarkAsFinished = markAsFinishedPercentComplete < this.progress
if (shouldMarkAsFinished) { if (shouldMarkAsFinished) {
@ -247,12 +247,12 @@ class MediaProgress extends Model {
} }
} }
if (shouldMarkAsFinished) { if (!this.isFinished && shouldMarkAsFinished) {
this.isFinished = true this.isFinished = true
this.finishedAt = this.finishedAt || Date.now() this.finishedAt = this.finishedAt || Date.now()
this.extraData.progress = 1 this.extraData.progress = 1
this.changed('extraData', true) 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.isFinished = false
this.finishedAt = null this.finishedAt = null
} }