feat: real EXIF extraction via adapters-exif crate

- MetadataExtractorPort in domain (bytes → StructuredData)
- adapters-exif: NomExifExtractor using nom-exif, handles EXIF + TrackInfo
- Worker's MetadataExtractorPlugin delegates to port, no longer knows nom-exif
- Filters noisy binary tags (U8Array, Undefined, Unknown)
This commit is contained in:
2026-05-31 20:28:50 +02:00
parent d1c7243f5b
commit 45669ec848
10 changed files with 212 additions and 8 deletions

View File

@@ -3,8 +3,9 @@ use super::entities::{
MetadataSource,
};
use crate::common::errors::DomainError;
use crate::common::value_objects::{Checksum, SystemId};
use crate::common::value_objects::{Checksum, StructuredData, SystemId};
use async_trait::async_trait;
use bytes::Bytes;
// --- AssetRepository ---
@@ -74,3 +75,9 @@ pub trait DuplicateRepository: Send + Sync {
async fn find_by_asset(&self, asset_id: &SystemId) -> Result<Vec<DuplicateGroup>, DomainError>;
async fn save(&self, group: &DuplicateGroup) -> Result<(), DomainError>;
}
// --- MetadataExtractorPort ---
pub trait MetadataExtractorPort: Send + Sync {
fn extract(&self, bytes: &Bytes) -> Result<StructuredData, DomainError>;
}