From 4ca5664025fc5e2d270c8e9c1f7d701f58f21117 Mon Sep 17 00:00:00 2001 From: Joshua Pickard Date: Tue, 23 Sep 2025 16:59:42 +0000 Subject: [PATCH] Add 'vidsplit/vidsplit' --- vidsplit/vidsplit | 100 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 vidsplit/vidsplit diff --git a/vidsplit/vidsplit b/vidsplit/vidsplit new file mode 100644 index 0000000..99875e8 --- /dev/null +++ b/vidsplit/vidsplit @@ -0,0 +1,100 @@ +#!/usr/bin/env python3 + +## chmod +x vidsplit +## sudo cp vidsplit /usr/local/bin +## vidsplit --help + +import os +import subprocess +import argparse +import sys + +def get_file_extension(file_path): + """Extract the file extension from the input file.""" + return os.path.splitext(file_path)[1].lower() + +def get_duration(input_file): + """Get the total duration of the video in seconds.""" + cmd = [ + "ffprobe", "-i", input_file, "-show_entries", "format=duration", + "-v", "quiet", "-of", "default=noprint_wrappers=1:nokey=1" + ] + try: + duration = float(subprocess.check_output(cmd, stderr=subprocess.PIPE).decode().strip()) + return duration + except subprocess.CalledProcessError as e: + print(f"Error getting duration: {e}") + sys.exit(1) + +def split_video(input_file, size_limit_mb, output_dir): + """Split the video into chunks based on size limit.""" + # Supported video extensions + valid_extensions = {'.mp4', '.avi', '.mkv', '.mov'} + file_ext = get_file_extension(input_file) + + if file_ext not in valid_extensions: + print(f"Error: Unsupported file type '{file_ext}'. Supported types: {', '.join(valid_extensions)}") + sys.exit(1) + + # Convert size limit to bytes + size_limit = size_limit_mb * 1000000 + + # Ensure output directory exists + os.makedirs(output_dir, exist_ok=True) + + # Extract basename + basename = os.path.splitext(os.path.basename(input_file))[0] + + # Get total duration + total_duration = get_duration(input_file) + print(f"Total duration: {total_duration:.2f} seconds") + + cur_duration = 0 + i = 1 + + while cur_duration < total_duration: + output_file = os.path.join(output_dir, f"{basename}-{i}{file_ext}") + ffmpeg_cmd = [ + "ffmpeg", "-ss", str(cur_duration), "-i", input_file, + "-fs", str(size_limit), "-c", "copy", "-y", output_file + ] + + try: + result = subprocess.run(ffmpeg_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + if result.returncode != 0: + print(f"Error splitting chunk {i}: {result.stderr}") + sys.exit(1) + except subprocess.CalledProcessError as e: + print(f"Error splitting chunk {i}: {e}") + sys.exit(1) + + # Get duration of the new chunk + chunk_duration = get_duration(output_file) + cur_duration += chunk_duration + print(f"Created chunk {i} ({cur_duration:.2f}/{total_duration:.2f} seconds processed)") + i += 1 + + print("Splitting complete!") + +def main(): + parser = argparse.ArgumentParser(description="Split a video file into chunks based on size limit.") + parser.add_argument("input_file", help="Path to the input video file") + parser.add_argument("output_dir", help="Directory to store the split video files") + parser.add_argument("--size", type=float, default=110, help="Size limit for each chunk in MB (default: 110)") + + args = parser.parse_args() + + # Validate input file + if not os.path.isfile(args.input_file): + print(f"Error: Input file '{args.input_file}' does not exist") + sys.exit(1) + + # Validate size limit + if args.size <= 0: + print("Error: Size limit must be a positive number") + sys.exit(1) + + split_video(args.input_file, args.size, args.output_dir) + +if __name__ == "__main__": + main() \ No newline at end of file