New data model for global search input and search page

This commit is contained in:
advplyr 2022-03-13 12:39:12 -05:00
parent 30f15d3575
commit ea9ec13845
16 changed files with 241 additions and 88 deletions

View file

@ -25,6 +25,9 @@ class Library {
get folderPaths() {
return this.folders.map(f => f.fullPath)
}
get itemMediaType() {
return this.mediaType === 'podcast' ? 'podcast' : 'book'
}
construct(library) {
this.id = library.id

View file

@ -401,5 +401,10 @@ class LibraryItem {
}
return hasUpdated
}
searchQuery(query) {
query = query.toLowerCase()
return this.media.searchQuery(query)
}
}
module.exports = LibraryItem

View file

@ -313,5 +313,33 @@ class Book {
}
return false
}
searchQuery(query) {
var payload = {
tags: this.tags.filter(t => t.toLowerCase().includes(query)),
series: this.metadata.searchSeries(query),
authors: this.metadata.searchAuthors(query),
matchKey: null,
matchText: null
}
var metadataMatch = this.metadata.searchQuery(query)
if (metadataMatch) {
payload.matchKey = metadataMatch.matchKey
payload.matchText = metadataMatch.matchText
} else {
if (payload.authors.length) {
payload.matchKey = 'authors'
payload.matchText = this.metadata.authorName
} else if (payload.series.length) {
payload.matchKey = 'series'
payload.matchText = this.metadata.seriesName
}
else if (payload.tags.length) {
payload.matchKey = 'tags'
payload.matchText = this.tags.join(', ')
}
}
return payload
}
}
module.exports = Book

View file

@ -124,5 +124,10 @@ class Podcast {
async syncMetadataFiles(textMetadataFiles, opfMetadataOverrideDetails) {
return false
}
searchQuery(query) {
var payload = this.metadata.searchQuery(query)
return payload || {}
}
}
module.exports = Podcast

View file

@ -91,6 +91,13 @@ class BookMetadata {
if (!this.authors.length) return ''
return this.authors.map(au => au.name).join(', ')
}
get seriesName() {
if (!this.series.length) return ''
return this.series.map(se => {
if (!se.sequence) return se.name
return `${se.name} #${se.sequence}`
}).join(', ')
}
get narratorName() {
return this.narrators.join(', ')
}
@ -268,5 +275,24 @@ class BookMetadata {
sequence: sequenceTag || ''
}]
}
searchSeries(query) {
return this.series.filter(se => se.name.toLowerCase().includes(query))
}
searchAuthors(query) {
return this.authors.filter(se => se.name.toLowerCase().includes(query))
}
searchQuery(query) { // Returns key if match is found
var keysToCheck = ['title', 'asin', 'isbn']
for (var key of keysToCheck) {
if (this[key] && this[key].toLowerCase().includes(query)) {
return {
matchKey: key,
matchText: this[key]
}
}
}
return null
}
}
module.exports = BookMetadata

View file

@ -47,5 +47,18 @@ class PodcastMetadata {
toJSONExpanded() {
return this.toJSON()
}
searchQuery(query) { // Returns key if match is found
var keysToCheck = ['title', 'artist', 'itunesId', 'itunesArtistId']
for (var key of keysToCheck) {
if (this[key] && String(this[key]).toLowerCase().includes(query)) {
return {
matchKey: key,
matchText: this[key]
}
}
}
return null
}
}
module.exports = PodcastMetadata