من تو کتابخانه iTunes ام Playlist های زیادی دارم و از اونجا که بعضی از این Playlist ها دارای موزیک های متفاوتی به تعداد زیاد هستن و همچنین قاطی پاتی! میدونید که پیدا کردن این فایلها و دونه دونه کپی کردنشون بسیار وقت گیر و زجرآور است، و برای ما نیمچه برنامه نویس ها افت داره بخوایم از این کارا بکنیم.
من نیاز داشتم بعضی از این لیستها رو تمامی فایلهاش استخراج بشه تا بتونم یه جای دیگه هم به موزیک های مورد علاقه ام گوش کنم. اینکار رو میخواستم با خود iTunes انجام بدم، ولی همچین امکانی نداشت یا حداقل داره و من نمیدونم. از Playlist خروجی M3U گرفتم و این دفعه تو ویندوز با WMP تست کردم بازم نشد. بعد از اون تنها راهی که به ذهنم رسید این بود که چرا خودم نشینم یک کدی بنویسم که بتونه اینکار رو برای من انجام بده؟ البته شاید باشن نرم افزارهایی که اینکار رو انجام میدن، ولی خب من حوصله گشتن نداشتم و خودم دست بکار شدم و این تیکه کدی که می بینید رو نوشتم. با استفاده از زبان Python نوشته شده و فقط در ورژن ۲٫۷٫۳ تست گردیده.
#!/usr/bin/env python
import sys
import shutil
try:
file = open(sys.argv[1], 'rU')
except:
sys.exit('Error: File dosn\'t exist')
if not '#EXTM3U' in file.readline():
sys.exit('Error: This is not an M3U playlist file');
for line in file:
if not "#EXTINF:" in line:
print '=',
shutil.copy(line.strip(), sys.argv[2])
print 'done'
file.close()
نحوه استفاده اش هم خیلی ساده است، پارامتر اول اسم Playlsit شما که حتما باید M3U باشه و پارامتر بعدی هم آدرس مقصد ذخیره کردن فایل ها است.
m3uExtractor.py playlist.m3u /your/folder/address
یک نکته ی کلیدی توی این کدها وجود داره در این قسمت:
file = open(sys.argv[1], 'rU')
با مد “r” که اکثرن آشنایی دارید و برای فقط خواندن فایل بکار میره، ولی در اینجا یک “U” به اون اضافه شده ولی چرا من از این مد استفاده کردم؟
همونطور که میدونید معروف ترین سیستم عاملهای موجود برای رفتن به خط بعدی از کاراکترهای متفاوتی استفاده میکنن، مثلن Linux برای رفتن به خط بعدی از کاراکتر Line Feed استفاده میکنه و در OS X اپل از Carriage Return و در ویندوز از هردوی این کاراکترها بصورت همزمان استفاده میشه “CRLF”. وقتی در iTunes ویندوز خروجی M3U میگرفتم اسکریپت بدون استفاده از مد “U” بدرستی کار میکرد ولی اگر همین کار رو در OS X انجام میدادم، چون فایل ایجادی به جای LF از CR استفاده میکرد، اجرای اسکریپت به مشکل میخورد. مشکل هم از اینجا بوجود میاد که متد readline در Python بصورت معمول از کاراکتر LF برای رفتن به خط بعدی استفاده میکنه و ما باید برای اینکه به متد readline بفهمونیم که موقع خوندن فایل هر دوی این کاراکترها رو درنظر بگیره از مد “rU” استفاده کنیم که به معنای Universal Line هست.
پ.ن: وقتی می خواستم همچین چیزی بنویستم فکر نمیکردم به این آسونی باشه ولی بعد در کمال ناباوری دیدم چقدر شیرینه، البته هنوز زوده که من بتونم با Syntax زبان Python خو بگیرم، چون همیشه آخر دستورها یک ‘;’ اضافه میشد D:
راستی سال نو همتون مبارک.