feat: adiciona suporte para definir título e faixa padrão em faixas de áudio e legenda
This commit is contained in:
+34
@@ -112,6 +112,39 @@ src/
|
||||
|
||||
---
|
||||
|
||||
## Inventário de Mudanças — Compatibilidade com Jellyfin (01/03/2026)
|
||||
|
||||
### Contexto
|
||||
|
||||
Arquivos M4A produzidos pelo Google (ex: downloads do YouTube Music ou Google Drive) carregam
|
||||
um metadado `title` na stream de áudio com o valor `"ISO Media file produced by Google Inc."`. Quando
|
||||
o FFmpeg faz o mux sem sobrescrever esse metadado, ele é copiado literalmente para a faixa do MKV.
|
||||
|
||||
O Jellyfin **web** é tolerante e usa a tag `language` para selecionar a faixa preferida. Já o
|
||||
Jellyfin **mobile** usa o campo `title` da stream para exibir e selecionar faixas — quando não
|
||||
reconhece o título como idioma, não realiza seleção automática e mantém a faixa original.
|
||||
|
||||
Algo semelhante ocorre com `disposition:default`: a faixa original do fonte fica com `default=1`;
|
||||
a nova faixa fica com `default=0`; o Jellyfin mobile respeitam esse flag e tocam a original.
|
||||
|
||||
> **Status:** mudanças implementadas e compilando; investigação em andamento — o problema no
|
||||
> Jellyfin mobile ainda não foi completamente resolvido.
|
||||
|
||||
### Mudanças por camada
|
||||
|
||||
| Arquivo | Mudança |
|
||||
| --- | --- |
|
||||
| `domain/entities/audio_track.rs` | Adicionado `is_default: bool` e `title: String` a `AudioTrack` |
|
||||
| `domain/entities/subtitle_track.rs` | Adicionado `is_default: bool` e `title: String` a `SubtitleTrack` |
|
||||
| `application/use_cases/add_audio_track.rs` | Parâmetros `is_default` e `title` adicionados ao `execute()` |
|
||||
| `application/use_cases/add_subtitle.rs` | Parâmetros `is_default` e `title` adicionados ao `execute()` |
|
||||
| `adapters/ffmpeg/command_builder.rs` | Emite `-disposition:a/s:{idx} 0` nas faixas existentes quando uma externa é marcada como padrão; emite `-disposition:a/s:{idx} default` na faixa marcada; emite `-metadata:s:a/s:{idx} title={valor}` para toda faixa externa (string vazia apaga o título herdado) |
|
||||
| `ui/components/add_audio_track_form.rs` | Campo “Nome da faixa” (`TextEdit`) e checkbox “Definir como faixa padrão” |
|
||||
| `ui/components/add_subtitle_form.rs` | Campo “Nome da faixa” (`TextEdit`) e checkbox “Definir como faixa padrão” |
|
||||
| `ui/components/batch_panel.rs` | `PendingAudio` e `PendingSubtitle` propagam `is_default` e `title` |
|
||||
|
||||
---
|
||||
|
||||
## Testes Unitários (33/33 passando)
|
||||
|
||||
### Domain — Value Objects
|
||||
@@ -200,6 +233,7 @@ rfd = "0.14"
|
||||
- **`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
|
||||
- **`title=` sempre emitido** — `FfmpegCommandBuilder` emite `-metadata:s:a/s:{idx} title=` para toda faixa externa, garantindo que títulos herdados do arquivo fonte sejam sobrescritos; string vazia limpa o campo no MKV
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user