38 lines
1.2 KiB
Python
Executable file
38 lines
1.2 KiB
Python
Executable file
#!/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))
|
|
|