From 7f1fc1901b0ab51f4c3d5cd339327fdd1c130145 Mon Sep 17 00:00:00 2001 From: advplyr Date: Wed, 23 Feb 2022 17:52:21 -0600 Subject: [PATCH] Add:Server setting to disable folder watcher #378 --- client/pages/config/index.vue | 88 ++++++++++++-------------------- server/Server.js | 9 +++- server/Watcher.js | 5 ++ server/objects/ServerSettings.js | 3 ++ 4 files changed, 47 insertions(+), 58 deletions(-) diff --git a/client/pages/config/index.vue b/client/pages/config/index.vue index 28a2ce76..17d3d537 100644 --- a/client/pages/config/index.vue +++ b/client/pages/config/index.vue @@ -9,7 +9,7 @@
- +

Store covers with audiobook info_outlined @@ -19,7 +19,7 @@

- +

Use square book covers info_outlined @@ -29,7 +29,7 @@

- +

Use alternative library bookshelf view info_outlined @@ -52,8 +52,8 @@

- - + +

Scanner parse subtitles info_outlined @@ -62,8 +62,8 @@

- - + +

Scanner find covers info_outlined @@ -76,8 +76,8 @@

- - + +

Scanner prefer audio metadata info_outlined @@ -86,14 +86,24 @@

- - + +

Scanner prefer OPF metadata info_outlined

+ +
+ + +

+ Disable Watcher + info_outlined +

+
+
@@ -167,7 +177,17 @@ export default { useSquareBookCovers: false, useAlternativeBookshelfView: false, isPurgingCache: false, - newServerSettings: {} + newServerSettings: {}, + tooltips: { + scannerDisableWatcher: 'Disables the automatic adding/updating of audiobooks when file changes are detected. *Requires server restart', + scannerPreferOpfMetadata: 'OPF file metadata will be used for book details over folder names', + scannerPreferAudioMetadata: 'Audio file ID3 meta tags will be used for book details over folder names', + scannerParseSubtitle: 'Extract subtitles from audiobook directory names.
Subtitle must be seperated by " - "
i.e. "Book Title - A Subtitle Here" has the subtitle "A Subtitle Here"', + scannerFindCovers: 'If your audiobook does not have an embedded cover or a cover image inside the folder, the scanner will attempt to find a cover.
Note: This will extend scan time', + bookshelfView: 'Alternative bookshelf view that shows title & author under book covers', + coverDestination: 'By default covers are stored in /metadata/books, enabling this setting will store covers inside your audiobooks directory. Only one file named "cover" will be kept.', + coverAspectRatio: 'Prefer to use square covers over standard 1.6:1 book covers' + } } }, watch: { @@ -179,36 +199,12 @@ export default { } }, computed: { - scannerPreferAudioMetaTooltip() { - return 'Audio file ID3 meta tags will be used for book details over folder names' - }, - scannerPreferOpfMetaTooltip() { - return 'OPF file metadata will be used for book details over folder names' - }, - saveMetadataTooltip() { - return 'This will write a "metadata.nfo" file in all of your audiobook directories.' - }, experimentalFeaturesTooltip() { return 'Features in development that could use your feedback and help testing.' }, serverSettings() { return this.$store.state.serverSettings }, - parseSubtitleTooltip() { - return 'Extract subtitles from audiobook directory names.
Subtitle must be seperated by " - "
i.e. "Book Title - A Subtitle Here" has the subtitle "A Subtitle Here"' - }, - coverDestinationTooltip() { - return 'By default covers are stored in /metadata/books, enabling this setting will store covers inside your audiobooks directory. Only one file named "cover" will be kept.' - }, - scannerFindCoversTooltip() { - return 'If your audiobook does not have an embedded cover or a cover image inside the folder, the scanner will attempt to find a cover.
Note: This will extend scan time' - }, - coverAspectRatioTooltip() { - return 'Prefer to use square covers over standard 1.6:1 book covers' - }, - bookshelfViewTooltip() { - return 'Alternative bookshelf view that shows title & author under book covers' - }, providers() { return this.$store.state.scanners.providers }, @@ -225,11 +221,6 @@ export default { updateEnableChromecast(val) { this.updateServerSettings({ enableChromecast: val }) }, - updateScannerFindCovers(val) { - this.updateServerSettings({ - scannerFindCovers: !!val - }) - }, updateScannerCoverProvider(val) { this.updateServerSettings({ scannerCoverProvider: val @@ -241,21 +232,6 @@ export default { coverDestination: this.newServerSettings.coverDestination }) }, - updateScannerParseSubtitle(val) { - this.updateServerSettings({ - scannerParseSubtitle: !!val - }) - }, - updateScannerPreferAudioMeta(val) { - this.updateServerSettings({ - scannerPreferAudioMetadata: !!val - }) - }, - updateScannerPreferOpfMeta(val) { - this.updateServerSettings({ - scannerPreferOpfMetadata: !!val - }) - }, updateBookCoverAspectRatio(val) { this.updateServerSettings({ coverAspectRatio: val ? this.$constants.BookCoverAspectRatio.SQUARE : this.$constants.BookCoverAspectRatio.STANDARD diff --git a/server/Server.js b/server/Server.js index 5ab7baca..156fbf74 100644 --- a/server/Server.js +++ b/server/Server.js @@ -127,8 +127,13 @@ class Server { await this.scanner.fixDuplicateIds() } - this.watcher.initWatcher(this.libraries) - this.watcher.on('files', this.filesChanged.bind(this)) + if (this.db.serverSettings.scannerDisableWatcher) { + Logger.info(`[Server] Watcher is disabled`) + this.watcher.disabled = true + } else { + this.watcher.initWatcher(this.libraries) + this.watcher.on('files', this.filesChanged.bind(this)) + } } async start() { diff --git a/server/Watcher.js b/server/Watcher.js index 7912d485..c7457ecd 100644 --- a/server/Watcher.js +++ b/server/Watcher.js @@ -13,6 +13,8 @@ class FolderWatcher extends EventEmitter { this.pendingFileUpdates = [] this.pendingDelay = 4000 this.pendingTimeout = null + + this.disabled = false } get pendingFilePaths() { @@ -71,10 +73,12 @@ class FolderWatcher extends EventEmitter { } addLibrary(library) { + if (this.disabled) return this.buildLibraryWatcher(library) } updateLibrary(library) { + if (this.disabled) return var libwatcher = this.libraryWatchers.find(lib => lib.id === library.id) if (libwatcher) { libwatcher.name = library.name @@ -90,6 +94,7 @@ class FolderWatcher extends EventEmitter { } removeLibrary(library) { + if (this.disabled) return var libwatcher = this.libraryWatchers.find(lib => lib.id === library.id) if (libwatcher) { Logger.info(`[Watcher] Removed watcher for "${library.name}"`) diff --git a/server/objects/ServerSettings.js b/server/objects/ServerSettings.js index cf8e8b1e..64987909 100644 --- a/server/objects/ServerSettings.js +++ b/server/objects/ServerSettings.js @@ -15,6 +15,7 @@ class ServerSettings { this.scannerCoverProvider = 'google' this.scannerPreferAudioMetadata = false this.scannerPreferOpfMetadata = false + this.scannerDisableWatcher = false // Metadata this.coverDestination = CoverDestination.METADATA @@ -56,6 +57,7 @@ class ServerSettings { this.scannerParseSubtitle = settings.scannerParseSubtitle this.scannerPreferAudioMetadata = !!settings.scannerPreferAudioMetadata this.scannerPreferOpfMetadata = !!settings.scannerPreferOpfMetadata + this.scannerDisableWatcher = !!settings.scannerDisableWatcher this.coverDestination = settings.coverDestination || CoverDestination.METADATA this.saveMetadataFile = !!settings.saveMetadataFile @@ -92,6 +94,7 @@ class ServerSettings { scannerParseSubtitle: this.scannerParseSubtitle, scannerPreferAudioMetadata: this.scannerPreferAudioMetadata, scannerPreferOpfMetadata: this.scannerPreferOpfMetadata, + scannerDisableWatcher: this.scannerDisableWatcher, coverDestination: this.coverDestination, saveMetadataFile: !!this.saveMetadataFile, rateLimitLoginRequests: this.rateLimitLoginRequests,