Major Features: - 🖥️ Standalone desktop app (VideoMatcher.app) - double-click to run - 🎨 Black & gold branded UI (Montserrat font, #FFC407 accent) - 📁 Local file browser for master/adaptation folders - ⚡ Fast mode processing (10-20x faster, disables AKAZE/AI Vision) - 🤖 Smart AI Vision fallback (auto-retry when no matches found) - 📊 Real-time progress bars (fingerprinting & matching) - 💾 Local processing (no cloud, no authentication) - 📤 CSV export with master filenames Web Application (Enterprise): - 🌐 Flask web app with Azure AD authentication - 📦 Box.com integration for cloud storage - 🐳 Docker support for deployment - 🔐 JWT validation with httpOnly cookies - 🎯 REST API endpoints Enhancements: - Fixed master filename lookup (was showing "Unknown") - Automatic fingerprint recovery (detects missing files) - Improved CSV format (master file next to adaptation) - Port conflict handling (auto-finds available port) - Environment variable fixes for standalone mode Documentation: - Updated README with standalone app section - Added 10+ guide documents (UI improvements, fingerprint recovery, etc.) - Build instructions with PyInstaller - Comprehensive troubleshooting guide Technical: - PyInstaller build configuration (video_matcher.spec) - Launcher with environment setup (launcher.py) - Mock authentication for standalone mode - Video matcher service layer - Metadata parser and AKAZE video matching 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> |
||
|---|---|---|
| .claude | ||
| src/video_matcher | ||
| static | ||
| templates | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| AI_FALLBACK_GUIDE.md | ||
| AI_VISION_GUIDE.md | ||
| app.py | ||
| auth_middleware.py | ||
| batch_match.py | ||
| batch_match_fast.py | ||
| BATCH_MATCHING_GUIDE.md | ||
| BATCH_PROCESSING_GUIDE.md | ||
| box_video_client.py | ||
| build.py | ||
| bulk_add_masters.py | ||
| CHANGELOG.md | ||
| cli.py | ||
| config.env | ||
| config.py | ||
| docker-compose.yml | ||
| Dockerfile | ||
| DOCUMENTATION.md | ||
| ENHANCEMENTS.md | ||
| FINGERPRINT_RECOVERY.md | ||
| gunicorn_config.py | ||
| IMPLEMENTATION_SUMMARY.md | ||
| jwt_validator.py | ||
| launcher.py | ||
| match_fast.py | ||
| PERFORMANCE_NOTES.md | ||
| QUICK_START_ENHANCEMENTS.md | ||
| README.md | ||
| README_STANDALONE.md | ||
| requirements.txt | ||
| run_standalone.sh | ||
| STANDALONE_QUICK_START.md | ||
| UI_IMPROVEMENTS.md | ||
| video_matcher_service.py | ||
| wsgi.py | ||
Video Master-Adaptation Detection
A powerful video matching system to detect which master video files were used to create adaptation videos (cut-downs, re-edits, speed changes, crops, re-encodes, etc.).
Available in three modes: Standalone Desktop App, Web Application, and CLI Tool!
🖥️ Standalone Desktop Application (RECOMMENDED!)
The easiest way to use Video Matcher - a double-click desktop app with no server setup required!
Features:
- 🎨 Modern Black & Gold UI - Professional, branded interface
- 📁 Local File Browser - Select master and adaptation folders directly
- 🚀 Zero Configuration - No authentication, no server setup
- ⚡ Fast Mode - 10-20x faster than full analysis
- 🤖 Smart AI Fallback - Automatically retries with AI Vision when needed
- 📊 Real-time Progress - Visual progress bars during processing
- 💾 Local Processing - All data stays on your machine
- 🍎 macOS Native - Packaged as .app bundle
Quick Start (Standalone App)
Option 1: Use Pre-built App (Easiest)
# Download the standalone app
# Extract VideoMatcher.zip
# Double-click VideoMatcher.app
# That's it! The app will:
# - Open your browser automatically
# - Let you select master and adaptation folders
# - Process videos and show results
Option 2: Build from Source
# Clone the repository
cd Video_Master_Adot_Detection
# Install dependencies
pip install -r requirements.txt
pip install pyinstaller
# Build the standalone app
python build.py
# The app will be created in: dist/VideoMatcher.app
Using the Standalone App
- Double-click VideoMatcher.app (or run
./VideoMatcherin terminal) - Select Master Folder - Choose folder containing your master videos
- App scans for videos
- Fingerprints them (with progress bar)
- Shows count of processed masters
- Select Adaptation Folder(s) - Choose folder(s) with adaptations
- Start Matching - Click to begin processing
- Real-time progress updates
- Shows current video being processed
- Visual progress bar
- View Results - See which masters matched which adaptations
- Master filename clearly displayed
- Confidence scores and match percentages
- AI Vision badge for cross-aspect matches
- Export results as CSV
Stopping the App
From .app bundle:
# Option 1: Activity Monitor
# Search for "VideoMatcher" and quit
# Option 2: Terminal
pkill -f VideoMatcher
From terminal:
- Press
Ctrl+Cin the terminal window
Standalone App Architecture
VideoMatcher.app/
├── VideoMatcher # Executable (launcher.py bundled)
├── _internal/ # Python runtime and dependencies
│ ├── data/ # Fingerprints and master registry
│ ├── tmp/ # Temporary processing files
│ └── [libraries] # Flask, OpenCV, FFmpeg bindings
├── templates/ # UI templates
│ └── standalone.html # Main interface
└── static/ # CSS/JS assets
How it works:
- Launcher sets environment variables (standalone mode)
- Finds available port (default: 5001 if 5000 is taken)
- Starts Flask server on localhost
- Opens browser automatically
- No authentication required
- All processing happens locally
System Requirements
- macOS: 10.13+ (High Sierra or later)
- Windows: Windows 10/11 (untested)
- Linux: Ubuntu 20.04+ (untested)
- FFmpeg: Must be installed on system
# macOS brew install ffmpeg # Windows # Download from https://ffmpeg.org/download.html # Linux sudo apt-get install ffmpeg - Disk Space: ~200MB for app + storage for fingerprints
- RAM: 4GB minimum, 8GB recommended
Troubleshooting (Standalone App)
| Issue | Solution |
|---|---|
| Port 5000 already in use | App automatically finds next available port (5001, 5002, etc.) |
| 403 Access Denied error | Make sure you're running the latest build with authentication disabled |
| "Application is not open" error | Old instance running - use pkill -f VideoMatcher to stop it |
| FFmpeg errors | Install FFmpeg: brew install ffmpeg |
| Slow fingerprinting | Normal - Fast mode processes ~5-10 seconds per video |
| Can't see master filenames | Update to latest version - this bug was fixed |
🌐 Web Application (Enterprise)
The tool now includes a Flask web application with:
- 🔐 Azure AD Authentication - Secure Microsoft SSO
- 📦 Box.com Integration - Browse and process videos directly from Box storage
- 🎯 Modern UI - Beautiful, responsive interface with real-time progress
- 🐳 Docker Support - Easy deployment to AWS/Azure/GCP
- 🔄 Production Ready - Development and production configurations
Quick Start (Web App)
# Install dependencies
pip install -r requirements.txt
# Configure environment
cp .env.example .env
# Edit .env with your Azure AD credentials
# Run development server
python app.py
# Visit http://localhost:7183
See the Web Application Guide below for detailed setup.
✨ Key Features ✅ ENHANCED v2.1
- 🎯 Spatial-Only Matching - Ignores timing, handles speed changes & reordering
- 🔍 AKAZE Feature Matching - Robust geometric verification (NEW in v2.1)
- ⚡ Metadata Filtering - Instant 80-95% search space reduction (NEW in v2.1)
- 🤖 AI Vision (GPT-4o) - Detects cross-aspect-ratio matches (16:9 → 1:1, 9:16, etc.)
- 🎬 Multi-Master Detection - Identifies all masters used in an adaptation
- 📊 Percentage Contribution - Shows how much of each master was used
- 🎵 Audio Fingerprinting - Chromaprint-based robust audio matching
- ⚡ Batch Processing - Fast & full modes with beautiful HTML reports (ENHANCED in v2.1)
- 🎨 Rich CLI - Beautiful terminal output with tables and progress bars
- 🌍 Text/Logo Handling - Ignores different languages, logos, overlays (VERIFIED in v2.1)
🚀 Quick Start
Choose your preferred way to use the tool:
- Web Application - Modern UI with Azure AD + Box.com
- CLI Tool - Command-line interface for local use
🌐 Web Application Guide
Overview
The web application provides a modern interface for video matching with enterprise authentication and cloud storage integration.
Architecture:
- Frontend: Bootstrap 5 + MSAL Browser for Azure AD authentication
- Backend: Flask 3.0 with JWT validation and httpOnly cookies
- Storage: Box.com for video files, JSON for matching results
- Deployment: Docker-ready for AWS/Azure/GCP
Prerequisites (Web App)
- Python 3.11+
- FFmpeg & Chromaprint (same as CLI)
- Azure AD App Registration (already configured)
- Box.com API Credentials (JWT config file)
Installation (Web App)
# Navigate to project directory
cd Video_Master_Adot_Detection
# Create and activate virtual environment (if not already done)
python3 -m venv venv
source venv/bin/activate # On macOS/Linux
# Install all dependencies (includes Flask, auth, Box SDK)
pip install -r requirements.txt
# Configure environment
cp .env.example .env
Configuration
1. Edit .env file:
# Flask Configuration
FLASK_APP=app.py
FLASK_ENV=development
SECRET_KEY=your-secret-key-here # Generate with: python3 -c "import secrets; print(secrets.token_hex(32))"
PORT=7183
# Azure AD Authentication (Pre-configured)
AZURE_TENANT_ID=e519c2e6-bc6d-4fdf-8d9c-923c2f002385
AZURE_CLIENT_ID=9079054c-9620-4757-a256-23413042f1ef
# Box.com (To be configured when credentials received)
BOX_CONFIG_PATH=config/box_config.json
BOX_ROOT_FOLDER_ID=your_folder_id
# Video Processing
VIDEO_TEMP_DIR=tmp/video_downloads
MAX_VIDEOS_PER_JOB=20
# OpenAI (for AI Vision matching)
OPENAI_API_KEY=your_openai_key_here
2. Box.com Setup (when credentials are received):
# Place your Box JWT config file
mkdir -p config
# Copy box_config.json to config/box_config.json
Running the Web App
Development Mode:
# Start the development server
python app.py
# Server will run on http://localhost:7183
# Opens automatically with hot-reload enabled
Production Mode (with Gunicorn):
# Update .env
FLASK_ENV=production
DEBUG=False
# Run with Gunicorn
gunicorn -c gunicorn_config.py wsgi:app
# Or use Docker (recommended)
docker-compose up -d
Using the Web Application
-
Access the App
- Open browser to
http://localhost:7183 - You'll see the authentication screen
- Open browser to
-
Sign In
- Click "Sign in with Microsoft"
- Authenticate with your Azure AD credentials
- You'll be redirected to the main dashboard
-
Browse Box Folders (once Box credentials are configured)
- Navigate through your Box folders
- Select videos to process
- Choose matching parameters
-
Process Videos
- Select videos from Box
- Click "Start Matching"
- Watch real-time progress
- View results with confidence scores
-
View Results
- Detailed matching reports
- Export as HTML or JSON
- Review all matched masters
API Endpoints
The web app exposes these REST API endpoints:
Authentication:
POST /auth/login- Process Azure AD tokenPOST /auth/logout- Clear sessionGET /auth/status- Check authentication status
Box Integration:
GET /box/folders- List root foldersGET /box/folders/<folder_id>- List subfoldersGET /box/videos/<folder_id>- List videos in folder
Video Matching:
POST /match- Start matching jobGET /jobs/<job_id>/status- Get job statusGET /jobs/<job_id>/results- Get job results
Utility:
GET /health- Health check
Docker Deployment
Build and run with Docker:
# Build image
docker build -t video-matcher:latest .
# Run with docker-compose
docker-compose up -d
# View logs
docker-compose logs -f
# Stop
docker-compose down
Deploy to cloud:
# AWS Elastic Container Service
# Azure App Service
# GCP Cloud Run
# See deployment guides in DEPLOYMENT.md (coming soon)
Security Features
- 🔐 Azure AD JWT Validation - Cryptographic token verification
- 🍪 httpOnly Cookies - XSS protection
- 🔒 HTTPS in Production - TLS encryption required
- 🛡️ SameSite Cookies - CSRF protection
- 🔑 Secret Management - Environment-based configuration
Troubleshooting (Web App)
| Issue | Solution |
|---|---|
| Can't sign in | Check Azure AD tenant/client ID in .env |
| Box not working | Verify config/box_config.json exists and is valid |
| Port already in use | Change PORT=7183 in .env to another port |
| Module not found | Run pip install -r requirements.txt |
| Permission denied on Box | Check Box JWT app has correct permissions |
📋 CLI Tool Quick Start
The CLI tool provides command-line access to all video matching features.
Prerequisites
- Python 3.8+
- FFmpeg
# macOS brew install ffmpeg chromaprint # Ubuntu/Debian sudo apt-get install ffmpeg libchromaprint-dev
Installation
# Clone the repository
cd Video_Master_Adot_Detection
# Create and activate virtual environment
python3 -m venv venv
source venv/bin/activate # On macOS/Linux
# or
venv\Scripts\activate # On Windows
# Install dependencies
pip install -r requirements.txt
# (Optional) Set up AI Vision for cross-aspect matching
# Copy .env.example to .env and add your OpenAI API key
cp .env.example .env
# Edit .env and add: OPENAI_API_KEY=your_key_here
# Verify installation
python cli.py status
Basic Usage
# 1. Add master videos
python cli.py add-master /path/to/master.mp4
# Or bulk add from directory
python bulk_add_masters.py /path/to/masters/ --recursive
# 2. List masters
python cli.py list-masters
# 3. Match a single adaptation
python cli.py match /path/to/adaptation.mp4
# 4. Batch match entire folder (with HTML report!)
# Fast mode (recommended - 2x faster)
python batch_match_fast.py /path/to/adaptations/ report.html
# Or full mode (with AKAZE verification)
python cli.py batch-match /path/to/adaptations/ -o report.html
# 5. View results in terminal or open HTML report in browser
open report.html
📖 Usage Examples
Adding Masters
# Single master with auto-generated ID
python cli.py add-master master_video.mp4
# Custom ID
python cli.py add-master master_video.mp4 --id master_v1
# Bulk add all .mp4 files
python bulk_add_masters.py masters_folder/ -r
Matching Adaptations
Single video:
# Default matching (30% threshold)
python cli.py match adaptation.mp4
# Stricter matching (require 60% match)
python cli.py match adaptation.mp4 -t 0.6
# More sensitive frame detection
python cli.py match adaptation.mp4 -f 0.65
# Combined: strict + sensitive
python cli.py match adaptation.mp4 -t 0.6 -f 0.65
Batch matching with HTML report:
# Process entire folder and generate report
python cli.py batch-match /path/to/adaptations/
# With custom thresholds
python cli.py batch-match /path/to/adaptations/ -t 0.5 -f 0.75
# Specify output filename
python cli.py batch-match /path/to/adaptations/ -o my_report.html
🎯 What It Handles
✅ Speed Changes - Matches 15s adaptation to 20s master (slow-mo, time-lapse) ✅ Shot Reordering - Detects masters even when shots are rearranged ✅ Different Durations - Handles cut-downs and extended versions ✅ Non-Linear Edits - Finds masters in complex re-edits ✅ Re-encoding - Robust to compression and format changes ✅ Multiple Masters - Identifies when adaptation uses multiple sources ✅ Cross-Aspect Ratios - AI Vision + AKAZE detect 16:9 cropped to 1:1 or 9:16 ✅ Text/Logo Variations - All tiers ignore different subtitles, logos, overlays ✅ Language Differences - German, English, French, etc. (VERIFIED with real data) ✅ Logo Placement - Different positions, sizes, branding (VERIFIED)
📊 Understanding Results
Terminal Output (Single Match)
When matching a single video with python cli.py match:
Found 2 master(s) matching this adaptation:
╭──────┬────────────┬─────────────┬────────┬───────┬──────────┬────────────╮
│ Rank │ Master ID │ Video Match │ Frames │ Audio │ Combined │ Confidence │
├──────┼────────────┼─────────────┼────────┼───────┼──────────┼────────────┤
│ 1 │ master_C │ 100.0% │ 15/15 │ 0.500 │ 0.850 │ High │
│ 2 │ master_B │ 73.3% │ 11/15 │ 0.500 │ 0.663 │ Medium │
╰──────┴────────────┴─────────────┴────────┴───────┴──────────┴────────────╯
Best Match:
Master: master_C
Video frames matched: 100.0% (15/15 frames)
Average frame similarity: 94.4%
Combined confidence: 85.0%
AI Vision Analysis:
Method: GPT-4o (OpenAI)
Format: Adaptation is cropped from master
AI Reasoning:
Both sets feature the same two people in identical clothing and poses...
Note: AI Vision is smartly triggered only when needed:
- ✅ Triggered: No matches OR incomplete frame coverage (< 100%)
- ❌ Skipped: Perfect match found (100% coverage)
- 💰 Cost savings: Only 1-2 out of 39 adaptations typically need AI!
- Typical cost when triggered: ~$0.005 per comparison
Score Interpretation
| Score | Meaning |
|---|---|
| Video Match | Percentage of adaptation frames found in master |
| Frames | Number of matching frames / total frames |
| Audio | Audio fingerprint similarity (0-1) |
| Combined | Weighted score: 70% video + 30% audio |
| Confidence | Very High (≥90%) → Very Low (<50%) |
HTML Report (Batch Match)
When batch matching with python cli.py batch-match, you get a beautiful HTML report:
Features:
- 📊 Summary Dashboard - Total processed, matched, unmatched counts
- 🎬 Per-Adaptation Cards - Each video shown with all matching masters
- 🎨 Color-Coded Confidence - Visual badges (green = high, yellow = medium, red = low)
- 📈 Progress Bars - Visual representation of match percentage
- 📱 Responsive Design - Works on desktop and mobile
- 🖨️ Print-Friendly - Clean layout for printing/PDFs
Report includes:
- Adaptation filename and match count
- Master ID, duration, and video match percentage
- Number of frames matched
- Combined confidence score
- Visual progress indicators
- Error messages for failed matches
Opening the report:
# Report is saved as matching_report_YYYYMMDD_HHMMSS.html
# Open in browser:
open matching_report_20251010_153045.html # macOS
xdg-open matching_report_20251010_153045.html # Linux
start matching_report_20251010_153045.html # Windows
🔧 CLI Commands
| Command | Description |
|---|---|
add-master <path> |
Add a master video to library |
list-masters |
Show all master videos |
match <path> |
Match single adaptation against masters |
batch-match <folder> |
Match entire folder + generate HTML report |
status |
Check system dependencies |
clear |
Remove all masters from library |
--help |
Show help for any command |
📚 Documentation
Core Documentation
- README.md - This file, quick start and overview
- DOCUMENTATION.md - Detailed technical documentation
Enhancement Documentation (v2.1) ✨ NEW
- QUICK_START_ENHANCEMENTS.md - Quick guide to new features
- ENHANCEMENTS.md - Complete technical details of enhancements
- BATCH_PROCESSING_GUIDE.md - Comprehensive batch processing guide
What's in the enhanced docs:
- AKAZE feature matching (Tier 2 verification)
- Metadata filtering (Stage 0 optimization)
- Fast vs Full batch processing modes
- Real-world test results with 46 masters & 39 adaptations
- Text/logo/language handling confirmed working
- Performance benchmarks and best practices
🎬 How It Works (Enhanced in v2.1)
Hybrid 4-Stage Architecture ✅ TESTED & VERIFIED
Stage 0: Metadata Filtering (NEW - Instant)
- Parses filenames for format (1x1, 9x16, 16x9), variant (A-F), duration
- Reduces search space by 80-95% before matching
- Zero cost, instant filtering
- Best for: Organized filename conventions
Tier 1: Perceptual Hash Pre-Filtering (Fast)
- Extracts frames at 2 frames/second (catches quick edits)
- Generates perceptual hashes (8×8 DCT)
- Creates audio fingerprint (Chromaprint)
- Compares ALL masters, finds top candidates
- Stores as JSON for reuse
- Best for: Same aspect ratio videos
- Speed: ~5-10 seconds for 46 masters
Tier 2: AKAZE Verification (NEW - Selective)
- Runs ONLY on top 5 candidates (not all masters)
- Detects AKAZE keypoints and descriptors
- Geometric verification with RANSAC homography
- Confirms or improves perceptual hash results
- Best for: Scale/rotation/perspective changes
- Speed: ~10-15 seconds for 5 candidates
- Verified: Handles text overlays, logos, different languages
Tier 3: AI Vision (Smart Fallback)
- Only triggered when truly needed:
- No matches found at all (likely cross-aspect), OR
- Best match has incomplete frame coverage (< 100%)
- Extracts 5 key frames from each video
- Uses GPT-4o to compare scenes semantically
- Ignores text, logos, subtitles, branding
- Focuses on people, products, settings, framing
- Best for: Cross-aspect ratios (16:9 → 1:1, 9:16)
- Optimization: Skips AI for perfect matches (saves cost & time!)
Spatial Matching (Tier 1)
For each adaptation frame:
→ Find most similar frame in master (anywhere in timeline)
→ If similarity ≥ threshold: count as match
→ Calculate: (matches / total_frames) × 100%
Key Insight: By ignoring temporal order, we handle speed changes, reordering, and non-linear edits automatically!
AI Vision Matching (Tier 2)
When Tier 1 fails or has low confidence:
→ Extract 5 evenly-spaced frames from adaptation
→ Extract 5 evenly-spaced frames from each master
→ Send to GPT-4o for semantic comparison
→ AI analyzes: people, products, settings, composition
→ Returns: match (yes/no), confidence (0-100%), is_crop (yes/no)
→ Cost: ~$0.005-0.007 per comparison
Key Features:
- Detects cropping, scaling, pan-and-scan
- Ignores text localization and logo variations
- Handles aspect ratio changes (16:9 ↔ 1:1 ↔ 9:16)
- Provides human-readable explanations
Confidence Scoring
combined_score = (video_match × 0.7) + (audio_match × 0.3)
🏗️ Project Structure
Video_Master_Adot_Detection/
├── app.py # Flask web application (NEW)
├── config.py # Environment configuration (NEW)
├── wsgi.py # WSGI entry point (NEW)
├── gunicorn_config.py # Production server config (NEW)
├── auth_middleware.py # Azure AD authentication (NEW)
├── jwt_validator.py # JWT token validation (NEW)
├── box_video_client.py # Box.com integration (Phase 2)
├── video_matcher_service.py # Service layer (Phase 3)
├── cli.py # CLI interface (maintained)
├── bulk_add_masters.py # Batch processing script (CLI)
├── batch_match.py # Batch matching (CLI)
├── batch_match_fast.py # Fast batch matching (CLI)
├── requirements.txt # Python dependencies
├── Dockerfile # Docker containerization (NEW)
├── docker-compose.yml # Docker compose config (NEW)
├── .dockerignore # Docker ignore patterns (NEW)
├── README.md # This file
├── DOCUMENTATION.md # Detailed documentation
├── static/ # Frontend assets (NEW)
│ ├── css/
│ │ └── styles.css
│ └── js/
│ ├── auth.js # MSAL authentication client
│ ├── box_browser.js # Box folder browser (Phase 2)
│ ├── video_matcher.js # Matching interface (Phase 3)
│ └── results_display.js # Results visualization (Phase 3)
├── templates/ # Flask templates (NEW)
│ ├── index.html # Main dashboard
│ ├── match.html # Video selection (Phase 2)
│ ├── results.html # Results display (Phase 3)
│ ├── 404.html # Error page
│ └── 500.html # Error page
├── src/
│ └── video_matcher/
│ ├── fingerprinter.py # Fingerprinting & matching logic
│ ├── matcher.py # Master management & scoring
│ ├── ai_vision.py # AI Vision (GPT-4o) integration
│ ├── video_akaze.py # AKAZE feature matching
│ └── metadata_parser.py # Metadata filtering
├── data/
│ ├── fingerprints/ # Stored fingerprints (*.json)
│ ├── masters.json # Master video database
│ └── jobs/ # Matching job state (NEW)
├── config/ # Configuration files (NEW)
│ └── box_config.json # Box JWT credentials (to be added)
├── logs/ # Application logs (NEW)
│ ├── access.log
│ └── error.log
├── tmp/ # Temporary storage (NEW)
│ └── video_downloads/ # Downloaded videos
├── .env.example # Example environment config
├── .env # Your configuration (not tracked)
└── To Exclude/ # Test videos (not tracked)
⚙️ Configuration
AI Vision Setup
AI Vision is optional but highly recommended for cross-aspect-ratio matching.
- Get an OpenAI API key from https://platform.openai.com/api-keys
- Copy
.env.exampleto.env - Add your key:
OPENAI_API_KEY=sk-...
Cost Estimates:
- Single comparison: ~$0.005-0.007 (10 images)
- 50 masters: ~$0.25-0.35 per adaptation
- Very affordable for production use!
To disable AI Vision:
- Don't set
OPENAI_API_KEY, or - Set it to empty in
.env
Adjust Sensitivity
# More lenient (catches more matches)
python cli.py match video.mp4 -t 0.2 -f 0.65
# Default (balanced)
python cli.py match video.mp4 -t 0.3 -f 0.70
# Stricter (higher confidence)
python cli.py match video.mp4 -t 0.5 -f 0.75
Sampling Rate
The default is 2 frames per second which provides good accuracy for fast-paced content with quick edits.
To adjust, edit src/video_matcher/fingerprinter.py:106:
samples_per_second = 2.0 # Default: 2 frames/sec (good for quick edits)
samples_per_second = 1.0 # Faster: 1 frame/sec (basic matching)
samples_per_second = 3.0 # Slower: 3 frames/sec (very detailed)
Impact:
- 2 fps: 20s video = 40 frames (recommended for ads/marketing)
- 1 fps: 20s video = 20 frames (faster, less granular)
- 3 fps: 20s video = 60 frames (catches sub-second cuts)
🐛 Troubleshooting
| Issue | Solution |
|---|---|
| No matches found | Lower thresholds: -t 0.2 -f 0.65 or enable AI Vision |
| Too many false positives | Raise thresholds: -t 0.5 -f 0.75 |
| Different aspect ratios | Enable AI Vision (set OPENAI_API_KEY in .env) |
| AI Vision not working | Check API key in .env and verify balance |
| FFmpeg frame extraction errors | Update ffmpeg: brew upgrade ffmpeg |
| FFmpeg not found | brew install ffmpeg or check PATH |
| Import errors | Activate venv: source venv/bin/activate |
| Model deprecated error | Update code to use gpt-4o (already fixed in v2.0) |
🚧 Limitations
This tool has the following limitations:
- Basic perceptual hashing - Uses 8×8 DCT instead of production TMK
- Audio placeholder - Chromaprint comparison returns 0.5 (not fully implemented)
- No segment timeline - Doesn't show which specific parts matched
- Single-threaded - Not optimized for large-scale batch processing
- JSON storage - Not suitable for large libraries (>1000 videos)
- AI Vision cost - Can add up with large master libraries (though affordable)
🔮 Future Enhancements
For production use, consider:
- ✅ AI Vision (GPT-4o) - Cross-aspect matching ✓ IMPLEMENTED v2.0
- ⬜ TMK Integration - Facebook's Threat Match for robust matching
- ⬜ Segment Timeline - Show which parts came from which master
- ⬜ Web UI - Drag-drop interface with visual comparison
- ⬜ Database - PostgreSQL/MongoDB instead of JSON
- ⬜ Vector Search - Qdrant/Milvus for sub-second matching
- ⬜ GPU Acceleration - CUDA-based hash computation
- ⬜ Smart AI Triggering - Only use AI for aspect ratio mismatches
- ⬜ Parallel Processing - Celery + Redis for batch jobs
See DOCUMENTATION.md for detailed production architecture.
📈 Performance (Real-World Tested)
Stage 0: Metadata Filtering
- Time: Instant (filename parsing)
- Reduction: 80-95% when filenames follow conventions
- Cost: $0.00
Tier 1: Perceptual Hash (2 fps sampling)
- Fingerprint generation: ~3-6 seconds per minute of video
- Matching: ~5-10 seconds for 46 masters
- Library size: Works well up to ~100 masters
- Cost: $0.00
Tier 2: AKAZE Verification (NEW)
- Time: ~10-15 seconds for top 5 candidates
- Optimization: 92% reduction (5 vs 46 masters)
- Accuracy: 95-100% match rates
- Cost: $0.00
Tier 3: AI Vision
- Frame extraction: ~1-2 seconds per video
- GPT-4o API call: ~2-3 seconds per comparison
- Cost: ~$0.005-0.007 per comparison
- Only triggered for cross-aspect or no matches
Real-World Example: Austrian Spring Fashion Campaign ✅ TESTED
- Masters: 46 videos (various formats, 6s-20s durations)
- Adaptations: 39 videos (Austrian market, German language)
- Variations: Different text overlays, logos, localization
Results:
- Stage 0: 0% reduction (duration not in filenames)
- Tier 1: Found 3 candidates per video (100% matches)
- Tier 2: Verified all with "very_high" confidence (60+ inliers)
- Tier 3: Skipped (perfect matches found)
- Processing time: 15-25 seconds per video (full mode)
- Processing time: 8-12 seconds per video (fast mode)
- Batch time: 5-8 minutes for 39 videos (fast mode)
- Batch time: 10-15 minutes for 39 videos (full mode)
- Total cost: $0.00 (no AI Vision needed)
- Accuracy: 100% correct master identification
Fingerprint Storage:
- 20s video @ 2fps = ~8KB JSON file (40 frames)
- 15s video @ 2fps = ~6KB JSON file (30 frames)
🤝 Contributing
Contributions welcome! Areas for improvement:
- TMK integration for production matching
- Full Chromaprint audio comparison
- Segment-level timeline visualization
- Web interface
- Performance optimization
- Unit tests
📄 License
MIT License - See LICENSE file for details.
🙋 Support
For questions or issues:
- Check DOCUMENTATION.md
- Review troubleshooting section
- Open an issue on GitHub
Built with: Python, Flask, FFmpeg, Chromaprint, OpenCV AKAZE, OpenAI GPT-4o, Rich, Azure AD, Box SDK Status: Production-Ready Web App + CLI (Phase 1 Complete: Authentication) Version: 3.0.0 - Web Application with Azure AD + Box.com Integration
What's New in v3.0:
- 🌐 Flask web application with modern UI
- 🔐 Azure AD authentication (Microsoft SSO)
- 📦 Box.com integration for cloud storage
- 🐳 Docker support for easy deployment
- 🔄 Production and development configurations
- 🎯 REST API for programmatic access
- ✅ Phase 1 Complete: Authentication working
- ⏳ Phase 2 Pending: Box integration (waiting for credentials)
- ⏳ Phase 3 Pending: Matching service layer
Implementation Phases:
- Phase 1 (✅ Complete): Flask app, Azure AD auth, templates, Docker config
- Phase 2 (⏳ Pending): Box.com client, folder browsing, video selection UI
- Phase 3 (⏳ Pending): Video matcher service, job management, results display
- CLI Tool: Fully functional and maintained for local use