Se você tiver a sugestão definida para usar k3b
nas configurações do tipo de arquivo, k3b
irá dividir o arquivo automaticamente se você abrir o arquivo de sugestão e permitir que você copie novamente.
Eu tenho um flac de álbum completo e um arquivo de sugestão para ele. Como posso dividir isso em um flac por trilha? Eu sou um usuário do KDE, então eu preferiria um jeito KDE / QT, eu gostaria de ver a linha de comando e outras respostas gui também, mas elas não são o meu método preferido.
O Shnsplit pode ler um arquivo cue diretamente, o que também significa que ele pode acessar os outros dados do arquivo cue (não apenas os pontos de interrupção) e gerar nomes de arquivos mais legais que 'split - * .flac':
shnsplit -f file.cue -t %n-%t -o flac file.flac
Concedido, isso dificulta o uso do cuetag.sh se o arquivo flac original estiver no mesmo diretório.
Eu só conheço um jeito CLI. Você precisará de cuetools e shntool.
cuebreakpoints file.cue | shnsplit -o flac file.flac
cuetag.sh file.cue "split-*".flac
Flacon é uma GUI intuitiva de código aberto que faz exatamente isso: dividir um FLAC com um CUE.
Flacon extracts individual tracks from one big audio file containing the entire album of music and saves them as separate audio files. To do this, it uses information from the appropriate CUE file.
Ele suporta, entre outras coisas:
Supported input formats: WAV, FLAC, APE, WavPack, True Audio (TTA).
Supported out formats: FLAC, WAV, WavPack, AAC, OGG or MP3.
Automatic character set detection for CUE files.
Para usá-lo, você só precisa abrir o arquivo *.cue
com flacon
; ele deve detectar automaticamente o arquivo FLAC grande (se não, você pode especificá-lo manualmente) e, em seguida, selecionar o formato de saída FLAC ( e, opcionalmente, configure o codificador) e inicie o processo de conversão.
se arquivos de alta qualidade estiverem sendo usados, o shnsplit está feliz em errar com
shnsplit: error: m:ss.ff format can only be used with CD-quality files
felizmente, o binário flac suporta --skip = mm: ss.ss e --until = mm: ss.ss para que um script possa usar pontos de quebra como:
[..]
time[0]="00:00.00"
c=1
for ts in $(cuebreakpoints "${cue_file}"); do
time[${c}]=${ts}
c=$((c+1))
done
time[${c}]='-0'
for ((i=0;i<$((${#time[@]}-1));i++)); do
trackno=$(($i+1))
TRACKNUMBER="$(printf %02d ${trackno})"
title="$(cueprint --track-number ${trackno} -t '%t' "${cue_file}")"
flac --silent --exhaustive-model-search --skip=${time[$i]} --until=${time[$(($i+1))]} --tag=ARTIST="${ARTIST}" --tag=ALBUM="${ALBUM}" --tag=DATE="${DATE}" --tag=TITLE="${title}" --tag=TRACKNUMBER="${TRACKNUMBER}" "${aud_file}" --output-name="${TRACKNUMBER}-${title}.flac"
done
Existe um projeto que funciona para vários arquivos de entrada: split2flac
A partir da descrição do projeto:
split2flac splits one big APE/FLAC/TTA/WV/WAV audio image (or a collection of such files, recursively) with CUE sheet into FLAC/M4A/MP3/OGG_VORBIS/WAV tracks with tagging, renaming, charset conversion of cue sheet, album cover images. It also uses configuration file, so no need to pass a lot of arguments every time, only an input file. Should work in any POSIX-compliant shell.
Descobri que mac
(que é o comando que shntool
usou para decodificar arquivos APE) é muito menos tolerante do que ffmpeg
se o arquivo de origem contiver erros menores.
Normalmente, ffmpeg
ainda converteria o arquivo completamente, enquanto mac
provavelmente geraria um erro durante o processamento.
Então acabei escrevendo um script para dividir o arquivo APE analisando o arquivo CUE e convertendo o arquivo APE em arquivos FLAC separados por títulos usando ffmpeg:
#!/usr/bin/env python2.7
import subprocess as subp
import sys
import os
from os.path import splitext, basename
import random
import glob
records = []
filename = ""
album=''
alb_artist=''
codec = 'flac'
ffmpeg_exec = 'ffmpeg'
encodingList = ('utf-8','euc-kr', 'shift-jis', 'cp936', 'big5')
filecontent = open(sys.argv[1]).read()
for enc in encodingList:
try:
lines = filecontent.decode(enc).split('\n')
encoding = enc
break
except UnicodeDecodeError as e:
if enc == encodingList[-1]:
raise e
else:
pass
for l in lines:
a = l.split()
if not a:
continue
if a[0] == "FILE":
filename = ' '.join(a[1:-1]).strip('\'"')
elif a[0]=='TRACK':
records.append({})
records[-1]['index'] = a[1]
elif a[0]=='TITLE':
if len(records)>0:
records[-1]['title'] = ' '.join(a[1:]).strip('\'"')
else:
album = ' '.join(a[1:]).strip('\'"')
elif a[0]=='INDEX' and a[1]=='01':
timea = a[2].split(':')
if len(timea) == 3 and int(timea[0]) >= 60:
timea.insert(0, str(int(timea[0])/60))
timea[1] = str(int(timea[1])%60)
times = '{0}.{1}'.format(':'.join(timea[:-1]), timea[-1])
records[-1]['start'] = times
elif a[0]=='PERFORMER':
if len(records)>1:
records[-1]['artist'] = ' '.join(a[1:]).strip('\'"')
else:
alb_artist = ' '.join(a[1:]).strip('\'"')
for i, j in enumerate(records):
try:
j['stop'] = records[i+1]['start']
except IndexError:
pass
if not os.path.isfile(filename):
tmpname = splitext(basename(sys.argv[1]))[0]+splitext(filename)[1]
if os.path.exists(tmpname):
filename = tmpname
del tmpname
else:
for ext in ('.ape', '.flac', '.wav', '.mp3'):
tmpname = splitext(filename)[0] + ext
if os.path.exists(tmpname):
filename = tmpname
break
if not os.path.isfile(filename):
raise IOError("Can't not find file: {0}".format(filename))
fstat = os.stat(filename)
atime = fstat.st_atime
mtime = fstat.st_mtime
records[-1]['stop'] = '99:59:59'
if filename.lower().endswith('.flac'):
tmpfile = filename
else:
tmpfile = splitext(filename)[0] + str(random.randint(10000,90000)) + '.flac'
try:
if filename != tmpfile:
ret = subp.call([ffmpeg_exec, '-hide_banner', '-y', '-i', filename,
'-c:a', codec,'-compression_level','12','-f','flac',tmpfile])
if ret != 0:
raise SystemExit('Converting failed.')
for i in records:
output = i['index'] +' - '+ i['title']+'.flac'
commandline = [ffmpeg_exec, '-hide_banner',
'-y', '-i', tmpfile,
'-c', 'copy',
'-ss', i['start'], '-to', i['stop'],
'-metadata', u'title={0}'.format(i['title']),
'-metadata', u'artist={0}'.format(i.get('artist', '')),
'-metadata', u'performer={0}'.format(i.get('artist', '')),
'-metadata', u'album={0}'.format(album),
'-metadata', 'track={0}/{1}'.format(i['index'], len(records)),
'-metadata', u'album_artist={0}'.format(alb_artist),
'-metadata', u'composer={0}'.format(alb_artist),
'-metadata', 'encoder=Meow',
'-write_id3v1', '1',
output]
ret = subp.call(commandline)
if ret == 0:
os.utime(output, (atime, mtime))
finally:
if os.path.isfile(tmpfile):
os.remove(tmpfile)
shntool
no Ubuntu 14.04
snhtool
não possui a dependência executável mac
(Monkey's Audio Console), e o único pacote que eu encontrei foi no flacon
PPA:
sudo add-apt-repository -y ppa:flacon
sudo apt-get update
sudo apt-get install -y flacon shntool
shntool split -f *.cue -o flac -t '%n - %p - %t' *.ape
flacon
é uma GUI para shntool
, mas vem com todos os codecs necessários ... senão recebi o erro:
shnsplit: warning: failed to read data from input file using format: [ape]
shnsplit: + you may not have permission to read file: [example.ape]
shnsplit: + arguments may be incorrect for decoder: [mac]
shnsplit: + verify that the decoder is installed and in your PATH
shnsplit: + this file may be unsupported, truncated or corrupt
shnsplit: error: cannot continue due to error(s) shown above
Tags command-line gui flac audio