From c23f31216a97a554c740a8821d5b1e91f003d583 Mon Sep 17 00:00:00 2001 From: advplyr Date: Sat, 1 Oct 2022 16:51:22 -0500 Subject: [PATCH] Fix:iTunes crash on matching genres #1025 --- client/components/cards/BookMatchCard.vue | 3 +- client/components/modals/item/tabs/Match.vue | 66 +++++++++++--------- server/providers/Audible.js | 8 +-- server/providers/GoogleBooks.js | 2 +- server/providers/iTunes.js | 2 +- server/scanner/Scanner.js | 18 ++++-- 6 files changed, 59 insertions(+), 40 deletions(-) diff --git a/client/components/cards/BookMatchCard.vue b/client/components/cards/BookMatchCard.vue index 3a34af68..009072c7 100644 --- a/client/components/cards/BookMatchCard.vue +++ b/client/components/cards/BookMatchCard.vue @@ -4,6 +4,7 @@
+
@@ -12,7 +13,7 @@

{{ book.publishedYear }}

-

by {{ book.author }}

+

by {{ book.author }}

Narrated by {{ book.narrator }}

Runtime: {{ $elapsedPrettyExtended(book.duration * 60) }}

diff --git a/client/components/modals/item/tabs/Match.vue b/client/components/modals/item/tabs/Match.vue index cd966aeb..a4cd0cbb 100644 --- a/client/components/modals/item/tabs/Match.vue +++ b/client/components/modals/item/tabs/Match.vue @@ -25,16 +25,16 @@
-
+
-
+
arrow_back

Update Book Details

-
+
@@ -43,49 +43,49 @@
-
+

Currently: {{ mediaMetadata.title || '' }}

-
+

Currently: {{ mediaMetadata.subtitle || '' }}

-
+

Currently: {{ mediaMetadata.authorName || '' }}

-
+

Currently: {{ mediaMetadata.narratorName || '' }}

-
+

Currently: {{ mediaMetadata.description.substr(0, 100) + (mediaMetadata.description.length > 100 ? '...' : '') }}

-
+

Currently: {{ mediaMetadata.publisher || '' }}

-
+
@@ -93,46 +93,47 @@
-
+

Currently: {{ mediaMetadata.seriesName || '' }}

-
+
-
+
- + +

Currently: {{ mediaMetadata.genres.join(', ') }}

-
+

Currently: {{ media.tags.join(', ') }}

-
+

Currently: {{ mediaMetadata.language || '' }}

-
+

Currently: {{ mediaMetadata.isbn || '' }}

-
+
@@ -140,28 +141,28 @@
-
+

Currently: {{ mediaMetadata.itunesId || '' }}

-
+

Currently: {{ mediaMetadata.feedUrl || '' }}

-
+

Currently: {{ mediaMetadata.itunesPageUrl || '' }}

-
+
@@ -196,6 +197,7 @@ export default { searchResults: [], hasSearched: false, selectedMatch: null, + selectedMatchOrig: null, selectedMatchUsage: { title: true, subtitle: true, @@ -251,7 +253,6 @@ export default { }) }, set(val) { - console.log('set series items', val) this.selectedMatch.series = val } }, @@ -341,7 +342,7 @@ export default { this.hasSearched = true }, init() { - this.selectedMatch = null + this.clearSelectedMatch() this.selectedMatchUsage = { title: true, subtitle: true, @@ -402,13 +403,15 @@ export default { }) } } - if (match.genres && Array.isArray(match.genres)) { - match.genres = match.genres.join(',') + if (match.genres && !Array.isArray(match.genres)) { + // match.genres = match.genres.join(',') + match.genres = match.genres.split(',').map((g) => g.trim()) } } console.log('Select Match', match) this.selectedMatch = match + this.selectedMatchOrig = JSON.parse(JSON.stringify(match)) }, buildMatchUpdatePayload() { var updatePayload = {} @@ -452,7 +455,8 @@ 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].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()) } else if (key === 'itunesId') { @@ -503,15 +507,19 @@ export default { } else { this.$toast.info('No detail updates were necessary') } - this.selectedMatch = null + this.clearSelectedMatch() this.$emit('selectTab', 'details') } else { this.$toast.error('Item Details Failed to Update') } } else { - this.selectedMatch = null + this.clearSelectedMatch() } this.isProcessing = false + }, + clearSelectedMatch() { + this.selectedMatch = null + this.selectedMatchOrig = null } } } diff --git a/server/providers/Audible.js b/server/providers/Audible.js index 5bbda72f..4330f0b7 100644 --- a/server/providers/Audible.js +++ b/server/providers/Audible.js @@ -12,8 +12,8 @@ class Audible { if (seriesPrimary) series.push(seriesPrimary) if (seriesSecondary) series.push(seriesSecondary) - var genresFiltered = genres ? genres.filter(g => g.type == "genre") : [] - var tagsFiltered = genres ? genres.filter(g => g.type == "tag") : [] + const genresFiltered = genres ? genres.filter(g => g.type == "genre").map(g => g.name) : [] + const tagsFiltered = genres ? genres.filter(g => g.type == "tag").map(g => g.name) : [] return { title, @@ -25,8 +25,8 @@ class Audible { description: summary ? htmlSanitizer.stripAllTags(summary) : null, cover: image, asin, - genres: genresFiltered.length > 0 ? genresFiltered.map(({ name }) => name).join(', ') : null, - tags: tagsFiltered.length > 0 ? tagsFiltered.map(({ name }) => name).join(', ') : null, + genres: genresFiltered.length ? genresFiltered : null, + tags: tagsFiltered.length ? tagsFiltered.join(', ') : null, series: series != [] ? series.map(({ name, position }) => ({ series: name, volumeNumber: position })) : null, language: language ? language.charAt(0).toUpperCase() + language.slice(1) : null, duration: runtimeLengthMin && !isNaN(runtimeLengthMin) ? Number(runtimeLengthMin) : 0 diff --git a/server/providers/GoogleBooks.js b/server/providers/GoogleBooks.js index 0d78f0eb..975528eb 100644 --- a/server/providers/GoogleBooks.js +++ b/server/providers/GoogleBooks.js @@ -26,7 +26,7 @@ class GoogleBooks { publishedYear: publisherDate ? publisherDate.split('-')[0] : null, description, cover: imageLinks && imageLinks.thumbnail ? imageLinks.thumbnail : null, - genres: categories ? categories.join(', ') : null, + genres: categories && Array.isArray(categories) ? [...categories] : null, isbn: this.extractIsbn(industryIdentifiers) } } diff --git a/server/providers/iTunes.js b/server/providers/iTunes.js index 5bf33fe5..143617b2 100644 --- a/server/providers/iTunes.js +++ b/server/providers/iTunes.js @@ -67,7 +67,7 @@ class iTunes { author: data.artistName, description: htmlSanitizer.stripAllTags(data.description || ''), publishedYear: data.releaseDate ? data.releaseDate.split('-')[0] : null, - genres: data.primaryGenreName ? [data.primaryGenreName] : [], + genres: data.primaryGenreName ? [data.primaryGenreName] : null, cover: this.getCoverArtwork(data) } } diff --git a/server/scanner/Scanner.js b/server/scanner/Scanner.js index 21d95058..20d7a302 100644 --- a/server/scanner/Scanner.js +++ b/server/scanner/Scanner.js @@ -798,6 +798,7 @@ class Scanner { const detailKeysToUpdate = ['title', 'subtitle', 'description', 'narrator', 'publisher', 'publishedYear', 'genres', 'tags', 'language', 'explicit', 'asin', 'isbn'] const updatePayload = {} updatePayload.metadata = {} + for (const key in matchData) { if (matchData[key] && detailKeysToUpdate.includes(key)) { if (key === 'narrator') { @@ -805,12 +806,21 @@ class Scanner { updatePayload.metadata.narrators = matchData[key].split(',').map(v => v.trim()).filter(v => !!v) } } else if (key === 'genres') { - if ((!libraryItem.media.metadata.genres || options.overrideDetails)) { - updatePayload.metadata[key] = matchData[key].split(',').map(v => v.trim()).filter(v => !!v) + if ((!libraryItem.media.metadata.genres.length || options.overrideDetails)) { + var genresArray = [] + if (Array.isArray(matchData[key])) genresArray = [...matchData[key]] + else { // Genres should always be passed in as an array but just incase handle a string + Logger.warn(`[Scanner] quickMatch genres is not an array ${matchData[key]}`) + genresArray = matchData[key].split(',').map(v => v.trim()).filter(v => !!v) + } + updatePayload.metadata[key] = genresArray } } else if (key === 'tags') { - if ((!libraryItem.media.tags || options.overrideDetails)) { - updatePayload[key] = matchData[key].split(',').map(v => v.trim()).filter(v => !!v) + if ((!libraryItem.media.tags.length || options.overrideDetails)) { + var tagsArray = [] + if (Array.isArray(matchData[key])) tagsArray = [...matchData[key]] + else tagsArray = tagsArray[key].split(',').map(v => v.trim()).filter(v => !!v) + updatePayload[key] = tagsArray } } else if ((!libraryItem.media.metadata[key] || options.overrideDetails)) { updatePayload.metadata[key] = matchData[key]