From f0430f87138c3b3a8eba6770ef995bbfb1b4bbca Mon Sep 17 00:00:00 2001 From: jgrogan Date: Mon, 2 Sep 2024 09:09:58 +0100 Subject: [PATCH] Add mp3 converter --- src/music/convert.py | 77 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/music/convert.py diff --git a/src/music/convert.py b/src/music/convert.py new file mode 100644 index 0000000..ae6781c --- /dev/null +++ b/src/music/convert.py @@ -0,0 +1,77 @@ +import argparse +import os +import logging +import shutil +from pathlib import Path +import subprocess +from multiprocessing import Pool + +logger = logging.getLogger(__name__) + +def launch_task(cmd): + subprocess.run(cmd, shell=True, check=True) + +def convert(input_dir: Path, output_dir: Path): + + logger.info("Converting files in %s", input_dir) + logger.info("Writing output to: %s", output_dir) + + os.makedirs(output_dir, exist_ok=True) + + flac_files = list(input_dir.resolve().rglob("*.flac")) + tasks = [] + + for idx, path in enumerate(flac_files): + + logger.info("Converting file %d of %d", idx, len(flac_files)) + + relative_path = path.relative_to(input_dir) + output_filename = str(path.stem) + ".mp3" + output_filename.replace("'", "") + + output_path = output_dir / relative_path.parent / output_filename + + cmd = f"ffmpeg -i '{path}' -ab 320k -map_metadata 0 -id3v2_version 3 '{output_path}'" + tasks.append(cmd) + + with Pool(10) as p: + p.map(launch_task, tasks) + + +def move(input_dir: Path, output_dir: Path): + + logger.info("Moving files in %s to %s", input_dir, output_dir) + os.makedirs(output_dir, exist_ok=True) + + mp3_files = list(input_dir.resolve().rglob("*.mp3")) + for idx, path in enumerate(mp3_files): + logger.info("Moving file %d of %d", idx, len(mp3_files)) + relative_path = path.relative_to(input_dir) + output_path = output_dir / relative_path + os.makedirs(output_path.parent, exist_ok=True) + shutil.move(path, output_path) + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser() + + parser.add_argument('--input_dir', + type=Path, + default=Path(), + help="Directory with input files for conversion.") + + parser.add_argument('--output_dir', + type=Path, + default=Path(), + help="Directory for converted files") + + args = parser.parse_args() + + logging.basicConfig() + logging.getLogger().setLevel(logging.INFO) + + # convert(args.input_dir.resolve(), args.output_dir.resolve()) + move(args.input_dir.resolve(), args.output_dir.resolve()) + +