من و راسبری-پی و دانلودهای شبانه

یه دونه راسبری پی خریدم که تو خونه گذاشتم و باهاش عشق دنیا رو می‌کنم. چند وقتی بود که می‌خواستم مثل این یادداشت بیت نیم‌سوز یه مدیر دانلود روش راه بندازم. چیزی که هدفم بود این بود که (۱) خیلی راحت بتونم فایل‌هام رو به لیست دانلودهام اضافه کنم (۲) دانلود خیلی اتوماتیک و تمیز انجام بشه.

ساختن لیست دانلودها
تو یه پوشه از هاستم یه اسکرپت کوچیک php گذاشتم که هر چی براش بفرستم، به آخر یه فایل تکست اضافه می‌کنه. به این ترتیب هر جا که باشم، لینکایی که می‌خوام دانلود شن رو خیلی تمیز برای این اسکریپت می‌فرستم و و این اسکریپت برام لیست دانلودهام رو می‌سازه. مثلا:
[html]
http://melmi.ir/downloads/append.php?link_to_download_file
[/html]
من php بلد نیستم، واسه همین هم اصل اسکریپت رو از این‌جا برداشتم و یه کم تغییرش دادم. این هم اسکریپت تغییر پیدا کرده:

البته برای اینکه هر کسی نتونه به این فایل چیزی اضافه کنه، رو فولدر این اسکرپت پسورد گذاشتم. نتیجتا برای دسترسی به این اسکرپت، یه همچین چیزی لازمه:
[html]
http://folani:passwordesh@melmi.ir/downloads/append.php?link_to_download_file
[/html]
امن‌ترین روش توی دنیا نیست، اما برای من کافیه.

تو مرحله بعد برای اینکه تنبلی رو به اوجش برسونم، دنبال یه افزونه گشتم که از تو کروم با یه کلیک مستقیما بتونم لینکم رو به این ارسال کنم. با یه کم گشتن افزونه خیلی خوب Context Menus رو پیدا کردم که اجازه می‌ده به راحتی برای کانتکست منوی کروم، آیتم‌های اضافه با اسکرپت‌های سفارشی تعریف کنیم. من البته کار خاصی نداشتم و فقط همون دستور بالا رو با یه کم تغییر به قسمت Custom از منوی LinkMenu اضافه کردم:
[html]
http://folani:passwordesh@melmi.ir/downloads/append.php?%s
[/html]
و تمام. حالا می‌تونم با یه کلیک از هر جای دنیا لینک دانلود فایلی که می‌خوام رو تو سایتم ثبت کنم.

انجام دانلود
نظم دادن به خود دانلود دردسر زیادی نداره. باید یه اسکرپت داشته باشم که تو یه فاصله زمانی مشخص دانلودهام رو انجام بده.
تو اسکریپت اول از هم می‌رم به فولدر دانلودها و فایل dllist.txt رو (بعد از پاک کردن فایل قبلی) از سرور می‌گیرم:
[bash]
cd ~/Downloads/auto/
rm dllist.txt
wget –user=folani –password=passwordesh melmi.ir/downloads/dllist.txt
[/bash]
برای استفاده از این فایل به دو تا فایل دیگه هم احتیاج دارم. یه فایل به اسم done.txt که لیست فایلایی رو نگه می‌داره که دانلودشون تکمیل شده، و یه فایل به اسم active.txt که لیست فایلایی هست که هنوز دانلودشون انجام یا کامل نشده. بعد از دانلود فایل dllist.txt، اولین کار اینه که ازش فایل done.txt رو فریق کنم تا فایل active.txt تشکیل بشه:
[bash]
comm dllist.txt done.txt -23 –nocheck-order > active.txt
[/bash]
دستور comm تفریق رو انجام می‌ده. معنی پارامترهاش رو هم می‌شه راحت تو منوال‌هاش دید.
مرحله بعد اینه که یه حلقه بنویسم که تا وقتی فایل active.txt خالی نشده، فایلای اون تو رو یکی یکی (۱) دانلود کنه (۲) بعد از اینکه دانلودشون تموم شد، بذاره تو done.txt و (۳) فایل دانلود شده رو از active.txt خارج کنه:
[bash]
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
[/bash]
فقط خط اول حلقه یه کم توضیح می‌خواد. لینک‌ها تو فایل لینکای من به شکل کدبندی درصدی می‌یاد. از طرف دیگه wget میونش زیاد با این فرمت کدبندی درصدی خوب نیست و ممکنه اسم فایلا رو به هم بریزه. برای همین با استفاده از بخش sed و echo اون پایپ‌لاین لینک‌ها رو به شکل اول برمی‌گردونم. (راستش این مشکل رو با پرسیدن سوال حل کردم.)
و نهایتا اسکریپت ما این شکلی خواهد بود:

والبته یادم نمی‌ره که مجوز اجرایی هم بهش بدم.
[bash]
sudo chmod +x dl.sh
[/bash]

خوب برای اجرای این اسکریپت به شکل منظم یه cron احتیاج دارم که البته کار باهاش رو قبلا این‌جا تجربه کرده بودم. اینا هم دستورایی هستن که تو cron می‌ذارم. به این ترتیب اسکریپت عزیز دانلودها رو ساعت یک شب شروع و ساعت ۹ صبح قطع می‌کنه. فکر کنم واضح باشن:
[bash]
۰ ۱ * * * /home/pi/Downloads/auto/dl.sh
۰ ۹ * * * kill $(pgrep dl.sh)
۰ ۹ * * * killall wget
[/bash]

والسلام. دو تا نکته. اول این که برای این کار حتی یه برنامه اضافه هم تو rpi نصب نکردم و فقط با ابزارای ساده لینوکس و وصل کردن اون‌ها به هم کل این سیستم رو راه انداختم. نکته دیگه اینکه این ویندوزیا با همه دانلود منیجرای غول تشنشون نمی‌تونن به سادگی یه همچین سیستمی راه بندازن.

آپدیت: اسکریپت‌ها به گیست اضافه شد و از آنجا در متن قرار گرفت.