diff --git a/client/components/tables/library/LibraryItem.vue b/client/components/tables/library/LibraryItem.vue index cfb30a0c..25b581c9 100644 --- a/client/components/tables/library/LibraryItem.vue +++ b/client/components/tables/library/LibraryItem.vue @@ -74,11 +74,6 @@ export default { } ] if (this.isBookLibrary) { - items.push({ - text: this.$strings.ButtonForceReScan, - action: 'force-rescan', - value: 'force-rescan' - }) items.push({ text: this.$strings.ButtonMatchBooks, action: 'match-books', diff --git a/server/models/Library.js b/server/models/Library.js index 8bf9dfd8..df202fb9 100644 --- a/server/models/Library.js +++ b/server/models/Library.js @@ -80,6 +80,9 @@ class Library extends Model { mediaType: libraryExpanded.mediaType, provider: libraryExpanded.provider, settings: libraryExpanded.settings, + lastScan: libraryExpanded.lastScan?.valueOf() || null, + lastScanVersion: libraryExpanded.lastScanVersion || null, + lastScanMetadataPrecedence: libraryExpanded.extraData?.lastScanMetadataPrecedence || null, createdAt: libraryExpanded.createdAt.valueOf(), lastUpdate: libraryExpanded.updatedAt.valueOf() }) @@ -152,6 +155,9 @@ class Library extends Model { if (oldLibrary.oldLibraryId) { extraData.oldLibraryId = oldLibrary.oldLibraryId } + if (oldLibrary.lastScanMetadataPrecedence) { + extraData.lastScanMetadataPrecedence = oldLibrary.lastScanMetadataPrecedence + } return { id: oldLibrary.id, name: oldLibrary.name, @@ -160,6 +166,8 @@ class Library extends Model { mediaType: oldLibrary.mediaType || null, provider: oldLibrary.provider, settings: oldLibrary.settings?.toJSON() || {}, + lastScan: oldLibrary.lastScan || null, + lastScanVersion: oldLibrary.lastScanVersion || null, createdAt: oldLibrary.createdAt, updatedAt: oldLibrary.lastUpdate, extraData diff --git a/server/objects/Library.js b/server/objects/Library.js index c5ef216a..6c1952dc 100644 --- a/server/objects/Library.js +++ b/server/objects/Library.js @@ -15,6 +15,9 @@ class Library { this.provider = 'google' this.lastScan = 0 + this.lastScanVersion = null + this.lastScanMetadataPrecedence = null + this.settings = null this.createdAt = null @@ -53,6 +56,10 @@ class Library { this.settings.disableWatcher = !!library.disableWatcher } + this.lastScan = library.lastScan + this.lastScanVersion = library.lastScanVersion + this.lastScanMetadataPrecedence = library.lastScanMetadataPrecedence + this.createdAt = library.createdAt this.lastUpdate = library.lastUpdate this.cleanOldValues() // mediaType changed for v2 and icon change for v2.2.2 @@ -84,6 +91,8 @@ class Library { mediaType: this.mediaType, provider: this.provider, settings: this.settings.toJSON(), + lastScan: this.lastScan, + lastScanVersion: this.lastScanVersion, createdAt: this.createdAt, lastUpdate: this.lastUpdate } diff --git a/server/scanner/LibraryScanner.js b/server/scanner/LibraryScanner.js index db3c89df..64977e2d 100644 --- a/server/scanner/LibraryScanner.js +++ b/server/scanner/LibraryScanner.js @@ -48,15 +48,21 @@ class LibraryScanner { */ async scan(library, forceRescan = false) { if (this.isLibraryScanning(library.id)) { - Logger.error(`[Scanner] Already scanning ${library.id}`) + Logger.error(`[LibraryScanner] Already scanning ${library.id}`) return } if (!library.folders.length) { - Logger.warn(`[Scanner] Library has no folders to scan "${library.name}"`) + Logger.warn(`[LibraryScanner] Library has no folders to scan "${library.name}"`) return } + if (library.isBook && library.settings.metadataPrecedence.join() !== library.lastScanMetadataPrecedence?.join()) { + const lastScanMetadataPrecedence = library.lastScanMetadataPrecedence?.join() || 'Unset' + Logger.info(`[LibraryScanner] Library metadata precedence changed since last scan. From [${lastScanMetadataPrecedence}] to [${library.settings.metadataPrecedence.join()}]`) + forceRescan = true + } + const libraryScan = new LibraryScan() libraryScan.setData(library) libraryScan.verbose = true @@ -64,18 +70,18 @@ class LibraryScanner { SocketAuthority.emitter('scan_start', libraryScan.getScanEmitData) - Logger.info(`[Scanner] Starting${forceRescan ? ' (forced)' : ''} library scan ${libraryScan.id} for ${libraryScan.libraryName}`) + Logger.info(`[LibraryScanner] Starting${forceRescan ? ' (forced)' : ''} library scan ${libraryScan.id} for ${libraryScan.libraryName}`) const canceled = await this.scanLibrary(libraryScan, forceRescan) if (canceled) { - Logger.info(`[Scanner] Library scan canceled for "${libraryScan.libraryName}"`) + Logger.info(`[LibraryScanner] Library scan canceled for "${libraryScan.libraryName}"`) delete this.cancelLibraryScan[libraryScan.libraryId] } libraryScan.setComplete() - Logger.info(`[Scanner] Library scan ${libraryScan.id} completed in ${libraryScan.elapsedTimestamp} | ${libraryScan.resultStats}`) + Logger.info(`[LibraryScanner] Library scan ${libraryScan.id} completed in ${libraryScan.elapsedTimestamp} | ${libraryScan.resultStats}`) this.librariesScanning = this.librariesScanning.filter(ls => ls.id !== library.id) if (canceled && !libraryScan.totalResults) { @@ -85,6 +91,13 @@ class LibraryScanner { return } + library.lastScan = Date.now() + library.lastScanVersion = packageJson.version + if (library.isBook) { + library.lastScanMetadataPrecedence = library.settings.metadataPrecedence + } + await Database.libraryModel.updateFromOld(library) + SocketAuthority.emitter('scan_complete', libraryScan.getScanEmitData) if (libraryScan.totalResults) {