Pull to refresh

Парсим RSS LostFilm'a с помощью grep и передаем на закачку через wget

Reading time 4 min
Views 21K
RSS
Однажды мне надоело вручную просматривать LostFilm на наличие новых вышедших серий и я решил автоматизировать этот процесс. Дело в том, что многие BitTorrent клиенты имеют в своих настройках так называемые папки слежения (wach directory). Как только в этой папке появляется новый torrent файл BitTorrent клиент сразу же начинает его загрузку. Обычной практикой, к примеру, является создание такой папки и открытие к ней доступа на запись по FTP. Теперь, все что нам требуется, это автоматизировать скачивание torrent файла по выходу нового эпизода в указанную папку для их дальнейшей автоматической загрузки. Как сделать именно это я сейчас и покажу.

Для справки, папки слежения в Transmission задаются опциями (watch-dir-enabled и watch-dir), а в rTorrent для этого нужно добавить следующую строку в конфигурационный файл:
schedule = watch_directory,5,5,load_start=./watch/*.torrent

Пункт первый

Итак, прежде всего нам нужно получить RSS ленту с LostFilm'a. Для этого воспользуемся командой wget:

wget -qO - http://www.lostfilm.tv/rssdd.xml

здесь: опция "-q" указывает wget не выводить информацию о своей работе, т.е. "быть тихой";
"-O -" заставляет выводить загруженную ленту не в файл, а в поток стандартного вывода. Это сделано для того, чтобы полученные данные можно было передать по конвейеру на вход фильтра grep.

Пункт второй

Теперь нам нужно из полученной ленты выбрать все ссылки на torrent файлы. Для этого мы зададим grep искать подстроки по следующему регулярному выражению: 'http.*torrent'. Тут символ точки обозначает «любой символ» а звездочка — «повторение любое число раз». Т.е. мы найдем все записи начинающиеся с «http» и заканчивающиеся на «torrent» что и будет являться ссылками на torrent файлы. Сама команда выглядит так:

grep -ioe 'http.*torrent'

где "-i" — регистронезависимый поиск,
"-o" — выбирать только совпавшую часть подстроки (сделано для фильтрации тегов что окружают ссылку),
"-e" — поиск по регулярному выражению

Пункт третий

После того, как мы нашли все ссылки на торрент файлы нам нужно выбрать только те, что интересны нам. К примеру мне, нравятся сериалы Lost, House M.D, Lie to me и Spartacus. На их примере я и покажу как производить фильтрацию. Все ссылки на торрент файлы в RSS ленте LostFilm имеют вид:

http://lostfilm.tv/download.php/2030/The.Oscars.The.Red.Carpet.2010.rus.LostFilm.TV.torrent

Таким образом, чтобы выделить названия интересующих меня сериалов я воспользовался следующим регулярным выражением: '[0-9]{4}/(lost|house|lie|spartacus)'. Оно выполняет поиск 4х цифр подряд ("[0-9]{4}", где в фигурных скобочках задано число повторений), вслед за ними символ слеша, и после этого один из четырех вариантов по названию сериала ("(lost|house|lie|spartacus)", где символ "|" читается как ИЛИ). Но, для команды grep служебные символы нужно экранировать с помощью "\". Итого, мы имеем:

grep -ie '[0-9]\{4\}/\(lost\|house\|lie\|spartacus\)'

Пункт четвертый

Теперь у нас на выходе остались только ссылки на torrent файлы интересующих нас сериалов. Теперь нам осталось их загрузить в папку слежения нашего торрент клиента. Но, дело в том, что без авторизации LostFilm не даст скачать файлы. Чтобы можно было скачать файлы нужно вместе с GET запросом передать cookies со сведениями об авторизации. К счастью, команда wget умеет загружать cookies из указанного файла. Посмотрим на вызов wget:

wget -nc -qi - -P ~/.config/watch_dir --load-cookies=~/.config/cookies.txt

где опция "-nc" указывает команде не перезагружать файлы если они уже есть у нас на диске,
"-q" — рассмотренная выше опция, указывает команде "вести себя тихо",
"-i -" — получить список файлов для загрузки со стандартного потока ввода,
"-P ~/.config/watch_dir" — указание нашей папки слежения куда будет произведена загрузка файлов,
"--load-cookies=~/.config/cookies.txt" — использовать cookies из указанного файла.

при этом файл с cookies имеет следующий формат:

.lostfilm.tv TRUE / FALSE 2147483643 pass <ваши данные>
.lostfilm.tv TRUE / FALSE 2147483643 uid <ваши данные>


Обращаю внимание на то, что ни пароль ни uid не не передаются в открытом виде! Их значения можно увидеть открыв окошко просмотра cookies в вашем браузере или же, к примеру, воспользоваться плагином для FireFox для экспорта всех cookies в файл который и следует передать wget'у.

Пункт последний

и теперь все вместе:

wget -qO - http://www.lostfilm.tv/rssdd.xml | grep -ioe 'http.*torrent' | grep -ie '[0-9]\{4\}/\(lost\|house\|lie\|spartacus\)' | wget -nc -qi - -P ~/.config/watch_dir --load-cookies=~/.config/cookies.txt

Пункт финальный :)

Ну и теперь, для окончательной автоматизации, пропишем все это в cron:

*/15 * * * * wget -qO - http://www.lostfilm.tv/rssdd.xml | grep -ioe 'http.*torrent' | grep -ie '[0-9]\{4\}/\(lost\|house\|lie\|spartacus\)' | wget -nc -qi - -P ~/.config/watch_dir --load-cookies=~/.config/cookies.txt > /dev/null 2>&1

где "> /dev/null 2>&1" подавляет вывод команды и тем самым не заставляет cron генерировать вам email с выводом команд.

UPD. Добавил продолжение статьи где рассматривается вопрос с RSS лентами, не имеющими прямых ссылок на torrent файлы.

UPD2. В комментариях справедливо заметили что в данной реализации обращение к серверу происходит каждый раз даже если новых данных на нем и не появилось.

Так, хаброчеловек Nebulosa предложил в своем комментарии «проверку на существования файлов, чтобы wget не дергал каждый раз сервер»,

а Guria, в то же время, рекомендует «дабы не парсить и не грузить одно и тоже, да и сервер почём зря не дёргать следует записывать значение заголовка Last-Modified и передавать его в заголовке If-Modified-Since. Также сервер может поддерживать ETag.»

UPD3. Если возникают трудности с передачей cookies то можно воспользоваться еще одним способом. Для этого следует заменить вызов последней команды wget в конвейере на такой:

wget -nc -qi - -P ~/ --header "Cookie: uid=***; pass=***"
Tags:
Hubs:
+45
Comments 75
Comments Comments 75

Articles