feat: register non-video files — graceful probe fallback for svg/pdf/docx/pages etc
This commit is contained in:
@@ -48,11 +48,6 @@ impl IngestionService {
|
||||
|
||||
pub async fn ingest(&self, file_path: &str) -> Result<Option<String>> {
|
||||
let path = Path::new(file_path);
|
||||
|
||||
if !is_video_extension(path) {
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
let canonical_path = path.canonicalize().unwrap_or_else(|_| path.to_path_buf());
|
||||
let filename = path
|
||||
.file_name()
|
||||
@@ -110,13 +105,11 @@ impl IngestionService {
|
||||
|
||||
info!("Starting ingestion for: {} ({})", path.display(), uuid);
|
||||
|
||||
let probe_result = probe::probe_video(file_path)
|
||||
.with_context(|| format!("Failed to probe video: {}", file_path))?;
|
||||
let probe_result = probe::probe_video(file_path).ok();
|
||||
let file_meta = std::fs::metadata(&canonical_path).ok();
|
||||
|
||||
let duration = probe_result
|
||||
.format
|
||||
.duration
|
||||
.as_ref()
|
||||
let duration = probe_result.as_ref()
|
||||
.and_then(|r| r.format.duration.as_ref())
|
||||
.and_then(|s| s.parse::<f64>().ok())
|
||||
.unwrap_or(0.0);
|
||||
|
||||
@@ -124,15 +117,17 @@ impl IngestionService {
|
||||
let mut height = 0u32;
|
||||
let mut fps = 0.0;
|
||||
|
||||
for stream in &probe_result.streams {
|
||||
if stream.codec_type.as_deref() == Some("video") {
|
||||
width = stream.width.unwrap_or(0);
|
||||
height = stream.height.unwrap_or(0);
|
||||
if let Some(fps_str) = &stream.r_frame_rate {
|
||||
if let Some((num, den)) = fps_str.split_once('/') {
|
||||
if let (Ok(n), Ok(d)) = (num.parse::<f64>(), den.parse::<f64>()) {
|
||||
if d > 0.0 {
|
||||
fps = n / d;
|
||||
if let Some(ref probe) = probe_result {
|
||||
for stream in &probe.streams {
|
||||
if stream.codec_type.as_deref() == Some("video") {
|
||||
width = stream.width.unwrap_or(0);
|
||||
height = stream.height.unwrap_or(0);
|
||||
if let Some(fps_str) = &stream.r_frame_rate {
|
||||
if let Some((num, den)) = fps_str.split_once('/') {
|
||||
if let (Ok(n), Ok(d)) = (num.parse::<f64>(), den.parse::<f64>()) {
|
||||
if d > 0.0 {
|
||||
fps = n / d;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -141,7 +136,10 @@ impl IngestionService {
|
||||
}
|
||||
|
||||
let file_manager = FileManager::new(std::path::PathBuf::from("."));
|
||||
let probe_json_str = serde_json::to_string_pretty(&probe_result)?;
|
||||
let probe_json_val: serde_json::Value = probe_result.as_ref().map(|r| serde_json::to_value(r)).and_then(|r| r.ok()).unwrap_or_else(|| {
|
||||
serde_json::json!({"format": {"size": file_meta.map(|m| m.len().to_string()).unwrap_or_default(), "filename": &canonical_path.to_string_lossy().to_string(), "format_name": "unknown"}, "streams": []})
|
||||
});
|
||||
let probe_json_str = serde_json::to_string_pretty(&probe_json_val)?;
|
||||
|
||||
if let Err(e) = file_manager.save_json(&uuid, "probe", &probe_json_str) {
|
||||
warn!("Failed to save probe JSON for {}: {}", uuid, e);
|
||||
@@ -150,10 +148,7 @@ impl IngestionService {
|
||||
}
|
||||
|
||||
let total_frames = {
|
||||
let video_stream = probe_result
|
||||
.streams
|
||||
.iter()
|
||||
.find(|s| s.codec_type.as_deref() == Some("video"));
|
||||
let video_stream = probe_result.as_ref().and_then(|pr| pr.streams.iter().find(|s| s.codec_type.as_deref() == Some("video")));
|
||||
|
||||
if let Some(stream) = video_stream {
|
||||
if let Some(nb_frames_str) = &stream.nb_frames {
|
||||
@@ -249,11 +244,4 @@ impl IngestionService {
|
||||
}
|
||||
}
|
||||
|
||||
fn is_video_extension(path: &Path) -> bool {
|
||||
if let Some(ext) = path.extension().and_then(|e| e.to_str()) {
|
||||
let ext = ext.to_lowercase();
|
||||
matches!(ext.as_str(), "mp4" | "mov" | "mkv" | "avi" | "webm" | "m4v")
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user