RSS-Bridge_rss-bridge/bridges/IvooxBridge.php

137 lines
4.6 KiB
PHP

<?php
/**
* IvooxRssBridge
* Returns the latest search result
* TODO: support podcast episodes list
*/
class IvooxBridge extends BridgeAbstract
{
const NAME = 'Ivoox Bridge';
const URI = 'https://www.ivoox.com/';
const CACHE_TIMEOUT = 10800; // 3h
const DESCRIPTION = 'Returns the 10 newest episodes by keyword search';
const MAINTAINER = 'xurxof'; // based on YoutubeBridge by mitsukarenai
const PARAMETERS = [
'Search result' => [
's' => [
'name' => 'keyword',
'required' => true,
'exampleValue' => 'car'
]
]
];
private function ivBridgeAddItem(
$episode_link,
$podcast_name,
$episode_title,
$author_name,
$episode_description,
$publication_date,
$episode_duration
) {
$item = [];
$item['title'] = htmlspecialchars_decode($podcast_name . ': ' . $episode_title);
$item['author'] = $author_name;
$item['timestamp'] = $publication_date;
$item['uri'] = $episode_link;
$item['content'] = '<a href="' . $episode_link . '">' . $podcast_name . ': ' . $episode_title
. '</a><br />Duration: ' . $episode_duration
. '<br />Description:<br />' . $episode_description;
$this->items[] = $item;
}
private function ivBridgeParseHtmlListing($html)
{
$limit = 4;
$count = 0;
foreach ($html->find('div.flip-container') as $flipper) {
$linkcount = 0;
if (!empty($flipper->find('div.modulo-type-banner'))) {
// ad
continue;
}
if ($count < $limit) {
foreach ($flipper->find('div.header-modulo') as $element) {
foreach ($element->find('a') as $link) {
if ($linkcount == 0) {
$episode_link = $link->href;
$episode_title = $link->title;
} elseif ($linkcount == 1) {
$author_link = $link->href;
$author_name = $link->title;
} elseif ($linkcount == 2) {
$podcast_link = $link->href;
$podcast_name = $link->title;
}
$linkcount++;
}
}
$episode_description = $flipper->find('button.btn-link', 0)->getAttribute('data-content');
$episode_duration = $flipper->find('p.time', 0)->innertext;
$publication_date = $flipper->find('li.date', 0)->getAttribute('title');
// alternative date_parse_from_format
// or DateTime::createFromFormat('G:i - d \d\e M \d\e Y', $publication);
// TODO: month name translations, due function doesn't support locale
$a = strptime($publication_date, '%H:%M - %d de %b. de %Y'); // obsolete function, uses c libraries
$publication_date = mktime(0, 0, 0, $a['tm_mon'] + 1, $a['tm_mday'], $a['tm_year'] + 1900);
$this->ivBridgeAddItem(
$episode_link,
$podcast_name,
$episode_title,
$author_name,
$episode_description,
$publication_date,
$episode_duration
);
$count++;
}
}
}
public function collectData()
{
// store locale, change to spanish
$originalLocales = explode(';', setlocale(LC_ALL, 0));
setlocale(LC_ALL, 'es_ES.utf8');
$xml = '';
$html = '';
$url_feed = '';
if ($this->getInput('s')) { /* Search modes */
$this->request = str_replace(' ', '-', $this->getInput('s'));
$url_feed = self::URI . urlencode($this->request) . '_sb_f_1.html?o=uploaddate';
} else {
returnClientError('Not valid mode at IvooxBridge');
}
$dom = getSimpleHTMLDOM($url_feed);
$this->ivBridgeParseHtmlListing($dom);
// restore locale
foreach ($originalLocales as $localeSetting) {
if (strpos($localeSetting, '=') !== false) {
[$category, $locale] = explode('=', $localeSetting);
if (! defined($category)) {
continue;
}
$category = constant($category);
} else {
$category = LC_ALL;
$locale = $localeSetting;
}
setlocale($category, $locale);
}
}
}