<?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);
		}
	}
}
