Files
daymade 9b724f33e3 Release v1.9.0: Add video-comparer skill and enhance transcript-fixer
## New Skill: video-comparer v1.0.0
- Compare original and compressed videos with interactive HTML reports
- Calculate quality metrics (PSNR, SSIM) for compression analysis
- Generate frame-by-frame visual comparisons (slider, side-by-side, grid)
- Extract video metadata (codec, resolution, bitrate, duration)
- Multi-platform FFmpeg support with security features

## transcript-fixer Enhancements
- Add async AI processor for parallel processing
- Add connection pool management for database operations
- Add concurrency manager and rate limiter
- Add audit log retention and database migrations
- Add health check and metrics monitoring
- Add comprehensive test suite (8 new test files)
- Enhance security with domain and path validators

## Marketplace Updates
- Update marketplace version from 1.8.0 to 1.9.0
- Update skills count from 15 to 16
- Update documentation (README.md, CLAUDE.md, CHANGELOG.md)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-30 00:23:12 +08:00

348 lines
9.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Video Comparer
A professional video comparison tool that analyzes compression quality and generates interactive HTML reports. Compare original vs compressed videos with detailed metrics (PSNR, SSIM) and frame-by-frame visual comparisons.
## Features
### 🎯 Video Analysis
- **Metadata Extraction**: Codec, resolution, frame rate, bitrate, duration, file size
- **Quality Metrics**: PSNR (Peak Signal-to-Noise Ratio) and SSIM (Structural Similarity Index)
- **Compression Analysis**: Size and bitrate reduction percentages
### 🖼️ Interactive Comparison
- **Three Viewing Modes**:
- **Slider Mode**: Interactive before/after slider using img-comparison-slider
- **Side-by-Side Mode**: Simultaneous display of both frames
- **Grid Mode**: Compact 2-column layout
- **Zoom Controls**: 50%-200% zoom with real image dimension scaling
- **Responsive Design**: Works on desktop, tablet, and mobile
### 🔒 Security & Reliability
- **Path Validation**: Prevents directory traversal attacks
- **Command Injection Prevention**: No shell=True in subprocess calls
- **Resource Limits**: File size and timeout restrictions
- **Comprehensive Error Handling**: User-friendly error messages
## Quick Start
### Prerequisites
1. **Python 3.8+** (for type hints and modern features)
2. **FFmpeg** (required for video analysis)
```bash
# macOS
brew install ffmpeg
# Ubuntu/Debian
sudo apt install ffmpeg
# Windows
# Download from https://ffmpeg.org/download.html
```
### Basic Usage
```bash
# Navigate to the skill directory
cd /path/to/video-comparer
# Compare two videos
python3 scripts/compare.py original.mp4 compressed.mp4
# Open the generated report
open comparison.html # macOS
# or
xdg-open comparison.html # Linux
# or
start comparison.html # Windows
```
### Command Line Options
```bash
python3 scripts/compare.py <original> <compressed> [options]
Arguments:
original Path to original video file
compressed Path to compressed video file
Options:
-o, --output PATH Output HTML report path (default: comparison.html)
--interval SECONDS Frame extraction interval in seconds (default: 5)
-h, --help Show help message
```
### Examples
```bash
# Basic comparison
python3 scripts/compare.py original.mp4 compressed.mp4
# Custom output file
python3 scripts/compare.py original.mp4 compressed.mp4 -o report.html
# Extract frames every 10 seconds (fewer frames, faster processing)
python3 scripts/compare.py original.mp4 compressed.mp4 --interval 10
# Compare with absolute paths
python3 scripts/compare.py ~/Videos/original.mov ~/Videos/compressed.mov
# Batch comparison
for original in originals/*.mp4; do
compressed="compressed/$(basename "$original")"
python3 scripts/compare.py "$original" "$compressed" -o "reports/$(basename "$original" .mp4).html"
done
```
## Supported Formats
| Format | Extension | Notes |
|--------|-----------|-------|
| MP4 | `.mp4` | Recommended, widely supported |
| MOV | `.mov` | Apple QuickTime format |
| AVI | `.avi` | Legacy format |
| MKV | `.mkv` | Matroska container |
| WebM | `.webm` | Web-optimized format |
## Output Report
The generated HTML report includes:
### 1. Video Parameters Comparison
- **Codec**: Video compression format (h264, hevc, vp9, etc.)
- **Resolution**: Width × Height in pixels
- **Frame Rate**: Frames per second
- **Bitrate**: Data rate (kbps/Mbps)
- **Duration**: Total video length
- **File Size**: Storage requirement
- **Filenames**: Original file names
### 2. Quality Analysis
- **Size Reduction**: Percentage of storage saved
- **Bitrate Reduction**: Percentage of bandwidth saved
- **PSNR**: Peak Signal-to-Noise Ratio (dB)
- 30-35 dB: Acceptable quality
- 35-40 dB: Good quality
- 40+ dB: Excellent quality
- **SSIM**: Structural Similarity Index (0.0-1.0)
- 0.90-0.95: Good quality
- 0.95-0.98: Very good quality
- 0.98+: Excellent quality
### 3. Frame-by-Frame Comparison
- Interactive slider for detailed comparison
- Side-by-side viewing for overall assessment
- Grid layout for quick scanning
- Zoom controls (50%-200%)
- Timestamp labels for each frame
## Configuration
### Constants in `scripts/compare.py`
```python
ALLOWED_EXTENSIONS = {'.mp4', '.mov', '.avi', '.mkv', '.webm'}
MAX_FILE_SIZE_MB = 500 # Maximum file size limit
FFMPEG_TIMEOUT = 300 # FFmpeg timeout (5 minutes)
FFPROBE_TIMEOUT = 30 # FFprobe timeout (30 seconds)
BASE_FRAME_HEIGHT = 800 # Frame height for comparison
FRAME_INTERVAL = 5 # Default frame extraction interval
```
### Customizing Frame Resolution
To change the frame resolution for comparison:
```python
# In scripts/compare.py
BASE_FRAME_HEIGHT = 1200 # Higher resolution (larger file size)
# or
BASE_FRAME_HEIGHT = 600 # Lower resolution (smaller file size)
```
## Performance
### Processing Time
- **Metadata Extraction**: < 5 seconds
- **Quality Metrics**: 1-2 minutes (depends on video duration)
- **Frame Extraction**: 30-60 seconds (depends on video length and interval)
- **Report Generation**: < 10 seconds
### File Sizes
- **Input Videos**: Up to 500MB each (configurable)
- **Generated Report**: 2-5MB (depends on frame count)
- **Temporary Files**: Auto-cleaned during processing
### Resource Usage
- **Memory**: ~200-500MB during processing
- **Disk Space**: ~100MB temporary files
- **CPU**: Moderate (video decoding)
## Security Features
### Path Validation
- ✅ Converts all paths to absolute paths
- ✅ Verifies files exist and are readable
- ✅ Checks file extensions against whitelist
- ✅ Validates file size before processing
### Command Injection Prevention
- ✅ All subprocess calls use argument lists
- ✅ No `shell=True` in subprocess calls
- ✅ User input never passed to shell
- ✅ FFmpeg arguments validated and escaped
### Resource Limits
- ✅ File size limit enforcement
- ✅ Timeout limits for FFmpeg operations
- ✅ Temporary files auto-cleanup
- ✅ Memory usage monitoring
## Troubleshooting
### Common Issues
#### "FFmpeg not found"
```bash
# Install FFmpeg using your package manager
brew install ffmpeg # macOS
sudo apt install ffmpeg # Ubuntu/Debian
sudo yum install ffmpeg # CentOS/RHEL/Fedora
```
#### "File too large: X MB"
```bash
# Options:
1. Compress videos before comparison
2. Increase MAX_FILE_SIZE_MB in compare.py
3. Use shorter video clips
```
#### "Operation timed out"
```bash
# For very long videos:
python3 scripts/compare.py original.mp4 compressed.mp4 --interval 10
# or
# Increase FFMPEG_TIMEOUT in compare.py
```
#### "No frames extracted"
- Check if videos are playable in media player
- Verify videos have sufficient duration (> interval seconds)
- Ensure FFmpeg can decode the codec
#### "Frame count mismatch"
- Videos have different durations or frame rates
- Script automatically truncates to minimum frame count
- Warning is displayed in output
### Debug Mode
Enable verbose output by modifying the script:
```python
# Add at the top of compare.py
import logging
logging.basicConfig(level=logging.DEBUG)
```
## Architecture
### File Structure
```
video-comparer/
├── SKILL.md # Skill description and invocation
├── README.md # This file
├── assets/
│ └── template.html # HTML report template
├── references/
│ ├── video_metrics.md # Quality metrics reference
│ └── ffmpeg_commands.md # FFmpeg command examples
└── scripts/
└── compare.py # Main comparison script (696 lines)
```
### Code Organization
- **compare.py**: Main script with all functionality
- Input validation and security checks
- FFmpeg integration and command execution
- Video metadata extraction
- Quality metrics calculation (PSNR, SSIM)
- Frame extraction and processing
- HTML report generation
- **template.html**: Interactive report template
- Responsive CSS Grid layout
- Web Components for slider functionality
- Base64-encoded image embedding
- Interactive controls and zoom
### Dependencies
- **Python Standard Library**: os, subprocess, json, pathlib, tempfile, base64
- **External Tools**: FFmpeg, FFprobe (must be installed separately)
- **Web Components**: img-comparison-slider (loaded from CDN)
## Contributing
### Development Setup
```bash
# Clone the repository
git clone <repository-url>
cd video-comparer
# Create virtual environment (optional but recommended)
python3 -m venv venv
source venv/bin/activate # macOS/Linux
# or
venv\Scripts\activate # Windows
# Install FFmpeg (see Prerequisites section)
# Test the installation
python3 scripts/compare.py --help
```
### Code Style
- **Python**: PEP 8 compliance
- **Type Hints**: All function signatures
- **Docstrings**: All public functions and classes
- **Error Handling**: Comprehensive exception handling
- **Security**: Input validation and sanitization
### Testing
```bash
# Test with sample videos (you'll need to provide these)
python3 scripts/compare.py test/original.mp4 test/compressed.mp4
# Test error handling
python3 scripts/compare.py nonexistent.mp4 also_nonexistent.mp4
python3 scripts/compare.py original.txt compressed.txt
```
## License
This skill is part of the claude-code-skills collection. See the main repository for license information.
## Support
For issues and questions:
1. Check this README for troubleshooting
2. Review the SKILL.md file for detailed usage instructions
3. Ensure FFmpeg is properly installed
4. Verify video files are supported formats
## Changelog
### v1.0.0
- Initial release
- Video metadata extraction
- PSNR and SSIM quality metrics
- Frame extraction and comparison
- Interactive HTML report generation
- Security features and error handling
- Responsive design and mobile support