mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-12-26 21:59:38 +00:00
Add:Library settings for mark as finished when time remaining or percent complete #837
This commit is contained in:
parent
6ca277a21d
commit
91aea4f754
8 changed files with 99 additions and 18 deletions
|
|
@ -255,15 +255,18 @@ class LibraryController {
|
|||
}
|
||||
|
||||
// Validate settings
|
||||
const defaultLibrarySettings = Database.libraryModel.getDefaultLibrarySettingsForMediaType(req.library.mediaType)
|
||||
const updatedSettings = {
|
||||
...(req.library.settings || Database.libraryModel.getDefaultLibrarySettingsForMediaType(req.library.mediaType))
|
||||
...(req.library.settings || defaultLibrarySettings)
|
||||
}
|
||||
let hasUpdates = false
|
||||
let hasUpdatedDisableWatcher = false
|
||||
let hasUpdatedScanCron = false
|
||||
if (req.body.settings) {
|
||||
for (const key in req.body.settings) {
|
||||
if (updatedSettings[key] === undefined) continue
|
||||
if (!Object.keys(defaultLibrarySettings).includes(key)) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (key === 'metadataPrecedence') {
|
||||
if (!Array.isArray(req.body.settings[key])) {
|
||||
|
|
@ -285,6 +288,28 @@ class LibraryController {
|
|||
updatedSettings[key] = req.body.settings[key]
|
||||
Logger.debug(`[LibraryController] Library "${req.library.name}" updating setting "${key}" to "${updatedSettings[key]}"`)
|
||||
}
|
||||
} else if (key === 'markAsFinishedPercentComplete') {
|
||||
if (req.body.settings[key] !== null && isNaN(req.body.settings[key])) {
|
||||
return res.status(400).send(`Invalid request. Setting "${key}" must be a number`)
|
||||
} else if (req.body.settings[key] !== null && (Number(req.body.settings[key]) < 0 || Number(req.body.settings[key]) > 100)) {
|
||||
return res.status(400).send(`Invalid request. Setting "${key}" must be between 0 and 100`)
|
||||
}
|
||||
if (req.body.settings[key] !== updatedSettings[key]) {
|
||||
hasUpdates = true
|
||||
updatedSettings[key] = Number(req.body.settings[key])
|
||||
Logger.debug(`[LibraryController] Library "${req.library.name}" updating setting "${key}" to "${updatedSettings[key]}"`)
|
||||
}
|
||||
} else if (key === 'markAsFinishedTimeRemaining') {
|
||||
if (req.body.settings[key] !== null && isNaN(req.body.settings[key])) {
|
||||
return res.status(400).send(`Invalid request. Setting "${key}" must be a number`)
|
||||
} else if (req.body.settings[key] !== null && Number(req.body.settings[key]) < 0) {
|
||||
return res.status(400).send(`Invalid request. Setting "${key}" must be greater than or equal to 0`)
|
||||
}
|
||||
if (req.body.settings[key] !== updatedSettings[key]) {
|
||||
hasUpdates = true
|
||||
updatedSettings[key] = Number(req.body.settings[key])
|
||||
Logger.debug(`[LibraryController] Library "${req.library.name}" updating setting "${key}" to "${updatedSettings[key]}"`)
|
||||
}
|
||||
} else {
|
||||
if (typeof req.body.settings[key] !== typeof updatedSettings[key]) {
|
||||
return res.status(400).send(`Invalid request. Setting "${key}" must be of type ${typeof updatedSettings[key]}`)
|
||||
|
|
|
|||
|
|
@ -349,7 +349,7 @@ class PlaybackSessionManager {
|
|||
progress: session.progress
|
||||
// TODO: Add support for passing in these values from library settings
|
||||
// markAsFinishedTimeRemaining: 5,
|
||||
// markAsFinishedPercentageComplete: 95
|
||||
// markAsFinishedPercentComplete: 95
|
||||
})
|
||||
if (updateResponse.mediaProgress) {
|
||||
SocketAuthority.clientEmitter(user.id, 'user_item_progress_updated', {
|
||||
|
|
|
|||
|
|
@ -12,6 +12,8 @@ const Logger = require('../Logger')
|
|||
* @property {boolean} hideSingleBookSeries Do not show series that only have 1 book
|
||||
* @property {boolean} onlyShowLaterBooksInContinueSeries Skip showing books that are earlier than the max sequence read
|
||||
* @property {string[]} metadataPrecedence
|
||||
* @property {number} markAsFinishedTimeRemaining Time remaining in seconds to mark as finished. (defaults to 10s)
|
||||
* @property {number} markAsFinishedPercentComplete Percent complete to mark as finished (0-100). If this is set it will be used over markAsFinishedTimeRemaining.
|
||||
*/
|
||||
|
||||
class Library extends Model {
|
||||
|
|
@ -57,7 +59,9 @@ class Library extends Model {
|
|||
coverAspectRatio: 1, // Square
|
||||
disableWatcher: false,
|
||||
autoScanCronExpression: null,
|
||||
podcastSearchRegion: 'us'
|
||||
podcastSearchRegion: 'us',
|
||||
markAsFinishedPercentComplete: null,
|
||||
markAsFinishedTimeRemaining: 10
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
|
|
@ -70,7 +74,9 @@ class Library extends Model {
|
|||
epubsAllowScriptedContent: false,
|
||||
hideSingleBookSeries: false,
|
||||
onlyShowLaterBooksInContinueSeries: false,
|
||||
metadataPrecedence: this.defaultMetadataPrecedence
|
||||
metadataPrecedence: this.defaultMetadataPrecedence,
|
||||
markAsFinishedPercentComplete: null,
|
||||
markAsFinishedTimeRemaining: 10
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -229,18 +229,18 @@ class MediaProgress extends Model {
|
|||
const timeRemaining = this.duration - this.currentTime
|
||||
|
||||
// Check if progress is far enough to mark as finished
|
||||
// - If markAsFinishedPercentageComplete is provided, use that otherwise use markAsFinishedTimeRemaining (default 5 seconds)
|
||||
// - If markAsFinishedPercentComplete is provided, use that otherwise use markAsFinishedTimeRemaining (default 10 seconds)
|
||||
let shouldMarkAsFinished = false
|
||||
if (!this.isFinished && this.duration) {
|
||||
if (!isNullOrNaN(progressPayload.markAsFinishedPercentageComplete)) {
|
||||
const markAsFinishedPercentageComplete = Number(progressPayload.markAsFinishedPercentageComplete) / 100
|
||||
shouldMarkAsFinished = markAsFinishedPercentageComplete <= this.progress
|
||||
if (!isNullOrNaN(progressPayload.markAsFinishedPercentComplete)) {
|
||||
const markAsFinishedPercentComplete = Number(progressPayload.markAsFinishedPercentComplete) / 100
|
||||
shouldMarkAsFinished = markAsFinishedPercentComplete < this.progress
|
||||
if (shouldMarkAsFinished) {
|
||||
Logger.debug(`[MediaProgress] Marking media progress as finished because progress (${this.progress}) is greater than ${markAsFinishedPercentageComplete}`)
|
||||
Logger.debug(`[MediaProgress] Marking media progress as finished because progress (${this.progress}) is greater than ${markAsFinishedPercentComplete}`)
|
||||
}
|
||||
} else {
|
||||
const markAsFinishedTimeRemaining = isNullOrNaN(progressPayload.markAsFinishedTimeRemaining) ? 5 : Number(progressPayload.markAsFinishedTimeRemaining)
|
||||
shouldMarkAsFinished = timeRemaining <= markAsFinishedTimeRemaining
|
||||
const markAsFinishedTimeRemaining = isNullOrNaN(progressPayload.markAsFinishedTimeRemaining) ? 10 : Number(progressPayload.markAsFinishedTimeRemaining)
|
||||
shouldMarkAsFinished = timeRemaining < markAsFinishedTimeRemaining
|
||||
if (shouldMarkAsFinished) {
|
||||
Logger.debug(`[MediaProgress] Marking media progress as finished because time remaining (${timeRemaining}) is less than ${markAsFinishedTimeRemaining} seconds`)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ const { DataTypes, Model } = sequelize
|
|||
* @property {string} [finishedAt]
|
||||
* @property {number} [lastUpdate]
|
||||
* @property {number} [markAsFinishedTimeRemaining]
|
||||
* @property {number} [markAsFinishedPercentageComplete]
|
||||
* @property {number} [markAsFinishedPercentComplete]
|
||||
*/
|
||||
|
||||
class User extends Model {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue