-
-
Save mervick/00d4412690a56849e95ef8b5bbac42bc to your computer and use it in GitHub Desktop.
CUE splitter using ffmpeg (to flac)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python3 | |
import argparse | |
import os | |
import subprocess | |
def main(): | |
parser = argparse.ArgumentParser(description='Split flac file using cue') | |
parser.add_argument('cue', type=str, help='path to cue file') | |
parser.add_argument('--cover', type=str, help='path to cover image') | |
parser.add_argument('--out', type=str, help='output directory') | |
args = parser.parse_args() | |
cue_file = args.cue | |
cover = args.cover | |
if cue_file is None: | |
parser.print_help() | |
return | |
d = open(cue_file).read().splitlines() | |
dirpath = os.path.dirname(cue_file) | |
outpath = dirpath if args.out is None else args.out | |
if not os.path.isdir(outpath): | |
os.mkdir(outpath, 0o777) | |
general = {} | |
tracks = [] | |
current_file = None | |
for line in d: | |
if line.startswith('REM GENRE '): | |
general['genre'] = ' '.join(line.split(' ')[2:]) | |
if line.startswith('REM DATE '): | |
general['date'] = ' '.join(line.split(' ')[2:]) | |
if line.startswith('PERFORMER '): | |
general['artist'] = ' '.join(line.split(' ')[1:]).replace('"', '') | |
if line.startswith('TITLE '): | |
general['album'] = ' '.join(line.split(' ')[1:]).replace('"', '') | |
if line.startswith('FILE '): | |
current_file = ' '.join(line.split(' ')[1:-1]).replace('"', '') | |
current_file = os.path.join(dirpath, current_file) | |
if line.startswith(' TRACK '): | |
track = general.copy() | |
track['track'] = int(line.strip().split(' ')[1], 10) | |
tracks.append(track) | |
if line.startswith(' TITLE '): | |
tracks[-1]['title'] = ' '.join(line.strip().split(' ')[1:]).replace('"', '') | |
if line.startswith(' PERFORMER '): | |
tracks[-1]['artist'] = ' '.join(line.strip().split(' ')[1:]).replace('"', '') | |
if line.startswith(' INDEX 01 '): | |
t = list(map(int, ' '.join(line.strip().split(' ')[2:]).replace('"', '').split(':'))) | |
tracks[-1]['start'] = 60 * t[0] + t[1] + t[2] / 100.0 | |
for i in range(len(tracks)): | |
if i != len(tracks) - 1: | |
tracks[i]['duration'] = tracks[i + 1]['start'] - tracks[i]['start'] | |
for track in tracks: | |
out_file = os.path.join(outpath, '%.2d. %s.flac' % (track['track'], track['title'])) | |
metadata = { | |
'artist': track['artist'], | |
'title': track['title'], | |
'album': track['album'], | |
'track': str(track['track']) + '/' + str(len(tracks)) | |
} | |
if 'genre' in track: | |
metadata['genre'] = track['genre'] | |
if 'date' in track: | |
metadata['date'] = track['date'] | |
cmd = 'ffmpeg' | |
cmd += ' -i "%s"' % current_file | |
if cover is not None: | |
cmd += ' -i "%s" -map 0:a -map 1' % cover | |
cmd += ' -metadata:s:v title="Album cover"' + \ | |
' -metadata:s:v comment="Cover (front)" -disposition:v attached_pic' | |
cmd += ' -ss %.2d:%.2d:%.2d' % (track['start'] / 60 / 60, track['start'] / 60 % 60, int(track['start'] % 60)) | |
if 'duration' in track: | |
cmd += ' -t %.2d:%.2d:%.2d' % (track['duration'] / 60 / 60, track['duration'] / 60 % 60, int(track['duration'] % 60)) | |
cmd += ' ' + ' '.join('-metadata %s="%s"' % (k, v) for (k, v) in metadata.items()) | |
cmd += ' "%s"' % out_file | |
print(cmd) | |
subprocess.call(cmd, shell=True) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment