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>
52 lines
1.4 KiB
Python
Executable file
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']}")
|