feat: implement project management and media track handling

- Added domain entities for audio, subtitle, and video tracks.
- Created a Project entity to manage media editing sessions.
- Implemented value objects for file paths, sync offsets, track IDs, and languages.
- Developed infrastructure for asynchronous FFmpeg process execution.
- Built a user interface for selecting video files, adding audio and subtitle tracks, and managing output settings.
- Integrated error handling and logging for media processing tasks.
This commit is contained in:
2026-02-28 13:42:23 -03:00
parent eff779a1df
commit ce236eca5d
47 changed files with 6818 additions and 2 deletions
+42
View File
@@ -0,0 +1,42 @@
use eframe::egui;
use crate::adapters::filesystem::FilePickerAdapter;
use crate::domain::value_objects::FilePath;
/// Componente para seleção do arquivo de vídeo base.
/// Ao confirmar, dispara LoadMediaInfo via callback.
pub struct VideoSelector {
pub selected_path: Option<FilePath>,
}
impl VideoSelector {
pub fn new() -> Self {
VideoSelector { selected_path: None }
}
/// Renderiza o seletor. Retorna `Some(FilePath)` se um novo arquivo foi selecionado.
pub fn ui(&mut self, ui: &mut egui::Ui) -> Option<FilePath> {
let mut selected = None;
ui.group(|ui| {
ui.heading("Arquivo de vídeo");
ui.horizontal(|ui| {
let label = self
.selected_path
.as_ref()
.map(|p| p.to_string_lossy().to_string())
.unwrap_or_else(|| "Nenhum arquivo selecionado".to_string());
ui.label(&label);
if ui.button("Selecionar…").clicked() {
if let Some(path) = FilePickerAdapter::pick_video() {
self.selected_path = Some(path.clone());
selected = Some(path);
}
}
});
});
selected
}
}