Compare commits

...

5 Commits

Author SHA1 Message Date
advplyr d9b206fe1c Fix server crash when quick match all updates existing series sequence #3961 2025-02-14 16:56:37 -06:00
advplyr fe4e0145c9 Merge pull request #3984 from advplyr/fix-chapter-end-sleep-timer
Fix chapter end sleep timer sometimes not stopping #3969
2025-02-14 16:39:26 -06:00
advplyr c4d99a118f Fix chapter end sleep timer sometimes not stopping #3969 2025-02-14 16:24:39 -06:00
advplyr b96226966b Merge pull request #3980 from advplyr/stringify_sequelize_query
Fix count cache by stringify Symbols #3979
2025-02-13 18:24:36 -06:00
advplyr 5ca12eee19 Fix count cache by stringify Symbols #3979 2025-02-13 18:07:59 -06:00
5 changed files with 50 additions and 16 deletions
+12 -7
View File
@@ -85,7 +85,8 @@ export default {
displayTitle: null,
currentPlaybackRate: 1,
syncFailedToast: null,
coverAspectRatio: 1
coverAspectRatio: 1,
lastChapterId: null
}
},
computed: {
@@ -236,12 +237,16 @@ export default {
}
}, 1000)
},
checkChapterEnd(time) {
checkChapterEnd() {
if (!this.currentChapter) return
const chapterEndTime = this.currentChapter.end
const tolerance = 0.75
if (time >= chapterEndTime - tolerance) {
this.sleepTimerEnd()
// Track chapter transitions by comparing current chapter with last chapter
if (this.lastChapterId !== this.currentChapter.id) {
// Chapter changed - if we had a previous chapter, this means we crossed a boundary
if (this.lastChapterId) {
this.sleepTimerEnd()
}
this.lastChapterId = this.currentChapter.id
}
},
sleepTimerEnd() {
@@ -301,7 +306,7 @@ export default {
}
if (this.sleepTimerType === this.$constants.SleepTimerTypes.CHAPTER && this.sleepTimerSet) {
this.checkChapterEnd(time)
this.checkChapterEnd()
}
},
setDuration(duration) {
+1 -1
View File
@@ -103,7 +103,7 @@ class LibraryItem extends Model {
{
model: this.sequelize.models.series,
through: {
attributes: ['sequence', 'createdAt']
attributes: ['id', 'sequence', 'createdAt']
}
}
]
-6
View File
@@ -48,13 +48,7 @@ class Scanner {
let updatePayload = {}
let hasUpdated = false
let existingAuthors = [] // Used for checking if authors or series are now empty
let existingSeries = []
if (libraryItem.isBook) {
existingAuthors = libraryItem.media.authors.map((a) => a.id)
existingSeries = libraryItem.media.series.map((s) => s.id)
const searchISBN = options.isbn || libraryItem.media.isbn
const searchASIN = options.asin || libraryItem.media.asin
@@ -5,7 +5,7 @@ const authorFilters = require('./authorFilters')
const ShareManager = require('../../managers/ShareManager')
const { profile } = require('../profiler')
const stringifySequelizeQuery = require('../stringifySequelizeQuery')
const countCache = new Map()
module.exports = {
@@ -345,7 +345,7 @@ module.exports = {
},
async findAndCountAll(findOptions, limit, offset) {
const findOptionsKey = JSON.stringify(findOptions)
const findOptionsKey = stringifySequelizeQuery(findOptions)
Logger.debug(`[LibraryItemsBookFilters] findOptionsKey: ${findOptionsKey}`)
findOptions.limit = limit || null
@@ -353,6 +353,7 @@ module.exports = {
if (countCache.has(findOptionsKey)) {
const rows = await Database.bookModel.findAll(findOptions)
return { rows, count: countCache.get(findOptionsKey) }
} else {
const result = await Database.bookModel.findAndCountAll(findOptions)
+34
View File
@@ -0,0 +1,34 @@
function stringifySequelizeQuery(findOptions) {
// Helper function to handle symbols in nested objects
function handleSymbols(obj) {
if (!obj || typeof obj !== 'object') return obj
if (Array.isArray(obj)) {
return obj.map(handleSymbols)
}
const newObj = {}
for (const [key, value] of Object.entries(obj)) {
// Handle Symbol keys from Object.getOwnPropertySymbols
Object.getOwnPropertySymbols(obj).forEach((sym) => {
newObj[`__Op.${sym.toString()}`] = handleSymbols(obj[sym])
})
// Handle regular keys
if (typeof key === 'string') {
if (value && typeof value === 'object' && Object.getPrototypeOf(value) === Symbol.prototype) {
// Handle Symbol values
newObj[key] = `__Op.${value.toString()}`
} else {
// Recursively handle nested objects
newObj[key] = handleSymbols(value)
}
}
}
return newObj
}
const sanitizedOptions = handleSymbols(findOptions)
return JSON.stringify(sanitizedOptions)
}
module.exports = stringifySequelizeQuery