From 377cbc53a7c759643e84ac60bb494e0da62b3608 Mon Sep 17 00:00:00 2001 From: IrosTheBeggar Date: Mon, 6 Apr 2026 09:03:09 -0400 Subject: [PATCH] subdirectories won't be scanned --- src/api/admin.js | 8 ++++++-- src/db/task-queue.js | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/api/admin.js b/src/api/admin.js index 5b27aff6..0cfec355 100644 --- a/src/api/admin.js +++ b/src/api/admin.js @@ -211,8 +211,12 @@ export function setup(mstream) { res.json({}); try { - dbQueue.scanVPath(input.value.vpath); - }catch (err) { + if (dbQueue.isSubdirectoryOfExistingVpath(input.value.directory)) { + winston.info(`Skipping scan for '${input.value.vpath}' — directory is a subdirectory of an existing vpath`); + } else { + dbQueue.scanVPath(input.value.vpath); + } + } catch (err) { winston.error('/api/v1/admin/directory failed to add ', { stack: err }); } }); diff --git a/src/db/task-queue.js b/src/db/task-queue.js index edde95f8..f9e9c2e6 100644 --- a/src/db/task-queue.js +++ b/src/db/task-queue.js @@ -46,6 +46,35 @@ function findRustParser() { return false; } +// ── Subdirectory filtering ────────────────────────────────────────────────── + +function filterSubdirectoryVpaths(libraries) { + const normalized = libraries.map(lib => ({ + ...lib, + _normalRoot: path.resolve(lib.root_path) + path.sep + })); + + return normalized.filter((lib, _i, all) => { + return !all.some(other => + other.name !== lib.name + && lib._normalRoot.startsWith(other._normalRoot) + && lib._normalRoot !== other._normalRoot + ); + }); +} + +function isSubdirectoryOfExistingVpath(directory) { + const normalDir = path.resolve(directory) + path.sep; + const libraries = db.getAllLibraries(); + for (const lib of libraries) { + const normalRoot = path.resolve(lib.root_path) + path.sep; + if (normalDir.startsWith(normalRoot) && normalDir !== normalRoot) { + return true; + } + } + return false; +} + // ── Scan task management ──────────────────────────────────────────────────── function addScanTask(vpath, forceRescan = false) { @@ -58,14 +87,14 @@ function addScanTask(vpath, forceRescan = false) { } function scanAll() { - const libraries = db.getAllLibraries(); + const libraries = filterSubdirectoryVpaths(db.getAllLibraries()); for (const lib of libraries) { addScanTask(lib.name); } } function rescanAll() { - const libraries = db.getAllLibraries(); + const libraries = filterSubdirectoryVpaths(db.getAllLibraries()); for (const lib of libraries) { addScanTask(lib.name, true); } @@ -154,7 +183,7 @@ export function scanVPath(vPath) { addScanTask(vPath); } -export { scanAll, rescanAll }; +export { scanAll, rescanAll, isSubdirectoryOfExistingVpath }; export function isScanning() { return runningTasks.size > 0;