| | |
| | """ |
| | Extract Source Images from Video Files |
| | |
| | This utility extracts source images that were embedded in video files |
| | generated by Wan2GP with source image embedding enabled. |
| | Supports MKV (attachments) and MP4 (cover art) formats. |
| | """ |
| |
|
| | import sys |
| | import os |
| | import argparse |
| | import glob |
| | from shared.utils.audio_video import extract_source_images |
| |
|
| |
|
| | def main(): |
| | parser = argparse.ArgumentParser( |
| | description="Extract source images from video files with embedded images (MKV attachments or MP4 cover art)", |
| | formatter_class=argparse.RawDescriptionHelpFormatter, |
| | epilog=__doc__ |
| | ) |
| | |
| | parser.add_argument( |
| | 'video_files', |
| | nargs='+', |
| | help='Video file(s) to extract source images from (MKV or MP4)' |
| | ) |
| | |
| | parser.add_argument( |
| | '-o', '--output-dir', |
| | help='Output directory for extracted images (default: same as video directory)' |
| | ) |
| | |
| | parser.add_argument( |
| | '-v', '--verbose', |
| | action='store_true', |
| | help='Enable verbose output' |
| | ) |
| | |
| | args = parser.parse_args() |
| | |
| | |
| | video_files = [] |
| | for pattern in args.video_files: |
| | if '*' in pattern or '?' in pattern: |
| | video_files.extend(glob.glob(pattern)) |
| | else: |
| | video_files.append(pattern) |
| | |
| | if not video_files: |
| | print("No video files found matching the specified patterns.") |
| | return 1 |
| | |
| | total_extracted = 0 |
| | |
| | for video_file in video_files: |
| | if not os.path.exists(video_file): |
| | print(f"Warning: File not found: {video_file}") |
| | continue |
| | |
| | if not (video_file.lower().endswith('.mkv') or video_file.lower().endswith('.mp4')): |
| | print(f"Warning: Skipping unsupported file: {video_file} (only MKV and MP4 supported)") |
| | continue |
| | |
| | if args.verbose: |
| | print(f"\nProcessing: {video_file}") |
| | |
| | |
| | if args.output_dir: |
| | output_dir = args.output_dir |
| | else: |
| | |
| | video_dir = os.path.dirname(video_file) or '.' |
| | video_name = os.path.splitext(os.path.basename(video_file))[0] |
| | output_dir = os.path.join(video_dir, f"{video_name}_sources") |
| | |
| | try: |
| | extracted_files = extract_source_images(video_file, output_dir) |
| | |
| | if extracted_files: |
| | print(f"✓ Extracted {len(extracted_files)} source image(s) from {video_file}") |
| | if args.verbose: |
| | for img_file in extracted_files: |
| | print(f" → {img_file}") |
| | total_extracted += len(extracted_files) |
| | else: |
| | print(f"ℹ No source images found in {video_file}") |
| | |
| | except Exception as e: |
| | print(f"✗ Error processing {video_file}: {e}") |
| | |
| | print(f"\nTotal: Extracted {total_extracted} source image(s) from {len(video_files)} video file(s)") |
| | return 0 |
| |
|
| |
|
| | if __name__ == "__main__": |
| | sys.exit(main()) |
| |
|