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

Добавляем информативности RSS-лентам от RuTracker.org

Время на прочтение 5 мин
Количество просмотров 16K

Введение


В своем первом топике я писал как организовать скачивание избранных раздач с любимого torrent-трекера, не отвлекаясь от чтения новостей. В этом топике будет описан оверкилл-способ, позволяющий еще более упростить процесс получения информации о каждой конкретной раздаче, пришедшей к нам в виде записи RSS-ленты. Как известно, сам по себе RuTracker.org публикует в RSS-ленте только ссылки на соответствующие ветки форума. Никакого описания раздачи элемент ленты не содержит, а хотелось бы иначе.

Предвидя возражения в духе «Хватит изобретать велосипед, лучше возьми готовые RSS. Например, от xpoft.ru» (спасибо egor_bulychev за наводку; без сарказма, правда, спасибо), скажу следующее: инструмент интересный, шустрый, лента с нужным содержимым формируется в несколько кликов мышью. Но, к сожалению, сгенерированные им RSS-ленты не радуют постоянством содержимого элементов: то придет исчерпывающая информация о раздаче, а то только название, да постер. Причем зависимости содержимого ленты от фактического описания раздачи на RuTracker.org выявлено не было. Такой расклад меня не устраивает: хочется и описание почитать, и media-info со скриншотами посмотреть, да еще и не переходя на оригинальную страницу с описанием.

Непосредственно задача


Получить из тела поста на torrent-трекере описание раздачи и добавить его в соответствующий элемент RSS-ленты. Результирующую ленту отдавать в формате RSS. На входе имеем довольно унылую и малоинформативную ленту:

Исходная лента

Инструменты


Состав инструментов будет почти такой же, как и в предыдущей статье, за исключением torrent-клиента.
  • Yahoo Pipes для манипуляций с RSS;
  • Аккаунт в Google Reader (подойдет, впрочем, и любая другая RSS-читалка);
  • Конечно же, время.

Решение


Всего для решения задачи нам понадобятся три пайпа:
  • Преобразователь URL в имя поста на форуме torrent-трекера;
  • «Пайп-потрошитель» для добычи полезной информации из топиков;
  • Основной пайп, производящий обработку исходной RSS-ленты.
Можно создать их вручную и неплохо прокачать навык использования Yahoo Pipes, можно быстро и безболезненно клонировать мои и допилить их под себя, можно (для самых ленивых) использовать пайпы, созданные мной без каких либо изменений. Всем, кроме тех, кому по душе первый вариант, можно смело пропускать следующие три пункта и читать сразу инструкцию по применению и ссылки. Нелюбителям же простых путей расскажу обо всем по порядку.

Пайп №1: Преобразователь URL в имя поста

Без этого пайпа можно было бы и обойтись, если бы не одна особенность работы Yahoo Pipes с кириллическими наборами символов. Не буду говорить за все, но RSS-лента от RuTracker.org в процессе обработки превращается в совершенно нечитаемую абракадабру. Для получения нормального названия раздачи нам этот пайп и понадобится. Непосредственно в Yahoo Pipes нет инструмента для работы с кодировками, так что придется прокладывать обходной путь.

URL2NameConvernter

Здесь все просто: запрашиваем при помощи блока URL Input (сюрприз!) URL топика, блоком Fetch Page выдергиваем название раздачи из тега
<title></title>
и убираем из него все лишнее при помощи блока Regex и шаблона
<title>(.+)::.+

Ссылка на готовый пайп — http://pipes.yahoo.com/ivopupkin/url2nameconv

Пайп №2: Pipe The Ripper

Делает основную работу по извлечению полезной информации из топика-описания раздачи.

Pipe The Ripper

Самое сложное — правильно выбрать границы полезной информации и отбросить лишнее. В остальном — так же все просто: блок для ввода URL топика, передающий его в блок Fetch Page. Границы полезной информации для себя я определил следующие:
<div class="post_body" id="
и
<legend>Download</legend>
соответственно, начало и конец. Они почти соответствуют границам первого сообщения в теме форума.

На этом бы и перейти к следующему этапу, но, т.к. разметка топика достаточно специфична, в таком виде он представляет мало ценности: браузер покажет нам только текст. Для нормального отображения рисунков и служит последний Regex-блок, заменяющий разметку RuTracker.org
<var class="postImg" title="([^"]+)">
на понятную браузеру без дополнительных танцев с бубном
<img src="$1">
для основной массы изображений и с
<var class="postImg.+" title="([^"]+)">
на
<img src="$1">
для титульного изображения.

Ссылка на готовый пайп — http://pipes.yahoo.com/ivopupkin/pipetheripper

Пайп №3: Основной

Он и будет делать для нас всю грязную работу. А именно: запрашивать URL исходной ленты, получать список ее элементов, выполнять дочерние пайпы, окончательно формировать названия элементов и создавать результирующую ленту.

URL Input & Fetch Feed
С первыми двумя блоками все ясно и без разъяснений: URL Input запрашивает у пользователя URL RSS-ленты, а Fetch Feed подгружает саму ленту.

Rename
Следующий за ними блок Rename служит для предварительного формирования признака «Обновлено» для раздачи и отдельного поля с размером раздачи. Нужно это для обхода проблем с кодировкой исходной RSS-ленты, описанной выше.

Regex
Затем при помощи блока Regex мы проделываем сразу несколько действий (обратите внимание на поля, в которых происходят замены):
  • Из «обрезанной» ссылки на топик с раздачей получаем полноценный URL, заменив текст по шаблону (.+) на строку http://rutracker.org/forum/$1;
  • Удалим ненужную информацию из поля item.isupdated, заменив абракадабру ^(\[Îáíîâëåíî\])*.+ на шаблон $1;
  • Пусть криво, но поборем проблему с перекодированием символов, выполнив замену по шаблону \[Îáíîâëåíî\] на текст \[Обновлено\];
  • Получим размер раздачи в отдельном поле заменой .+\[(.+)\]$ на $1.
Loop 1&2
Блоками Loop и соответствующими дочерними пайпами (в качестве входного параметра, сообщив им значение item.link) обновляем для всей ленты заголовок и содержимое. Результат сохраняем в полях item.title и item.description соответственно.

Loop 3
В следующем блоке Loop+String Builder окончательно формируем заголовок элемента ленты, содержащий информацию об обновлении раздачи и ее размер. Сохраняем его в каком-нибудь поле. Например, в item.title.content.

Create RSS
Ну и наконец из той кучи данных, что скопилась у нас к этому моменту формируем стройную RSS-ленту при помощи блока Create RSS, вывод которого связываем с Pipe Output.

Ссылка на готовый пайп — http://pipes.yahoo.com/ivopupkin/rutrackerrssexpander

Инструкция по применению


Все просто как дважды два:
  • Открываем основной пайп;
  • Скармливаем ему ссылку на ленту с RuTracker.org;
  • Запускаем пайп на выполнение;
  • Кнопкой Get as RSS получаем ссылку на RSS-ленту с желанной информацией о раздачах.
Готовая лента

Содержимое, конечно, чуть взъерошено, но все же пригодно для оценки раздач. Чтение, как вы уже наверное догадались, возможно в любом RSS-ридере.
При желании и достаточной сноровке можно в одну результирующую ленту упаковывать сразу несколько RSS-лент с RuTracker.org. Для этого достаточно в основном пайпе на каждую входящую ленту создать свою пару блоков URL Input и Fetch Feed, результат работы которых объединить блоком Union. Дальнейшие операции изменения не потребуют.

Вместо заключения


Я показал, как при помощи несложных манипуляций преобразить интересную, но чем-то не устраивающую нас RSS-ленту. Подобным образом можно как редактировать уже существующие RSS-ленты, так и создавать свои на основе данных с произвольных страниц. Более того, при помощи Yahoo Pipes возможно превращать элементы, находящиеся на произвольной странице в элементы RSS-ленты (например, так можно отслеживать появление новых тем на форуме или их обновление). Примечательно, что для этого нет необходимости обладать серьезными навыками в программировании, а также настраивать и содержать необходимую инфраструктуру.

Ссылки

.
Теги:
Хабы:
+37
Комментарии 14
Комментарии Комментарии 14

Публикации

Истории

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

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн