feat: implement duplicate title normalized filter

This commit is contained in:
Tiberiu Ichim 2026-02-22 16:46:14 +02:00
parent aa85106681
commit ead215e777
13 changed files with 276 additions and 1 deletions

View file

@ -146,6 +146,7 @@ class Book extends Model {
},
title: DataTypes.STRING,
titleIgnorePrefix: DataTypes.STRING,
titleNormalized: DataTypes.STRING,
subtitle: DataTypes.STRING,
publishedYear: DataTypes.STRING,
publishedDate: DataTypes.STRING,
@ -407,7 +408,9 @@ class Book extends Model {
this[key] = payload.metadata[key] || null
if (key === 'title') {
const { getTitleIgnorePrefix, getNormalizedTitle } = require('../utils')
this.titleIgnorePrefix = getTitleIgnorePrefix(this.title)
this.titleNormalized = getNormalizedTitle(this.title)
}
hasUpdates = true

View file

@ -78,6 +78,8 @@ class LibraryItem extends Model {
/** @type {string} */
this.titleIgnorePrefix // Only used for sorting
/** @type {string} */
this.titleNormalized // Only used for sorting
/** @type {string} */
this.authorNamesFirstLast // Only used for sorting
/** @type {string} */
this.authorNamesLastFirst // Only used for sorting
@ -687,6 +689,7 @@ class LibraryItem extends Model {
extraData: DataTypes.JSON,
title: DataTypes.STRING,
titleIgnorePrefix: DataTypes.STRING,
titleNormalized: DataTypes.STRING,
authorNamesFirstLast: DataTypes.STRING,
authorNamesLastFirst: DataTypes.STRING,
isNotConsolidated: {
@ -719,6 +722,9 @@ class LibraryItem extends Model {
{
fields: ['libraryId', 'mediaType', { name: 'titleIgnorePrefix', collate: 'NOCASE' }]
},
{
fields: ['libraryId', 'mediaType', { name: 'titleNormalized', collate: 'NOCASE' }]
},
{
fields: ['libraryId', 'mediaType', { name: 'authorNamesFirstLast', collate: 'NOCASE' }]
},
@ -795,6 +801,7 @@ class LibraryItem extends Model {
if (instance.media) {
instance.title = instance.media.title
instance.titleIgnorePrefix = instance.media.titleIgnorePrefix
instance.titleNormalized = instance.media.titleNormalized
if (instance.isBook) {
if (instance.media.authors !== undefined) {
instance.authorNamesFirstLast = instance.media.authorName

View file

@ -1,5 +1,5 @@
const { DataTypes, Model } = require('sequelize')
const { getTitlePrefixAtEnd, getTitleIgnorePrefix } = require('../utils')
const { getTitlePrefixAtEnd, getTitleIgnorePrefix, getNormalizedTitle } = require('../utils')
const Logger = require('../Logger')
const libraryItemsPodcastFilters = require('../utils/queries/libraryItemsPodcastFilters')
const htmlSanitizer = require('../utils/htmlSanitizer')
@ -93,6 +93,7 @@ class Podcast extends Model {
{
title,
titleIgnorePrefix: getTitleIgnorePrefix(title),
titleNormalized: getNormalizedTitle(title),
author: typeof payload.metadata.author === 'string' ? payload.metadata.author : null,
releaseDate: typeof payload.metadata.releaseDate === 'string' ? payload.metadata.releaseDate : null,
feedURL: typeof payload.metadata.feedUrl === 'string' ? payload.metadata.feedUrl : null,
@ -130,6 +131,7 @@ class Podcast extends Model {
},
title: DataTypes.STRING,
titleIgnorePrefix: DataTypes.STRING,
titleNormalized: DataTypes.STRING,
author: DataTypes.STRING,
releaseDate: DataTypes.STRING,
feedURL: DataTypes.STRING,
@ -257,6 +259,7 @@ class Podcast extends Model {
if (key === 'title') {
this.titleIgnorePrefix = getTitleIgnorePrefix(this.title)
this.titleNormalized = getNormalizedTitle(this.title)
}
hasUpdates = true