İşte orijinal sorunu çözmek için hızla birlikte hacklediğim bir Python betiği: bir müzik kitaplığının sıkıştırılmış bir kopyasını saklayın. Komut dosyası, AAC dosyası zaten mevcut değilse ve ALAC dosyasından daha yeni değilse .m4a dosyalarını (ALAC olduğu varsayılır) AAC biçimine dönüştürür. Kitaplıktaki MP3 dosyaları zaten sıkıştırılmış oldukları için bağlanacaktır.
Sadece script ( ctrl-c) 'i iptal etmenin yarısı dönüştürülmüş bir dosya bırakacağına dikkat edin .
Aslında bunu halletmek için bir Makefile yazmak istedim, ancak dosya adlarındaki boşlukları işleyemediği için (kabul edilen yanıta bakın) ve bir bash betiği yazmanın beni acı dolu bir dünyaya sokması garantili olduğu için Python öyle. Oldukça basit ve kısadır ve bu nedenle ihtiyaçlarınıza göre ayarlanması kolay olmalıdır.
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])
Elbette bu, kodlamayı paralel olarak gerçekleştirmek için geliştirilebilir. Bu, okuyucuya bir alıştırma olarak bırakılmıştır ;-)