From e2bb0cfb7cb7fb4587eaf0ff346296c37c24b315 Mon Sep 17 00:00:00 2001 From: KeyboardHammer Date: Sat, 3 Feb 2024 21:48:35 -0600 Subject: [PATCH 01/43] add sorting to author page --- client/components/app/BookShelfToolbar.vue | 30 +++++++++++++++++++ .../pages/library/_library/authors/index.vue | 23 +++++++++++++- client/store/user.js | 4 ++- server/controllers/LibraryController.js | 1 + 4 files changed, 56 insertions(+), 2 deletions(-) diff --git a/client/components/app/BookShelfToolbar.vue b/client/components/app/BookShelfToolbar.vue index bd31768b..74ab02f1 100644 --- a/client/components/app/BookShelfToolbar.vue +++ b/client/components/app/BookShelfToolbar.vue @@ -98,6 +98,9 @@ @@ -183,6 +186,30 @@ export default { } ] }, + authorSortItems() { + return [ + { + text: this.$strings.LabelAuthorFirstLast, + value: 'name' + }, + { + text: this.$strings.LabelAuthorLastFirst, + value: 'lastFirst' + }, + { + text: this.$strings.LabelNumberOfBooks, + value: 'numBooks' + }, + { + text: this.$strings.LabelAddedAt, + value: 'addedAt' + }, + { + text: this.$strings.LabelLastUpdated, + value: 'lastUpdated' + } + ] + }, userIsAdminOrUp() { return this.$store.getters['user/getIsAdminOrUp'] }, @@ -455,6 +482,9 @@ export default { updateCollapseBookSeries() { this.saveSettings() }, + updateAuthorSort() { + this.saveSettings() + }, saveSettings() { this.$store.dispatch('user/updateUserSettings', this.settings) }, diff --git a/client/pages/library/_library/authors/index.vue b/client/pages/library/_library/authors/index.vue index 1f8e385b..a81865a5 100644 --- a/client/pages/library/_library/authors/index.vue +++ b/client/pages/library/_library/authors/index.vue @@ -48,9 +48,12 @@ export default { }, methods: { async init() { + this.settings = { ...this.$store.state.user.settings } this.authors = await this.$axios .$get(`/api/libraries/${this.currentLibraryId}/authors`) - .then((response) => response.authors) + .then((response) => { + return this.sortAuthors(response.authors) + }) .catch((error) => { console.error('Failed to load authors', error) return [] @@ -78,15 +81,33 @@ export default { }, editAuthor(author) { this.$store.commit('globals/showEditAuthorModal', author) + }, + sortAuthors(authors) { + const sortProp = this.settings.authorSortBy + const bDesc = this.settings.authorSortDesc === true ? -1 : 1 + return authors.sort((a, b) => { + if (typeof a[sortProp] === 'number' && typeof b[sortProp] === 'number') { + return a[sortProp] > b[sortProp] ? 1 * bDesc : -1 * bDesc + } + return a[sortProp].localeCompare(b[sortProp], undefined, { sensitivity: 'base' }) * bDesc + }) + }, + settingsUpdated(settings) { + for (const key in settings) { + this.settings[key] = settings[key] + } + this.sortAuthors(this.authors) } }, mounted() { this.init() + this.$eventBus.$on('user-settings', this.settingsUpdated) this.$root.socket.on('author_added', this.authorAdded) this.$root.socket.on('author_updated', this.authorUpdated) this.$root.socket.on('author_removed', this.authorRemoved) }, beforeDestroy() { + this.$eventBus.$off('user-settings', this.settingsUpdated) this.$root.socket.off('author_added', this.authorAdded) this.$root.socket.off('author_updated', this.authorUpdated) this.$root.socket.off('author_removed', this.authorRemoved) diff --git a/client/store/user.js b/client/store/user.js index 85babb09..40a8813f 100644 --- a/client/store/user.js +++ b/client/store/user.js @@ -11,7 +11,9 @@ export const state = () => ({ useChapterTrack: false, seriesSortBy: 'name', seriesSortDesc: false, - seriesFilterBy: 'all' + seriesFilterBy: 'all', + authorSortBy: 'name', + authorSortDesc: false, } }) diff --git a/server/controllers/LibraryController.js b/server/controllers/LibraryController.js index 70baff85..b2500d4f 100644 --- a/server/controllers/LibraryController.js +++ b/server/controllers/LibraryController.js @@ -636,6 +636,7 @@ class LibraryController { for (const author of authors) { const oldAuthor = author.getOldAuthor().toJSON() oldAuthor.numBooks = author.books.length + oldAuthor.lastFirst = author.lastFirst oldAuthors.push(oldAuthor) } From d24427aad8dd613d2035e0424930f705527b185a Mon Sep 17 00:00:00 2001 From: KeyboardHammer Date: Sat, 3 Feb 2024 22:04:40 -0600 Subject: [PATCH 02/43] fix property --- client/components/app/BookShelfToolbar.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/components/app/BookShelfToolbar.vue b/client/components/app/BookShelfToolbar.vue index 74ab02f1..9064c914 100644 --- a/client/components/app/BookShelfToolbar.vue +++ b/client/components/app/BookShelfToolbar.vue @@ -205,8 +205,8 @@ export default { value: 'addedAt' }, { - text: this.$strings.LabelLastUpdated, - value: 'lastUpdated' + text: this.$strings.LabelUpdatedAt, + value: 'updatedAt' } ] }, From b47793c365aaafee08db3cb4fe0b5a070029fb4f Mon Sep 17 00:00:00 2001 From: mikiher Date: Mon, 26 Feb 2024 14:00:25 +0200 Subject: [PATCH 03/43] Add cache control header for timestamped cover image requests --- server/controllers/LibraryItemController.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/controllers/LibraryItemController.js b/server/controllers/LibraryItemController.js index dfa1daea..3fa7743a 100644 --- a/server/controllers/LibraryItemController.js +++ b/server/controllers/LibraryItemController.js @@ -283,6 +283,9 @@ class LibraryItemController { return res.sendStatus(404) } + if (req.query.ts) + res.set('Cache-Control', 'private, max-age=86400') + if (raw) { // any value if (global.XAccel) { const encodedURI = encodeUriPath(global.XAccel + libraryItem.media.coverPath) From 655bebfec4c6ba71751a7aa4a0f3e7af7f5e4789 Mon Sep 17 00:00:00 2001 From: Teekeks Date: Tue, 27 Feb 2024 18:30:05 +0100 Subject: [PATCH 04/43] feat: Expanded filter to include "has no ebook" and "has no supplementary ebooks" options --- client/components/controls/LibraryFilterSelect.vue | 8 ++++++++ client/strings/de.json | 2 ++ client/strings/en-us.json | 2 ++ server/utils/queries/libraryItemsBookFilters.js | 8 ++++++++ 4 files changed, 20 insertions(+) diff --git a/client/components/controls/LibraryFilterSelect.vue b/client/components/controls/LibraryFilterSelect.vue index 5ed4400b..04dd11af 100644 --- a/client/components/controls/LibraryFilterSelect.vue +++ b/client/components/controls/LibraryFilterSelect.vue @@ -368,9 +368,17 @@ export default { id: 'ebook', name: this.$strings.LabelHasEbook }, + { + id: 'no-ebook', + name: this.$strings.LabelMissingEbook + }, { id: 'supplementary', name: this.$strings.LabelHasSupplementaryEbook + }, + { + id: 'no-supplementary', + name: this.$strings.LabelMissingSupplementaryEbook } ] }, diff --git a/client/strings/de.json b/client/strings/de.json index 5b2711c1..33b0fb1b 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta Tags", "LabelMinute": "Minute", "LabelMissing": "Fehlend", + "LabelMissingEbook": "E-Book fehlt", "LabelMissingParts": "Fehlende Teile", + "LabelMissingSupplementaryEbook": "Ergänzendes E-Book fehlt", "LabelMobileRedirectURIs": "Erlaubte Weiterleitungs-URIs für die mobile App", "LabelMobileRedirectURIsDescription": "Dies ist eine Whitelist gültiger Umleitungs-URIs für mobile Apps. Der Standardwert ist audiobookshelf://oauth, den du entfernen oder durch zusätzliche URIs für die Integration von Drittanbieter-Apps ergänzen kannst. Die Verwendung eines Sternchens (*) als alleiniger Eintrag erlaubt jede URI.", "LabelMore": "Mehr", diff --git a/client/strings/en-us.json b/client/strings/en-us.json index b8860ffa..2465f873 100644 --- a/client/strings/en-us.json +++ b/client/strings/en-us.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta Tags", "LabelMinute": "Minute", "LabelMissing": "Missing", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Missing Parts", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "More", diff --git a/server/utils/queries/libraryItemsBookFilters.js b/server/utils/queries/libraryItemsBookFilters.js index d23459b4..16a25847 100644 --- a/server/utils/queries/libraryItemsBookFilters.js +++ b/server/utils/queries/libraryItemsBookFilters.js @@ -204,6 +204,10 @@ module.exports = { mediaWhere['ebookFile'] = { [Sequelize.Op.not]: null } + } else if (value == 'no-ebook') { + mediaWhere['ebookFile'] = { + [Sequelize.Op.eq]: null + } } } else if (group === 'missing') { if (['asin', 'isbn', 'subtitle', 'publishedYear', 'description', 'publisher', 'language', 'cover'].includes(value)) { @@ -421,6 +425,10 @@ module.exports = { libraryItemWhere['libraryFiles'] = { [Sequelize.Op.substring]: `"isSupplementary":true` } + } else if (filterGroup === 'ebooks' && filterValue === 'no-supplementary') { + libraryItemWhere['libraryFiles'] = { + [Sequelize.Op.notLike]: Sequelize.literal(`\'%"isSupplementary":true%\'`), + } } else if (filterGroup === 'missing' && filterValue === 'authors') { authorInclude = { model: Database.authorModel, From d2b006b909f2b3ab2569e3929f8018aeb342fe75 Mon Sep 17 00:00:00 2001 From: advplyr Date: Wed, 28 Feb 2024 16:16:26 -0600 Subject: [PATCH 05/43] Update:Windows binary manager to install ffmpeg/ffprobe 5.1 #1098 --- server/managers/BinaryManager.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/managers/BinaryManager.js b/server/managers/BinaryManager.js index ec4ed3b6..b4121ab8 100644 --- a/server/managers/BinaryManager.js +++ b/server/managers/BinaryManager.js @@ -11,8 +11,8 @@ const fileUtils = require('../utils/fileUtils') class BinaryManager { defaultRequiredBinaries = [ - { name: 'ffmpeg', envVariable: 'FFMPEG_PATH', validVersions: ['5.1', '6'] }, - { name: 'ffprobe', envVariable: 'FFPROBE_PATH', validVersions: ['5.1', '6'] } + { name: 'ffmpeg', envVariable: 'FFMPEG_PATH', validVersions: ['5.1'] }, + { name: 'ffprobe', envVariable: 'FFPROBE_PATH', validVersions: ['5.1'] } ] constructor(requiredBinaries = this.defaultRequiredBinaries) { @@ -135,7 +135,7 @@ class BinaryManager { if (!binaries.length) return Logger.info(`[BinaryManager] Installing binaries: ${binaries.join(', ')}`) let destination = await fileUtils.isWritable(this.mainInstallPath) ? this.mainInstallPath : this.altInstallPath - await ffbinaries.downloadBinaries(binaries, { destination, version: '6.1', force: true }) + await ffbinaries.downloadBinaries(binaries, { destination, version: '5.1', force: true }) Logger.info(`[BinaryManager] Binaries installed to ${destination}`) } From 987842ed04e5a7e8025bdfc2ed576d9569eed8ec Mon Sep 17 00:00:00 2001 From: Lars Kiesow Date: Thu, 29 Feb 2024 17:56:55 +0100 Subject: [PATCH 06/43] Fix file names with URL control characters This patch ensures that files names like `series #3 xy.jpg` are actually handled correctly instead of the part after `#` being interpreted as fragment and being discarded. I noticed that in a few rare cases the App wouldn't properly display cover images. It turns out that due the file names containing a `#`, the file path got corrupted, causing Audiobookshelf to return a 403. --- server/utils/fileUtils.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/utils/fileUtils.js b/server/utils/fileUtils.js index 99bb49eb..1fc161c7 100644 --- a/server/utils/fileUtils.js +++ b/server/utils/fileUtils.js @@ -357,7 +357,10 @@ module.exports.removeFile = (path) => { } module.exports.encodeUriPath = (path) => { - const uri = new URL(path, "file://") + const uri = new URL('/', "file://") + // we assign the path here to assure that URL control characters like # are + // actually interpreted as part of the URL path + uri.pathname = path return uri.pathname } From 79d32274aa5c5a5cc02975e3dbc3b36fdebdb3e6 Mon Sep 17 00:00:00 2001 From: Lars Kiesow Date: Thu, 29 Feb 2024 18:16:29 +0100 Subject: [PATCH 07/43] Fix log source in log file The logger should include a source containing the location where the logger was called. This works well for logging to `stdout`. Unfortunately, the file logs contain the locations where the file logging is called inside of the logger. This is not helpful: ``` {"timestamp":"2023-11-19 16:35:43","source":"Logger.js:114","message":"[oldDbFiles] Processed db data file with 1 entities","levelName":"INFO","level":2} {"timestamp":"2023-11-19 16:35:43","source":"Logger.js:114","message":"[oldDbFiles] Finished loading db data with 2 entities","levelName":"INFO","level":2} {"timestamp":"2023-11-19 16:35:43","source":"Logger.js:114","message":"[oldDbFiles] 2 settings loaded","levelName":"INFO","level":2} ``` This patch fixes the issue, ensureing that the actual source location will be logged: ``` {"timestamp":"2024-02-29 18:12:59.832","source":"DailyLog.js:132","message":"[DailyLog] 2024-02-29: Loaded 20 Logs","levelName":"DEBUG","level":1} {"timestamp":"2024-02-29 18:12:59.638","source":"Server.js:172","message":"=== Starting Server ===","levelName":"INFO","level":2} {"timestamp":"2024-02-29 18:12:59.638","source":"Server.js:103","message":"[Server] Init v2.8.0","levelName":"INFO","level":2} ``` --- server/Logger.js | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/server/Logger.js b/server/Logger.js index ba20801f..7cc7aa4c 100644 --- a/server/Logger.js +++ b/server/Logger.js @@ -70,14 +70,15 @@ class Logger { } /** - * - * @param {number} level - * @param {string[]} args + * + * @param {number} level + * @param {string[]} args + * @param {string} src */ - async handleLog(level, args) { + async handleLog(level, args, src) { const logObj = { timestamp: this.timestamp, - source: this.source, + source: src, message: args.join(' '), levelName: this.getLogLevelString(level), level @@ -104,31 +105,31 @@ class Logger { trace(...args) { if (this.logLevel > LogLevel.TRACE) return console.trace(`[${this.timestamp}] TRACE:`, ...args) - this.handleLog(LogLevel.TRACE, args) + this.handleLog(LogLevel.TRACE, args, this.source) } debug(...args) { if (this.logLevel > LogLevel.DEBUG) return console.debug(`[${this.timestamp}] DEBUG:`, ...args, `(${this.source})`) - this.handleLog(LogLevel.DEBUG, args) + this.handleLog(LogLevel.DEBUG, args, this.source) } info(...args) { if (this.logLevel > LogLevel.INFO) return console.info(`[${this.timestamp}] INFO:`, ...args) - this.handleLog(LogLevel.INFO, args) + this.handleLog(LogLevel.INFO, args, this.source) } warn(...args) { if (this.logLevel > LogLevel.WARN) return console.warn(`[${this.timestamp}] WARN:`, ...args, `(${this.source})`) - this.handleLog(LogLevel.WARN, args) + this.handleLog(LogLevel.WARN, args, this.source) } error(...args) { if (this.logLevel > LogLevel.ERROR) return console.error(`[${this.timestamp}] ERROR:`, ...args, `(${this.source})`) - this.handleLog(LogLevel.ERROR, args) + this.handleLog(LogLevel.ERROR, args, this.source) } /** @@ -139,12 +140,12 @@ class Logger { */ fatal(...args) { console.error(`[${this.timestamp}] FATAL:`, ...args, `(${this.source})`) - return this.handleLog(LogLevel.FATAL, args) + return this.handleLog(LogLevel.FATAL, args, this.source) } note(...args) { console.log(`[${this.timestamp}] NOTE:`, ...args) - this.handleLog(LogLevel.NOTE, args) + this.handleLog(LogLevel.NOTE, args, this.source) } } module.exports = new Logger() \ No newline at end of file From 763bb1b8293fe1ca1e17336f4cdb5c5d506d4483 Mon Sep 17 00:00:00 2001 From: advplyr Date: Thu, 29 Feb 2024 13:59:00 -0600 Subject: [PATCH 08/43] Map ebook filter translations --- client/strings/cs.json | 2 ++ client/strings/da.json | 2 ++ client/strings/es.json | 2 ++ client/strings/et.json | 2 ++ client/strings/fr.json | 2 ++ client/strings/gu.json | 2 ++ client/strings/hi.json | 2 ++ client/strings/hr.json | 2 ++ client/strings/hu.json | 2 ++ client/strings/it.json | 2 ++ client/strings/lt.json | 2 ++ client/strings/nl.json | 2 ++ client/strings/no.json | 2 ++ client/strings/pl.json | 2 ++ client/strings/pt-br.json | 2 ++ client/strings/ru.json | 2 ++ client/strings/sv.json | 2 ++ client/strings/zh-cn.json | 2 ++ 18 files changed, 36 insertions(+) diff --git a/client/strings/cs.json b/client/strings/cs.json index 3134d60d..7dc18aa6 100644 --- a/client/strings/cs.json +++ b/client/strings/cs.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Metaznačky", "LabelMinute": "Minuta", "LabelMissing": "Chybějící", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Chybějící díly", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "Více", diff --git a/client/strings/da.json b/client/strings/da.json index f79f19b1..8c305ca2 100644 --- a/client/strings/da.json +++ b/client/strings/da.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta-tags", "LabelMinute": "Minut", "LabelMissing": "Mangler", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Manglende dele", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "Mere", diff --git a/client/strings/es.json b/client/strings/es.json index 75052413..452b625d 100644 --- a/client/strings/es.json +++ b/client/strings/es.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Metaetiquetas", "LabelMinute": "Minuto", "LabelMissing": "Ausente", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Partes Ausentes", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "URIs de redirección a móviles permitidos", "LabelMobileRedirectURIsDescription": "Esta es una lista de URIs válidos para redireccionamiento de apps móviles. La URI por defecto es audiobookshelf://oauth, la cual puedes remover or corroborar con URIs adicionales para la integración con apps de terceros. Utilizando un asterisco (*) como el único punto de entrada permite cualquier URI.", "LabelMore": "Más", diff --git a/client/strings/et.json b/client/strings/et.json index 07f9eef0..8c13c435 100644 --- a/client/strings/et.json +++ b/client/strings/et.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta märgendid", "LabelMinute": "Minut", "LabelMissing": "Puudub", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Puuduvad osad", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Lubatud mobiilile suunamise URI-d", "LabelMobileRedirectURIsDescription": "See on mobiilirakenduste jaoks kehtivate suunamise URI-de lubatud nimekiri. Vaikimisi on selleks audiobookshelf://oauth, mida saate eemaldada või täiendada täiendavate URI-dega kolmanda osapoole rakenduste integreerimiseks. Tärni (*) ainukese kirjena kasutamine võimaldab mis tahes URI-d.", "LabelMore": "Rohkem", diff --git a/client/strings/fr.json b/client/strings/fr.json index bbf38e18..d855c366 100644 --- a/client/strings/fr.json +++ b/client/strings/fr.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Balises de métadonnée", "LabelMinute": "Minute", "LabelMissing": "Manquant", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Parties manquantes", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "URI de redirection mobile autorisés", "LabelMobileRedirectURIsDescription": "Il s'agit d'une liste blanche d’URI de redirection valides pour les applications mobiles. Celui par défaut est audiobookshelf://oauth, que vous pouvez supprimer ou compléter avec des URIs supplémentaires pour l'intégration d'applications tierces. L’utilisation d’un astérisque (*) comme seule entrée autorise n’importe quel URI.", "LabelMore": "Plus", diff --git a/client/strings/gu.json b/client/strings/gu.json index 2f3d9cd8..eff18343 100644 --- a/client/strings/gu.json +++ b/client/strings/gu.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta Tags", "LabelMinute": "Minute", "LabelMissing": "Missing", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Missing Parts", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "More", diff --git a/client/strings/hi.json b/client/strings/hi.json index 01667b59..d126e9f5 100644 --- a/client/strings/hi.json +++ b/client/strings/hi.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta Tags", "LabelMinute": "Minute", "LabelMissing": "Missing", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Missing Parts", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "More", diff --git a/client/strings/hr.json b/client/strings/hr.json index 8aa933c7..313505ac 100644 --- a/client/strings/hr.json +++ b/client/strings/hr.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta Tags", "LabelMinute": "Minuta", "LabelMissing": "Nedostaje", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Nedostajali dijelovi", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "Više", diff --git a/client/strings/hu.json b/client/strings/hu.json index d52957e1..1829916a 100644 --- a/client/strings/hu.json +++ b/client/strings/hu.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta címkék", "LabelMinute": "Perc", "LabelMissing": "Hiányzó", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Hiányzó részek", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Engedélyezett mobil átirányítási URI-k", "LabelMobileRedirectURIsDescription": "Ez egy fehérlista az érvényes mobilalkalmazás-átirányítási URI-k számára. Az alapértelmezett audiobookshelf://oauth, amely eltávolítható vagy kiegészíthető további URI-kkal harmadik féltől származó alkalmazásintegráció érdekében. Ha az egyetlen bejegyzés egy csillag (*), akkor bármely URI engedélyezett.", "LabelMore": "Több", diff --git a/client/strings/it.json b/client/strings/it.json index 26a61fda..f4e97048 100644 --- a/client/strings/it.json +++ b/client/strings/it.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta Tags", "LabelMinute": "Minuto", "LabelMissing": "Altro", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Parti rimanenti", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "URI di reindirizzamento mobile consentiti", "LabelMobileRedirectURIsDescription": "Questa è una lista bianca di URI di reindirizzamento validi per le app mobili. Quello predefinito è audiobookshelf://oauth, che puoi rimuovere o integrare con URI aggiuntivi per l'integrazione di app di terze parti. Utilizzando un asterisco (*) poiché l'unica voce consente qualsiasi URI.", "LabelMore": "Molto", diff --git a/client/strings/lt.json b/client/strings/lt.json index 1c2558c9..4d97ab47 100644 --- a/client/strings/lt.json +++ b/client/strings/lt.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta žymos", "LabelMinute": "Minutė", "LabelMissing": "Trūksta", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Trūkstamos dalys", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "Daugiau", diff --git a/client/strings/nl.json b/client/strings/nl.json index dd06146d..858b3de6 100644 --- a/client/strings/nl.json +++ b/client/strings/nl.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta-tags", "LabelMinute": "Minuut", "LabelMissing": "Ontbrekend", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Ontbrekende delen", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "Meer", diff --git a/client/strings/no.json b/client/strings/no.json index a29a7ef2..065d28df 100644 --- a/client/strings/no.json +++ b/client/strings/no.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta Tags", "LabelMinute": "Minutt", "LabelMissing": "Mangler", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Manglende deler", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "Mer", diff --git a/client/strings/pl.json b/client/strings/pl.json index 3189ccb7..2d4141ba 100644 --- a/client/strings/pl.json +++ b/client/strings/pl.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta Tags", "LabelMinute": "Minuta", "LabelMissing": "Brakujący", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Brakujące cześci", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "Więcej", diff --git a/client/strings/pt-br.json b/client/strings/pt-br.json index 14e7f52a..887b05b9 100644 --- a/client/strings/pt-br.json +++ b/client/strings/pt-br.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Etiquetas Meta", "LabelMinute": "Minuto", "LabelMissing": "Ausente", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Partes Ausentes", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "URIs de redirecionamento móveis permitidas", "LabelMobileRedirectURIsDescription": "Essa é uma lista de permissionamento para URIs válidas para o redirecionamento de aplicativos móveis. A padrão é audiobookshelf://oauth, que pode ser removida ou acrescentada com novas URIs para integração com apps de terceiros. Usando um asterisco (*) como um item único dará permissão para qualquer URI.", "LabelMore": "Mais", diff --git a/client/strings/ru.json b/client/strings/ru.json index adc3b48b..6d690ee6 100644 --- a/client/strings/ru.json +++ b/client/strings/ru.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Мета теги", "LabelMinute": "Минуты", "LabelMissing": "Потеряно", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Потерянные части", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Разрешенные URI перенаправления с мобильных устройств", "LabelMobileRedirectURIsDescription": "Это белый список допустимых URI перенаправления для мобильных приложений. По умолчанию используется audiobookshelf://oauth, который можно удалить или дополнить дополнительными URI для интеграции со сторонними приложениями. Использование звездочки (*) в качестве единственной записи разрешает любой URI.", "LabelMore": "Еще", diff --git a/client/strings/sv.json b/client/strings/sv.json index 9560e765..55e92be4 100644 --- a/client/strings/sv.json +++ b/client/strings/sv.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Metamärken", "LabelMinute": "Minut", "LabelMissing": "Saknad", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Saknade delar", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "Mer", diff --git a/client/strings/zh-cn.json b/client/strings/zh-cn.json index c1d9345f..0634c74f 100644 --- a/client/strings/zh-cn.json +++ b/client/strings/zh-cn.json @@ -356,7 +356,9 @@ "LabelMetaTags": "元标签", "LabelMinute": "分钟", "LabelMissing": "丢失", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "丢失的部分", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "允许移动应用重定向 URI", "LabelMobileRedirectURIsDescription": "这是移动应用程序的有效重定向 URI 白名单. 默认值为 audiobookshelf://oauth,您可以删除它或添加其他 URI 以进行第三方应用集成. 使用星号 (*) 作为唯一条目允许任何 URI.", "LabelMore": "更多", From 4fe672f09d794c05d31a9375b2a686ed1c0dfe10 Mon Sep 17 00:00:00 2001 From: mikiher Date: Fri, 1 Mar 2024 11:55:53 +0200 Subject: [PATCH 09/43] Update cover image URLs with timestamp where available --- client/components/modals/item/tabs/Match.vue | 4 ++-- client/pages/library/_library/podcast/latest.vue | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/components/modals/item/tabs/Match.vue b/client/components/modals/item/tabs/Match.vue index 7051a444..72aa7116 100644 --- a/client/components/modals/item/tabs/Match.vue +++ b/client/components/modals/item/tabs/Match.vue @@ -49,8 +49,8 @@

Current

- - + +
diff --git a/client/pages/library/_library/podcast/latest.vue b/client/pages/library/_library/podcast/latest.vue index 42f107c8..3fc47dfd 100644 --- a/client/pages/library/_library/podcast/latest.vue +++ b/client/pages/library/_library/podcast/latest.vue @@ -8,11 +8,11 @@

{{ $strings.MessageNoEpisodes }}