Files
gart/code/fcpxml/writer/roles.py
T
João HenriqueandClaude Opus 5 4f5cf94443 refactor: writer.py vira pacote, um módulo por assunto
O writer tinha 4.199 linhas, das quais 3.300 numa única classe com dezoito
assuntos dentro. Achar o trecho de zoom exigia rolar por marcadores,
velocidade e legendas.

Agora é o pacote fcpxml/writer/, com um arquivo por assunto e o
FCPXMLModifier montado por composição de mixins. Mixins, e não objetos
separados, porque todas essas operações mexem no mesmo documento e nos
mesmos índices — separá-las em objetos independentes transformaria toda
chamada interna em travessia de fronteira sem nada em troca. A divisão que
importa aqui é de leitura, não de estado.

Nenhuma mudança de comportamento e nenhuma alteração nos ~50 pontos que
importam do writer: o __init__ re-exporta tudo, inclusive os nomes com
underscore que a suíte já usava.

    core      723   carga, índices, navegação na spine, save
    titles    600   títulos e legendas dinâmicas
    cut       333   dividir, cortar faixas, apagar
    speed     297   velocidade e zoom
    (+ 20 módulos menores)

Único ajuste de chamada: quatro testes faziam patch em
fcpxml.writer.subprocess, que agora mora em writer.document (ver
Engine/docs/05_EXPERIENCIAS.md #23).

Lint zerado, 1441 testes passando.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 21:38:49 -04:00

44 lines
1.2 KiB
Python

"""Atribuir roles de vídeo/áudio.
Extraído de writer.py — ver fcpxml/writer/__init__.py para o conjunto.
"""
import xml.etree.ElementTree as ET
from typing import Optional
from .helpers import _sanitize_xml_value
class RolesMixin:
"""Atribuir roles de vídeo/áudio."""
# ROLE OPERATIONS (v0.5.0)
# ========================================================================
def assign_role(
self,
clip_id: str,
audio_role: Optional[str] = None,
video_role: Optional[str] = None,
) -> ET.Element:
"""Set the audio/video role on a clip.
Args:
clip_id: Name/ID of the clip
audio_role: Audio role (e.g., "dialogue", "music", "effects")
video_role: Video role (e.g., "video", "titles")
Returns:
The modified clip element
"""
clip = self._require_clip(clip_id)
if audio_role is not None:
clip.set('audioRole', _sanitize_xml_value(audio_role, 256))
if video_role is not None:
clip.set('videoRole', _sanitize_xml_value(video_role, 256))
return clip
# ========================================================================