"""Inserir clipes na spine. Extraído de writer.py — ver fcpxml/writer/__init__.py para o conjunto. """ import xml.etree.ElementTree as ET from typing import Optional class InsertMixin: """Inserir clipes na spine.""" # INSERT CLIP OPERATIONS # ======================================================================== def insert_clip( self, position: str, asset_id: Optional[str] = None, asset_name: Optional[str] = None, duration: Optional[str] = None, in_point: Optional[str] = None, out_point: Optional[str] = None, ripple: bool = True ) -> ET.Element: """ Insert a library clip onto the timeline. Args: position: Where to insert - 'start', 'end', timecode, or 'after:clip_id' asset_id: Asset reference ID (e.g., 'r3') asset_name: Asset name (alternative to asset_id) duration: Duration of clip (if not using in/out points) in_point: Source in-point for subclip out_point: Source out-point for subclip ripple: Whether to shift subsequent clips Returns: The created clip element """ asset, asset_id = self._resolve_asset(asset_id, asset_name) clip_duration, source_start = self._resolve_clip_duration( asset, duration, in_point, out_point ) # Get spine and calculate insert position spine = self._get_spine() spine_children = list(spine) target_offset, insert_index = self._resolve_insert_position( position, spine_children ) # Build extra attrs — include format from first available format extra: dict[str, str] = {} for fmt_id in self.formats: extra['format'] = fmt_id break new_clip = self._make_asset_clip( asset_id, asset.get('name', 'Untitled'), target_offset, source_start, clip_duration, **extra, ) # Insert into spine spine.insert(insert_index, new_clip) # Ripple subsequent clips if needed if ripple and insert_index < len(spine_children): self._ripple_from_index(spine, insert_index + 1, clip_duration) # Add to clip index clip_id = f"inserted_{len(self.clips)}" self.clips[clip_id] = new_clip return new_clip # ========================================================================