From 83a4f9b8e809ce2106fec5ae0e440ebef026169d Mon Sep 17 00:00:00 2001 From: velvettear Date: Thu, 2 Jun 2022 16:36:27 +0200 Subject: [PATCH] added config parameter 'initialscan' to suppress initial 'add' events --- classes/Watcher.js | 47 +++++++++++++++++++++++++++++++++++++++++++-- example_config.json | 6 +++++- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/classes/Watcher.js b/classes/Watcher.js index e57a557..80d106c 100644 --- a/classes/Watcher.js +++ b/classes/Watcher.js @@ -1,5 +1,6 @@ const path = require('path'); const chokidar = require('chokidar'); +const { open, writeFile } = require('fs/promises'); class Watcher { @@ -7,17 +8,27 @@ class Watcher { this.#initialize(); } - #initialize() { + async #initialize() { if (config?.library === undefined) { throw new Error('library not defined'); } if (config?.library?.sources === undefined || config?.library?.sources.length === 0) { throw new Error('no library sources defined'); } + let initialScan = config?.library?.initialscan?.enabled; + if (initialScan === undefined) { + initialScan = true; + } for (let index = 0; index < config.library.sources.length; index++) { const directory = path.resolve(config.library.sources[index]); + let ignoreInitial = !initialScan; + if (ignoreInitial === false) { + ignoreInitial = (new Date().getTime() - await this.#checkHiddenFile(directory)) < (config?.library?.initialscan?.maxage || 86400000); + } logger.debug('watching directory \'' + directory + '\'...'); - this.#handleEvents(chokidar.watch(directory)); + this.#handleEvents(chokidar.watch(directory, { + ignoreInitial: ignoreInitial + })); } } @@ -35,6 +46,38 @@ class Watcher { queue.add(constants.FS_EVENT_CHANGE, file, stats); }); } + + async #checkHiddenFile(directory) { + if (directory === undefined) { + return; + } + const hiddenFile = path.join(directory, '.kannon'); + let filehandle; + try { + filehandle = await open(hiddenFile); + return (await filehandle.readFile()).toString(); + } catch (error) { + if (error.code === 'ENOENT') { + return await this.#createHiddenFile(hiddenFile); + } + logger.error('encountered an error checking the hidden file \'' + hiddenFile + '\' > ' + error); + } finally { + filehandle?.close(); + } + } + + async #createHiddenFile(file) { + if (file === undefined) { + return; + } + const timestamp = new Date().getTime().toString(); + try { + await writeFile(file, timestamp); + return timestamp; + } catch (error) { + logger.error('encountered an error writing the hidden file \'' + file + '\' > ' + error); + } + } } module.exports = Watcher; \ No newline at end of file diff --git a/example_config.json b/example_config.json index 8095187..8378aba 100644 --- a/example_config.json +++ b/example_config.json @@ -22,7 +22,11 @@ "formats": [ "mp3", "flac" - ] + ], + "initialscan": { + "enabled": false, + "maxage": 3600000 + } }, "database": { "dialect": "postgres",