यहां एक पायथन स्क्रिप्ट है जिसे मैंने मूल समस्या को हल करने के लिए जल्दी से एक साथ हैक किया: एक संगीत पुस्तकालय की एक संकुचित प्रतिलिपि रखें। जब तक AAC फ़ाइल पहले से मौजूद है और ALAC फ़ाइल की तुलना में नई है, स्क्रिप्ट AAC प्रारूप में .m4a फ़ाइलों (ALAC होना मानती है) में बदल जाएगी। पुस्तकालय में एमपी 3 फाइलें जुड़ी होंगी, क्योंकि वे पहले से ही संपीड़ित हैं।
बस सावधान रहें कि स्क्रिप्ट को निरस्त करना ( ctrl-c) एक अर्ध-परिवर्तित फ़ाइल को पीछे छोड़ देगा।
मैं मूल रूप से इसे संभालने के लिए एक मेकफिल लिखना चाहता था, लेकिन चूंकि यह फ़ाइल नाम में रिक्त स्थान को नहीं संभाल सकता है (स्वीकृत उत्तर देखें) और क्योंकि बैश स्क्रिप्ट लिखने से मुझे दर्द की दुनिया में डाल देने की गारंटी है, यह पायथन है। यह काफी सीधा और छोटा है, और इस तरह अपनी आवश्यकताओं के लिए आसान होना चाहिए।
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])
बेशक, यह समानांतर में एन्कोडिंग प्रदर्शन करने के लिए बढ़ाया जा सकता है। कि पाठक के लिए एक अभ्यास के रूप में छोड़ दिया है; ;-)