Агрегатор подкастов на PHP в 10 строчек

23.6.2015 - 2748 просмотров ;)

Я решил уйти с pipes.yahoo потому то они меня и без того вышвырнули.
Было принято решение написать собственный аналог агрегатора подкастов.

Задача такая:
Нужно было из кучи подкаст лент сгенерить одну RSS ленту.

Для реализации я воспользовался PHP + SimplePie.
SimplePie — это библиотека для работы с RSS.

Сначала я вообще думал обойтись регулярками, что было бы не так сильно и страшно как кажеться, однако совесть не позволила такого допустить.

Итак по шагам, подключаем злосчастный SimplePie:
include_once('autoloader.php');

Кстати надо сказать, что что бы SimplePie заработал как надо, нужно рядом с нашим файликом положить папку library и создать папку cache с правами 777. Соответственно файл autoload.php от simplepie будет лежать рядом с нашим. Это неверное решение конечно, но проект у меня 10 строчный так что заморачиваться не будем.

Открываем объект:
$feed = new SimplePie();

Заполняем фиды:

$feed->set_feed_url(array(
'http://maxim.podfm.ru/runetologia/rss/',
'http://feeds.feedburner.com/pirate-radio-t',
'http://feeds.rucast.net/radio-t',
...

Подгрузим 3 шаблончика для формирования нашей RSS (шапка, футер и шаблон отдельного item)

$tpl_header = file_get_contents("header_template.xml");
$tpl_footer = file_get_contents("footer_template.xml");
$tpl_item = file_get_contents("item_template.xml");

еще 3 строчки которые для нас практически бесполезны:

$feed->set_cache_duration (600);
$success = $feed->init();
$feed->handle_content_type();

Покажем Шапку от нашей RSS:
echo $tpl_header;

А вот основной код, который формирует каждый item, работает так:
происходит цикл по всем записям, записи уже отсортированы автоматически благодаря SimplePie. Происходит проверка на общее количество записей и проверка есть ли в записи подкаст вообще, если есть подкаст,то из шаблона $tpl_item происходит замена строчек на реальные данные из лент.

Код:
if ($success) {
$itemlimit=0;
foreach($feed->get_items() as $item) {
if ($itemlimit==60) { break; }
$enclosure = $item->get_enclosure();
if ($enclosure->get_link() != ""){
// дадим только если есть mp3
$itemXML = str_replace('[title]', decodeHtmlEnt($item->get_title()), $tpl_item );
$itemXML = str_replace('[link]', $item->get_permalink(), $itemXML );
$itemXML = str_replace('[guid]', $item->get_permalink(), $itemXML );
$itemXML = str_replace('[pubDate]', $item->get_date("D, d M Y H:i:s O"), $itemXML );
$itemXML = str_replace('[content]', decodeHtmlEnt($item->get_content()), $itemXML );
$itemXML = str_replace('[url]', $enclosure->get_link(), $itemXML );
$itemXML = str_replace('[length]', $enclosure->get_length(), $itemXML );
echo $itemXML;
}
$itemlimit = $itemlimit + 1;
}
}

Единственное что тут будет не ясно это что это за функция: decodeHtmlEnt. Ее можно даже и выкинуть и должно работать, однако с ней мир лучше, она преобразует цифровые HTML значения типа & # 1045 ; в соответствующие символы.

Код функции взят из PHP.net и приложен, он тоже 10 строчек.

Осталось выкинуть футер и все:

echo $tpl_footer;

Шаблоны и сам код прилагаю в архиве..

А Зачем агрегировать подкасты в одну ленту ?
Потому что так мне удобнее. Не нужно вглядываться в каждую ленту. Агрегатор сам подберет и аккуратно положит в единственную ленту все подкасты в порядке очереди.

Статьи из раздела, Видеочат рулетка