From fd58df472963d7cb7e766e3e54c0f62975469a16 Mon Sep 17 00:00:00 2001 From: advplyr Date: Wed, 22 Mar 2023 18:05:43 -0500 Subject: [PATCH] Add:Abridged book detail, parse from audible, abridged book filter #1408 --- .../components/controls/LibraryFilterSelect.vue | 5 +++++ client/components/modals/item/tabs/Match.vue | 16 ++++++++++++---- client/components/ui/Checkbox.vue | 2 +- client/components/widgets/BookDetailsEdit.vue | 11 +++++++++-- client/pages/item/_id/index.vue | 13 ++++++++++++- client/strings/de.json | 2 ++ client/strings/en-us.json | 4 +++- client/strings/es.json | 2 ++ client/strings/fr.json | 2 ++ client/strings/hr.json | 2 ++ client/strings/it.json | 4 +++- client/strings/pl.json | 2 ++ client/strings/ru.json | 2 ++ client/strings/zh-cn.json | 2 ++ server/objects/metadata/BookMetadata.js | 11 ++++++++--- server/providers/Audible.js | 5 +++-- server/scanner/Scanner.js | 2 +- server/utils/abmetadataGenerator.js | 4 ++++ server/utils/index.js | 2 +- server/utils/libraryHelpers.js | 2 ++ 20 files changed, 78 insertions(+), 17 deletions(-) diff --git a/client/components/controls/LibraryFilterSelect.vue b/client/components/controls/LibraryFilterSelect.vue index 4cb34e56..254e2d1d 100644 --- a/client/components/controls/LibraryFilterSelect.vue +++ b/client/components/controls/LibraryFilterSelect.vue @@ -185,6 +185,11 @@ export default { value: 'tracks', sublist: true }, + { + text: this.$strings.LabelAbridged, + value: 'abridged', + sublist: false + }, { text: this.$strings.ButtonIssues, value: 'issues', diff --git a/client/components/modals/item/tabs/Match.vue b/client/components/modals/item/tabs/Match.vue index 6cc1e1ba..c3390fe4 100644 --- a/client/components/modals/item/tabs/Match.vue +++ b/client/components/modals/item/tabs/Match.vue @@ -164,13 +164,20 @@

{{ $strings.LabelCurrently }} {{ mediaMetadata.releaseDate || '' }}

-
+
-
- +
+

{{ $strings.LabelCurrently }} {{ mediaMetadata.explicit ? 'Explicit (checked)' : 'Not Explicit (unchecked)' }}

+
+ +
+ +

{{ $strings.LabelCurrently }} {{ mediaMetadata.abridged ? 'Abridged (checked)' : 'Unabridged (unchecked)' }}

+
+
{{ $strings.ButtonSubmit }} @@ -216,6 +223,7 @@ export default { explicit: true, asin: true, isbn: true, + abridged: true, // Podcast specific itunesPageUrl: true, itunesId: true, @@ -360,6 +368,7 @@ export default { explicit: true, asin: true, isbn: true, + abridged: true, // Podcast specific itunesPageUrl: true, itunesId: true, @@ -476,7 +485,6 @@ export default { } else if (key === 'narrator') { updatePayload.metadata.narrators = this.selectedMatch[key].split(',').map((v) => v.trim()) } else if (key === 'genres') { - // updatePayload.metadata.genres = this.selectedMatch[key].split(',').map((v) => v.trim()) updatePayload.metadata.genres = [...this.selectedMatch[key]] } else if (key === 'tags') { updatePayload.tags = this.selectedMatch[key].split(',').map((v) => v.trim()) diff --git a/client/components/ui/Checkbox.vue b/client/components/ui/Checkbox.vue index 9210420b..439d6c7d 100644 --- a/client/components/ui/Checkbox.vue +++ b/client/components/ui/Checkbox.vue @@ -4,7 +4,7 @@
-
{{ label }}
+
{{ label }}
diff --git a/client/components/widgets/BookDetailsEdit.vue b/client/components/widgets/BookDetailsEdit.vue index fcce7cf4..14a6797e 100644 --- a/client/components/widgets/BookDetailsEdit.vue +++ b/client/components/widgets/BookDetailsEdit.vue @@ -50,7 +50,7 @@
-
+
@@ -61,6 +61,11 @@
+
+
+ +
+
@@ -89,7 +94,8 @@ export default { isbn: null, asin: null, genres: [], - explicit: false + explicit: false, + abridged: false }, newTags: [] } @@ -271,6 +277,7 @@ export default { this.details.isbn = this.mediaMetadata.isbn || null this.details.asin = this.mediaMetadata.asin || null this.details.explicit = !!this.mediaMetadata.explicit + this.details.abridged = !!this.mediaMetadata.abridged this.newTags = [...(this.media.tags || [])] }, submitForm() { diff --git a/client/pages/item/_id/index.vue b/client/pages/item/_id/index.vue index 86c1ea0e..85763402 100644 --- a/client/pages/item/_id/index.vue +++ b/client/pages/item/_id/index.vue @@ -124,6 +124,14 @@ {{ sizePretty }} +
+
+ {{ $strings.LabelAbridged }} +
+
+ {{ isAbridged ? 'Yes' : 'No' }} +
+
@@ -319,7 +327,10 @@ export default { return this.libraryItem.isInvalid }, isExplicit() { - return this.mediaMetadata.explicit || false + return !!this.mediaMetadata.explicit + }, + isAbridged() { + return !!this.mediaMetadata.abridged }, invalidAudioFiles() { if (!this.isBook) return [] diff --git a/client/strings/de.json b/client/strings/de.json index a829ffa5..c5f40c26 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -155,6 +155,7 @@ "HeaderUpdateLibrary": "Bibliothek aktualisieren", "HeaderUsers": "Benutzer", "HeaderYourStats": "Eigene Statistiken", + "LabelAbridged": "Abridged", "LabelAccountType": "Kontoart", "LabelAccountTypeAdmin": "Admin", "LabelAccountTypeGuest": "Gast", @@ -420,6 +421,7 @@ "LabelTracksMultiTrack": "Mehrfachdatei", "LabelTracksSingleTrack": "Einzeldatei", "LabelType": "Typ", + "LabelUnabridged": "Unabridged", "LabelUnknown": "Unbekannt", "LabelUpdateCover": "Titelbild aktualisieren", "LabelUpdateCoverHelp": "Erlaube das Überschreiben bestehender Titelbilder für die ausgewählten Hörbücher wenn eine Übereinstimmung gefunden wird", diff --git a/client/strings/en-us.json b/client/strings/en-us.json index 2c829514..6550a503 100644 --- a/client/strings/en-us.json +++ b/client/strings/en-us.json @@ -155,6 +155,7 @@ "HeaderUpdateLibrary": "Update Library", "HeaderUsers": "Users", "HeaderYourStats": "Your Stats", + "LabelAbridged": "Abridged", "LabelAccountType": "Account Type", "LabelAccountTypeAdmin": "Admin", "LabelAccountTypeGuest": "Guest", @@ -420,6 +421,7 @@ "LabelTracksMultiTrack": "Multi-track", "LabelTracksSingleTrack": "Single-track", "LabelType": "Type", + "LabelUnabridged": "Unabridged", "LabelUnknown": "Unknown", "LabelUpdateCover": "Update Cover", "LabelUpdateCoverHelp": "Allow overwriting of existing covers for the selected books when a match is located", @@ -636,4 +638,4 @@ "ToastSocketFailedToConnect": "Socket failed to connect", "ToastUserDeleteFailed": "Failed to delete user", "ToastUserDeleteSuccess": "User deleted" -} +} \ No newline at end of file diff --git a/client/strings/es.json b/client/strings/es.json index 5d0f198c..bb2a224d 100644 --- a/client/strings/es.json +++ b/client/strings/es.json @@ -155,6 +155,7 @@ "HeaderUpdateLibrary": "Actualizar Biblioteca", "HeaderUsers": "Usuarios", "HeaderYourStats": "Tus Estáticas", + "LabelAbridged": "Abridged", "LabelAccountType": "Tipo de Cuenta", "LabelAccountTypeAdmin": "Administrador", "LabelAccountTypeGuest": "Invitado", @@ -420,6 +421,7 @@ "LabelTracksMultiTrack": "Multi-track", "LabelTracksSingleTrack": "Single-track", "LabelType": "Tipo", + "LabelUnabridged": "Unabridged", "LabelUnknown": "Desconocido", "LabelUpdateCover": "Actualizar Portada", "LabelUpdateCoverHelp": "Permitir sobrescribir portadas existentes de los libros seleccionados cuando sean encontrados.", diff --git a/client/strings/fr.json b/client/strings/fr.json index 9e22ed2b..dee7f1a0 100644 --- a/client/strings/fr.json +++ b/client/strings/fr.json @@ -155,6 +155,7 @@ "HeaderUpdateLibrary": "Mettre à jour la bibliothèque", "HeaderUsers": "Utilisateurs", "HeaderYourStats": "Vos statistiques", + "LabelAbridged": "Abridged", "LabelAccountType": "Type de compte", "LabelAccountTypeAdmin": "Admin", "LabelAccountTypeGuest": "Invité", @@ -420,6 +421,7 @@ "LabelTracksMultiTrack": "Piste multiple", "LabelTracksSingleTrack": "Piste simple", "LabelType": "Type", + "LabelUnabridged": "Unabridged", "LabelUnknown": "Inconnu", "LabelUpdateCover": "Mettre à jour la couverture", "LabelUpdateCoverHelp": "Autoriser la mise à jour de la couverture existante lorsqu’une correspondance est trouvée", diff --git a/client/strings/hr.json b/client/strings/hr.json index 395219f4..3b9a5d75 100644 --- a/client/strings/hr.json +++ b/client/strings/hr.json @@ -155,6 +155,7 @@ "HeaderUpdateLibrary": "Aktualiziraj biblioteku", "HeaderUsers": "Korinici", "HeaderYourStats": "Tvoja statistika", + "LabelAbridged": "Abridged", "LabelAccountType": "Vrsta korisničkog računa", "LabelAccountTypeAdmin": "Administrator", "LabelAccountTypeGuest": "Gost", @@ -420,6 +421,7 @@ "LabelTracksMultiTrack": "Multi-track", "LabelTracksSingleTrack": "Single-track", "LabelType": "Tip", + "LabelUnabridged": "Unabridged", "LabelUnknown": "Nepoznato", "LabelUpdateCover": "Aktualiziraj Cover", "LabelUpdateCoverHelp": "Dozvoli postavljanje novog covera za odabrane knjige nakon što je match pronađen.", diff --git a/client/strings/it.json b/client/strings/it.json index 04c8c1f8..c44dc48a 100644 --- a/client/strings/it.json +++ b/client/strings/it.json @@ -155,6 +155,7 @@ "HeaderUpdateLibrary": "Aggiorna Libreria", "HeaderUsers": "Utenti", "HeaderYourStats": "Statistiche Personali", + "LabelAbridged": "Abridged", "LabelAccountType": "Tipo di Account", "LabelAccountTypeAdmin": "Admin", "LabelAccountTypeGuest": "Ospite", @@ -420,6 +421,7 @@ "LabelTracksMultiTrack": "Multi-traccia", "LabelTracksSingleTrack": "Traccia-singola", "LabelType": "Tipo", + "LabelUnabridged": "Unabridged", "LabelUnknown": "Sconosciuto", "LabelUpdateCover": "Aggiornamento Cover", "LabelUpdateCoverHelp": "Consenti la sovrascrittura delle copertine esistenti per i libri selezionati quando viene trovata una corrispondenza", @@ -636,4 +638,4 @@ "ToastSocketFailedToConnect": "Socket non riesce a connettersi", "ToastUserDeleteFailed": "Errore eliminazione utente", "ToastUserDeleteSuccess": "Utente eliminato" -} +} \ No newline at end of file diff --git a/client/strings/pl.json b/client/strings/pl.json index 7d8e3573..8d07bd64 100644 --- a/client/strings/pl.json +++ b/client/strings/pl.json @@ -155,6 +155,7 @@ "HeaderUpdateLibrary": "Zaktualizuj bibliotekę", "HeaderUsers": "Użytkownicy", "HeaderYourStats": "Twoje statystyki", + "LabelAbridged": "Abridged", "LabelAccountType": "Typ konta", "LabelAccountTypeAdmin": "Administrator", "LabelAccountTypeGuest": "Gość", @@ -420,6 +421,7 @@ "LabelTracksMultiTrack": "Multi-track", "LabelTracksSingleTrack": "Single-track", "LabelType": "Typ", + "LabelUnabridged": "Unabridged", "LabelUnknown": "Nieznany", "LabelUpdateCover": "Zaktalizuj odkładkę", "LabelUpdateCoverHelp": "Umożliwienie nadpisania istniejących okładek dla wybranych książek w przypadku znalezienia dopasowania", diff --git a/client/strings/ru.json b/client/strings/ru.json index b5660db2..c172df99 100644 --- a/client/strings/ru.json +++ b/client/strings/ru.json @@ -155,6 +155,7 @@ "HeaderUpdateLibrary": "Обновить библиотеку", "HeaderUsers": "Пользователи", "HeaderYourStats": "Ваша статистика", + "LabelAbridged": "Abridged", "LabelAccountType": "Тип учетной записи", "LabelAccountTypeAdmin": "Администратор", "LabelAccountTypeGuest": "Гость", @@ -420,6 +421,7 @@ "LabelTracksMultiTrack": "Мультитрек", "LabelTracksSingleTrack": "Один трек", "LabelType": "Тип", + "LabelUnabridged": "Unabridged", "LabelUnknown": "Неизвестно", "LabelUpdateCover": "Обновить обложку", "LabelUpdateCoverHelp": "Позволяет перезаписывать существующие обложки для выбранных книг если будут найдены", diff --git a/client/strings/zh-cn.json b/client/strings/zh-cn.json index 9933d13f..afc21c05 100644 --- a/client/strings/zh-cn.json +++ b/client/strings/zh-cn.json @@ -155,6 +155,7 @@ "HeaderUpdateLibrary": "更新媒体库", "HeaderUsers": "用户", "HeaderYourStats": "你的统计数据", + "LabelAbridged": "Abridged", "LabelAccountType": "帐户类型", "LabelAccountTypeAdmin": "管理员", "LabelAccountTypeGuest": "来宾", @@ -420,6 +421,7 @@ "LabelTracksMultiTrack": "多轨", "LabelTracksSingleTrack": "单轨", "LabelType": "类型", + "LabelUnabridged": "Unabridged", "LabelUnknown": "未知", "LabelUpdateCover": "更新封面", "LabelUpdateCoverHelp": "找到匹配项时允许覆盖所选书籍存在的封面", diff --git a/server/objects/metadata/BookMetadata.js b/server/objects/metadata/BookMetadata.js index 17eaff52..68fb6084 100644 --- a/server/objects/metadata/BookMetadata.js +++ b/server/objects/metadata/BookMetadata.js @@ -17,6 +17,7 @@ class BookMetadata { this.asin = null this.language = null this.explicit = false + this.abridged = false if (metadata) { this.construct(metadata) @@ -38,6 +39,7 @@ class BookMetadata { this.asin = metadata.asin this.language = metadata.language this.explicit = !!metadata.explicit + this.abridged = !!metadata.abridged } toJSON() { @@ -55,7 +57,8 @@ class BookMetadata { isbn: this.isbn, asin: this.asin, language: this.language, - explicit: this.explicit + explicit: this.explicit, + abridged: this.abridged } } @@ -76,7 +79,8 @@ class BookMetadata { isbn: this.isbn, asin: this.asin, language: this.language, - explicit: this.explicit + explicit: this.explicit, + abridged: this.abridged } } @@ -100,7 +104,8 @@ class BookMetadata { authorName: this.authorName, authorNameLF: this.authorNameLF, narratorName: this.narratorName, - seriesName: this.seriesName + seriesName: this.seriesName, + abridged: this.abridged } } diff --git a/server/providers/Audible.js b/server/providers/Audible.js index 3ee1e00f..b2f1318c 100644 --- a/server/providers/Audible.js +++ b/server/providers/Audible.js @@ -19,7 +19,7 @@ class Audible { } cleanResult(item) { - const { title, subtitle, asin, authors, narrators, publisherName, summary, releaseDate, image, genres, seriesPrimary, seriesSecondary, language, runtimeLengthMin } = item + const { title, subtitle, asin, authors, narrators, publisherName, summary, releaseDate, image, genres, seriesPrimary, seriesSecondary, language, runtimeLengthMin, formatType } = item const series = [] if (seriesPrimary) { @@ -54,7 +54,8 @@ class Audible { language: language ? language.charAt(0).toUpperCase() + language.slice(1) : null, duration: runtimeLengthMin && !isNaN(runtimeLengthMin) ? Number(runtimeLengthMin) : 0, region: item.region || null, - rating: item.rating || null + rating: item.rating || null, + abridged: formatType === 'abridged' } } diff --git a/server/scanner/Scanner.js b/server/scanner/Scanner.js index 0ac38b96..682700b5 100644 --- a/server/scanner/Scanner.js +++ b/server/scanner/Scanner.js @@ -793,7 +793,7 @@ class Scanner { async quickMatchBookBuildUpdatePayload(libraryItem, matchData, options) { // Update media metadata if not set OR overrideDetails flag - const detailKeysToUpdate = ['title', 'subtitle', 'description', 'narrator', 'publisher', 'publishedYear', 'genres', 'tags', 'language', 'explicit', 'asin', 'isbn'] + const detailKeysToUpdate = ['title', 'subtitle', 'description', 'narrator', 'publisher', 'publishedYear', 'genres', 'tags', 'language', 'explicit', 'abridged', 'asin', 'isbn'] const updatePayload = {} updatePayload.metadata = {} diff --git a/server/utils/abmetadataGenerator.js b/server/utils/abmetadataGenerator.js index bf638492..e6fb0b70 100644 --- a/server/utils/abmetadataGenerator.js +++ b/server/utils/abmetadataGenerator.js @@ -121,6 +121,10 @@ const bookMetadataMapper = { explicit: { to: (m) => m.explicit ? 'Y' : 'N', from: (v) => v && v.toLowerCase() == 'y' + }, + abridged: { + to: (m) => m.abridged ? 'Y' : 'N', + from: (v) => v && v.toLowerCase() == 'y' } } diff --git a/server/utils/index.js b/server/utils/index.js index 034e3beb..b146b93c 100644 --- a/server/utils/index.js +++ b/server/utils/index.js @@ -108,7 +108,7 @@ module.exports.reqSupportsWebp = (req) => { module.exports.areEquivalent = areEquivalent module.exports.copyValue = (val) => { - if (!val) return null + if (!val) return val === false ? false : null if (!this.isObject(val)) return val if (Array.isArray(val)) { diff --git a/server/utils/libraryHelpers.js b/server/utils/libraryHelpers.js index 47a7b9f5..7063dd2f 100644 --- a/server/utils/libraryHelpers.js +++ b/server/utils/libraryHelpers.js @@ -67,6 +67,8 @@ module.exports = { filtered = filtered.filter(li => li.hasIssues) } else if (filterBy === 'feed-open') { filtered = filtered.filter(li => feedsArray.some(feed => feed.entityId === li.id)) + } else if (filterBy === 'abridged') { + filtered = filtered.filter(li => !!li.media.metadata?.abridged) } return filtered