Дуже часто приходиться щось викачувати з інтернету. Утиліта wget, як і всі інші тулзи у лінуксі, має надзвичайно багатий функціонал. Одна з важливих штук це викачування файлів по списку.

У цій статті я зроблю короткий огляд функціоналу який використовую + фікс одного цікавого глюку.

Як завантажити файли зі списку за допомогою wget

Якщо виконати команду wget -h ми побачимо безліч опцій. Ось опис нашої команди:

-i,  --input-file=FILE  download URLs found in local or external FILE.

У перекладі на українську це значить: завантажити УРЛки із локального або зовнішнього файлу.

Для прикладу у вас є файл serial_season_1.txt у якому знаходяться посилання на всі серії першого сезону. Що б їх викачати собі на комп’ютер достатньо запустити ось таку команду:

wget --input-file=serial_season_1.txt

Залишилось чекати, в залежності від швидкості вашого Інтернету. Ще однією з переваг такої штуки це те, що wget завантажує файли у такому порядку, у якому вони були вказані у файлі. Тобто перші серії прилетять до вас самими першими =)

Дозавантаження файлів

wget розумна тулза і шарить дозавантаження файлів. Для того що б кожного разу не починати завантаження з 0 необхідно використовувати опцію --continue.

 -c,  --continue resume getting a partially-downloaded file.

Наша нова команда буде мати вигляд:

wget  --continue --input-file=serial_season_1.txt

Тепер якщо ви зупините завантаження або обірветься інтернет, достатньо запустити команду ще раз і файли докачаються.

Глюк з кирилицею

Все було добре, але якось попався цікавий глюк. Якщо в урл попадаються закодовані символи у назві файлів, тоді wget зберігає їх у якомусь дивному форматі. Або взагалі не зберігає і вилітає з фатальною помилкою.

Cannot write to ‘01_Я+\321%82ак+\321%85о\321%87\321%83.mp3’
(Invalid argument).

Я трохи погуглив, і зрозумів в чому прикол. Так як я php програміст і у мене встановлено php на усіх машинах, я і заюзав можливості цієї мови. Ось рішення моєї проблеми:

download-from-file-list(){
  cat $1|  while read line ; do    
    input=$(echo $line | php -r "echo trim(urldecode(file_get_contents('php://stdin')));")
    output=$(basename "$input");
    echo $output;
    wget --continue "$input"  -O "$output";
  done
}

Використовуємо дуже просто:

download-from-file-list  serial_season_1.txt

Ось фактично і все. Реальні потужності wget наздвичайно великі, це тільки початок.