From 9d4303ef7b48f6b1854d09c8ee4bc01c2e0867b8 Mon Sep 17 00:00:00 2001 From: advplyr Date: Tue, 17 Jun 2025 16:25:30 -0500 Subject: [PATCH 1/2] Update book library secondary title sort to use title ignore prefixes #4414 --- .../utils/queries/libraryItemsBookFilters.js | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/server/utils/queries/libraryItemsBookFilters.js b/server/utils/queries/libraryItemsBookFilters.js index 73d36c584..7fa5eb41c 100644 --- a/server/utils/queries/libraryItemsBookFilters.js +++ b/server/utils/queries/libraryItemsBookFilters.js @@ -251,6 +251,15 @@ module.exports = { */ getOrder(sortBy, sortDesc, collapseseries) { const dir = sortDesc ? 'DESC' : 'ASC' + + const getTitleOrder = () => { + if (global.ServerSettings.sortingIgnorePrefix) { + return [Sequelize.literal('`libraryItem`.`titleIgnorePrefix` COLLATE NOCASE'), dir] + } else { + return [Sequelize.literal('`libraryItem`.`title` COLLATE NOCASE'), dir] + } + } + if (sortBy === 'addedAt') { return [[Sequelize.literal('libraryItem.createdAt'), dir]] } else if (sortBy === 'size') { @@ -264,25 +273,16 @@ module.exports = { } else if (sortBy === 'media.metadata.publishedYear') { return [[Sequelize.literal(`CAST(\`book\`.\`publishedYear\` AS INTEGER)`), dir]] } else if (sortBy === 'media.metadata.authorNameLF') { - return [ - [Sequelize.literal('`libraryItem`.`authorNamesLastFirst` COLLATE NOCASE'), dir], - [Sequelize.literal('`libraryItem`.`title` COLLATE NOCASE'), dir] - ] + // Sort by author name last first, secondary sort by title + return [[Sequelize.literal('`libraryItem`.`authorNamesLastFirst` COLLATE NOCASE'), dir], getTitleOrder()] } else if (sortBy === 'media.metadata.authorName') { - return [ - [Sequelize.literal('`libraryItem`.`authorNamesFirstLast` COLLATE NOCASE'), dir], - [Sequelize.literal('`libraryItem`.`title` COLLATE NOCASE'), dir] - ] + // Sort by author name first last, secondary sort by title + return [[Sequelize.literal('`libraryItem`.`authorNamesFirstLast` COLLATE NOCASE'), dir], getTitleOrder()] } else if (sortBy === 'media.metadata.title') { if (collapseseries) { return [[Sequelize.literal('display_title COLLATE NOCASE'), dir]] } - - if (global.ServerSettings.sortingIgnorePrefix) { - return [[Sequelize.literal('`libraryItem`.`titleIgnorePrefix` COLLATE NOCASE'), dir]] - } else { - return [[Sequelize.literal('`libraryItem`.`title` COLLATE NOCASE'), dir]] - } + return [getTitleOrder()] } else if (sortBy === 'sequence') { const nullDir = sortDesc ? 'DESC NULLS FIRST' : 'ASC NULLS LAST' return [[Sequelize.literal(`CAST(\`series.bookSeries.sequence\` AS FLOAT) ${nullDir}`)]] From 9bf8d7de11b969bb7ece861d0321db33d1b016c9 Mon Sep 17 00:00:00 2001 From: advplyr Date: Tue, 17 Jun 2025 17:21:21 -0500 Subject: [PATCH 2/2] Fix server crash when FantLab provider request times out #4410 --- server/providers/FantLab.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/server/providers/FantLab.js b/server/providers/FantLab.js index dd9f60cc8..f33934ca2 100644 --- a/server/providers/FantLab.js +++ b/server/providers/FantLab.js @@ -52,9 +52,7 @@ class FantLab { return [] }) - return Promise.all(items.map(async (item) => await this.getWork(item, timeout))).then((resArray) => { - return resArray.filter((res) => res) - }) + return Promise.all(items.map(async (item) => await this.getWork(item, timeout))).then((resArray) => resArray.filter(Boolean)) } /** @@ -83,6 +81,10 @@ class FantLab { return null }) + if (!bookData) { + return null + } + return this.cleanBookData(bookData, timeout) }