diff --git a/src/encode.py b/src/encode.py new file mode 100644 index 0000000..4b4a5e5 --- /dev/null +++ b/src/encode.py @@ -0,0 +1,106 @@ +import sys +import argparse +import subprocess +import pandas as pd + + +def run_cmd(cmd): + try: + subprocess.run(cmd, check = True, + stdout = subprocess.DEVNULL, + stderr = subprocess.DEVNULL) + except subprocess.CalledProcessError: + sys.exit(1) + + +def encode(): + parser = argparse.ArgumentParser() + parser.add_argument( + "-t", "--track_file", + type = str, + help = "Path to input track file.", + required = True) + parser.add_argument( + "-id", "--identifier", + type = str, + help = "Identifier code for the given track.", + required = True) + parser.add_argument( + "-m", "--metadata_file", + type=str, + help="Path to .csv metadata file.", + required=True) + parser.add_argument( + "-a", "--artwork_dir", + type=str, + help="Path to directory containing artwork files.", + required=True) + parser.add_argument( + "-o", "--output_file", + type=str, + help="Path to .csv file to store individual sample metadata.", + required=True) + args = parser.parse_args() + + metadata_df = pd.read_csv(args.metadata_file) + track_metadata = metadata_df[metadata_df["Code"] == args.identifier] + + if track_metadata["File Extension"].item() != ".flac": + cmd = [ + "ffmpeg", + "-i", args.track_file, + "-vn", + "-c:a", "flac", + args.output_file + ] + else: + cmd = [ + "cp", + args.track_file, + args.output_file + ] + + run_cmd(cmd) + + # Remove any existing metadata. + cmd = [ + "metaflac", + "--remove-all-tags", + args.output_file + ] + run_cmd(cmd) + + # Remove any existing album artwork. + cmd = [ + "metaflac", + "--remove", + "--block-type=PICTURE,PADDING", + "--dont-use-padding", + args.output_file + ] + run_cmd(cmd) + + cmd = [ + "metaflac", + "--remove-tag=COVERART", + args.output_file + ] + run_cmd(cmd) + + # Write the new metadata. + cmd = [ + "metaflac", + f"--set-tag=ALBUM={track_metadata['Album'].item()}", + f"--set-tag=ARTIST={track_metadata['Artist'].item()}", + f"--set-tag=TITLE={track_metadata['Title'].item()}", + f"--set-tag=TRACKNUMBER={track_metadata['Track'].item()}", + f"--set-tag=DATE={track_metadata['Year'].item()}", + f"--set-tag=DISCNUMBER={track_metadata['Disc'].item()}", + f"--import-picture-from={args.artwork_dir}/{track_metadata['Artwork File'].item()}", + args.output_file + ] + run_cmd(cmd) + + +if __name__ == "__main__": + encode() diff --git a/src/install.py b/src/install.py new file mode 100644 index 0000000..5487d30 --- /dev/null +++ b/src/install.py @@ -0,0 +1,70 @@ +import os +import sys +import argparse +import subprocess +import pandas as pd + + +def run_cmd(cmd): + try: + subprocess.run(cmd, check = True, + stdout = subprocess.DEVNULL, + stderr = subprocess.DEVNULL) + except subprocess.CalledProcessError: + sys.exit(1) + + +def install(): + parser = argparse.ArgumentParser() + parser.add_argument( + "-td", "--track_dir", + type = str, + help = "Path to directory with processed track files.", + required = True) + parser.add_argument( + "-m", "--metadata_file", + type=str, + help="Path to .csv metadata file.", + required=True) + parser.add_argument( + "-d", "--dir", + type=str, + help="Target directory to install files.", + required=True) + args = parser.parse_args() + + metadata_df = pd.read_csv(args.metadata_file) + track_list = os.listdir(args.track_dir) + + for track in track_list: + track_metadata = metadata_df[metadata_df["Code"] == track.split(".")[0]] + + # Create album directory (if it does not exist). + album_dir = os.path.join(args.dir, track_metadata["Album"].item()) + cmd = [ + "mkdir", + "-p", + album_dir + ] + run_cmd(cmd) + + # Copy song to target directory. + disc_number = track_metadata["Disc"].item() + track_number = track_metadata["Track"].item() + song_title = track_metadata["Title"].item() + song_title = song_title.replace("/", " - ") + + track_path = os.path.join( + album_dir, + f"{disc_number:>02}-{track_number:>02} {song_title}") + + cmd = [ + "cp", + os.path.join(args.track_dir, track), + track_path + ] + run_cmd(cmd) + + +if __name__ == "__main__": + install()