다음은 원래 문제를 해결하기 위해 빠르게 해킹 한 Python 스크립트입니다. 음악 라이브러리의 압축 된 사본을 보관하세요. 스크립트는 AAC 파일이 이미 존재하고 ALAC 파일보다 최신 버전이 아닌 경우 .m4a 파일 (ALAC로 가정)을 AAC 형식으로 변환합니다. 라이브러리의 MP3 파일은 이미 압축되어 있으므로 링크됩니다.
스크립트 ( ctrl-c) 를 중단하면 반 변환 된 파일이 남게됩니다.
나는 원래 이것을 처리하기 위해 Makefile을 작성하고 싶었지만 파일 이름의 공백을 처리 할 수 없기 때문에 (허용되는 답변 참조) bash 스크립트를 작성하면 고통의 세계에 빠질 수 있기 때문에 Python은 그렇습니다. 매우 간단하고 짧기 때문에 필요에 맞게 쉽게 조정할 수 있습니다.
from __future__ import print_function
import glob
import os
import subprocess
UNCOMPRESSED_DIR = 'Music'
COMPRESSED = 'compressed_'
UNCOMPRESSED_EXTS = ('m4a', ) # files to convert to lossy format
LINK_EXTS = ('mp3', ) # files to link instead of convert
for root, dirs, files in os.walk(UNCOMPRESSED_DIR):
out_root = COMPRESSED + root
if not os.path.exists(out_root):
os.mkdir(out_root)
for file in files:
file_path = os.path.join(root, file)
file_root, ext = os.path.splitext(file_path)
if ext[1:] in LINK_EXTS:
if not os.path.exists(COMPRESSED + file_path):
print('Linking {}'.format(file_path))
link_source = os.path.relpath(file_path, out_root)
os.symlink(link_source, COMPRESSED + file_path)
continue
if ext[1:] not in UNCOMPRESSED_EXTS:
print('Skipping {}'.format(file_path))
continue
out_file_path = COMPRESSED + file_path
if (os.path.exists(out_file_path)
and os.path.getctime(out_file_path) > os.path.getctime(file_path)):
print('Up to date: {}'.format(file_path))
continue
print('Converting {}'.format(file_path))
subprocess.call(['ffmpeg', '-y', '-i', file_path,
'-c:a', 'libfdk_aac', '-vbr', '4',
out_file_path])
물론 이것은 인코딩을 병렬로 수행하도록 향상 될 수 있습니다. 그것은 독자에게 연습으로 남겨집니다 ;-)