Skip to content

Commit

Permalink
Update:Pass mark as finished library settings to media progress update
Browse files Browse the repository at this point in the history
  • Loading branch information
advplyr committed Oct 25, 2024
1 parent 91aea4f commit 0782146
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 10 deletions.
33 changes: 27 additions & 6 deletions server/managers/PlaybackSessionManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand All @@ -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

Expand Down Expand Up @@ -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) {
Expand All @@ -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) {
Expand Down Expand Up @@ -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}`)
Expand All @@ -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', {
Expand Down
7 changes: 7 additions & 0 deletions server/models/Library.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
Expand Down
8 changes: 4 additions & 4 deletions server/models/MediaProgress.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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
}
Expand Down

0 comments on commit 0782146

Please sign in to comment.