Введение
В своем первом топике я писал как организовать скачивание избранных раздач с любимого torrent-трекера, не отвлекаясь от чтения новостей. В этом топике будет описан
Предвидя возражения в духе «Хватит изобретать велосипед, лучше возьми готовые RSS. Например, от xpoft.ru» (спасибо egor_bulychev за наводку; без сарказма, правда, спасибо), скажу следующее: инструмент интересный, шустрый, лента с нужным содержимым формируется в несколько кликов мышью. Но, к сожалению, сгенерированные им RSS-ленты не радуют постоянством содержимого элементов: то придет исчерпывающая информация о раздаче, а то только название, да постер. Причем зависимости содержимого ленты от фактического описания раздачи на RuTracker.org выявлено не было. Такой расклад меня не устраивает: хочется и описание почитать, и media-info со скриншотами посмотреть, да еще и не переходя на оригинальную страницу с описанием.
Непосредственно задача
Получить из тела поста на torrent-трекере описание раздачи и добавить его в соответствующий элемент RSS-ленты. Результирующую ленту отдавать в формате RSS. На входе имеем довольно унылую и малоинформативную ленту:
Инструменты
Состав инструментов будет почти такой же, как и в предыдущей статье, за исключением torrent-клиента.
- Yahoo Pipes для манипуляций с RSS;
- Аккаунт в Google Reader (подойдет, впрочем, и любая другая RSS-читалка);
- Конечно же, время.
Решение
Всего для решения задачи нам понадобятся три пайпа:
- Преобразователь URL в имя поста на форуме torrent-трекера;
- «Пайп-потрошитель» для добычи полезной информации из топиков;
- Основной пайп, производящий обработку исходной RSS-ленты.
Пайп №1: Преобразователь URL в имя поста
Без этого пайпа можно было бы и обойтись, если бы не одна особенность работы Yahoo Pipes с кириллическими наборами символов. Не буду говорить за все, но RSS-лента от RuTracker.org в процессе обработки превращается в совершенно нечитаемую абракадабру. Для получения нормального названия раздачи нам этот пайп и понадобится. Непосредственно в Yahoo Pipes нет инструмента для работы с кодировками, так что придется прокладывать обходной путь.
Здесь все просто: запрашиваем при помощи блока URL Input (сюрприз!) URL топика, блоком Fetch Page выдергиваем название раздачи из тега
<title></title>и убираем из него все лишнее при помощи блока Regex и шаблона
<title>(.+)::.+
Ссылка на готовый пайп — http://pipes.yahoo.com/ivopupkin/url2nameconv
Пайп №2: 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 запрашивает у пользователя URL RSS-ленты, а Fetch Feed подгружает саму ленту.
Следующий за ними блок Rename служит для предварительного формирования признака «Обновлено» для раздачи и отдельного поля с размером раздачи. Нужно это для обхода проблем с кодировкой исходной RSS-ленты, описанной выше.
Затем при помощи блока Regex мы проделываем сразу несколько действий (обратите внимание на поля, в которых происходят замены):
- Из «обрезанной» ссылки на топик с раздачей получаем полноценный URL, заменив текст по шаблону
(.+)
на строкуhttp://rutracker.org/forum/$1
; - Удалим ненужную информацию из поля item.isupdated, заменив абракадабру
^(\[Îáíîâëåíî\])*.+
на шаблон$1
; - Пусть криво, но поборем проблему с перекодированием символов, выполнив замену по шаблону
\[Îáíîâëåíî\]
на текст\[Обновлено\]
; - Получим размер раздачи в отдельном поле заменой
.+\[(.+)\]$
на$1
.
Блоками Loop и соответствующими дочерними пайпами (в качестве входного параметра, сообщив им значение item.link) обновляем для всей ленты заголовок и содержимое. Результат сохраняем в полях item.title и item.description соответственно.
В следующем блоке Loop+String Builder окончательно формируем заголовок элемента ленты, содержащий информацию об обновлении раздачи и ее размер. Сохраняем его в каком-нибудь поле. Например, в item.title.content.
Ну и наконец из той кучи данных, что скопилась у нас к этому моменту формируем стройную 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-ленты (например, так можно отслеживать появление новых тем на форуме или их обновление). Примечательно, что для этого нет необходимости обладать серьезными навыками в программировании, а также настраивать и содержать необходимую инфраструктуру.