diff --git a/client/components/controls/LibraryFilterSelect.vue b/client/components/controls/LibraryFilterSelect.vue index 42a513a8..f94bef85 100644 --- a/client/components/controls/LibraryFilterSelect.vue +++ b/client/components/controls/LibraryFilterSelect.vue @@ -188,9 +188,9 @@ export default { sublist: true }, { - text: this.$strings.LabelEbook, - value: 'ebook', - sublist: false + text: this.$strings.LabelEbooks, + value: 'ebooks', + sublist: true }, { text: this.$strings.LabelAbridged, @@ -341,6 +341,18 @@ export default { } ] }, + ebooks() { + return [ + { + id: 'ebook', + name: this.$strings.LabelHasEbook + }, + { + id: 'supplementary', + name: this.$strings.LabelHasSupplementaryEbook + } + ] + }, missing() { return [ { diff --git a/client/store/user.js b/client/store/user.js index d90c911e..37f8e9c3 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'] + const invalidFilters = ['series', 'authors', 'narrators', 'languages', 'progress', 'issues', 'ebooks', 'abridged'] const filterByFirstPart = (state.settings.filterBy || '').split('.').shift() if (invalidFilters.includes(filterByFirstPart)) { settingsUpdate.filterBy = 'all' diff --git a/client/strings/de.json b/client/strings/de.json index 9da24798..7f8d78ea 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -224,6 +224,7 @@ "LabelDuration": "Laufzeit", "LabelDurationFound": "Gefundene Laufzeit:", "LabelEbook": "Ebook", + "LabelEbooks": "Ebooks", "LabelEdit": "Bearbeiten", "LabelEmail": "Email", "LabelEmailSettingsFromAddress": "From Address", @@ -251,6 +252,8 @@ "LabelGenre": "Kategorie", "LabelGenres": "Kategorien", "LabelHardDeleteFile": "Datei dauerhaft löschen", + "LabelHasEbook": "Has ebook", + "LabelHasSupplementaryEbook": "Has supplementary ebook", "LabelHost": "Host", "LabelHour": "Stunde", "LabelIcon": "Symbol", diff --git a/client/strings/en-us.json b/client/strings/en-us.json index ad854733..fa8d35b6 100644 --- a/client/strings/en-us.json +++ b/client/strings/en-us.json @@ -224,6 +224,7 @@ "LabelDuration": "Duration", "LabelDurationFound": "Duration found:", "LabelEbook": "Ebook", + "LabelEbooks": "Ebooks", "LabelEdit": "Edit", "LabelEmail": "Email", "LabelEmailSettingsFromAddress": "From Address", @@ -251,6 +252,8 @@ "LabelGenre": "Genre", "LabelGenres": "Genres", "LabelHardDeleteFile": "Hard delete file", + "LabelHasEbook": "Has ebook", + "LabelHasSupplementaryEbook": "Has supplementary ebook", "LabelHost": "Host", "LabelHour": "Hour", "LabelIcon": "Icon", diff --git a/client/strings/es.json b/client/strings/es.json index e291ea4a..b8ff1e96 100644 --- a/client/strings/es.json +++ b/client/strings/es.json @@ -224,6 +224,7 @@ "LabelDuration": "Duración", "LabelDurationFound": "Duración Comprobada:", "LabelEbook": "Ebook", + "LabelEbooks": "Ebooks", "LabelEdit": "Editar", "LabelEmail": "Email", "LabelEmailSettingsFromAddress": "From Address", @@ -251,6 +252,8 @@ "LabelGenre": "Genero", "LabelGenres": "Géneros", "LabelHardDeleteFile": "Eliminar Definitivamente", + "LabelHasEbook": "Has ebook", + "LabelHasSupplementaryEbook": "Has supplementary ebook", "LabelHost": "Host", "LabelHour": "Hora", "LabelIcon": "Icono", diff --git a/client/strings/fr.json b/client/strings/fr.json index 62d59ab6..09b38183 100644 --- a/client/strings/fr.json +++ b/client/strings/fr.json @@ -224,6 +224,7 @@ "LabelDuration": "Durée", "LabelDurationFound": "Durée trouvée :", "LabelEbook": "E-book", + "LabelEbooks": "Ebooks", "LabelEdit": "Modifier", "LabelEmail": "E-mail", "LabelEmailSettingsFromAddress": "Expéditeur", @@ -251,6 +252,8 @@ "LabelGenre": "Genre", "LabelGenres": "Genres", "LabelHardDeleteFile": "Suppression du fichier", + "LabelHasEbook": "Has ebook", + "LabelHasSupplementaryEbook": "Has supplementary ebook", "LabelHost": "Hôte", "LabelHour": "Heure", "LabelIcon": "Icone", diff --git a/client/strings/gu.json b/client/strings/gu.json index eb44d6c2..b8f63f27 100644 --- a/client/strings/gu.json +++ b/client/strings/gu.json @@ -224,6 +224,7 @@ "LabelDuration": "Duration", "LabelDurationFound": "Duration found:", "LabelEbook": "Ebook", + "LabelEbooks": "Ebooks", "LabelEdit": "Edit", "LabelEmail": "Email", "LabelEmailSettingsFromAddress": "From Address", @@ -251,6 +252,8 @@ "LabelGenre": "Genre", "LabelGenres": "Genres", "LabelHardDeleteFile": "Hard delete file", + "LabelHasEbook": "Has ebook", + "LabelHasSupplementaryEbook": "Has supplementary ebook", "LabelHost": "Host", "LabelHour": "Hour", "LabelIcon": "Icon", diff --git a/client/strings/hi.json b/client/strings/hi.json index f7fe595f..788d15ab 100644 --- a/client/strings/hi.json +++ b/client/strings/hi.json @@ -224,6 +224,7 @@ "LabelDuration": "Duration", "LabelDurationFound": "Duration found:", "LabelEbook": "Ebook", + "LabelEbooks": "Ebooks", "LabelEdit": "Edit", "LabelEmail": "Email", "LabelEmailSettingsFromAddress": "From Address", @@ -251,6 +252,8 @@ "LabelGenre": "Genre", "LabelGenres": "Genres", "LabelHardDeleteFile": "Hard delete file", + "LabelHasEbook": "Has ebook", + "LabelHasSupplementaryEbook": "Has supplementary ebook", "LabelHost": "Host", "LabelHour": "Hour", "LabelIcon": "Icon", diff --git a/client/strings/hr.json b/client/strings/hr.json index d7a49c54..98e2a434 100644 --- a/client/strings/hr.json +++ b/client/strings/hr.json @@ -224,6 +224,7 @@ "LabelDuration": "Trajanje", "LabelDurationFound": "Pronađeno trajanje:", "LabelEbook": "Ebook", + "LabelEbooks": "Ebooks", "LabelEdit": "Uredi", "LabelEmail": "Email", "LabelEmailSettingsFromAddress": "From Address", @@ -251,6 +252,8 @@ "LabelGenre": "Genre", "LabelGenres": "Žanrovi", "LabelHardDeleteFile": "Obriši datoteku zauvijek", + "LabelHasEbook": "Has ebook", + "LabelHasSupplementaryEbook": "Has supplementary ebook", "LabelHost": "Host", "LabelHour": "Sat", "LabelIcon": "Ikona", diff --git a/client/strings/it.json b/client/strings/it.json index 00127dc4..a902960f 100644 --- a/client/strings/it.json +++ b/client/strings/it.json @@ -224,6 +224,7 @@ "LabelDuration": "Durata", "LabelDurationFound": "Durata Trovata:", "LabelEbook": "Ebook", + "LabelEbooks": "Ebooks", "LabelEdit": "Modifica", "LabelEmail": "Email", "LabelEmailSettingsFromAddress": "From Address", @@ -251,6 +252,8 @@ "LabelGenre": "Genere", "LabelGenres": "Generi", "LabelHardDeleteFile": "Elimina Definitivamente", + "LabelHasEbook": "Has ebook", + "LabelHasSupplementaryEbook": "Has supplementary ebook", "LabelHost": "Host", "LabelHour": "Ora", "LabelIcon": "Icona", diff --git a/client/strings/nl.json b/client/strings/nl.json index 17c7d6b5..e528b828 100644 --- a/client/strings/nl.json +++ b/client/strings/nl.json @@ -224,6 +224,7 @@ "LabelDuration": "Duur", "LabelDurationFound": "Gevonden duur:", "LabelEbook": "Ebook", + "LabelEbooks": "Ebooks", "LabelEdit": "Wijzig", "LabelEmail": "Email", "LabelEmailSettingsFromAddress": "From Address", @@ -251,6 +252,8 @@ "LabelGenre": "Genre", "LabelGenres": "Genres", "LabelHardDeleteFile": "Hard-delete bestand", + "LabelHasEbook": "Has ebook", + "LabelHasSupplementaryEbook": "Has supplementary ebook", "LabelHost": "Host", "LabelHour": "Uur", "LabelIcon": "Icoon", diff --git a/client/strings/pl.json b/client/strings/pl.json index 9edbc4f6..330bf698 100644 --- a/client/strings/pl.json +++ b/client/strings/pl.json @@ -224,6 +224,7 @@ "LabelDuration": "Czas trwania", "LabelDurationFound": "Znaleziona długość:", "LabelEbook": "Ebook", + "LabelEbooks": "Ebooks", "LabelEdit": "Edytuj", "LabelEmail": "Email", "LabelEmailSettingsFromAddress": "From Address", @@ -251,6 +252,8 @@ "LabelGenre": "Gatunek", "LabelGenres": "Gatunki", "LabelHardDeleteFile": "Usuń trwale plik", + "LabelHasEbook": "Has ebook", + "LabelHasSupplementaryEbook": "Has supplementary ebook", "LabelHost": "Host", "LabelHour": "Godzina", "LabelIcon": "Ikona", diff --git a/client/strings/ru.json b/client/strings/ru.json index a2cffcd7..e7646f1d 100644 --- a/client/strings/ru.json +++ b/client/strings/ru.json @@ -224,6 +224,7 @@ "LabelDuration": "Длина", "LabelDurationFound": "Найденная длина:", "LabelEbook": "Ebook", + "LabelEbooks": "Ebooks", "LabelEdit": "Редактировать", "LabelEmail": "Email", "LabelEmailSettingsFromAddress": "From Address", @@ -251,6 +252,8 @@ "LabelGenre": "Жанр", "LabelGenres": "Жанры", "LabelHardDeleteFile": "Жесткое удаление файла", + "LabelHasEbook": "Has ebook", + "LabelHasSupplementaryEbook": "Has supplementary ebook", "LabelHost": "Host", "LabelHour": "Часы", "LabelIcon": "Иконка", diff --git a/client/strings/zh-cn.json b/client/strings/zh-cn.json index 1f51a48b..a9851af5 100644 --- a/client/strings/zh-cn.json +++ b/client/strings/zh-cn.json @@ -224,6 +224,7 @@ "LabelDuration": "持续时间", "LabelDurationFound": "找到持续时间:", "LabelEbook": "Ebook", + "LabelEbooks": "Ebooks", "LabelEdit": "编辑", "LabelEmail": "Email", "LabelEmailSettingsFromAddress": "From Address", @@ -251,6 +252,8 @@ "LabelGenre": "流派", "LabelGenres": "流派", "LabelHardDeleteFile": "完全删除文件", + "LabelHasEbook": "Has ebook", + "LabelHasSupplementaryEbook": "Has supplementary ebook", "LabelHost": "Host", "LabelHour": "小时", "LabelIcon": "图标", diff --git a/server/utils/libraryHelpers.js b/server/utils/libraryHelpers.js index baab216d..fb63cb2a 100644 --- a/server/utils/libraryHelpers.js +++ b/server/utils/libraryHelpers.js @@ -13,7 +13,7 @@ module.exports = { getFilteredLibraryItems(libraryItems, filterBy, user, feedsArray) { let filtered = libraryItems - const searchGroups = ['genres', 'tags', 'series', 'authors', 'progress', 'narrators', 'missing', 'languages', 'tracks'] + const searchGroups = ['genres', 'tags', 'series', 'authors', 'progress', 'narrators', 'missing', 'languages', 'tracks', 'ebooks'] const group = searchGroups.find(_group => filterBy.startsWith(_group + '.')) if (group) { const filterVal = filterBy.replace(`${group}.`, '') @@ -62,6 +62,9 @@ module.exports = { } else if (group === 'tracks') { if (filter === 'single') filtered = filtered.filter(li => li.isBook && li.media.numTracks === 1) else if (filter === 'multi') filtered = filtered.filter(li => li.isBook && li.media.numTracks > 1) + } else if (group === 'ebooks') { + if (filter === 'ebook') filtered = filtered.filter(li => li.media.ebookFile) + else if (filter === 'supplementary') filtered = filtered.filter(li => li.libraryFiles.some(lf => lf.isEBookFile && lf.ino !== li.media.ebookFile?.ino)) } } else if (filterBy === 'issues') { filtered = filtered.filter(li => li.hasIssues)