summaryrefslogtreecommitdiff
path: root/bridges/IvooxBridge.php
diff options
context:
space:
mode:
Diffstat (limited to 'bridges/IvooxBridge.php')
-rw-r--r--bridges/IvooxBridge.php128
1 files changed, 128 insertions, 0 deletions
diff --git a/bridges/IvooxBridge.php b/bridges/IvooxBridge.php
new file mode 100644
index 0000000..3cdf74b
--- /dev/null
+++ b/bridges/IvooxBridge.php
@@ -0,0 +1,128 @@
+<?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 = array(
+ 'Search result' => array(
+ 's' => array(
+ 'name' => 'keyword',
+ 'exampleValue' => 'test'
+ )
+ )
+ );
+
+ private function ivBridgeAddItem(
+ $episode_link,
+ $podcast_name,
+ $episode_title,
+ $author_name,
+ $episode_description,
+ $publication_date,
+ $episode_duration) {
+ $item = array();
+ $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)
+ or returnServerError('Could not request ' . $url_feed);
+ $this->ivBridgeParseHtmlListing($dom);
+
+ // restore locale
+
+ foreach($originalLocales as $localeSetting) {
+ if(strpos($localeSetting, '=') !== false) {
+ list($category, $locale) = explode('=', $localeSetting);
+ } else {
+ $category = LC_ALL;
+ $locale = $localeSetting;
+ }
+
+ setlocale($category, $locale);
+ }
+ }
+}