2019-03-22 23:33:46 +03:00
|
|
|
<?php
|
2022-07-01 16:10:30 +03:00
|
|
|
|
2019-03-22 23:33:46 +03:00
|
|
|
/**
|
|
|
|
* IvooxRssBridge
|
|
|
|
* Returns the latest search result
|
|
|
|
* TODO: support podcast episodes list
|
|
|
|
*/
|
2022-07-01 16:10:30 +03:00
|
|
|
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) {
|
Fix coding style missed by phpbcf (#2901)
$ composer require --dev friendsofphp/php-cs-fixer
$ echo >.php-cs-fixer.dist.php "<?php
$finder = PhpCsFixer\Finder::create()
->in(__DIR__);
$rules = [
'@PSR12' => true,
// '@PSR12:risky' => true,
'@PHP74Migration' => true,
// '@PHP74Migration:risky' => true,
// buggy, duplicates existing comment sometimes
'no_break_comment' => false,
'array_syntax' => true,
'lowercase_static_reference' => true,
'visibility_required' => false,
// Too much noise
'binary_operator_spaces' => false,
'heredoc_indentation' => false,
'trailing_comma_in_multiline' => false,
];
$config = new PhpCsFixer\Config();
return $config
->setRules($rules)
// ->setRiskyAllowed(true)
->setFinder($finder);
"
$ vendor/bin/php-cs-fixer --version
PHP CS Fixer 3.8.0 BerSzcz against war! by Fabien Potencier and Dariusz Ruminski.
PHP runtime: 8.1.7
$ vendor/bin/php-cs-fixer fix
$ rm .php-cs-fixer.cache
$ vendor/bin/php-cs-fixer fix
2022-07-08 14:00:52 +03:00
|
|
|
[$category, $locale] = explode('=', $localeSetting);
|
2022-08-06 23:46:49 +03:00
|
|
|
if (! defined($category)) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
$category = constant($category);
|
2022-07-01 16:10:30 +03:00
|
|
|
} else {
|
|
|
|
$category = LC_ALL;
|
|
|
|
$locale = $localeSetting;
|
|
|
|
}
|
|
|
|
|
|
|
|
setlocale($category, $locale);
|
|
|
|
}
|
|
|
|
}
|
2019-03-22 23:33:46 +03:00
|
|
|
}
|