Add file.rs for local file input

This commit is contained in:
2026-03-19 00:32:33 +08:00
parent 6630abc32b
commit 3acc36f648

65
src/input/file.rs Normal file
View File

@@ -0,0 +1,65 @@
//! 本地檔案輸入
use anyhow::Result;
use std::path::{Path, PathBuf};
#[derive(Debug, Clone)]
pub enum MediaType {
Video,
Audio,
Image,
Document,
Unknown,
}
impl MediaType {
pub fn from_extension(ext: &str) -> Self {
match ext.to_lowercase().as_str() {
"mp4" | "avi" | "mkv" | "mov" | "webm" | "flv" => MediaType::Video,
"mp3" | "wav" | "flac" | "aac" | "ogg" | "m4a" => MediaType::Audio,
"jpg" | "jpeg" | "png" | "gif" | "webp" | "bmp" => MediaType::Image,
"md" | "markdown" | "pdf" | "html" | "htm" => MediaType::Document,
_ => MediaType::Unknown,
}
}
}
pub struct FileInput {
path: Option<PathBuf>,
media_type: MediaType,
}
impl FileInput {
pub fn new() -> Self {
Self {
path: None,
media_type: MediaType::Unknown,
}
}
pub fn open(&mut self, path: &str) -> Result<MediaType> {
let path = Path::new(path);
if !path.exists() {
anyhow::bail!("File not found: {:?}", path);
}
let ext = path.extension()
.and_then(|e| e.to_str())
.unwrap_or("");
let media_type = MediaType::from_extension(ext);
self.path = Some(path.to_path_buf());
self.media_type = media_type.clone();
Ok(media_type)
}
pub fn get_path(&self) -> Option<&Path> {
self.path.as_deref()
}
pub fn get_media_type(&self) -> &MediaType {
&self.media_type
}
}