diff --git a/aax2mp3 b/aax2mp3 new file mode 100755 index 0000000..039e8f7 --- /dev/null +++ b/aax2mp3 @@ -0,0 +1,38 @@ +#!/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)) +