diff --git a/client/components/modals/item/tabs/Match.vue b/client/components/modals/item/tabs/Match.vue index 8aa312b5..7051a444 100644 --- a/client/components/modals/item/tabs/Match.vue +++ b/client/components/modals/item/tabs/Match.vue @@ -546,24 +546,11 @@ export default { // Persist in local storage localStorage.setItem('selectedMatchUsage', JSON.stringify(this.selectedMatchUsage)) - if (updatePayload.metadata.cover) { - const coverPayload = { - url: updatePayload.metadata.cover - } - const success = await this.$axios.$post(`/api/items/${this.libraryItemId}/cover`, coverPayload).catch((error) => { - console.error('Failed to update', error) - return false - }) - if (success) { - this.$toast.success(this.$strings.ToastItemCoverUpdateSuccess) - } else { - this.$toast.error(this.$strings.ToastItemCoverUpdateFailed) - } - console.log('Updated cover') - delete updatePayload.metadata.cover - } - if (Object.keys(updatePayload).length) { + if (updatePayload.metadata.cover) { + updatePayload.url = updatePayload.metadata.cover + delete updatePayload.metadata.cover + } const mediaUpdatePayload = updatePayload const updateResult = await this.$axios.$patch(`/api/items/${this.libraryItemId}/media`, mediaUpdatePayload).catch((error) => { console.error('Failed to update', error) diff --git a/server/controllers/LibraryItemController.js b/server/controllers/LibraryItemController.js index 26b375a0..dfa1daea 100644 --- a/server/controllers/LibraryItemController.js +++ b/server/controllers/LibraryItemController.js @@ -124,6 +124,11 @@ class LibraryItemController { const libraryItem = req.libraryItem const mediaPayload = req.body + if (mediaPayload.url) { + await LibraryItemController.prototype.uploadCover.bind(this)(req, res, false) + if (res.writableEnded) return + } + // Book specific if (libraryItem.isBook) { await this.createAuthorsAndSeriesForItemUpdate(mediaPayload, libraryItem.libraryId) @@ -146,7 +151,7 @@ class LibraryItemController { seriesRemoved = libraryItem.media.metadata.series.filter(se => !seriesIdsInUpdate.includes(se.id)) } - const hasUpdates = libraryItem.media.update(mediaPayload) + const hasUpdates = libraryItem.media.update(mediaPayload) || mediaPayload.url if (hasUpdates) { libraryItem.updatedAt = Date.now() @@ -171,7 +176,7 @@ class LibraryItemController { } // POST: api/items/:id/cover - async uploadCover(req, res) { + async uploadCover(req, res, updateAndReturnJson = true) { if (!req.user.canUpload) { Logger.warn('User attempted to upload a cover without permission', req.user) return res.sendStatus(403) @@ -196,12 +201,14 @@ class LibraryItemController { return res.status(500).send('Unknown error occurred') } - await Database.updateLibraryItem(libraryItem) - SocketAuthority.emitter('item_updated', libraryItem.toJSONExpanded()) - res.json({ - success: true, - cover: result.cover - }) + if (updateAndReturnJson) { + await Database.updateLibraryItem(libraryItem) + SocketAuthority.emitter('item_updated', libraryItem.toJSONExpanded()) + res.json({ + success: true, + cover: result.cover + }) + } } // PATCH: api/items/:id/cover diff --git a/server/models/LibraryItem.js b/server/models/LibraryItem.js index c7da31f6..21f4228e 100644 --- a/server/models/LibraryItem.js +++ b/server/models/LibraryItem.js @@ -378,6 +378,9 @@ class LibraryItem extends Model { if (!areEquivalent(updatedLibraryItem[key], existingValue, true)) { Logger.debug(`[LibraryItem] "${libraryItemExpanded.media.title}" ${key} updated from ${existingValue} to ${updatedLibraryItem[key]}`) hasLibraryItemUpdates = true + if (key === 'updatedAt') { + libraryItemExpanded.changed('updatedAt', true) + } } } if (hasLibraryItemUpdates) { @@ -405,6 +408,7 @@ class LibraryItem extends Model { isInvalid: !!oldLibraryItem.isInvalid, mtime: oldLibraryItem.mtimeMs, ctime: oldLibraryItem.ctimeMs, + updatedAt: oldLibraryItem.updatedAt, birthtime: oldLibraryItem.birthtimeMs, size: oldLibraryItem.size, lastScan: oldLibraryItem.lastScan,