#!/usr/bin/env python3 import concurrent.futures import subprocess import glob import os import multiprocessing # Different ways to get CPU count logical_cores = os.cpu_count() # All cores including hyperthreading physical_cores = multiprocessing.cpu_count() # Same as above # For more detailed info on Apple Silicon: try: # This works on macOS to get performance core count p_cores = len([x for x in os.sched_getaffinity(0) if x < os.cpu_count()//2]) except AttributeError: p_cores = physical_cores print(f"System has {logical_cores} logical cores") max_workers = max(1, logical_cores - 2) # Leave 2 cores free for system def convert_file(aax_file): mp3_file = aax_file.replace('.aax', '.mp3') print(f"Converting {aax_file} to {mp3_file}") subprocess.run(['ffmpeg', '-activation_bytes', os.getenv('AUDIBLE_ACTIVATION_BYTES'), '-i', aax_file, mp3_file], check=True) aax_files = glob.glob('*.aax') if not aax_files: print("No .aax files found in current directory") exit(1) print(f"Found {len(aax_files)} files to convert") print(f"Will convert {max_workers} files simultaneously") with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: list(executor.map(convert_file, aax_files))