นี่คือสคริปต์ Python ที่ฉันแฮ็กเข้าด้วยกันอย่างรวดเร็วเพื่อแก้ปัญหาเดิม: เก็บสำเนาไลบรารีเพลงที่บีบอัดไว้ สคริปต์จะแปลงไฟล์. m4a (สมมติว่าเป็น ALAC) เป็นรูปแบบ AAC เว้นแต่จะมีไฟล์ AAC อยู่แล้วและใหม่กว่าไฟล์ ALAC ไฟล์ MP3 ในไลบรารีจะถูกเชื่อมโยงเนื่องจากถูกบีบอัดแล้ว
เพียงระวังว่าการยกเลิกสคริปต์ ( ctrl-c) จะทิ้งไฟล์ที่แปลงแล้วครึ่งหนึ่ง
แต่เดิมฉันต้องการเขียน Makefile เพื่อจัดการสิ่งนี้ แต่เนื่องจากไม่สามารถจัดการช่องว่างในชื่อไฟล์ได้ (ดูคำตอบที่ยอมรับ) และเนื่องจากการเขียนสคริปต์ทุบตีนั้นรับประกันว่าจะทำให้ฉันอยู่ในโลกแห่งความเจ็บปวด 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])
แน่นอนว่าสิ่งนี้สามารถปรับปรุงได้เพื่อทำการเข้ารหัสควบคู่กันไป ที่ฝากไว้เป็นแบบฝึกหัดให้กับผู้อ่าน ;-)