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 @@
-
-
+ updateSettingsKey('scannerParseSubtitle', val)" />
+
Scanner parse subtitles
info_outlined
@@ -62,8 +62,8 @@
-
-
+ updateSettingsKey('scannerFindCovers', val)" />
+
Scanner find covers
info_outlined
@@ -76,8 +76,8 @@
-
-
+ updateSettingsKey('scannerPreferAudioMetadata', val)" />
+
Scanner prefer audio metadata
info_outlined
@@ -86,14 +86,24 @@
-
-
+ updateSettingsKey('scannerPreferOpfMetadata', val)" />
+
Scanner prefer OPF metadata
info_outlined
+
+
+
updateSettingsKey('scannerDisableWatcher', val)" />
+
+
+ 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,