یه دونه راسبری پی خریدم که تو خونه گذاشتم و باهاش عشق دنیا رو میکنم. چند وقتی بود که میخواستم مثل این یادداشت بیت نیمسوز یه مدیر دانلود روش راه بندازم. چیزی که هدفم بود این بود که (۱) خیلی راحت بتونم فایلهام رو به لیست دانلودهام اضافه کنم (۲) دانلود خیلی اتوماتیک و تمیز انجام بشه.
ساختن لیست دانلودها
تو یه پوشه از هاستم یه اسکرپت کوچیک php گذاشتم که هر چی براش بفرستم، به آخر یه فایل تکست اضافه میکنه. به این ترتیب هر جا که باشم، لینکایی که میخوام دانلود شن رو خیلی تمیز برای این اسکریپت میفرستم و و این اسکریپت برام لیست دانلودهام رو میسازه. مثلا:
http://melmi.ir/downloads/append.php?link_to_download_file
من php بلد نیستم، واسه همین هم اصل اسکریپت رو از اینجا برداشتم و یه کم تغییرش دادم. این هم اسکریپت تغییر پیدا کرده:
<?php $query_string = $_SERVER['QUERY_STRING']; $fp = fopen("dllist.txt", "a"); flock($fp, LOCK_EX); fputs($fp, $query_string); fputs($fp, "\n"); flock($fp, LOCK_UN); fclose($fp); print("Saved."); ?>
البته برای اینکه هر کسی نتونه به این فایل چیزی اضافه کنه، رو فولدر این اسکرپت پسورد گذاشتم. نتیجتا برای دسترسی به این اسکرپت، یه همچین چیزی لازمه:
http://folani:[email protected]/downloads/append.php?link_to_download_file
امنترین روش توی دنیا نیست، اما برای من کافیه.
تو مرحله بعد برای اینکه تنبلی رو به اوجش برسونم، دنبال یه افزونه گشتم که از تو کروم با یه کلیک مستقیما بتونم لینکم رو به این ارسال کنم. با یه کم گشتن افزونه خیلی خوب Context Menus رو پیدا کردم که اجازه میده به راحتی برای کانتکست منوی کروم، آیتمهای اضافه با اسکرپتهای سفارشی تعریف کنیم. من البته کار خاصی نداشتم و فقط همون دستور بالا رو با یه کم تغییر به قسمت Custom از منوی LinkMenu اضافه کردم:
http://folani:[email protected]/downloads/append.php?%s
و تمام. حالا میتونم با یه کلیک از هر جای دنیا لینک دانلود فایلی که میخوام رو تو سایتم ثبت کنم.
انجام دانلود
نظم دادن به خود دانلود دردسر زیادی نداره. باید یه اسکرپت داشته باشم که تو یه فاصله زمانی مشخص دانلودهام رو انجام بده.
تو اسکریپت اول از هم میرم به فولدر دانلودها و فایل dllist.txt رو (بعد از پاک کردن فایل قبلی) از سرور میگیرم:
cd ~/Downloads/auto/ rm dllist.txt wget --user=folani --password=passwordesh melmi.ir/downloads/dllist.txt
برای استفاده از این فایل به دو تا فایل دیگه هم احتیاج دارم. یه فایل به اسم done.txt که لیست فایلایی رو نگه میداره که دانلودشون تکمیل شده، و یه فایل به اسم active.txt که لیست فایلایی هست که هنوز دانلودشون انجام یا کامل نشده. بعد از دانلود فایل dllist.txt، اولین کار اینه که ازش فایل done.txt رو فریق کنم تا فایل active.txt تشکیل بشه:
comm dllist.txt done.txt -23 --nocheck-order > active.txt
دستور comm تفریق رو انجام میده. معنی پارامترهاش رو هم میشه راحت تو منوالهاش دید.
مرحله بعد اینه که یه حلقه بنویسم که تا وقتی فایل active.txt خالی نشده، فایلای اون تو رو یکی یکی (۱) دانلود کنه (۲) بعد از اینکه دانلودشون تموم شد، بذاره تو done.txt و (۳) فایل دانلود شده رو از active.txt خارج کنه:
while [ -s active.txt ] do head -n 1 active.txt | sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' | xargs echo -e | xargs -I {} wget -c "{}" head -n 1 active.txt >> done.txt tail -n +2 active.txt > tmp.txt mv tmp.txt active.txt done
فقط خط اول حلقه یه کم توضیح میخواد. لینکها تو فایل لینکای من به شکل کدبندی درصدی مییاد. از طرف دیگه wget میونش زیاد با این فرمت کدبندی درصدی خوب نیست و ممکنه اسم فایلا رو به هم بریزه. برای همین با استفاده از بخش sed و echo اون پایپلاین لینکها رو به شکل اول برمیگردونم. (راستش این مشکل رو با پرسیدن سوال حل کردم.)
و نهایتا اسکریپت ما این شکلی خواهد بود:
#!/bin/bash cd ~/Downloads/auto/ rm dllist.txt wget --user=folani --password=passwordesh melmi.ir/downloads/dllist.txt comm dllist.txt done.txt -23 --nocheck-order > active.txt while [ -s active.txt ] do head -n 1 active.txt | xargs -I {} wget -c "{}" head -n 1 active.txt >> done.txt tail -n +2 active.txt > tmp.txt mv tmp.txt active.txt done
والبته یادم نمیره که مجوز اجرایی هم بهش بدم.
sudo chmod +x dl.sh
خوب برای اجرای این اسکریپت به شکل منظم یه cron احتیاج دارم که البته کار باهاش رو قبلا اینجا تجربه کرده بودم. اینا هم دستورایی هستن که تو cron میذارم. به این ترتیب اسکریپت عزیز دانلودها رو ساعت یک شب شروع و ساعت ۹ صبح قطع میکنه. فکر کنم واضح باشن:
0 1 * * * /home/pi/Downloads/auto/dl.sh 0 9 * * * kill $(pgrep dl.sh) 0 9 * * * killall wget
والسلام. دو تا نکته. اول این که برای این کار حتی یه برنامه اضافه هم تو rpi نصب نکردم و فقط با ابزارای ساده لینوکس و وصل کردن اونها به هم کل این سیستم رو راه انداختم. نکته دیگه اینکه این ویندوزیا با همه دانلود منیجرای غول تشنشون نمیتونن به سادگی یه همچین سیستمی راه بندازن.