mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-07-08 02:11:35 +00:00
fix: tighten browse keyset fallback rules
This commit is contained in:
parent
b701b6efb6
commit
2d13ec3f8c
4 changed files with 132 additions and 30 deletions
|
|
@ -2,7 +2,11 @@ function getTitleCursorKey() {
|
|||
return global.ServerSettings && global.ServerSettings.sortingIgnorePrefix ? 'titleIgnorePrefix' : 'title'
|
||||
}
|
||||
|
||||
function getKeysetCursorKeys(sortBy) {
|
||||
function getKeysetCursorKeys(sortBy, collapseseries) {
|
||||
if (sortBy === 'media.metadata.title' && collapseseries) {
|
||||
return []
|
||||
}
|
||||
|
||||
if (sortBy === 'media.metadata.title') {
|
||||
return [getTitleCursorKey(), 'id']
|
||||
}
|
||||
|
|
@ -23,27 +27,15 @@ function getKeysetCursorKeys(sortBy) {
|
|||
return ['updatedAt', 'id']
|
||||
}
|
||||
|
||||
if (sortBy === 'progress') {
|
||||
return ['mediaProgresses.updatedAt', 'id']
|
||||
}
|
||||
|
||||
if (sortBy === 'progress.createdAt') {
|
||||
return ['mediaProgresses.createdAt', 'id']
|
||||
}
|
||||
|
||||
if (sortBy === 'progress.finishedAt') {
|
||||
return ['mediaProgresses.finishedAt', 'id']
|
||||
}
|
||||
|
||||
return []
|
||||
}
|
||||
|
||||
function getPaginationMode(pageMode, sortBy) {
|
||||
function getPaginationMode(pageMode, sortBy, collapseseries) {
|
||||
if (pageMode !== 'endless') {
|
||||
return 'offset'
|
||||
}
|
||||
|
||||
return getKeysetCursorKeys(sortBy).length ? 'keyset' : 'offset'
|
||||
return getKeysetCursorKeys(sortBy, collapseseries).length ? 'keyset' : 'offset'
|
||||
}
|
||||
|
||||
function getFamily({ mediaType, sortBy, filterGroup, collapseseries }) {
|
||||
|
|
@ -60,7 +52,7 @@ function getFamily({ mediaType, sortBy, filterGroup, collapseseries }) {
|
|||
|
||||
function getLibraryBrowseStrategy({ mediaType, sortBy, filterGroup, pageMode, collapseseries } = {}) {
|
||||
const normalizedSort = sortBy || 'media.metadata.title'
|
||||
const paginationMode = getPaginationMode(pageMode, normalizedSort)
|
||||
const paginationMode = getPaginationMode(pageMode, normalizedSort, collapseseries)
|
||||
|
||||
if (normalizedSort === 'random') {
|
||||
return {
|
||||
|
|
@ -79,7 +71,7 @@ function getLibraryBrowseStrategy({ mediaType, sortBy, filterGroup, pageMode, co
|
|||
countMode: paginationMode === 'keyset' ? 'deferred-exact' : 'exact-on-initial-page',
|
||||
deepScrollAllowed: paginationMode === 'keyset',
|
||||
tieBreaker: 'id',
|
||||
cursorKeys: getKeysetCursorKeys(normalizedSort)
|
||||
cursorKeys: getKeysetCursorKeys(normalizedSort, collapseseries)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -353,6 +353,8 @@ module.exports = {
|
|||
getOrder(sortBy, sortDesc, collapseseries) {
|
||||
const dir = sortDesc ? 'DESC' : 'ASC'
|
||||
|
||||
const libraryItemIdOrder = [Sequelize.literal('libraryItem.id'), dir]
|
||||
|
||||
const getTitleOrder = () => {
|
||||
if (global.ServerSettings.sortingIgnorePrefix) {
|
||||
return [Sequelize.literal('`libraryItem`.`titleIgnorePrefix` COLLATE NOCASE'), dir]
|
||||
|
|
@ -362,7 +364,7 @@ module.exports = {
|
|||
}
|
||||
|
||||
if (sortBy === 'addedAt') {
|
||||
return [[Sequelize.literal('libraryItem.createdAt'), dir]]
|
||||
return [[Sequelize.literal('libraryItem.createdAt'), dir], libraryItemIdOrder]
|
||||
} else if (sortBy === 'size') {
|
||||
return [[Sequelize.literal('libraryItem.size'), dir]]
|
||||
} else if (sortBy === 'birthtimeMs') {
|
||||
|
|
@ -375,15 +377,15 @@ module.exports = {
|
|||
return [[Sequelize.literal(`CAST(\`book\`.\`publishedYear\` AS INTEGER)`), dir]]
|
||||
} else if (sortBy === 'media.metadata.authorNameLF') {
|
||||
// Sort by author name last first, secondary sort by title
|
||||
return [[Sequelize.literal('`libraryItem`.`authorNamesLastFirst` COLLATE NOCASE'), dir], getTitleOrder()]
|
||||
return [[Sequelize.literal('`libraryItem`.`authorNamesLastFirst` COLLATE NOCASE'), dir], getTitleOrder(), libraryItemIdOrder]
|
||||
} else if (sortBy === 'media.metadata.authorName') {
|
||||
// Sort by author name first last, secondary sort by title
|
||||
return [[Sequelize.literal('`libraryItem`.`authorNamesFirstLast` COLLATE NOCASE'), dir], getTitleOrder()]
|
||||
return [[Sequelize.literal('`libraryItem`.`authorNamesFirstLast` COLLATE NOCASE'), dir], getTitleOrder(), libraryItemIdOrder]
|
||||
} else if (sortBy === 'media.metadata.title') {
|
||||
if (collapseseries) {
|
||||
return [[Sequelize.literal('display_title COLLATE NOCASE'), dir]]
|
||||
}
|
||||
return [getTitleOrder()]
|
||||
return [getTitleOrder(), libraryItemIdOrder]
|
||||
} else if (sortBy === 'sequence') {
|
||||
const nullDir = sortDesc ? 'DESC NULLS FIRST' : 'ASC NULLS LAST'
|
||||
return [[Sequelize.literal(`CAST(\`series.bookSeries.sequence\` AS FLOAT) ${nullDir}`)]]
|
||||
|
|
@ -395,6 +397,8 @@ module.exports = {
|
|||
return [[Sequelize.literal(`mediaProgresses.finishedAt ${dir} NULLS LAST`)]]
|
||||
} else if (sortBy === 'random') {
|
||||
return [Database.sequelize.random()]
|
||||
} else if (sortBy === 'updatedAt') {
|
||||
return [[Sequelize.literal('libraryItem.updatedAt'), dir], libraryItemIdOrder]
|
||||
}
|
||||
return []
|
||||
},
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue