array( 'program' => array( 'name' => 'Program Name', 'type' => 'text', 'required' => true, ), ), 'Catalog' => array( 'all_pages' => array( 'name' => 'All Pages', 'type' => 'checkbox', 'defaultValue' => false, ), ), ); public function getIcon() { # This should be the favicon served on `self::URI` return 'https://s3.amazonaws.com/unode1/assets/4957/r3T9Lm9LTLmpAEX6FlSA_apple-touch-icon.png'; } public function getURI() { switch ($this->queriedContext) { case 'Program': return self::URI . '/programs/' . $this->getInput('program'); case 'Catalog': return self::URI . '/catalog'; } return parent::getURI(); } public function getName() { switch ($this->queriedContext) { case 'Program': $html = getSimpleHTMLDOMCached($this->getURI()) or returnServerError('Could not load content'); return $html->find('h1.program--title', 0)->innertext; case 'Catalog': return self::NAME . ' | Programas'; } return parent::getName(); } /* This uses the uscreen platform, other sites can adapt this. https://www.uscreen.tv/ */ public function collectData() { switch ($this->queriedContext) { case 'Program': $program = $this->getInput('program'); $html = getSimpleHTMLDOMCached($this->getURI()) or returnServerError('Could not load content'); foreach($html->find('.cce--thumbnails-video-chapter') as $element) { $cid = $element->getAttribute('data-id'); $item['title'] = $element->find('.cce--chapter-title', 0)->innertext; $item['content'] = $element->find('.cce--thumbnails-image-block', 0) . $element->find('.cce--chapter-body', 0)->innertext; $item['uri'] = $this->getURI() . '?cid=' . $cid; /* TODO: Suport login credentials? */ /* # Get direct video URL */ /* $json_source = getContents(self::URI . '/chapters/' . $cid, array('Cookie: _uscreen2_session=???;')) */ /* or returnServerError('Could not request chapter JSON'); */ /* $json = json_decode($json_source); */ /* $item['enclosures'] = [$json->fallback]; */ $this->items[] = $item; } break; case 'Catalog': $json_raw = getContents($this->getCatalogURI(1)) or returnServerError('Could not load catalog content'); $json = json_decode($json_raw); $total_pages = $json->total_pages; foreach($this->parseCatalogPage($json) as $item) { $this->items[] = $item; } if ($this->getInput('all_pages') === true) { foreach(range(2, $total_pages) as $page) { $json_raw = getContents($this->getCatalogURI($page)) or returnServerError('Could not load catalog content (all pages)'); $json = json_decode($json_raw); foreach($this->parseCatalogPage($json) as $item) { $this->items[] = $item; } } } break; } } private function getCatalogURI($page) { return self::URI . '/catalog.json?page=' . $page; } private function parseCatalogPage($json) { $items = array(); foreach($json->records as $record) { $item = array(); $item['title'] = $record->title; $item['content'] = $record->description . '
Duration: ' . $record->duration . '
'; $item['timestamp'] = strtotime($record->release_date); $item['uri'] = self::URI . $record->url; $item['enclosures'] = array( $record->main_poster, ); $items[] = $item; } return $items; } }