| |
|
| | """
|
| | 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())
|
| |
|