initial commit
This commit is contained in:
45
convert.py
Normal file
45
convert.py
Normal file
@ -0,0 +1,45 @@
|
||||
import os
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
from concurrent.futures import ProcessPoolExecutor, as_completed
|
||||
import multiprocessing
|
||||
|
||||
def convert_file(filepath, out_dir):
|
||||
filename = os.path.basename(filepath)
|
||||
basename, _ = os.path.splitext(filename)
|
||||
out_filename = basename + ".m4a"
|
||||
out_path = os.path.join(out_dir, out_filename)
|
||||
|
||||
# ffmpeg command to copy audio
|
||||
proc = subprocess.run(
|
||||
["ffmpeg", "-i", filepath, "-vn", "-c:a", "copy", out_path],
|
||||
capture_output=True
|
||||
)
|
||||
|
||||
if proc.returncode != 0:
|
||||
return f"ERROR: Failed to convert {filename}\n{proc.stderr.decode()}"
|
||||
return f"Converted: {filename}"
|
||||
|
||||
def main():
|
||||
cwd = Path.cwd()
|
||||
in_dir = cwd / "playlists"
|
||||
out_dir = cwd / "audios"
|
||||
|
||||
os.makedirs(out_dir, exist_ok=True)
|
||||
|
||||
files = [str(in_dir / f) for f in os.listdir(in_dir) if f.lower().endswith(('.mp4', '.mkv', '.mov'))]
|
||||
|
||||
# Use number of CPU cores, with 16 files max per core
|
||||
num_cores = multiprocessing.cpu_count()
|
||||
max_workers = min(len(files), num_cores)
|
||||
|
||||
print(f"Converting {len(files)} files using {max_workers} workers...")
|
||||
|
||||
results = []
|
||||
with ProcessPoolExecutor(max_workers=max_workers) as executor:
|
||||
futures = {executor.submit(convert_file, f, str(out_dir)): f for f in files}
|
||||
for future in as_completed(futures):
|
||||
print(future.result())
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user