قطعه کد: کپی تمامی لیستهای یک فایل M3U در آدرس دلخواه با Python

من تو کتابخانه 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:

راستی سال نو همتون مبارک.

مطالبی در مورد Object.prototype در JavaScript

همونطور که می دونید در JavaScript شما این امکان رو دارید تا شیء/نوع های داده ای پیشفرض نظیر String, Array و … رو گسترش بدید و متدها و امکانات بیشتری رو به این شیء ها اضافه کنید. اینکار هم با استفاده از کلمه ی کلیدی prototype انجام میشه، ولی آیا پیشنهاد میشه برای اضافه کردن قابلیتهای بیشتر از این روش برای شیء Object استفاده کنیم؟ جواب قطعا خیر هست!

شیء های Native در JavaScript طوری هست که ما اگر یک متد رو توسط prototype به اشیاء مون اضافه کرده باشیم، از اون به بعد هر وقت ما یک متغیر از نوع دلخواه ایجاد کنیم، متدی که از قبل اضافه شده در متغیری که ما ایجاد کردیم کپی میشه! خوب این برای اشیائی مثل String, Array, Date, Math و … خیلی مشکل ایجاد نمیکنه ولی برای شیء Object اینطور نیست. فرض کنید ما از یک متغیر از نوع Object برای نگهداری لیست محصولات استفاده کنیم و بخوایم عملیاتی روی لیست محصولاتمون انجام بدیم و از حلقه ی for in برای واکشی اسامی محصولات استفاده کنیم، اونوقت اگر از قبل توسط prototype متدی مثلا به نام me تعریف کرده باشیم، اون هم در لیست اسامی محصولات ما وارد میشه!
مثال:


Object.prototype.me = function(){
	return 'eAmin';
};

var products = {
        // name : description
	"a": "abc",
	"b": "def",
	"c": "ghi"
}

for (var i in products) {
	console.log(i); // a, b, c, me!
}

خوب مسلما در اینجا me جزء محصولات ما نیست و فقط a,b,c باید باشن، که در اینجا بخاطر اینکه ما توسط prototype متد جدیدی اضافه کردیم به لیست ما اضافه شده. ولی راه حل چی می تونه باشه؟ شاید حتما نیاز دارید تا برای خوانایی و رعایت اصول صحیح برنامه نویسی از یک روش اصولی استفاده کنید.
یک راه ساده و نسبتا خوب اینه که مستقیما نام متد رو بعد از شیء اضافه کنید بدون استفاده از کلمه کلیدی prototype به اینصورت:


Object.me = function(arg){
	return arg.toString();
};

Object.me('eAmin'); // eAmin

اینطوری ما تقریبا به خواسته مون نزدیکتر شدیم. ولی صبر کنید… یک راه بهتری هم هست! در ECMAScript 5 با استفاده از متد defineProperty به همراه false قرار دادن خاصیت enumerable می تونیم دقیقا به همون چیزی که نیاز داشتیم برسیم.


Object.defineProperty(Object.prototype, 'me', {
	value: function(arg) {
		return arg.toString();
	},
	enumerable: false
});

var products = {
	// name : description
	"a": "abc",
	"b": "def",
	"c": "ghi"
}

console.log(products.me('eAmin')); // eAmin

for (var i in products) {
	console.log(i); // a, b, c
}

همونطور که در مثال بالا می بینید دیگه متدی که اضافه کردیم به لیست ما اضافه نشد و توسط حلقه for in قابل شمارش/خواندن نیست، ولی میتونید مثل بقیه متدها مانند متد hasOwnProperty اون رو صدا بزنید.
ناگفته نمونه که متد defineProperty در تمامی مرورگرهای استاندارد فعلی پشتیبانی میشه و IE8 از اون بصورت ناقص پشتیبانی میکنه و از IE9 به بعد بصورت کامل پشتیبانی میشه.

افتتاح eAmin.me

به نام او، که هرکاری با نام او آغاز شود با عاقبتی خوش ادامه پیدا خواهد کرد.

سلام به همه دوستان و بازدید کنندگان محترم

اول باید سال نوی جدید رو به شما تبریک بگم و امیدوارم سال خوب و خوشی داشته باشید  و همچنین سالی سرشار از علم اندوزی و یادگیری دانشهای جدید رو برای شما آرزو میکنم.

این وبلاگ بنده هست و سعی ندارم در توضیح زیر لوگوی بلاگ بنویسم “وبلاگ/روزنوشته ها یک برنامه نویس/ یک طراح وب جقله” و از این دسته موارد! این وبلاگ یک اسم دارد و آن هم eAmin.me است و هیچ توضیح اضافی دیگری نباید برای آن قرار داد.

در این تاریخ یعنی ۱۳۹۱/۰۱/۰۵ رسما” وبلاگ نویسی بنده آغاز شده و سعی میکنم با مطالبی تخصصی در حوزه برنامه نویسی و بیشتر در محدوده ی طراحی وب و تکنولوژی های جدید اون در کنار شما باشم. اصولا” من اعتقاد دارم فردی که خودش در اینکار هست بهتره با مسائل تخصصی شروع به وبلاگ نویسی کنه. با اینکار نه تنها کمکی هرچند اندک به دیگران برای رفع مشکل/ آموزش های جدید کرده بلکه دوچندان به خودش کمک کرده و همینکه تجربیات خودش رو با دیگران به اشتراک گذاشته باعث خواهد شد درک بهتر و کامل تری در طولانی مدت از تجربیات خودش بدست بیاورد که این مهمترین و بهترین دلیل برای وبلاگ نویسی با موضوعات تخصصی نیز هست، مخصوصا” در حوزه ی کامپیوتر و برنامه نویسی.

یک توضیح در مورد پوسته و ابزاری که برای وبلاگ نویسی استفاده شده: این وبلاگ با وردپرس راه اندازی شده و این پوسته که در حال حاضر میبنید یکی از پوسته های آماده شده هست و درحال حاضر بصورت آزمایشی و فقط برای شروع کار از این قالب استفاده میکنم و همچنین بزودی قالب جدید و اختصاصی برای این وبلاگ ایجاد خواهد شد و تا جایی که امکان داشته باشد سعی میکنم یک قالب بسیار ساده، User Friendly و کاربرد پذیر برای این وبلاگ ایجاد کنم تا کاربرانی که به این وبلاگ سر میزنند تجربه خوبی از این بازدید داشته باشند. هرچند که بهترین هدیه ای که میتوان به کاربر داد این است که مطالب پربار و کمیابی در اختیار او قرار داد. همچنین من اصولا فردی هستم که وقتی تونایی ایجاد یک وبلاگ و وبسایت را از پایه دارم  چرا خودم چنین چیزی رو ایجاد و از آن استفاده نکنم؟ این به معنی نیست که ابزارهایی که از آن استفاده میکنم جوابگوی من نیست و یا … درکل فقط حسی که ایجاد یک محیط از پایه و توسط خود، به بنده دست میده بسیار بسیار لذت بخش تر از یک ابزار از قبل آماده شده هست. و از این رو سعی دارم در آینده ای نزدیک یک محیط از پایه برای وبلاگ خودم ایجاد کنم و شخصا از آن استفاده کنم. بیشتر تمایل دارم از Node.JS برای اینکار استفاده کنم، ولی ببینیم در آینده چه پیش می آید.

امیدوارم بتوانم در جهت اهدافی که در این پست گفته شد، فعالیت پررنگی داشته باشم.

موفق باشید.