Skip to content

Instantly share code, notes, and snippets.

@RyougiKukoc
Created September 5, 2024 12:04
Show Gist options
  • Save RyougiKukoc/eeb67b6587b8b4b284072fec33d482a6 to your computer and use it in GitHub Desktop.
Save RyougiKukoc/eeb67b6587b8b4b284072fec33d482a6 to your computer and use it in GitHub Desktop.
transcode flac into alac in mkv files
import os
import subprocess as sp
recursive = True
src_dir = '.'
src_dir = os.path.abspath(src_dir)
def encode(tar_fp, dst_dir_fp):
dst_fp = os.path.join(dst_dir_fp, os.path.basename(tar_fp).replace('FLAC', 'ALAC'))
p = sp.Popen(['mkvmerge', '-i', tar_fp], stdout=sp.PIPE, stderr=sp.PIPE)
mkvinfo = p.communicate()[0].decode()
aids, exceptstr = [], '!'
for line in mkvinfo.splitlines():
if '(FLAC)' in line:
aids.append(int(line.split(':')[0].split('ID')[-1]))
exceptstr += f'{aids[-1]},'
extract_cmd = ['mkvextract', tar_fp, 'tracks']
for aid in aids:
extract_cmd.append(f'{aid}:_tmp_{aid}.flac')
_ = sp.run(extract_cmd)
for aid in aids:
_ = sp.run(['qaac64', '-o', f'_tmp_{aid}.alac', '-A', f'_tmp_{aid}.flac'])
merge_cmd = ['mkvmerge', '-o', dst_fp, '-a', exceptstr[:-1], tar_fp]
merge_cmd += [f'_tmp_{aid}.alac' for aid in aids]
_ = sp.run(merge_cmd)
for aid in aids:
os.remove(f'_tmp_{aid}.alac')
os.remove(f'_tmp_{aid}.flac')
if __name__ == '__main__':
if recursive:
for root, dirs, files in os.walk(src_dir):
os.chdir(root)
dst_dir = os.path.join(root, 'flac2alac')
os.makedirs(dst_dir, exist_ok=True)
for fn in files:
if not fn.endswith('.mkv'):
continue
tar = os.path.join(root, fn)
encode(tar, dst_dir)
else:
os.chdir(src_dir)
dst_dir = os.path.join(src_dir, 'flac2alac')
os.makedirs(dst_dir, exist_ok=True)
for fn in os.listdir(src_dir):
tar = os.path.join(src_dir, fn)
if not fn.endswith('.mkv'):
continue
if not os.path.isfile(tar):
continue
encode(tar, dst_dir)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment