feat: directory scanner plugin — walk library paths, auto-register assets

- DirectoryScannerPlugin: recursive directory walk via FileStoragePort
- Computes SHA256 checksums, classifies media by extension
- Registers each file via RegisterAssetHandler (triggers AssetIngested → extract_metadata pipeline)
- Reads library_path_id from job payload, looks up volume + path
- Seeded plugin + scan_directory pipeline
- Trigger via POST /jobs with { job_type: "ScanDirectory", payload: { library_path_id: "..." } }
This commit is contained in:
2026-05-31 21:18:23 +02:00
parent ef64e86439
commit 95916cedde
29 changed files with 1461 additions and 7 deletions

View File

@@ -1,8 +1,12 @@
use crate::plugin_registry::InMemoryPluginRegistry;
use crate::plugins::{
MetadataExtractorPlugin, NoOpPlugin, SidecarSyncPlugin, ThumbnailGeneratorPlugin,
DirectoryScannerPlugin, MetadataExtractorPlugin, NoOpPlugin, SidecarSyncPlugin,
ThumbnailGeneratorPlugin,
};
use application::catalog::RegisterAssetHandler;
use domain::ports::{
EventPublisher, MetadataExtractorPort, SidecarWriterPort, ThumbnailGeneratorPort,
};
use domain::ports::{MetadataExtractorPort, SidecarWriterPort, ThumbnailGeneratorPort};
use std::sync::Arc;
use super::Repos;
@@ -13,6 +17,7 @@ pub fn build_plugin_registry(
sidecar_writer: Arc<dyn SidecarWriterPort>,
extractor: Arc<dyn MetadataExtractorPort>,
thumbnail_gen: Arc<dyn ThumbnailGeneratorPort>,
event_pub: Arc<dyn EventPublisher>,
) -> InMemoryPluginRegistry {
let mut registry = InMemoryPluginRegistry::new();
@@ -25,11 +30,23 @@ pub fn build_plugin_registry(
)));
registry.register(Arc::new(ThumbnailGeneratorPlugin::new(
repos.asset.clone(),
file_storage,
file_storage.clone(),
repos.derivative.clone(),
thumbnail_gen,
)));
let register_handler = Arc::new(RegisterAssetHandler::new(
repos.asset.clone(),
repos.duplicate.clone(),
event_pub,
));
registry.register(Arc::new(DirectoryScannerPlugin::new(
repos.volume.clone(),
repos.library_path.clone(),
file_storage.clone(),
register_handler,
)));
let export_handler = Arc::new(application::sidecar::ExportSidecarHandler::new(
repos.metadata.clone(),
repos.sidecar.clone(),