Как стать автором
Обновить

Парсер RSS на bash для Лостфильма: щадящий режим для RSS сервера, проверка скачанного

Время на прочтение3 мин
Количество просмотров5.9K
Доброго времени суток!
Когда-то, благодаря этому топику, был написан неплохой парсер для Лостфильма. Сейчас я хотел бы поделиться собственной доработкой скрипта, связанной с изменением формата ссылок на Лостфильме, добавлением проверки на обновление ленты и проверки скачанного.

Прежде всего, что-бы снизить нагрузку на RSS сервер, при запросе ленты с помощью wget нужно использовать «If-Modified-Since:». Тогда, при отсутствии обновлений, мы не будем качать и обрабатывать всю ленту. Такой подход снизит нагрузку на сервер (и немного на наш компьютер).
Используем следующий вариант команды:

# Подготовка заголовка If-Modified-Since
lastmod="$( grep -m 1 Last-Modified response.out )"

header="If-Modified-Since:"${lastmod#*:}


В файле response.out хранится последний ответ RSS сервера.
С помощью ${lastmod#*:} из найденной в последнем ответе сервера строки Last-Modified отрезаем все ненужное до ":".

Заголовок готов, теперь создадим фильтры для поиска нужных сериалов:

movies='House.M.D|IT.Crowd|Persons.Unknown|Legend.of.the.Seeker|Leverage|Warehouse.13|Futurama'

quality='\.720p\.|\.HD\.|Persons.Unknown|Legend.of.the.Seeker|IT.Crowd'

movies содержит список скачиваемых сериалов. Но на Лостфильме они обычно выходят в двух версиях качества, а я лично стараюсь качать все в высоком качестве. Значит нужен дополнительный фильтр — quality. Но не все сериалы выходили в 720p или HD, поэтому добавим их в конец фильтра что-бы они могли тоже пройти проверку на качество!

С фильтрами закончили, переходим к обработке ленты. В топике, упомянутом мной в начале, очень подробно рассматривается составление регулярных выражений для фильтров и опции команды wget, поэтому я их опускаю.
В команде используется заготовленный header и ответ сервера сохраняется тут же в response.out. Кстати, если response.out отсутствует (первый запуск или принудительное обновление) то ничего страшного не произойдет.

wget -vS -O - --header="$header" www.lostfilm.tv/rssdd.xml -o response.out | grep -ioe "http.*torrent" | egrep -i "$movies" | egrep "$quality" | while read link;
do
# заменяем в ссылке "&" на "&"
link="${link/&/&}"

Для удобства, сохраним отдельно имя торрента (отрезав все до "&"). Оно нам понадобится для проверки скачанного и сохранения файла торрента.
name="${link#*&}"

Теперь проверяем по имени присутствие файла в директории скачанного. Если такого файла нет, качаем по ссылке и сохраняем с этим именем. Потом (опционально) копируем в auto-load directory нашего клиента.
# скачанные файлы хранятся в ./Downloaded, для истории
if [ ! -e Downloaded/$name ]
then
wget -q --header "Cookie: uid=123456; pass=xxxxxxxxxxxx; usess=xxxxxxxxxxx" $link -O "Downloaded/$name"
cp "$name" "$path_to_your_autoload_dir/$name"
fi
done

Cookie для Лостфильма можно выдрать из любого браузера загуглив, а параметр usess находится в вашем профиле на www.lostfilm.tv

Вот полная версия моего скрипта:

#!/bin/bash

cd $your/rssdownloader/dir

# Подготовка заголовка If-Modified-Since
lastmod="$( grep -m 1 Last-Modified response.out )"

# Создаем header
header="If-Modified-Since:"${lastmod#*:}

# Фильтр сериалов
movies='House.M.D|IT.Crowd|Persons.Unknown|Legend.of.the.Seeker|Leverage|Warehouse.13|Futurama'

# Фильтр качества
quality='\.720p\.|\.HD\.|Persons.Unknown|Legend.of.the.Seeker|IT.Crowd'

wget -vS -O - --header="$header" http://www.lostfilm.tv/rssdd.xml -o response.out | grep -ioe "http.*torrent" | egrep -i "$movies" | egrep "$quality" | while read link;
do
  link="${link/&/&}"
  name="${link#*&}"

# скачанные файлы хранятся в ./Downloaded, для истории
  if [ ! -e Downloaded/$name ]
  then
    wget -q --header "Cookie: uid=123456; pass=xxxxxxxxxxxx; usess=xxxxxxxxxxx" $link -O "Downloaded/$name"
    cp "Downloaded/$name" "$path_to_your_autoload_dir/$name"
  fi
done

Спасибо за внимание!
P.S.: Сознаю что код далек от идеала, буду рад принять советы по улучшению!

Update: Думаю что теперь, со всеми поправками, данный скрипт можно назвать RTM. Спасибо всем кто участвовал в доведении его до ума, особенно GreyCat с его развёрнутыми обьяснениями!

Update 2: При проблемах скачивания ленты wget выдает несколько раз нужную нам строку. Поэтому берем только первый найденный вариант, с помощью ключа " -m 1 " (максимум скачаем лишний раз старую ленту).
lastmod="$( grep -m 1 Last-Modified response.out )"
Теги:
Хабы:
Всего голосов 32: ↑28 и ↓4+24
Комментарии48

Публикации

Истории

Ближайшие события