The source panel had maxWidth(400) which barely let the splitter move beyond its starting position. Removed the cap, lowered minWidth from 250 to 150, and widened both splitter handles to 5px for easier grab. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Video Montage Linker
A PyQt6 application for creating sequenced symlinks from image folders with advanced cross-dissolve transitions. Perfect for preparing image sequences for video editing, time-lapse assembly, or montage creation.
Features
Source Folder Management
- Add multiple source folders to merge images from different locations
- Drag & drop folders directly onto the window
- Alternating folder types: odd positions = Main, even positions = Transition
- Override folder types via right-click context menu
- Reorder folders with up/down buttons
- Per-folder trim settings (exclude frames from start/end)
Cross-Dissolve Transitions
Smooth blending between folder boundaries with four blend methods:
| Method | Description | Quality | Speed |
|---|---|---|---|
| Cross-Dissolve | Simple alpha blend | Good | Fastest |
| Optical Flow | Motion-compensated blend using OpenCV Farneback | Better | Medium |
| RIFE (ncnn) | Neural network interpolation via rife-ncnn-vulkan | Best | Fast (GPU) |
| RIFE (Practical) | PyTorch-based Practical-RIFE (v4.25/v4.26) | Best | Medium (GPU) |
- Asymmetric overlap: Set different frame counts for each side of a transition
- Blend curves: Linear, Ease In, Ease Out, Ease In/Out
- Output formats: PNG, JPEG (with quality), WebP (lossless with method setting)
- RIFE auto-download: Automatically downloads rife-ncnn-vulkan binary
- Practical-RIFE models: Auto-downloads from Google Drive on first use
Preview
- Video Preview: Play video files from source folders
- Image Sequence Preview: Browse frames with zoom (scroll wheel) and pan (drag)
- Sequence Table: 2-column view showing Main/Transition frame pairing
- Trim Slider: Visual frame range selection per folder
Dual Export Destinations
- Sequence destination: Regular symlinks only
- Transition destination: Symlinks + blended transition frames
Session Persistence
- SQLite database tracks all sessions and settings
- Resume previous session by selecting the same destination folder
- Restores: source folders, trim settings, folder types, transition settings, per-transition overlaps
Installation
Requirements
- Python 3.10+
- PyQt6
- Pillow
- NumPy
- OpenCV (optional, for Optical Flow)
pip install PyQt6 Pillow numpy opencv-python
Note: Practical-RIFE creates its own isolated venv with PyTorch. The gdown package is installed automatically for downloading models from Google Drive.
RIFE ncnn (Optional)
For AI-powered frame interpolation using Vulkan GPU acceleration:
- Select RIFE (ncnn) as the blend method
- Click Download to auto-fetch rife-ncnn-vulkan
- Or specify a custom binary path
- Models: rife-v4.6, rife-v4.15-lite, etc.
Practical-RIFE (Optional)
For PyTorch-based frame interpolation with latest models:
- Select RIFE (Practical) as the blend method
- Click Setup PyTorch to create an isolated venv with PyTorch (~2GB)
- Models auto-download from Google Drive on first use
- Available models: v4.26, v4.25, v4.22, v4.20, v4.18, v4.15
- Optional ensemble mode for higher quality (slower)
The venv is stored at ~/.cache/video-montage-linker/venv-rife/
Usage
GUI Mode
python symlink.py # Launch GUI (default)
python symlink.py --gui # Explicit GUI launch
Workflow:
- Add source folders (drag & drop or click "Add Folder")
- Adjust trim settings per folder if needed (right-click or use trim slider)
- Set destination folder(s)
- Enable transitions and configure blend method/settings
- Click Export Sequence or Export with Transitions
CLI Mode
# Create symlinks from source folders
python symlink.py --src /path/to/folder1 --src /path/to/folder2 --dst /path/to/dest
# List all tracked sessions
python symlink.py --list
# Clean up symlinks and remove session
python symlink.py --clean /path/to/dest
File Structure
video-montage-linker/
├── symlink.py # Entry point, CLI
├── config.py # Constants, paths
├── core/
│ ├── models.py # Enums, dataclasses
│ ├── database.py # SQLite session management
│ ├── blender.py # Image blending, RIFE downloader, Practical-RIFE env
│ ├── rife_worker.py # Practical-RIFE inference (runs in isolated venv)
│ └── manager.py # Symlink operations
└── ui/
├── widgets.py # TrimSlider, custom widgets
└── main_window.py # Main application window
Supported Formats
Images: PNG, WEBP, JPG, JPEG, TIFF, BMP, EXR
Videos (preview only): MP4, MOV, AVI, MKV, WEBM
Database
Session data stored at: ~/.config/video-montage-linker/symlinks.db
System Installation (Linux)
# Make executable
chmod +x symlink.py
# Add to PATH
ln -s /full/path/to/symlink.py ~/.local/bin/video-montage-linker
# Create desktop entry
cat > ~/.local/share/applications/video-montage-linker.desktop << 'EOF'
[Desktop Entry]
Name=Video Montage Linker
Comment=Create sequenced symlinks with cross-dissolve transitions
Exec=/full/path/to/symlink.py
Icon=emblem-symbolic-link
Terminal=false
Type=Application
Categories=Utility;Graphics;AudioVideo;
EOF
update-desktop-database ~/.local/share/applications/
License
MIT