Berikut ini skrip Python yang saya retas dengan cepat untuk menyelesaikan masalah asli: simpan salinan pustaka musik yang dikompresi. Skrip akan mengubah file .m4a (diasumsikan ALAC) ke format AAC, kecuali file AAC sudah ada dan lebih baru dari file ALAC. File MP3 di perpustakaan akan ditautkan, karena sudah dikompresi.
Berhati-hatilah karena membatalkan skrip ( ctrl-c) akan meninggalkan file yang setengah dikonversi.
Saya awalnya juga ingin menulis Makefile untuk menangani ini, tetapi karena Makefile tidak dapat menangani spasi dalam nama file (lihat jawaban yang diterima) dan karena menulis skrip bash dijamin akan menempatkan saya di dunia yang menyakitkan, Python itu. Ini cukup mudah dan singkat, dan karenanya harus mudah disesuaikan dengan kebutuhan Anda.
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])
Tentu saja, ini dapat ditingkatkan untuk melakukan pengkodean secara paralel. Itu dibiarkan sebagai latihan bagi pembaca ;-)