diff --git a/client/components/content/LibraryItemDetails.vue b/client/components/content/LibraryItemDetails.vue
index 50c060af..6764beb0 100644
--- a/client/components/content/LibraryItemDetails.vue
+++ b/client/components/content/LibraryItemDetails.vue
@@ -24,7 +24,7 @@
{{ $strings.LabelPublisher }}
- {{ publisher }}
+ {{ publisher }}
diff --git a/client/components/controls/LibraryFilterSelect.vue b/client/components/controls/LibraryFilterSelect.vue
index 7c093c16..e3393dad 100644
--- a/client/components/controls/LibraryFilterSelect.vue
+++ b/client/components/controls/LibraryFilterSelect.vue
@@ -124,6 +124,11 @@ export default {
value: 'narrators',
sublist: true
},
+ {
+ text: this.$strings.LabelPublisher,
+ value: 'publishers',
+ sublist: true
+ },
{
text: this.$strings.LabelLanguage,
value: 'languages',
@@ -167,6 +172,11 @@ export default {
value: 'narrators',
sublist: true
},
+ {
+ text: this.$strings.LabelPublisher,
+ value: 'publishers',
+ sublist: true
+ },
{
text: this.$strings.LabelLanguage,
value: 'languages',
@@ -313,6 +323,9 @@ export default {
languages() {
return this.filterData.languages || []
},
+ publishers() {
+ return this.filterData.publishers || []
+ },
progress() {
return [
{
diff --git a/client/store/libraries.js b/client/store/libraries.js
index a34a93c5..e0151626 100644
--- a/client/store/libraries.js
+++ b/client/store/libraries.js
@@ -238,21 +238,23 @@ export const mutations = {
if (!libraryItem || !state.filterData) return
if (state.currentLibraryId !== libraryItem.libraryId) return
/*
- var data = {
+ structure of filterData:
+ {
authors: [],
genres: [],
tags: [],
series: [],
narrators: [],
- languages: []
+ languages: [],
+ publishers: []
}
*/
- var mediaMetadata = libraryItem.media.metadata
+ const mediaMetadata = libraryItem.media.metadata
// Add/update book authors
- if (mediaMetadata.authors && mediaMetadata.authors.length) {
+ if (mediaMetadata.authors?.length) {
mediaMetadata.authors.forEach((author) => {
- var indexOf = state.filterData.authors.findIndex(au => au.id === author.id)
+ const indexOf = state.filterData.authors.findIndex(au => au.id === author.id)
if (indexOf >= 0) {
state.filterData.authors.splice(indexOf, 1, author)
} else {
@@ -263,9 +265,9 @@ export const mutations = {
}
// Add/update series
- if (mediaMetadata.series && mediaMetadata.series.length) {
+ if (mediaMetadata.series?.length) {
mediaMetadata.series.forEach((series) => {
- var indexOf = state.filterData.series.findIndex(se => se.id === series.id)
+ const indexOf = state.filterData.series.findIndex(se => se.id === series.id)
if (indexOf >= 0) {
state.filterData.series.splice(indexOf, 1, { id: series.id, name: series.name })
} else {
@@ -276,7 +278,7 @@ export const mutations = {
}
// Add genres
- if (mediaMetadata.genres && mediaMetadata.genres.length) {
+ if (mediaMetadata.genres?.length) {
mediaMetadata.genres.forEach((genre) => {
if (!state.filterData.genres.includes(genre)) {
state.filterData.genres.push(genre)
@@ -286,7 +288,7 @@ export const mutations = {
}
// Add tags
- if (libraryItem.media.tags && libraryItem.media.tags.length) {
+ if (libraryItem.media.tags?.length) {
libraryItem.media.tags.forEach((tag) => {
if (!state.filterData.tags.includes(tag)) {
state.filterData.tags.push(tag)
@@ -296,7 +298,7 @@ export const mutations = {
}
// Add narrators
- if (mediaMetadata.narrators && mediaMetadata.narrators.length) {
+ if (mediaMetadata.narrators?.length) {
mediaMetadata.narrators.forEach((narrator) => {
if (!state.filterData.narrators.includes(narrator)) {
state.filterData.narrators.push(narrator)
@@ -305,12 +307,16 @@ export const mutations = {
})
}
+ // Add publishers
+ if (mediaMetadata.publisher && !state.filterData.publishers.includes(mediaMetadata.publisher)) {
+ state.filterData.publishers.push(mediaMetadata.publisher)
+ state.filterData.publishers.sort((a, b) => a.localeCompare(b))
+ }
+
// Add language
- if (mediaMetadata.language) {
- if (!state.filterData.languages.includes(mediaMetadata.language)) {
- state.filterData.languages.push(mediaMetadata.language)
- state.filterData.languages.sort((a, b) => a.localeCompare(b))
- }
+ if (mediaMetadata.language && !state.filterData.languages.includes(mediaMetadata.language)) {
+ state.filterData.languages.push(mediaMetadata.language)
+ state.filterData.languages.sort((a, b) => a.localeCompare(b))
}
},
setCollections(state, collections) {
diff --git a/client/store/user.js b/client/store/user.js
index 64b1776e..85babb09 100644
--- a/client/store/user.js
+++ b/client/store/user.js
@@ -80,7 +80,7 @@ export const actions = {
if (state.settings.orderBy == 'media.metadata.publishedYear') {
settingsUpdate.orderBy = 'media.metadata.title'
}
- const invalidFilters = ['series', 'authors', 'narrators', 'languages', 'progress', 'issues', 'ebooks', 'abridged']
+ const invalidFilters = ['series', 'authors', 'narrators', 'publishers', 'languages', 'progress', 'issues', 'ebooks', 'abridged']
const filterByFirstPart = (state.settings.filterBy || '').split('.').shift()
if (invalidFilters.includes(filterByFirstPart)) {
settingsUpdate.filterBy = 'all'
diff --git a/server/utils/libraryHelpers.js b/server/utils/libraryHelpers.js
index 9ebd3323..7c4f9cf6 100644
--- a/server/utils/libraryHelpers.js
+++ b/server/utils/libraryHelpers.js
@@ -14,7 +14,7 @@ module.exports = {
getFilteredLibraryItems(libraryItems, filterBy, user, feedsArray) {
let filtered = libraryItems
- const searchGroups = ['genres', 'tags', 'series', 'authors', 'progress', 'narrators', 'missing', 'languages', 'tracks', 'ebooks']
+ const searchGroups = ['genres', 'tags', 'series', 'authors', 'progress', 'narrators', 'publishers', 'missing', 'languages', 'tracks', 'ebooks']
const group = searchGroups.find(_group => filterBy.startsWith(_group + '.'))
if (group) {
const filterVal = filterBy.replace(`${group}.`, '')
@@ -29,6 +29,7 @@ module.exports = {
}
else if (group === 'authors') filtered = filtered.filter(li => li.isBook && li.media.metadata.hasAuthor(filter))
else if (group === 'narrators') filtered = filtered.filter(li => li.isBook && li.media.metadata.hasNarrator(filter))
+ else if (group === 'publishers') filtered = filtered.filter(li => li.isBook && li.media.metadata.publisher === filter)
else if (group === 'progress') {
filtered = filtered.filter(li => {
const itemProgress = user.getMediaProgress(li.id)
@@ -82,16 +83,17 @@ module.exports = {
// Returns false if should be filtered out
checkFilterForSeriesLibraryItem(libraryItem, filterBy) {
- var searchGroups = ['genres', 'tags', 'authors', 'progress', 'narrators', 'languages']
- var group = searchGroups.find(_group => filterBy.startsWith(_group + '.'))
+ const searchGroups = ['genres', 'tags', 'authors', 'progress', 'narrators', 'publishers', 'languages']
+ const group = searchGroups.find(_group => filterBy.startsWith(_group + '.'))
if (group) {
- var filterVal = filterBy.replace(`${group}.`, '')
- var filter = this.decode(filterVal)
+ const filterVal = filterBy.replace(`${group}.`, '')
+ const filter = this.decode(filterVal)
if (group === 'genres') return libraryItem.media.metadata.genres.includes(filter)
else if (group === 'tags') return libraryItem.media.tags.includes(filter)
else if (group === 'authors') return libraryItem.isBook && libraryItem.media.metadata.hasAuthor(filter)
else if (group === 'narrators') return libraryItem.isBook && libraryItem.media.metadata.hasNarrator(filter)
+ else if (group === 'publishers') return libraryItem.isBook && libraryItem.media.metadata.publisher === filter
else if (group === 'languages') {
return libraryItem.media.metadata.language === filter
}
@@ -123,27 +125,28 @@ module.exports = {
},
getDistinctFilterDataNew(libraryItems) {
- var data = {
+ const data = {
authors: [],
genres: [],
tags: [],
series: [],
narrators: [],
- languages: []
+ languages: [],
+ publishers: []
}
libraryItems.forEach((li) => {
- var mediaMetadata = li.media.metadata
- if (mediaMetadata.authors && mediaMetadata.authors.length) {
+ const mediaMetadata = li.media.metadata
+ if (mediaMetadata.authors?.length) {
mediaMetadata.authors.forEach((author) => {
- if (author && !data.authors.find(au => au.id === author.id)) data.authors.push({ id: author.id, name: author.name })
+ if (author && !data.authors.some(au => au.id === author.id)) data.authors.push({ id: author.id, name: author.name })
})
}
- if (mediaMetadata.series && mediaMetadata.series.length) {
+ if (mediaMetadata.series?.length) {
mediaMetadata.series.forEach((series) => {
- if (series && !data.series.find(se => se.id === series.id)) data.series.push({ id: series.id, name: series.name })
+ if (series && !data.series.some(se => se.id === series.id)) data.series.push({ id: series.id, name: series.name })
})
}
- if (mediaMetadata.genres && mediaMetadata.genres.length) {
+ if (mediaMetadata.genres?.length) {
mediaMetadata.genres.forEach((genre) => {
if (genre && !data.genres.includes(genre)) data.genres.push(genre)
})
@@ -153,18 +156,24 @@ module.exports = {
if (tag && !data.tags.includes(tag)) data.tags.push(tag)
})
}
- if (mediaMetadata.narrators && mediaMetadata.narrators.length) {
+ if (mediaMetadata.narrators?.length) {
mediaMetadata.narrators.forEach((narrator) => {
if (narrator && !data.narrators.includes(narrator)) data.narrators.push(narrator)
})
}
- if (mediaMetadata.language && !data.languages.includes(mediaMetadata.language)) data.languages.push(mediaMetadata.language)
+ if (mediaMetadata.publisher && !data.publishers.includes(mediaMetadata.publisher)) {
+ data.publishers.push(mediaMetadata.publisher)
+ }
+ if (mediaMetadata.language && !data.languages.includes(mediaMetadata.language)) {
+ data.languages.push(mediaMetadata.language)
+ }
})
data.authors = naturalSort(data.authors).asc(au => au.name)
data.genres = naturalSort(data.genres).asc()
data.tags = naturalSort(data.tags).asc()
data.series = naturalSort(data.series).asc(se => se.name)
data.narrators = naturalSort(data.narrators).asc()
+ data.publishers = naturalSort(data.publishers).asc()
data.languages = naturalSort(data.languages).asc()
return data
},