video-master-adapt/match_fast.py
nickviljoen 891c36bbfb Add standalone desktop application with web interface
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>
2025-12-31 09:49:04 +02:00

52 lines
1.4 KiB
Python
Executable file

#!/usr/bin/env python3
"""
Fast matching without AKAZE - uses original perceptual hash only
"""
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent / "src"))
from video_matcher.matcher import VideoMatcher
from rich.console import Console
from rich.table import Table
from rich import box
console = Console()
if len(sys.argv) < 2:
console.print("[red]Usage: python match_fast.py <video_path>[/red]")
sys.exit(1)
video_path = sys.argv[1]
# Initialize matcher WITHOUT AKAZE
console.print("[cyan]Using fast mode (perceptual hash only)[/cyan]")
matcher = VideoMatcher(
use_akaze=False, # Disable AKAZE
use_metadata_filter=True, # Keep metadata filtering
enable_ai_vision=True # Keep AI Vision
)
# Match
matches = matcher.match_adaptation(video_path)
# Display results
if not matches:
console.print("[yellow]No matches found[/yellow]")
else:
table = Table(box=box.ROUNDED)
table.add_column("Rank", style="cyan")
table.add_column("Master ID", style="green")
table.add_column("Video Match", style="yellow")
table.add_column("Confidence", style="bold")
for idx, match in enumerate(matches, 1):
table.add_row(
str(idx),
match['master_id'],
f"{match['video_percentage']:.1f}%",
match['confidence']
)
console.print(table)
console.print(f"\n[bold]Best Match:[/bold] {matches[0]['master_id']}")