22 февр. 2010 г.

Качаем видео с agata.ru

Так получилось, что отоспался на эти выходные днём. А ночью наконец занялся давно отложенной задачей - вытащить все концертные видео с сайта agata.ru, которые, с некоторых пор, выложены там в формате флеш, причём мне не удалось найти ни один сайт или программу, которые были-бы способны скачать что-то кроме крохотного flashplayer.swf.



Ранее, изучение html кода не позволило мне найти ссылки на видео в явном виде. Оказалось, невнимательно смотрел. Можно было последовательно посмотреть все видеофайлы в браузере, а затем вытащить все из кэша, однако через короткое время файлы оттуда пропадали. Делать жесткие ссылки вручную или, тем более, писать скрипт мне было лень.

Захожу на http://agata.ru/video/epilog-predislovie-minsk.php, внимательно изучаю html-код страницы. Понял, почему я раньше не увидел ссылку на видео - искать надо было не swf, а flv.



agata.ru/video/opium_vid.php:SWFObject("flvplayer.swf","single","350","270","7"); s1.addParam("allowfullscreen","true");
agata.ru/video/opium_vid.php:s1.addVariable("file","/flash/opium_sm.flv"); s1.addVariable("image","");
agata.ru/video/chernaja_luna95.php:
agata.ru/video/epilog-morjak-nijnij_novgorod.php:


Далее необходимо получить все ссылки. Чтобы не тратить время, даю задание wget:
 wget -r -l 2 --no-parent --domains agata.ru --page-requisites --restrict-file-names=windows --no-clobber --limit-rate=50k -w 3 -c   http://agata.ru/video/epilog-predislovie-minsk.php

Что это значит: -r - рекурсивно качать файлы по ссылкам, -l 2 - только до второго уровня вложенности, --no-parent - не забираться вверх по дереву каталогов, --domains  - только для указанного домена, --page-requisites - качать все файлы, необходимые для правильного отображения страницы, --restrict-file-names - для правильной трансляции имен, чтобы они могли быть прочитаны в windows, --no-clobber - не перезаписывать файлы, --limit-rate и -w - чтобы не создавать излишнюю нагрузку на сайт, -c продолжать. Однако, после ошибки, качалка говорит, что файл существует, поэтому rm -rf * и начинаем все сначала.

По правде говоря, была небольшая надежда, что с такими опциями wget сама все вытащит, но она не оправдалась.

Далее долго разбираюсь, как-же вытащить только ссылки в нужном формате. Строки содержат разное количество параметров, поэтому, используя cut и awk в простом виде, ничего не получается. Долго пытаюсь заставить работать sed и awk.  Но, полчаса поиска в гугле и чтения манов дают результат, поражающий своей простотой и наглядностью :)

 grep -PoRh '/flash/.*.*flv' *|awk '{print "http://agata.ru"$1}'

Рассмотрим подробнее:
-P - интерпретировать шаблон, как регулярное выражение perl,
-o - печатать только то, что соответствует регулярному выражению, а не всю строку,
-R - рекурсивно обрабатывать файлы,
-h - не печатать имена файлов.

awk просто подставляет правильное начало строки. Уверен, что можно обойтись и без конвейера.

Voila! Все 76 ссылок автоматически извлечены. Осталось добавить | xargs wget к команде, чтобы скачать все найденное.