Add:Abridged book detail, parse from audible, abridged book filter #1408

This commit is contained in:
advplyr 2023-03-22 18:05:43 -05:00
parent 7181df0479
commit fd58df4729
20 changed files with 78 additions and 17 deletions

View File

@ -185,6 +185,11 @@ export default {
value: 'tracks', value: 'tracks',
sublist: true sublist: true
}, },
{
text: this.$strings.LabelAbridged,
value: 'abridged',
sublist: false
},
{ {
text: this.$strings.ButtonIssues, text: this.$strings.ButtonIssues,
value: 'issues', value: 'issues',

View File

@ -164,13 +164,20 @@
<p v-if="mediaMetadata.releaseDate" class="text-xs ml-1 text-white text-opacity-60">{{ $strings.LabelCurrently }} {{ mediaMetadata.releaseDate || '' }}</p> <p v-if="mediaMetadata.releaseDate" class="text-xs ml-1 text-white text-opacity-60">{{ $strings.LabelCurrently }} {{ mediaMetadata.releaseDate || '' }}</p>
</div> </div>
</div> </div>
<div v-if="selectedMatchOrig.explicit != null" class="flex items-center py-2"> <div v-if="selectedMatchOrig.explicit != null" class="flex items-center pb-2" :class="{ 'pt-2': mediaMetadata.explicit == null }">
<ui-checkbox v-model="selectedMatchUsage.explicit" checkbox-bg="bg" @input="checkboxToggled" /> <ui-checkbox v-model="selectedMatchUsage.explicit" checkbox-bg="bg" @input="checkboxToggled" />
<div class="flex-grow ml-4"> <div class="flex-grow ml-4" :class="{ 'pt-4': mediaMetadata.explicit != null }">
<ui-checkbox v-model="selectedMatch.explicit" :label="$strings.LabelExplicit" checkbox-bg="primary" border-color="gray-600" label-class="pl-2 text-base font-semibold" /> <ui-checkbox v-model="selectedMatch.explicit" :label="$strings.LabelExplicit" :disabled="!selectedMatchUsage.explicit" :checkbox-bg="!selectedMatchUsage.explicit ? 'bg' : 'primary'" border-color="gray-600" label-class="pl-2 text-base font-semibold" />
<p v-if="mediaMetadata.explicit != null" class="text-xs ml-1 text-white text-opacity-60">{{ $strings.LabelCurrently }} {{ mediaMetadata.explicit ? 'Explicit (checked)' : 'Not Explicit (unchecked)' }}</p> <p v-if="mediaMetadata.explicit != null" class="text-xs ml-1 text-white text-opacity-60">{{ $strings.LabelCurrently }} {{ mediaMetadata.explicit ? 'Explicit (checked)' : 'Not Explicit (unchecked)' }}</p>
</div> </div>
</div> </div>
<div v-if="selectedMatchOrig.abridged != null" class="flex items-center pb-2" :class="{ 'pt-2': mediaMetadata.abridged == null }">
<ui-checkbox v-model="selectedMatchUsage.abridged" checkbox-bg="bg" @input="checkboxToggled" />
<div class="flex-grow ml-4" :class="{ 'pt-4': mediaMetadata.abridged != null }">
<ui-checkbox v-model="selectedMatch.abridged" :label="$strings.LabelAbridged" :disabled="!selectedMatchUsage.abridged" :checkbox-bg="!selectedMatchUsage.abridged ? 'bg' : 'primary'" border-color="gray-600" label-class="pl-2 text-base font-semibold" />
<p v-if="mediaMetadata.abridged != null" class="text-xs ml-1 text-white text-opacity-60">{{ $strings.LabelCurrently }} {{ mediaMetadata.abridged ? 'Abridged (checked)' : 'Unabridged (unchecked)' }}</p>
</div>
</div>
<div class="flex items-center justify-end py-2"> <div class="flex items-center justify-end py-2">
<ui-btn color="success" type="submit">{{ $strings.ButtonSubmit }}</ui-btn> <ui-btn color="success" type="submit">{{ $strings.ButtonSubmit }}</ui-btn>
@ -216,6 +223,7 @@ export default {
explicit: true, explicit: true,
asin: true, asin: true,
isbn: true, isbn: true,
abridged: true,
// Podcast specific // Podcast specific
itunesPageUrl: true, itunesPageUrl: true,
itunesId: true, itunesId: true,
@ -360,6 +368,7 @@ export default {
explicit: true, explicit: true,
asin: true, asin: true,
isbn: true, isbn: true,
abridged: true,
// Podcast specific // Podcast specific
itunesPageUrl: true, itunesPageUrl: true,
itunesId: true, itunesId: true,
@ -476,7 +485,6 @@ export default {
} else if (key === 'narrator') { } else if (key === 'narrator') {
updatePayload.metadata.narrators = this.selectedMatch[key].split(',').map((v) => v.trim()) updatePayload.metadata.narrators = this.selectedMatch[key].split(',').map((v) => v.trim())
} else if (key === 'genres') { } else if (key === 'genres') {
// updatePayload.metadata.genres = this.selectedMatch[key].split(',').map((v) => v.trim())
updatePayload.metadata.genres = [...this.selectedMatch[key]] updatePayload.metadata.genres = [...this.selectedMatch[key]]
} else if (key === 'tags') { } else if (key === 'tags') {
updatePayload.tags = this.selectedMatch[key].split(',').map((v) => v.trim()) updatePayload.tags = this.selectedMatch[key].split(',').map((v) => v.trim())

View File

@ -4,7 +4,7 @@
<input v-model="selected" :disabled="disabled" type="checkbox" class="opacity-0 absolute" :class="!disabled ? 'cursor-pointer' : ''" /> <input v-model="selected" :disabled="disabled" type="checkbox" class="opacity-0 absolute" :class="!disabled ? 'cursor-pointer' : ''" />
<svg v-if="selected" class="fill-current pointer-events-none" :class="svgClass" viewBox="0 0 20 20"><path d="M0 11l2-2 5 5L18 3l2 2L7 18z" /></svg> <svg v-if="selected" class="fill-current pointer-events-none" :class="svgClass" viewBox="0 0 20 20"><path d="M0 11l2-2 5 5L18 3l2 2L7 18z" /></svg>
</div> </div>
<div v-if="label" class="select-none text-gray-100" :class="labelClassname">{{ label }}</div> <div v-if="label" class="select-none" :class="[labelClassname, disabled ? 'text-gray-400' : 'text-gray-100']">{{ label }}</div>
</label> </label>
</template> </template>

View File

@ -50,7 +50,7 @@
</div> </div>
<div class="flex flex-wrap mt-2 -mx-1"> <div class="flex flex-wrap mt-2 -mx-1">
<div class="w-full md:w-1/2 px-1"> <div class="w-full md:w-1/4 px-1">
<ui-text-input-with-label ref="publisherInput" v-model="details.publisher" :label="$strings.LabelPublisher" /> <ui-text-input-with-label ref="publisherInput" v-model="details.publisher" :label="$strings.LabelPublisher" />
</div> </div>
<div class="w-1/2 md:w-1/4 px-1 mt-2 md:mt-0"> <div class="w-1/2 md:w-1/4 px-1 mt-2 md:mt-0">
@ -61,6 +61,11 @@
<ui-checkbox v-model="details.explicit" :label="$strings.LabelExplicit" checkbox-bg="primary" border-color="gray-600" label-class="pl-2 text-base font-semibold" /> <ui-checkbox v-model="details.explicit" :label="$strings.LabelExplicit" checkbox-bg="primary" border-color="gray-600" label-class="pl-2 text-base font-semibold" />
</div> </div>
</div> </div>
<div class="flex-grow px-1 pt-6 mt-2 md:mt-0">
<div class="flex justify-center">
<ui-checkbox v-model="details.abridged" :label="$strings.LabelAbridged" checkbox-bg="primary" border-color="gray-600" label-class="pl-2 text-base font-semibold" />
</div>
</div>
</div> </div>
</form> </form>
</div> </div>
@ -89,7 +94,8 @@ export default {
isbn: null, isbn: null,
asin: null, asin: null,
genres: [], genres: [],
explicit: false explicit: false,
abridged: false
}, },
newTags: [] newTags: []
} }
@ -271,6 +277,7 @@ export default {
this.details.isbn = this.mediaMetadata.isbn || null this.details.isbn = this.mediaMetadata.isbn || null
this.details.asin = this.mediaMetadata.asin || null this.details.asin = this.mediaMetadata.asin || null
this.details.explicit = !!this.mediaMetadata.explicit this.details.explicit = !!this.mediaMetadata.explicit
this.details.abridged = !!this.mediaMetadata.abridged
this.newTags = [...(this.media.tags || [])] this.newTags = [...(this.media.tags || [])]
}, },
submitForm() { submitForm() {

View File

@ -124,6 +124,14 @@
{{ sizePretty }} {{ sizePretty }}
</div> </div>
</div> </div>
<div v-if="isBook" class="flex py-0.5">
<div class="w-32">
<span class="text-white text-opacity-60 uppercase text-sm">{{ $strings.LabelAbridged }}</span>
</div>
<div>
{{ isAbridged ? 'Yes' : 'No' }}
</div>
</div>
</div> </div>
<div class="hidden md:block flex-grow" /> <div class="hidden md:block flex-grow" />
</div> </div>
@ -319,7 +327,10 @@ export default {
return this.libraryItem.isInvalid return this.libraryItem.isInvalid
}, },
isExplicit() { isExplicit() {
return this.mediaMetadata.explicit || false return !!this.mediaMetadata.explicit
},
isAbridged() {
return !!this.mediaMetadata.abridged
}, },
invalidAudioFiles() { invalidAudioFiles() {
if (!this.isBook) return [] if (!this.isBook) return []

View File

@ -155,6 +155,7 @@
"HeaderUpdateLibrary": "Bibliothek aktualisieren", "HeaderUpdateLibrary": "Bibliothek aktualisieren",
"HeaderUsers": "Benutzer", "HeaderUsers": "Benutzer",
"HeaderYourStats": "Eigene Statistiken", "HeaderYourStats": "Eigene Statistiken",
"LabelAbridged": "Abridged",
"LabelAccountType": "Kontoart", "LabelAccountType": "Kontoart",
"LabelAccountTypeAdmin": "Admin", "LabelAccountTypeAdmin": "Admin",
"LabelAccountTypeGuest": "Gast", "LabelAccountTypeGuest": "Gast",
@ -420,6 +421,7 @@
"LabelTracksMultiTrack": "Mehrfachdatei", "LabelTracksMultiTrack": "Mehrfachdatei",
"LabelTracksSingleTrack": "Einzeldatei", "LabelTracksSingleTrack": "Einzeldatei",
"LabelType": "Typ", "LabelType": "Typ",
"LabelUnabridged": "Unabridged",
"LabelUnknown": "Unbekannt", "LabelUnknown": "Unbekannt",
"LabelUpdateCover": "Titelbild aktualisieren", "LabelUpdateCover": "Titelbild aktualisieren",
"LabelUpdateCoverHelp": "Erlaube das Überschreiben bestehender Titelbilder für die ausgewählten Hörbücher wenn eine Übereinstimmung gefunden wird", "LabelUpdateCoverHelp": "Erlaube das Überschreiben bestehender Titelbilder für die ausgewählten Hörbücher wenn eine Übereinstimmung gefunden wird",

View File

@ -155,6 +155,7 @@
"HeaderUpdateLibrary": "Update Library", "HeaderUpdateLibrary": "Update Library",
"HeaderUsers": "Users", "HeaderUsers": "Users",
"HeaderYourStats": "Your Stats", "HeaderYourStats": "Your Stats",
"LabelAbridged": "Abridged",
"LabelAccountType": "Account Type", "LabelAccountType": "Account Type",
"LabelAccountTypeAdmin": "Admin", "LabelAccountTypeAdmin": "Admin",
"LabelAccountTypeGuest": "Guest", "LabelAccountTypeGuest": "Guest",
@ -420,6 +421,7 @@
"LabelTracksMultiTrack": "Multi-track", "LabelTracksMultiTrack": "Multi-track",
"LabelTracksSingleTrack": "Single-track", "LabelTracksSingleTrack": "Single-track",
"LabelType": "Type", "LabelType": "Type",
"LabelUnabridged": "Unabridged",
"LabelUnknown": "Unknown", "LabelUnknown": "Unknown",
"LabelUpdateCover": "Update Cover", "LabelUpdateCover": "Update Cover",
"LabelUpdateCoverHelp": "Allow overwriting of existing covers for the selected books when a match is located", "LabelUpdateCoverHelp": "Allow overwriting of existing covers for the selected books when a match is located",

View File

@ -155,6 +155,7 @@
"HeaderUpdateLibrary": "Actualizar Biblioteca", "HeaderUpdateLibrary": "Actualizar Biblioteca",
"HeaderUsers": "Usuarios", "HeaderUsers": "Usuarios",
"HeaderYourStats": "Tus Estáticas", "HeaderYourStats": "Tus Estáticas",
"LabelAbridged": "Abridged",
"LabelAccountType": "Tipo de Cuenta", "LabelAccountType": "Tipo de Cuenta",
"LabelAccountTypeAdmin": "Administrador", "LabelAccountTypeAdmin": "Administrador",
"LabelAccountTypeGuest": "Invitado", "LabelAccountTypeGuest": "Invitado",
@ -420,6 +421,7 @@
"LabelTracksMultiTrack": "Multi-track", "LabelTracksMultiTrack": "Multi-track",
"LabelTracksSingleTrack": "Single-track", "LabelTracksSingleTrack": "Single-track",
"LabelType": "Tipo", "LabelType": "Tipo",
"LabelUnabridged": "Unabridged",
"LabelUnknown": "Desconocido", "LabelUnknown": "Desconocido",
"LabelUpdateCover": "Actualizar Portada", "LabelUpdateCover": "Actualizar Portada",
"LabelUpdateCoverHelp": "Permitir sobrescribir portadas existentes de los libros seleccionados cuando sean encontrados.", "LabelUpdateCoverHelp": "Permitir sobrescribir portadas existentes de los libros seleccionados cuando sean encontrados.",

View File

@ -155,6 +155,7 @@
"HeaderUpdateLibrary": "Mettre à jour la bibliothèque", "HeaderUpdateLibrary": "Mettre à jour la bibliothèque",
"HeaderUsers": "Utilisateurs", "HeaderUsers": "Utilisateurs",
"HeaderYourStats": "Vos statistiques", "HeaderYourStats": "Vos statistiques",
"LabelAbridged": "Abridged",
"LabelAccountType": "Type de compte", "LabelAccountType": "Type de compte",
"LabelAccountTypeAdmin": "Admin", "LabelAccountTypeAdmin": "Admin",
"LabelAccountTypeGuest": "Invité", "LabelAccountTypeGuest": "Invité",
@ -420,6 +421,7 @@
"LabelTracksMultiTrack": "Piste multiple", "LabelTracksMultiTrack": "Piste multiple",
"LabelTracksSingleTrack": "Piste simple", "LabelTracksSingleTrack": "Piste simple",
"LabelType": "Type", "LabelType": "Type",
"LabelUnabridged": "Unabridged",
"LabelUnknown": "Inconnu", "LabelUnknown": "Inconnu",
"LabelUpdateCover": "Mettre à jour la couverture", "LabelUpdateCover": "Mettre à jour la couverture",
"LabelUpdateCoverHelp": "Autoriser la mise à jour de la couverture existante lorsquune correspondance est trouvée", "LabelUpdateCoverHelp": "Autoriser la mise à jour de la couverture existante lorsquune correspondance est trouvée",

View File

@ -155,6 +155,7 @@
"HeaderUpdateLibrary": "Aktualiziraj biblioteku", "HeaderUpdateLibrary": "Aktualiziraj biblioteku",
"HeaderUsers": "Korinici", "HeaderUsers": "Korinici",
"HeaderYourStats": "Tvoja statistika", "HeaderYourStats": "Tvoja statistika",
"LabelAbridged": "Abridged",
"LabelAccountType": "Vrsta korisničkog računa", "LabelAccountType": "Vrsta korisničkog računa",
"LabelAccountTypeAdmin": "Administrator", "LabelAccountTypeAdmin": "Administrator",
"LabelAccountTypeGuest": "Gost", "LabelAccountTypeGuest": "Gost",
@ -420,6 +421,7 @@
"LabelTracksMultiTrack": "Multi-track", "LabelTracksMultiTrack": "Multi-track",
"LabelTracksSingleTrack": "Single-track", "LabelTracksSingleTrack": "Single-track",
"LabelType": "Tip", "LabelType": "Tip",
"LabelUnabridged": "Unabridged",
"LabelUnknown": "Nepoznato", "LabelUnknown": "Nepoznato",
"LabelUpdateCover": "Aktualiziraj Cover", "LabelUpdateCover": "Aktualiziraj Cover",
"LabelUpdateCoverHelp": "Dozvoli postavljanje novog covera za odabrane knjige nakon što je match pronađen.", "LabelUpdateCoverHelp": "Dozvoli postavljanje novog covera za odabrane knjige nakon što je match pronađen.",

View File

@ -155,6 +155,7 @@
"HeaderUpdateLibrary": "Aggiorna Libreria", "HeaderUpdateLibrary": "Aggiorna Libreria",
"HeaderUsers": "Utenti", "HeaderUsers": "Utenti",
"HeaderYourStats": "Statistiche Personali", "HeaderYourStats": "Statistiche Personali",
"LabelAbridged": "Abridged",
"LabelAccountType": "Tipo di Account", "LabelAccountType": "Tipo di Account",
"LabelAccountTypeAdmin": "Admin", "LabelAccountTypeAdmin": "Admin",
"LabelAccountTypeGuest": "Ospite", "LabelAccountTypeGuest": "Ospite",
@ -420,6 +421,7 @@
"LabelTracksMultiTrack": "Multi-traccia", "LabelTracksMultiTrack": "Multi-traccia",
"LabelTracksSingleTrack": "Traccia-singola", "LabelTracksSingleTrack": "Traccia-singola",
"LabelType": "Tipo", "LabelType": "Tipo",
"LabelUnabridged": "Unabridged",
"LabelUnknown": "Sconosciuto", "LabelUnknown": "Sconosciuto",
"LabelUpdateCover": "Aggiornamento Cover", "LabelUpdateCover": "Aggiornamento Cover",
"LabelUpdateCoverHelp": "Consenti la sovrascrittura delle copertine esistenti per i libri selezionati quando viene trovata una corrispondenza", "LabelUpdateCoverHelp": "Consenti la sovrascrittura delle copertine esistenti per i libri selezionati quando viene trovata una corrispondenza",

View File

@ -155,6 +155,7 @@
"HeaderUpdateLibrary": "Zaktualizuj bibliotekę", "HeaderUpdateLibrary": "Zaktualizuj bibliotekę",
"HeaderUsers": "Użytkownicy", "HeaderUsers": "Użytkownicy",
"HeaderYourStats": "Twoje statystyki", "HeaderYourStats": "Twoje statystyki",
"LabelAbridged": "Abridged",
"LabelAccountType": "Typ konta", "LabelAccountType": "Typ konta",
"LabelAccountTypeAdmin": "Administrator", "LabelAccountTypeAdmin": "Administrator",
"LabelAccountTypeGuest": "Gość", "LabelAccountTypeGuest": "Gość",
@ -420,6 +421,7 @@
"LabelTracksMultiTrack": "Multi-track", "LabelTracksMultiTrack": "Multi-track",
"LabelTracksSingleTrack": "Single-track", "LabelTracksSingleTrack": "Single-track",
"LabelType": "Typ", "LabelType": "Typ",
"LabelUnabridged": "Unabridged",
"LabelUnknown": "Nieznany", "LabelUnknown": "Nieznany",
"LabelUpdateCover": "Zaktalizuj odkładkę", "LabelUpdateCover": "Zaktalizuj odkładkę",
"LabelUpdateCoverHelp": "Umożliwienie nadpisania istniejących okładek dla wybranych książek w przypadku znalezienia dopasowania", "LabelUpdateCoverHelp": "Umożliwienie nadpisania istniejących okładek dla wybranych książek w przypadku znalezienia dopasowania",

View File

@ -155,6 +155,7 @@
"HeaderUpdateLibrary": "Обновить библиотеку", "HeaderUpdateLibrary": "Обновить библиотеку",
"HeaderUsers": "Пользователи", "HeaderUsers": "Пользователи",
"HeaderYourStats": "Ваша статистика", "HeaderYourStats": "Ваша статистика",
"LabelAbridged": "Abridged",
"LabelAccountType": "Тип учетной записи", "LabelAccountType": "Тип учетной записи",
"LabelAccountTypeAdmin": "Администратор", "LabelAccountTypeAdmin": "Администратор",
"LabelAccountTypeGuest": "Гость", "LabelAccountTypeGuest": "Гость",
@ -420,6 +421,7 @@
"LabelTracksMultiTrack": "Мультитрек", "LabelTracksMultiTrack": "Мультитрек",
"LabelTracksSingleTrack": "Один трек", "LabelTracksSingleTrack": "Один трек",
"LabelType": "Тип", "LabelType": "Тип",
"LabelUnabridged": "Unabridged",
"LabelUnknown": "Неизвестно", "LabelUnknown": "Неизвестно",
"LabelUpdateCover": "Обновить обложку", "LabelUpdateCover": "Обновить обложку",
"LabelUpdateCoverHelp": "Позволяет перезаписывать существующие обложки для выбранных книг если будут найдены", "LabelUpdateCoverHelp": "Позволяет перезаписывать существующие обложки для выбранных книг если будут найдены",

View File

@ -155,6 +155,7 @@
"HeaderUpdateLibrary": "更新媒体库", "HeaderUpdateLibrary": "更新媒体库",
"HeaderUsers": "用户", "HeaderUsers": "用户",
"HeaderYourStats": "你的统计数据", "HeaderYourStats": "你的统计数据",
"LabelAbridged": "Abridged",
"LabelAccountType": "帐户类型", "LabelAccountType": "帐户类型",
"LabelAccountTypeAdmin": "管理员", "LabelAccountTypeAdmin": "管理员",
"LabelAccountTypeGuest": "来宾", "LabelAccountTypeGuest": "来宾",
@ -420,6 +421,7 @@
"LabelTracksMultiTrack": "多轨", "LabelTracksMultiTrack": "多轨",
"LabelTracksSingleTrack": "单轨", "LabelTracksSingleTrack": "单轨",
"LabelType": "类型", "LabelType": "类型",
"LabelUnabridged": "Unabridged",
"LabelUnknown": "未知", "LabelUnknown": "未知",
"LabelUpdateCover": "更新封面", "LabelUpdateCover": "更新封面",
"LabelUpdateCoverHelp": "找到匹配项时允许覆盖所选书籍存在的封面", "LabelUpdateCoverHelp": "找到匹配项时允许覆盖所选书籍存在的封面",

View File

@ -17,6 +17,7 @@ class BookMetadata {
this.asin = null this.asin = null
this.language = null this.language = null
this.explicit = false this.explicit = false
this.abridged = false
if (metadata) { if (metadata) {
this.construct(metadata) this.construct(metadata)
@ -38,6 +39,7 @@ class BookMetadata {
this.asin = metadata.asin this.asin = metadata.asin
this.language = metadata.language this.language = metadata.language
this.explicit = !!metadata.explicit this.explicit = !!metadata.explicit
this.abridged = !!metadata.abridged
} }
toJSON() { toJSON() {
@ -55,7 +57,8 @@ class BookMetadata {
isbn: this.isbn, isbn: this.isbn,
asin: this.asin, asin: this.asin,
language: this.language, language: this.language,
explicit: this.explicit explicit: this.explicit,
abridged: this.abridged
} }
} }
@ -76,7 +79,8 @@ class BookMetadata {
isbn: this.isbn, isbn: this.isbn,
asin: this.asin, asin: this.asin,
language: this.language, language: this.language,
explicit: this.explicit explicit: this.explicit,
abridged: this.abridged
} }
} }
@ -100,7 +104,8 @@ class BookMetadata {
authorName: this.authorName, authorName: this.authorName,
authorNameLF: this.authorNameLF, authorNameLF: this.authorNameLF,
narratorName: this.narratorName, narratorName: this.narratorName,
seriesName: this.seriesName seriesName: this.seriesName,
abridged: this.abridged
} }
} }

View File

@ -19,7 +19,7 @@ class Audible {
} }
cleanResult(item) { 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 = [] const series = []
if (seriesPrimary) { if (seriesPrimary) {
@ -54,7 +54,8 @@ class Audible {
language: language ? language.charAt(0).toUpperCase() + language.slice(1) : null, language: language ? language.charAt(0).toUpperCase() + language.slice(1) : null,
duration: runtimeLengthMin && !isNaN(runtimeLengthMin) ? Number(runtimeLengthMin) : 0, duration: runtimeLengthMin && !isNaN(runtimeLengthMin) ? Number(runtimeLengthMin) : 0,
region: item.region || null, region: item.region || null,
rating: item.rating || null rating: item.rating || null,
abridged: formatType === 'abridged'
} }
} }

View File

@ -793,7 +793,7 @@ class Scanner {
async quickMatchBookBuildUpdatePayload(libraryItem, matchData, options) { async quickMatchBookBuildUpdatePayload(libraryItem, matchData, options) {
// Update media metadata if not set OR overrideDetails flag // 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 = {} const updatePayload = {}
updatePayload.metadata = {} updatePayload.metadata = {}

View File

@ -121,6 +121,10 @@ const bookMetadataMapper = {
explicit: { explicit: {
to: (m) => m.explicit ? 'Y' : 'N', to: (m) => m.explicit ? 'Y' : 'N',
from: (v) => v && v.toLowerCase() == 'y' from: (v) => v && v.toLowerCase() == 'y'
},
abridged: {
to: (m) => m.abridged ? 'Y' : 'N',
from: (v) => v && v.toLowerCase() == 'y'
} }
} }

View File

@ -108,7 +108,7 @@ module.exports.reqSupportsWebp = (req) => {
module.exports.areEquivalent = areEquivalent module.exports.areEquivalent = areEquivalent
module.exports.copyValue = (val) => { module.exports.copyValue = (val) => {
if (!val) return null if (!val) return val === false ? false : null
if (!this.isObject(val)) return val if (!this.isObject(val)) return val
if (Array.isArray(val)) { if (Array.isArray(val)) {

View File

@ -67,6 +67,8 @@ module.exports = {
filtered = filtered.filter(li => li.hasIssues) filtered = filtered.filter(li => li.hasIssues)
} else if (filterBy === 'feed-open') { } else if (filterBy === 'feed-open') {
filtered = filtered.filter(li => feedsArray.some(feed => feed.entityId === li.id)) 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 return filtered