مقدمه

لینک‌های دانلود فصل ۵ یک سریال
نمونه‌ای از لینک‌های دانلود یک سریال؛ لینک‌ها فقط در یک عدد تفاوت دارند.

سریال یا بازی که می‌خوام دانلود کنم باید چندین فایل پشت‌سر هم و به ترتیب دانلود بشه. الگوی لینک دانلودشون هم مشابه همه و فقط در یک شماره که ترتیب رو مشخص می‌کنه با هم تفاوت دارن. مثلاً:

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