feat: auto-populate series ASIN from Audible metadata

- Update Audible provider to return series ASIN in search results
- Pass series ASIN through Match.vue when selecting metadata
- Update Book.updateSeriesFromRequest to forward ASIN to Series model
- Update Scanner to use series ASIN during quick match

When using the Audible metadata provider, the series ASIN is now
automatically captured and stored with the series.
This commit is contained in:
Quentin King 2026-01-03 10:34:25 -06:00
parent edbd49c4c1
commit d5a2ea9feb
4 changed files with 38 additions and 7 deletions

View file

@ -303,17 +303,35 @@ class Scanner {
Logger.info(`[Scanner] quickMatchBookBuildUpdatePayload: Updated series sequence for "${existingSeries.name}" to ${seriesMatchItem.sequence} in "${libraryItem.media.title}"`)
hasSeriesUpdates = true
}
// Update series ASIN if provided and not already set
if (seriesMatchItem.asin && !existingSeries.audibleSeriesAsin) {
existingSeries.set({ audibleSeriesAsin: seriesMatchItem.asin })
if (existingSeries.changed()) {
await existingSeries.save()
SocketAuthority.emitter('series_updated', existingSeries.toOldJSON())
Logger.info(`[Scanner] quickMatchBookBuildUpdatePayload: Updated series "${existingSeries.name}" with ASIN ${seriesMatchItem.asin}`)
}
}
} else {
let seriesItem = await Database.seriesModel.getByNameAndLibrary(seriesMatchItem.series, libraryItem.libraryId)
if (!seriesItem) {
seriesItem = await Database.seriesModel.create({
name: seriesMatchItem.series,
nameIgnorePrefix: getTitleIgnorePrefix(seriesMatchItem.series),
libraryId: libraryItem.libraryId
libraryId: libraryItem.libraryId,
audibleSeriesAsin: seriesMatchItem.asin || null
})
// Update filter data
Database.addSeriesToFilterData(libraryItem.libraryId, seriesItem.name, seriesItem.id)
SocketAuthority.emitter('series_added', seriesItem.toOldJSON())
} else if (seriesMatchItem.asin && !seriesItem.audibleSeriesAsin) {
// Series exists but has no ASIN, update it
seriesItem.set({ audibleSeriesAsin: seriesMatchItem.asin })
if (seriesItem.changed()) {
await seriesItem.save()
SocketAuthority.emitter('series_updated', seriesItem.toOldJSON())
Logger.info(`[Scanner] quickMatchBookBuildUpdatePayload: Updated series "${seriesItem.name}" with ASIN ${seriesMatchItem.asin}`)
}
}
const bookSeries = await Database.bookSeriesModel.create({
seriesId: seriesItem.id,