Đây là một tập lệnh Python mà tôi đã nhanh chóng hack cùng nhau để giải quyết vấn đề ban đầu: giữ một bản sao nén của thư viện nhạc. Tập lệnh sẽ chuyển đổi các tệp .m4a (giả sử là ALAC) sang định dạng AAC, trừ khi tệp AAC đã tồn tại và mới hơn tệp ALAC. Các tệp MP3 trong thư viện sẽ được liên kết, vì chúng đã được nén.
Chỉ cần lưu ý rằng việc hủy bỏ script ( ctrl-c) sẽ để lại một tệp được chuyển đổi một nửa.
Ban đầu tôi cũng muốn viết một Makefile để xử lý điều này, nhưng vì nó không thể xử lý khoảng trắng trong tên tệp (xem câu trả lời được chấp nhận) và bởi vì việc viết một tập lệnh bash được đảm bảo sẽ đưa tôi vào một thế giới đau đớn, Python là vậy. Nó khá đơn giản và ngắn gọn, do đó sẽ dễ dàng điều chỉnh theo nhu cầu của bạn.
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])
Tất nhiên, điều này có thể được tăng cường để thực hiện mã hóa song song. Điều đó được để lại như một bài tập cho người đọc ;-)