From import to export, PyEncoder leans on the battle-tested libopenshot engine and exposes it through a focused, modular Qt6 application.
A native TimelineView with a backing model gives you precise, responsive editing.

Playback runs through libopenshot's openshot.QtPlayer GPU path — the player binds a Qt widget directly and drives Play(), Speed() and Position() on the engine.

The KeyframeScaler handles the math editors care about: rescale_fps, retime, stretch and snap-to-FPS — so animated properties survive a project frame-rate change.

An effects panel and a transitions library make assembling a sequence quick.
TransitionKind, with generated filter_complex
Heavy footage stays smooth thanks to a real background queue. The ProxyService runs a TranscodeQueue with full job lifecycle, an LRU cache and Qt signals; the export controller queues final renders.

PyEncoder is a clean, modular codebase — not a monolith.
| Area | Module | What it does |
|---|---|---|
| Engine | OpenShotEngineAdapter | Wraps libopenshot for timeline, playback and rendering |
| Proxies | ProxyService | Transcode queue with job lifecycle + LRU cache |
| Transitions | Transitions | 18 transition kinds, FFmpeg filter_complex generation |
| Titles | SVGTitles | SVG title template registry with overlay compositing |
| Keyframes | KeyframeScaler | rescale_fps, retime, stretch, snap-to-fps |
| Clipboard | ClipboardManager | Copy / cut / paste with relative offsets |
| Waveforms | WaveformDecoder | Real waveform decoding + caching for audio tracks |