feat: criado modo explícito de análise do Scanner para separar som

- criado modo explícito de análise do Scanner para separar som, imagem ou ambos

Resumo:
- 5 arquivos alterados
- 0 novos
- 5 modificados
- 0 removidos

 5 files changed, 68 insertions(+), 11 deletions(-)

Arquivos:
  - code/cep-plugin/index.html
  - code/cep-plugin/main.js
  - code/cep-plugin/styles.css
  - code/engine/executar_scanner.py
  - code/engine/scanner/configuracao_visual.py
This commit is contained in:
João Henrique
2026-09-09 17:04:49 -04:00
parent 53a8307f38
commit 89288d95f0
5 changed files with 68 additions and 11 deletions
+5 -2
View File
@@ -59,7 +59,9 @@ def executar(entrada: Path, saida: Path) -> Path:
pedido = json.loads(entrada.read_text(encoding="utf-8"))
configuracao = ConfiguracaoVisualDoScanner.de_dict(pedido["perfil"])
timeline = ConversorDeTimeline().converter(pedido["timeline"])
clipes = [clipe for faixa in timeline.faixas if faixa.tipo == "video"
analisar_imagem = configuracao.modo_de_analise in {"imagem", "ambos"}
analisar_som = configuracao.modo_de_analise in {"som", "ambos"}
clipes = [clipe for faixa in timeline.faixas if analisar_imagem and faixa.tipo == "video"
and faixa.indice in configuracao.faixas_de_video for clipe in faixa.clipes]
total_estimado = sum(max(1, math.ceil((clipe.intervalo_na_origem or clipe.intervalo_na_timeline).duracao /
configuracao.intervalo_em_segundos)) + 1 for clipe in clipes) or 1
@@ -105,7 +107,8 @@ def executar(entrada: Path, saida: Path) -> Path:
"arquivo_original": clipe.arquivo}, "erro": str(erro)})
concluidos += peso
faixas_de_audio = [faixa for faixa in timeline.faixas
if faixa.tipo == "audio" and faixa.indice in configuracao.faixas_de_audio]
if analisar_som and faixa.tipo == "audio"
and faixa.indice in configuracao.faixas_de_audio]
audio = [{"indice": faixa.indice, "nome": faixa.nome,
"clipes": [{"identificador": clipe.identificador, "nome": clipe.nome,
"inicio": clipe.intervalo_na_timeline.inicio, "fim": clipe.intervalo_na_timeline.fim}
@@ -38,6 +38,7 @@ class ConfiguracaoVisualDoScanner:
resolucao_maxima: int = 1080
faixas_de_video: tuple[int, ...] = ()
faixas_de_audio: tuple[int, ...] = ()
modo_de_analise: str = "ambos"
recursos_vision: frozenset[str] = RECURSOS_VISION
detectar_cenas: bool = True
analisar_continuidade: bool = True
@@ -56,6 +57,8 @@ class ConfiguracaoVisualDoScanner:
maximo_de_frames_interpretados: int | None = None
def __post_init__(self) -> None:
if self.modo_de_analise not in {"som", "imagem", "ambos"}:
raise ValueError("modo_de_analise deve ser som, imagem ou ambos.")
if not 0.04 <= self.intervalo_em_segundos <= 60:
raise ValueError("intervalo_em_segundos deve estar entre 0,04 e 60.")
if self.resolucao_maxima != 0 and not 240 <= self.resolucao_maxima <= 8640:
@@ -83,6 +86,7 @@ class ConfiguracaoVisualDoScanner:
resolucao_maxima=int(dados.get("resolucao_maxima", 1080)),
faixas_de_video=tuple(sorted(set(int(item) for item in dados.get("faixas_de_video", ())))),
faixas_de_audio=tuple(sorted(set(int(item) for item in dados.get("faixas_de_audio", ())))),
modo_de_analise=str(dados.get("modo_de_analise", "ambos")),
recursos_vision=frozenset(dados.get("recursos_vision", RECURSOS_VISION)),
detectar_cenas=bool(dados.get("detectar_cenas", True)),
analisar_continuidade=bool(dados.get("analisar_continuidade", True)),
@@ -103,6 +107,7 @@ class ConfiguracaoVisualDoScanner:
"resolucao_maxima": self.resolucao_maxima,
"faixas_de_video": list(self.faixas_de_video),
"faixas_de_audio": list(self.faixas_de_audio),
"modo_de_analise": self.modo_de_analise,
"recursos_vision": sorted(self.recursos_vision),
"detectar_cenas": self.detectar_cenas,
"analisar_continuidade": self.analisar_continuidade,