مقدمه

سریال یا بازی که میخوام دانلود کنم باید چندین فایل پشتسر هم و به ترتیب دانلود بشه. الگوی لینک دانلودشون هم مشابه همه و فقط در یک شماره که ترتیب رو مشخص میکنه با هم تفاوت دارن. مثلاً:
https://example.com/Better.Call.Saul.S05E01.mkv
https://example.com/Better.Call.Saul.S05E02.mkv
https://example.com/Better.Call.Saul.S05E03.mkv
...
https://example.com/Better.Call.Saul.S05E10.mkv
میخوام خیلی سریع و ساده همهٔ فایلها رو دانلود کنم. راه حل اصولیش اینه که بشینیم یک اسکریپت بنویسیم که url بگیره، صفحه رو scrape، لینکهای دانلود رو استخراج و دانلود کنه. قطعاً کلی ابزار آماده هم برای این کار وجود داره. ولی از اونجایی که حوصلهٔ اسکریپتنویسی و تمایل استفاده از ابزارهای دیگه رو ندارم، دوست دارم با ابزارهای سادهٔ گنو این کار رو انجام بدم. تنها کاری که باید بکنیم اینه که تمامی لینکها رو به ترتیب شمارشون تولید کنیم. بعدش میشه با ابزاری مثل wget
[۱] به راحتی دانلودشون کرد.
ایدهٔ اولیه: استفاده از brace expantion
اولین چیزی که به ذهنم رسید استفاده از brace expantion [۲] برای تولید لینکها بود (چون شمارهٔ لینکها zero pad هستن 01
گذاشتم. همچنین از اونجایی که echo
از کاراکتر فاصله برای جدا کردن خروجی استفاده میکنه، یک پردازش نهایی با tr
هم لازمه):
> echo https://example.com/Better.Call.Saul.S05E{01..10}.mkv | tr ' ' "\n"
https://example.com/Better.Call.Saul.S05E01.mkv
https://example.com/Better.Call.Saul.S05E02.mkv
https://example.com/Better.Call.Saul.S05E03.mkv
https://example.com/Better.Call.Saul.S05E04.mkv
https://example.com/Better.Call.Saul.S05E05.mkv
https://example.com/Better.Call.Saul.S05E06.mkv
https://example.com/Better.Call.Saul.S05E07.mkv
https://example.com/Better.Call.Saul.S05E08.mkv
https://example.com/Better.Call.Saul.S05E09.mkv
https://example.com/Better.Call.Saul.S05E10.mkv
همچنین با printf
هم میشه، نیاز به tr
هم نیست.
printf "https://example.com/Better.Call.Saul.S05E%02d.mkv\n" {01..10}
حالا که تونستیم لینکها رو تولید کنیم کافیه با wget
دانلودشون کنیم. بسته به سرور، امکان داره که خطای 403
بگیریم. برای حل این مشکل کافیه یک user-agent
برای wget
تنظیم کنیم.
> wget -P ~/Downloads --user-agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' https://example.com/Better.Call.Saul.S05E{01..10}.mkv | tr ' ' "\n"
کار ما با brace expantion به خوبی راه میافته ولی حین انجام اینکار با دستور seq
هم آشنا شدم که دونستناش خالی از لطف نیست.
روش دوم: seq
با دستور seq
میتونیم دنبالهای از اعداد تولید کنیم. ویژگی جالبش آرگومان -w
هست که خروجی رو zero pad میکنه.
> seq -w 1 10
01
02
03
04
05
06
07
08
09
10
حالا کافیه for
بزنیم و باقی آدرس لینک دانلود رو بهش بچسبونیم:
for i in $(seq -w 1 10); do
echo "https://example.com/Better.Call.Saul.S05E$i.mkv"
done
https://example.com/Better.Call.Saul.S05E01.mkv
https://example.com/Better.Call.Saul.S05E02.mkv
https://example.com/Better.Call.Saul.S05E03.mkv
https://example.com/Better.Call.Saul.S05E04.mkv
https://example.com/Better.Call.Saul.S05E05.mkv
https://example.com/Better.Call.Saul.S05E06.mkv
https://example.com/Better.Call.Saul.S05E07.mkv
https://example.com/Better.Call.Saul.S05E08.mkv
https://example.com/Better.Call.Saul.S05E09.mkv
https://example.com/Better.Call.Saul.S05E10.mkv
حالا که تونستیم لینکها رو به درستی تولید کنیم، کافیه با wget
دانلودشون کنیم.
for i in $(seq -w 1 10); do
wget -P ~/Downloads "https://example.com/Better.Call.Saul.S05E$i.mkv"
done
بسته به سرور، امکان داره که خطای 403
بگیریم. برای حل این مشکل کافیه یک user-agent
برای wget
تنظیم کنیم.
for i in $(seq -w 1 10); do
wget -P ~/Downloads --user-agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' "https://example.com/Better.Call.Saul.S05E$i.mkv"
done
و تمام؛ همهٔ فایلها به ترتیب دانلود میشن.
مراجع
[۱] https://www.gnu.org/software/wget/
[۲] https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html