این یه پروژه شخصیه. زیاد پیش میومد که فیلمی رو از یوتوب بخوام ببینم یا دانلود کنم و به هر دلیلی نخوام از فیلتر شکن استفاده کنم. فرض کنید فیلم های بلند. مثلا چند مورد از فیلم های ریچارد داوکینز بود که حجم بالایی داشتن می خواستم توی زمان دانلود مجانی بگیرمشون. 🙂
تا یه جایی از سرویس های آنلاین تبدیل فرمت استفاده می کردم و یا یکی دو تا سایت که کارشون گرفتن فیلم های یوتوب و دادن یه لینک مستقیم بود. بعد کم کم همشون رفتن سراغ جاوا و می گفتن اجازه بده یه چیزی رو سیستمت نصب کنیم تا ما هم اجازه بدیم تو فیلم دانلود کنی. این شد که بی خیالشون شدم و تصمیم گرفتم کارم رو خودم انجام بدم.
این مورد همزمان بود با شروع یادگیری PHP، بنابراین سعی کردم این پروژه رو با PHP پیاده کنم. برای انجامش از کلاس PHPtube استفاده کردم که خب مدت ها بود به روز نشده بود. یه فورک ازش گرفتم ولی تنبلی کردم و توی گیتهاب تغییرات و اضافه ها رو آپلود نکردم.
با یه سری مشکلات رو به رو شدم. این کلاس، لینک فایل رو بر می گردوند و حالا باید فکری به حال دانلود می کردم. اول اینکه محدودیت زمان اجرای PHP رو باید برمی داشتم یا حداقل به زمان منطقی می رسندمش. من از این دستور استفاده کردم:
1 2 3 | if( !ini_get('safe_mode') ){ set_time_limit(300); } |
مورد بعدی اینه که اگر فایل بزرگ باشه دانلودش با هر دستوری امکان پذیر نیست. بعد از کلی جستجو و خوندن پیشنهادهای مختلف و اجراشون به استفاده از دستور curl رسیدم. در یک زمانی تصمیم گرفتم که از رزیوم استفاده کنم. فایل رو به قطعات کوچک تبدیل می کردم و می ریختم توی یک فولدر به صورت موقت و در نهایت فایلها رو به هم می چسبوندم ولی در عمل این قضیه منجر می شد به دانلود ناقص فیلم ها. زیاد پیش میومد که پارت آخر دانلود نشه و فایل اصلی ناقص بشه. البته هنوز این ایده رو کنار نذاشتم و اگر وقت کنم اجراییش می کنم. دستوری که الان اجرا می شه اینه:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $fp = fopen($file_path, 'w'); $ch = curl_init($url); curl_setopt($ch, CURLOPT_URL, $url); //curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_VERBOSE, 1); curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); curl_setopt($ch, CURLOPT_FRESH_CONNECT, 0); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); //curl_setopt($ch, CURLOPT_RANGE, $range); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.29 Safari/535.1"); $data = curl_exec($ch); curl_close($ch); fclose($fp); |
و خب مورد بعدی این بود که ترجیح می دادم به جای اجرای همه کارها در یک فایل، دستورات رو تقسیم کنم و هر فایل کار به خصوصی رو انجام بده و که بعدها گسترشش برای خودم و دیگران راحت تر باشه. این شد که رسیدم به استفاده از require و require_once برای خوندن فایل های جداگانه و دسترسی به فانکشن هاشون. شاید تنها کمبودشون الان ناقص بودن کامنت ها باشه.
برای دانلود هم همونطور که خواهید دید پس از انتخاب کیفیت وسیله کاربر، مشخصات فایل مثل آدرس و نام از طریق سشن به فایل دانلود منتقل می شه. در واقع اطلاعات کیفیت های مختلف در سشن قرار می گیره و به دانلودر می گم که کدوم اطلاعات رو مبنای کار قرار بده. مقادیری که به صورت GET به دانلودر منتقل می شه شامل اسم سشن انتخابی، اسم فایل و تایپشه.
آدرس دسترسی به دموی این پروژه هم اینه که البته فقط تا قبل از دانلود رو جلو می ره. محدودیت IP براش گذاشتم چون سرور محدودیت حجمی و ترافیک داره 🙂
1 | http://scriptics.ir/ut/ |
ایده های زیادی که برای تکمیلش دارم. بعضی هاش رو اینجا می نویسم و بعد در بخش پروژه ها یه سرفصل براش در نظر می گیرم.
- توانایی گرفتن اطلاعات و دانلود روی سرور دیگه مثلا استفاده از دراپ باکس یا سرورهای دانلودی که از هوستینگ بگیرم.
- امکان مشخص کردن طول عمر برای فایل های دانلودی و پاک کردنشون بعد از مدت محدود.
- امکانثبت نام کاربرها و مشخص کردن سطح دسترسی
- محدودیت حجم دانلود برای کاربرها
البته این لیست می تونه بیشتر بشه. هدف از این پروژه هم تمرین عملی PHP و کانکت شدن با MySql است.
نکته: خیلی از کدها رو خودم ننوشتم. از جاهای مختلف جستجو کردم. مثال ها رو چک کردم و اونی که به هدفم نزدیکتر بود رو با کمی جرح و تعدیل استفاده کردم.
خوشحال می شم اگر ایده، پیشنهاد و یا انتقادی دارید بگید. یا جایی فکر می کنید کدها رو اشتباه نوشتم بهم خبر بدید.