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>
44 lines
1.3 KiB
Python
44 lines
1.3 KiB
Python
"""Reenquadrar a resolução do projeto.
|
|
|
|
Extraído de writer.py — ver fcpxml/writer/__init__.py para o conjunto.
|
|
"""
|
|
|
|
|
|
|
|
class ReformatMixin:
|
|
"""Reenquadrar a resolução do projeto."""
|
|
|
|
# REFORMAT OPERATIONS (v0.5.0)
|
|
# ========================================================================
|
|
|
|
SOCIAL_FORMATS = {
|
|
"9:16": (1080, 1920),
|
|
"1:1": (1080, 1080),
|
|
"4:5": (1080, 1350),
|
|
"16:9": (1920, 1080),
|
|
"4:3": (1440, 1080),
|
|
}
|
|
|
|
def reformat_resolution(self, width: int, height: int) -> None:
|
|
"""Change the timeline format to a new resolution.
|
|
|
|
Updates the format resource dimensions. FCP handles spatial
|
|
conforming (letterbox/pillarbox) on import.
|
|
|
|
Args:
|
|
width: Target width in pixels
|
|
height: Target height in pixels
|
|
"""
|
|
for fmt in self.root.findall('.//format'):
|
|
fmt.set('width', str(width))
|
|
fmt.set('height', str(height))
|
|
old_name = fmt.get('name', '')
|
|
if old_name:
|
|
fmt.set('name', f"FFVideoFormat{width}x{height}")
|
|
|
|
sequence = self.root.find('.//sequence')
|
|
if sequence is not None and sequence.get('format'):
|
|
pass # format ref stays the same, dimensions updated in-place
|
|
|
|
# ========================================================================
|