feat: implementa funcionalidade de exportação de faixas de áudio e legenda

This commit is contained in:
2026-02-28 13:59:57 -03:00
parent a588ecd382
commit 4aa7cf2dd4
7 changed files with 334 additions and 12 deletions
+20 -5
View File
@@ -1,7 +1,7 @@
# Progresso de Implementação
**Data:** 28/02/2026
**Status:** Fases 16 concluídas — compilando, testes passando, aplicação executável
**Status:** Fases 16 concluídas + exportação de faixa implementada — compilando, testes passando, aplicação executável
**Referência:** DEVELOPMENT_PLAN.md v1.0
---
@@ -9,7 +9,10 @@
## Resumo Executivo
Todas as 6 fases do plano de desenvolvimento foram implementadas. O projeto compila sem erros,
26 testes unitários passam e a aplicação pode ser executada com `cargo run`.
31 testes unitários passam e a aplicação pode ser executada com `cargo run`.
Após a conclusão das fases, foi implementada a funcionalidade de exportação de faixa de áudio
ou legenda diretamente da lista de faixas existentes.
---
@@ -61,6 +64,7 @@ src/
│ ├── add_subtitle.rs — adiciona SubtitleTrack ao Project
│ ├── adjust_sync.rs — altera SyncOffset de faixa externa
│ ├── edit_existing_track_sync.rs — altera SyncOffset de faixa existente
│ ├── export_track.rs — exporta faixa de áudio ou legenda para arquivo
│ ├── set_track_language.rs — altera idioma de faixa externa
│ └── generate_output.rs — constrói comando e delega ao MediaProcessorPort
@@ -68,12 +72,12 @@ src/
│ ├── mod.rs
│ ├── ffmpeg/
│ │ ├── mod.rs
│ │ ├── command_builder.rs — FfmpegCommandBuilder: Project → Vec<String>
│ │ ├── command_builder.rs — FfmpegCommandBuilder: Project → Vec<String>; build_export()
│ │ ├── ffprobe_gateway.rs — FfprobeGateway impl MediaInfoPort
│ │ └── ffmpeg_gateway.rs — FfmpegGateway impl MediaProcessorPort
│ └── filesystem/
│ ├── mod.rs — RealFileSystem impl FileSystemPort
│ └── file_picker.rs — FilePickerAdapter (diálogos nativos via rfd)
│ └── file_picker.rs — FilePickerAdapter; save_audio(codec), save_subtitle(codec)
├── infrastructure/
│ ├── mod.rs
@@ -97,7 +101,7 @@ src/
---
## Testes Unitários (26/26 passando)
## Testes Unitários (31/31 passando)
### Domain — Value Objects
| Teste | Resultado |
@@ -141,6 +145,15 @@ src/
| `mapa_faixa_externa_de_audio``map 1:a` | ✅ |
| `metadata_idioma_audio``-metadata:s:a:0 language=por` | ✅ |
### Application — ExportTrack
| Teste | Resultado |
|-------|-----------|
| `export_track::exporta_audio_com_c_a_copy``-c:a copy` presente, sem `-c copy` genérico | ✅ |
| `export_track::exporta_audio_mapeia_stream_correto``0:stream_index` correto | ✅ |
| `export_track::exporta_legenda_sem_c_copy` — nenhuma forma de `-c` para legendas | ✅ |
| `export_track::exporta_legenda_output_e_ultimo_argumento` | ✅ |
| `export_track::rejeita_faixa_de_video` — retorna erro para `TrackKind::Video` | ✅ |
---
## Dependências (Cargo.toml)
@@ -163,12 +176,14 @@ rfd = "0.14"
- **`TrackId` é opaco** — não expõe índice interno; mapeamento para `-map N:tipo` feito apenas no adapter
- **`Project` rejeita `output == source`** — validado no construtor
- **Termos FFmpeg nunca aparecem na UI** — a interface usa linguagem do usuário final
- **Exceção documentada ao RNF-01** — `build_export()` omite `-c copy` exclusivamente para legendas (conversão de container de texto, sem processamento de mídia); comentário inline explica a exceção
---
## O Que Falta (Backlog de Refinamento)
### Funcional
- [x] Exportar faixa de áudio ou legenda existente para arquivo separado
- [ ] Exibição de faixas externas adicionadas com opção de remover
- [ ] Progresso em tempo real via `run_ffmpeg_async` (infrastructure já implementada, UI usa thread bloqueante por ora)
- [ ] Exibição do comando gerado em modo debug