#!/usr/bin/env python3 # video_autoreduce_rename.py import argparse import argcomplete import colorama import os import re colorama.init() creset = colorama.Fore.RESET ccyan = colorama.Fore.CYAN cyellow = colorama.Fore.YELLOW cgreen = colorama.Fore.GREEN cred = colorama.Fore.RED def autorename(input_path, max_height=720, debug=False): """ Rename video files and folders in the specified directory tree that contain a resolution in their name to the specified max_height resolution. Args: input_path (str): The path of the directory to search for video files and folders. max_height (int, optional): The maximum height (in pixels) of the video to consider for conversion. Default is 720. debug (bool, optional): If True, print debug messages. Default is False. """ # Define patterns to search for various resolutions resolution_patterns = { 2160: r"(4096x2160|3840x2160|2880p|2160p|2160|1440p|4k)", 1080: r"(1920x1080|1080p|1080)", 720: r"(1280x720|720p|720)", } # Wrap each pattern to only match when isolated by non-alphanumeric chars or string boundaries resolution_patterns = { res: rf"(? max_height and re.search( pattern, filename, re.IGNORECASE ): old_file = os.path.join(dirpath, filename) new_filename = re.sub( pattern, f"{max_height}p", filename, flags=re.IGNORECASE ) new_file = os.path.join(dirpath, new_filename) if old_file != new_file: files_to_rename.append((old_file, new_file)) break # Collect directories to rename for dirname in dirnames: for resolution, pattern in resolution_patterns.items(): # Only process resolutions greater than max_height if resolution > max_height and re.search( pattern, dirname, re.IGNORECASE ): old_dir = os.path.join(dirpath, dirname) new_dirname = re.sub( pattern, f"{max_height}p", dirname, flags=re.IGNORECASE ) new_dir = os.path.join(dirpath, new_dirname) if old_dir != new_dir: dirs_to_rename.append((old_dir, new_dir)) break # Rename files first for old_file, new_file in files_to_rename: if os.path.exists(new_file): print(f"Error: Target filename {new_file} already exists.") continue os.rename(old_file, new_file) if debug: print(f"Renamed file: {old_file} -> {new_file}") # Rename directories after for old_dir, new_dir in sorted(dirs_to_rename, key=lambda x: -len(x[0])): if os.path.exists(new_dir): print(f"Error: Target directory name {new_dir} already exists.") continue os.rename(old_dir, new_dir) if debug: print(f"Renamed directory: {old_dir} -> {new_dir}") def main(): """ Main function to parse command line arguments and initiate file renamings. """ # Create argument parser parser = argparse.ArgumentParser( description="Rename video files containing resolutions in their filenames to a specified max_height resolution." ) # Define command line arguments parser.add_argument( "input_path", nargs="?", default=os.getcwd(), help="directory path to search for video files (default: current directory)", ) parser.add_argument( "-mh", "--max-height", type=int, default=720, help="maximum height of videos to be converted (default: 720)", ) parser.add_argument( "--debug", action="store_true", help="enable debug mode for printing additional messages", ) # Enable autocomplete for argparse argcomplete.autocomplete(parser) # Parse command line arguments args = parser.parse_args() # Rename videos autorename(args.input_path, args.max_height, args.debug) if __name__ == "__main__": # Execute main function when the script is run directly main()