public function gen_afterPageBuild(X_Page_ItemList_PItem $list, Zend_Controller_Action $controller)
 {
     if (!$this->isDefaultRenderer()) {
         return;
     }
     X_Debug::i("Plugin triggered");
     $request = $controller->getRequest();
     $responseType = 'u:BrowseResponse';
     $num = count($list->getItems());
     if ($this->request['browseflag'] == 'BrowseMetadata') {
         $parentID = $this->_getParent($controller->getRequest());
         $item = new X_Page_Item_PItem('fake-item', "Container");
         $item->setLink(array_merge(array('controller' => $controller->getRequest()->getControllerName(), 'action' => $controller->getRequest()->getActionName()), $controller->getRequest()->getParams()));
         $item->setDescription("Fake description");
         $didl = X_Upnp::createMetaDIDL($item, $parentID, $num, $controller->getRequest()->getControllerName(), $controller->getRequest()->getActionName(), $controller->getRequest()->getParam('p', 'null'));
     } elseif ($this->request['browseflag'] == 'BrowseDirectChildren') {
         $parentID = $this->request['objectid'];
         $didl = X_Upnp::createDIDL($list->getItems(), $parentID, $num, $controller->getRequest()->getControllerName(), $controller->getRequest()->getActionName(), $controller->getRequest()->getParam('p', 'null'));
     }
     $xmlDIDL = $didl->saveXML();
     X_Debug::i("DIDL response: {$xmlDIDL}");
     // Build SOAP-XML reply from DIDL-XML and send it to upnp device
     $domSOAP = X_Upnp::createSOAPEnvelope($xmlDIDL, $num, $num, $responseType, $parentID);
     $soapXML = $domSOAP->saveXML();
     // turn off viewRenderer and Layout, add Content-Type and set response body
     $this->_render($soapXML, $controller);
 }
 private function _prepareVideo(X_Page_ItemList_PItem $items, Zend_Gdata_Media_Feed $feed, $locationPrefix)
 {
     foreach ($feed as $yvideo) {
         /* @var $yvideo Zend_Gdata_YouTube_VideoEntry */
         if ($yvideo->getVideoDuration() == 0) {
             continue;
         }
         // no duration = no video
         $item = new X_Page_Item_PItem('youtube-video-' . $yvideo->getVideoId(), $yvideo->getVideoTitle() . ' [' . X_Env::formatTime($yvideo->getVideoDuration()) . ']');
         $thumb = $yvideo->getVideoThumbnails();
         @($thumb = $thumb[0]['url']);
         $item->setDescription($yvideo->getVideoDescription())->setType(X_Page_Item_PItem::TYPE_ELEMENT)->setIcon('/images/youtube/icons/video.png')->setThumbnail($thumb)->setCustom(__CLASS__ . ':location', "{$locationPrefix}/{$yvideo->getVideoId()}")->setLink(array('action' => 'mode', 'l' => X_Env::encode("{$locationPrefix}/{$yvideo->getVideoId()}")), 'default', false)->setGenerator(__CLASS__);
         $items->append($item);
     }
 }
 /**
  * Fetch videos in $category and $itemPage
  */
 protected function fetchVideos(X_Page_ItemList_PItem $items, $catPage, $category, $itemPage)
 {
     // FIXME we shouldn't use paginator. We could use db for pagination
     // it's faster
     $videos = Application_Model_VideosMapper::i()->fetchByCategory($category);
     $totalPageCount = $this->helpers()->paginator()->getPages($videos);
     if ($this->helpers()->paginator()->hasPrevious($videos, $itemPage)) {
         $item = new X_Page_Item_PItem($this->getId() . '-previousvidpage', X_Env::_("p_onlinelibrary_previouspage", $itemPage - 1, $totalPageCount));
         $item->setType(X_Page_Item_PItem::TYPE_CONTAINER)->setCustom(__CLASS__ . ':location', "{$catPage}/" . X_Env::encode($category) . "/" . ($itemPage - 1))->setLink(array('l' => X_Env::encode("{$catPage}/" . X_Env::encode($category) . "/" . ($itemPage - 1))), 'default', false);
         $items->append($item);
     }
     foreach ($this->helpers()->paginator()->getPage($videos, $itemPage) as $video) {
         /* @var $video Application_Model_Video */
         $item = new X_Page_Item_PItem($this->getId() . '-' . $video->getId(), $video->getTitle() . " [" . ucfirst($video->getHoster() . "]"));
         $item->setIcon("/images/icons/hosters/{$video->getHoster()}.png")->setType(X_Page_Item_PItem::TYPE_ELEMENT)->setCustom(__CLASS__ . ':location', "{$catPage}/" . X_Env::encode($category) . "/{$itemPage}/" . $video->getId())->setLink(array('action' => 'mode', 'l' => X_Env::encode("{$catPage}/" . X_Env::encode($category) . "/{$itemPage}/" . $video->getId())), 'default', false);
         if (trim($video->getDescription()) != '') {
             $item->setDescription(trim($video->getDescription()));
         }
         if (trim($video->getThumbnail()) != '') {
             $item->setThumbnail(trim($video->getThumbnail()));
         }
         $items->append($item);
     }
     if ($this->helpers()->paginator()->hasNext($videos, $itemPage)) {
         $item = new X_Page_Item_PItem($this->getId() . '-previousvidpage', X_Env::_("p_onlinelibrary_nextpage", $itemPage + 1, $totalPageCount));
         $item->setType(X_Page_Item_PItem::TYPE_CONTAINER)->setCustom(__CLASS__ . ':location', "{$catPage}/" . X_Env::encode($category) . "/" . ($itemPage + 1))->setLink(array('l' => X_Env::encode("{$catPage}/" . X_Env::encode($category) . "/" . ($itemPage + 1))), 'default', false);
         $items->append($item);
     }
 }
 private function _fetchVideos(X_Page_ItemList_PItem $items, $letter, $thread)
 {
     X_Debug::i("Fetching videos for {$letter}/{$thread}");
     $baseUrl = $this->config('base.url', 'http://www.jigoku.it/anime-streaming/');
     $baseUrl .= "{$thread}";
     $htmlString = $this->_loadPage($baseUrl, true);
     $dom = new Zend_Dom_Query($htmlString);
     // xpath index stars from 1
     $results = $dom->queryXpath('//div[@class="elenco"]//td[@class="serie"]/a');
     X_Debug::i("Links found: " . $results->count());
     //$found = false;
     for ($i = 0; $i < $results->count(); $i++, $results->next()) {
         $current = $results->current();
         $label = trim(trim($current->textContent), chr(0xc2) . chr(0xa0));
         if ($label == '') {
             $label = X_Env::_('p_jigoku_nonamevideo');
         }
         $href = $current->getAttribute('href');
         // href format: /anime-streaming/b-gata-h-kei/8306/episodio-2/
         @(list(, , $epId, $epName) = explode('/', trim($href, '/')));
         // works even without the $epName
         $href = "{$epId}:{$epName}";
         //$found = true;
         X_Debug::i("Valid link found: {$href}");
         $item = new X_Page_Item_PItem($this->getId() . "-{$label}", $label);
         $item->setIcon('/images/icons/folder_32.png')->setType(X_Page_Item_PItem::TYPE_ELEMENT)->setCustom(__CLASS__ . ':location', "{$letter}/{$thread}/{$href}")->setLink(array('action' => 'mode', 'l' => X_Env::encode("{$letter}/{$thread}/{$href}")), 'default', false);
         if (APPLICATION_ENV == 'development') {
             $item->setDescription("{$letter}/{$thread}/{$href}");
         }
         $items->append($item);
     }
     /*
     if (!$found) {
     	$item = new X_Page_Item_PItem($this->getId().'-ops', X_Env::_('p_animedb_opsnovideo'));
     	$item->setType(X_Page_Item_PItem::TYPE_ELEMENT)
     		->setLink(X_Env::completeUrl(
     			//$urlHelper->url()
     		));
     	$items->append($item);
     }
     */
 }
 private function _fetchVideos(X_Page_ItemList_PItem $items, $sortType, $subType, $page, $serie, $thread)
 {
     X_Debug::i("Fetching videos for {$sortType}/{$subType}/{$page}/{$serie}/{$thread}");
     $url = $this->config('index.video.url', 'http://www.icefilms.info/membersonly/components/com_iceplayer/video.php?vid=') . $thread;
     $htmlString = $this->_loadPage($url);
     //$htmlString = str_replace(array("\n", "\r", "\t", chr(0xC2), chr(0xA0), chr(157)), '', $htmlString);
     X_Debug::i($htmlString);
     $catPattern = '/(*ANY)<div class\\=ripdiv><b>([^\\<]+)<\\/b>/';
     //$urlPattern = '/url\=http\:\/\/www.megaupload.com\/\?d\=([^\&]+)&([^\>]+)>([^\<]+)</';
     $urlPattern = '/onclick\\=\\\'go\\(([0-9]+)\\)\\\'\\>([^\\<]+)</';
     $matches = array();
     $links = array();
     if (preg_match_all($catPattern, $htmlString, $matches, PREG_OFFSET_CAPTURE)) {
         for ($i = 0; $i < count($matches[0]); $i++) {
             //$links[$matches[1][$i][0]] = array();
             $catLabel = $matches[1][$i][0];
             if (array_key_exists($i + 1, $matches[0])) {
                 if (!preg_match_all($urlPattern, substr($htmlString, $matches[0][$i][1], $matches[0][$i + 1][1] - $matches[0][$i][1]), $lMatches, PREG_SET_ORDER)) {
                     X_Debug::e("Pattern failure: {$urlPattern}");
                     continue;
                 }
             } else {
                 if (!preg_match_all($urlPattern, substr($htmlString, $matches[0][$i][1]), $lMatches, PREG_SET_ORDER)) {
                     X_Debug::e("Pattern failure: {$urlPattern}");
                     continue;
                 }
             }
             //X_Debug::i(var_export($lMatches, true));
             foreach ($lMatches as $lm) {
                 //@list(, $muId, , $label) = $lm;
                 @(list(, $muId, $label) = $lm);
                 // $muId now is a videoId of Icefilms
                 $label = "{$label} ({$catLabel})";
                 //$videoId = self::TYPE_MEGAUPLOAD.":$muId";
                 $videoId = $muId;
                 $item = new X_Page_Item_PItem($this->getId() . "-megaupload", "{$label}");
                 $item->setIcon('/images/icons/file_32.png')->setType(X_Page_Item_PItem::TYPE_ELEMENT)->setCustom(__CLASS__ . ':location', "{$sortType}/{$subType}/{$page}/{$serie}/{$thread}/{$videoId}")->setLink(array('action' => 'mode', 'l' => X_Env::encode("{$sortType}/{$subType}/{$page}/{$serie}/{$thread}/{$videoId}")), 'default', false);
                 if (APPLICATION_ENV == 'development') {
                     $item->setDescription("{$sortType}/{$subType}/{$page}/{$serie}/{$thread}/{$videoId}");
                 }
                 $items->append($item);
             }
         }
     } else {
         X_Debug::i("Pattern failure {$catPattern} or no video found");
     }
 }
 /**
  * Fill an X_Page_ItemList_PItem object ($items) with a 
  * simple list of static values
  * @param X_Page_ItemList_PItem $items
  * @param array $menuEntries an array of menu entries, keys are locations and values are label keys 
  * @param string $keyPrefix a string prepended to all items key 
  * @param string $locationPrefix a string prepended to all items location
  * @return X_Page_ItemList_PItem
  */
 static function fillStaticMenu(X_Page_ItemList_PItem $items, $menuEntries = array(), $keyPrefix = '', $locationPrefix = '')
 {
     foreach ($menuEntries as $location => $labelKey) {
         $entry = new X_Page_Item_PItem("{$keyPrefix}-{$location}", X_Env::_($labelKey));
         $entry->setDescription(APPLICATION_ENV == 'development' ? "{$locationPrefix}{$location}" : null);
         $entry->setGenerator(__METHOD__)->setIcon('/images/icons/folder_32.png')->setCustom(__METHOD__ . ":location", "{$locationPrefix}{$location}")->setType(X_Page_Item_PItem::TYPE_CONTAINER)->setLink(array('l' => X_Env::encode("{$locationPrefix}{$location}")), 'default', false);
         $items->append($entry);
     }
     return $items;
 }
 /**
  * Add megavideo id to jdownloader download queue
  * @param string $provider
  * @param string $location
  * @param string $pid
  * @param Zend_Controller_Action $controller
  * @return X_Page_ItemList_PItem
  */
 public function getSelectionItems($provider, $location, $pid, Zend_Controller_Action $controller)
 {
     // we want to expose items only if pid is this plugin
     if ($this->getId() != $pid) {
         return;
     }
     X_Debug::i('Plugin triggered');
     $action = $controller->getRequest()->getParam("{$this->getId()}:action", '');
     /* @var $jdownloader X_VlcShares_Plugins_Helper_JDownloader */
     $jdownloader = $this->helpers('jdownloader');
     // IF action = 'start, stop or pause'
     // execute the action and return confirm, then exit
     if ($action != '') {
         try {
             if ($action == "start") {
                 $jdownloader->sendRawCommand(X_VlcShares_Plugins_Helper_JDownloader::CMD_ACTION_START);
                 $link = new X_Page_Item_PItem($this->getId() . '-started', X_Env::_('p_jdownloader_selection_started'));
                 $link->setType(X_Page_Item_PItem::TYPE_ELEMENT)->setLink(array('action' => 'share', 'pid' => null, "{$this->getId()}:action" => null), 'default', false);
                 return new X_Page_ItemList_PItem(array($link));
             }
             if ($action == "pause") {
                 $jdownloader->sendRawCommand(X_VlcShares_Plugins_Helper_JDownloader::CMD_ACTION_PAUSE);
                 $link = new X_Page_Item_PItem($this->getId() . '-started', X_Env::_('p_jdownloader_selection_paused'));
                 $link->setType(X_Page_Item_PItem::TYPE_ELEMENT)->setLink(array('action' => 'share', 'pid' => null, "{$this->getId()}:action" => null), 'default', false);
                 return new X_Page_ItemList_PItem(array($link));
             }
             if ($action == "stop") {
                 $jdownloader->sendRawCommand(X_VlcShares_Plugins_Helper_JDownloader::CMD_ACTION_STOP);
                 $link = new X_Page_Item_PItem($this->getId() . '-started', X_Env::_('p_jdownloader_selection_stopped'));
                 $link->setType(X_Page_Item_PItem::TYPE_ELEMENT)->setLink(array('action' => 'share', 'pid' => null, "{$this->getId()}:action" => null), 'default', false);
                 return new X_Page_ItemList_PItem(array($link));
             }
         } catch (Exception $e) {
             // connection problems or timeout
             $link = new X_Page_Item_PItem($this->getId() . '-error', X_Env::_('p_jdownloader_selection_error_network'));
             $link->setDescription($e->getMessage());
             $link->setType(X_Page_Item_PItem::TYPE_ELEMENT)->setLink(array('action' => 'share', 'pid' => null, "{$this->getId()}:action" => null), 'default', false);
             return new X_Page_ItemList_PItem(array($link));
         }
     } else {
         // else only confirm the addict
         /* @var $megavideo X_VlcShares_Plugins_Helper_Megavideo */
         $megavideo = $this->helpers('megavideo');
         try {
             $megavideo->getServer();
         } catch (Exception $e) {
             // not loaded location yet
             X_Debug::i("Force location loading");
             $providerObj = X_VlcShares_Plugins::broker()->getPlugins($provider);
             if ($providerObj instanceof X_VlcShares_Plugins_ResolverInterface) {
                 $providerObj->resolveLocation($location);
             }
         }
         $url = null;
         try {
             $url = "http://www.megavideo.com/?v=" . $megavideo->getId();
         } catch (Exception $e) {
             // TODO please, rewrite this piece of code
             // it's really a shame
             // let's try to get the url from the hoster
             try {
                 switch ($provider) {
                     // special cases
                     case 'onlinelibrary':
                         // hoster/id is stored inside db
                         $exploded = explode('/', $location);
                         $exploded = array_pop($exploded);
                         $video = new Application_Model_Video();
                         Application_Model_VideosMapper::i()->find($exploded, $video);
                         $hoster = $video->getHoster();
                         $videoId = $video->getIdVideo();
                         break;
                     default:
                         // we try to get information by location decoding
                         // many plugins use a /-divided location with last param in the format of HOSTER:VIDEOID
                         $exploded = explode('/', $location);
                         $exploded = array_pop($exploded);
                         $exploded = explode(':', $exploded, 2);
                         @(list($hoster, $videoId) = $exploded);
                         break;
                 }
                 // lets search a valid hoster
                 $url = $this->helpers()->hoster()->getHoster($hoster)->getHosterUrl($videoId);
             } catch (Exception $e) {
                 // simply: provider isn't compatible
                 // trying direct download
                 $pObj = X_VlcShares_Plugins::broker()->getPlugins($provider);
                 if ($pObj instanceof X_VlcShares_Plugins_ResolverInterface) {
                     $url = $pObj->resolveLocation($location);
                     if (!X_Env::startWith($url, "http://") && !X_Env::startWith($url, "https://")) {
                         // not valid, revert changes
                         $url = null;
                     }
                 }
             }
         }
         try {
             if ($url === null) {
                 throw new Exception();
             }
             X_Debug::i("Appending {{$url}} to the queue");
             $jdownloader->addLink($url);
             $link = new X_Page_Item_PItem($this->getId() . '-added', X_Env::_('p_jdownloader_selection_added'));
         } catch (Zend_Http_Client_Adapter_Exception $e) {
             // connection problems or timeout
             $link = new X_Page_Item_PItem($this->getId() . '-error', X_Env::_('p_jdownloader_selection_error_network'));
             $link->setDescription($e->getMessage());
         } catch (Exception $e) {
             // wrapper/other error
             X_Debug::e("Trying to add a new download to JDowloader, but location isn't a megavideo url or there is an error");
             $link = new X_Page_Item_PItem($this->getId() . '-error', X_Env::_('p_jdownloader_selection_error_invalid'));
             $link->setDescription($e->getMessage());
         }
         $link->setType(X_Page_Item_PItem::TYPE_ELEMENT)->setLink(array('action' => 'mode', $this->getId() => null, 'pid' => null), 'default', false);
         return new X_Page_ItemList_PItem(array($link));
     }
 }
 private function _fetchVideos(X_Page_ItemList_PItem $items, $resourceType, $pageN, $resourceGroup, $resourceId)
 {
     X_Debug::i("Fetching videos for {$resourceType}, {$pageN}, {$resourceGroup}, {$resourceId}");
     // as first thing we have to recreate the resource url from resourceId
     $url = sprintf(self::URL_BASE, $resourceId);
     $page = X_PageParser_Page::getPage($url, X_PageParser_Parser_StreamingOnlineVideos::instance());
     $this->preparePageLoader($page);
     foreach ($page->getParsed() as $link) {
         $videoId = $link['videoId'];
         $hosterId = $link['hosterId'];
         $videoCode = $link['link'];
         $videoLabel = trim("{$link['label']} [{$link['hosterId']}]");
         //$videoThumb = $link['thumbnail'];
         $item = new X_Page_Item_PItem("{$this->getId()}-hoster-{$hosterId}-{$videoId}", $videoLabel);
         $item->setIcon('/images/icons/file_32.png')->setType(X_Page_Item_PItem::TYPE_ELEMENT)->setCustom(__CLASS__ . ':location', "{$resourceType}/{$pageN}/{$resourceGroup}/{$resourceId}/{$videoCode}")->setLink(array('action' => 'mode', 'l' => X_Env::encode("{$resourceType}/{$pageN}/{$resourceGroup}/{$resourceId}/{$videoCode}")), 'default', false);
         if (APPLICATION_ENV == 'development') {
             $item->setDescription("{$resourceType}/{$pageN}/{$resourceGroup}/{$resourceId}/{$videoCode}");
         }
         /*
         if ( $videoThumb ) {
         	$item->setThumbnail($videoThumb);
         }
         */
         $items->append($item);
     }
 }
 protected function getDisableCacheButton()
 {
     $link = new X_Page_Item_PItem('core-cache-disable', X_Env::_('p_cache_disablebutton', date('d/m/Y H:i', $this->inCache->getCreated())));
     $link->setDescription(X_Env::_('p_cache_disablebutton_desc'))->setType(X_Page_Item_PItem::TYPE_CONTAINER)->setLink(array($this->getId() => '0'), 'default', false);
     return $link;
 }
 private function _fetchVideos(X_Page_ItemList_PItem $items, $resourceType, $resourceGroup, $page, $resourceId)
 {
     X_Debug::i("Fetching videos for {$resourceType}, {$resourceGroup}, {$page}, {$resourceId}");
     // as first thing we have to recreate the resource url from resourceId
     $url = self::URL_BASE;
     // in _fetchResources we converted / in : inside $resourceId and removed the last /
     // so to come back to the real address we have to undo this changes
     $url .= str_replace(':', '/', $resourceId) . '/';
     // now url is something like http://film-stream.tv/01/01/2010/resource-name/
     // loading page
     $htmlString = $this->_loadPage($url);
     // it's useless to execute pattern search in the whole page
     // so we stip from $htmlString only the usefull part
     $mainContentStart = '<div id="maincontent">';
     $mainContentEnd = '<div id="sidebar">';
     $mainContentStart = strpos($htmlString, $mainContentStart);
     if ($mainContentStart === false) {
         $mainContentStart = 0;
     }
     $mainContentEnd = strpos($htmlString, $mainContentEnd, $mainContentStart);
     // substr get a substring of $htmlString from $mainContentStart position to $mainContentEnd position - $mainContentStart position (is the fragment length)
     $htmlString = $mainContentEnd === false ? substr($htmlString, $mainContentStart) : substr($htmlString, $mainContentStart, $mainContentEnd - $mainContentStart);
     // let's define some pattern
     // $ytPattern will try to intercept
     // youtube trailer link
     // <param name="movie" value="http://www.youtube.com/v/VIDEOID?version=3">
     // match[1] = video id
     $ytPattern = '/<param name\\=\\"movie\\" value\\=\\"http\\:\\/\\/www\\.youtube\\.com\\/v\\/([^\\?\\"\\&]+)([^\\>]*)>/';
     $matches = array();
     // first let's search for youtube videos
     if (preg_match_all($ytPattern, $htmlString, $matches, PREG_SET_ORDER)) {
         foreach ($matches as $match) {
             $videoId = self::VIDEO_YOUTUBE . ':' . $match[1];
             $videoLabel = X_Env::_("p_filmstream_video_youtubetrailer");
             $item = new X_Page_Item_PItem("{$this->getId()}-youtube-{$videoId}", $videoLabel);
             $item->setIcon('/images/icons/file_32.png')->setType(X_Page_Item_PItem::TYPE_ELEMENT)->setCustom(__CLASS__ . ':location', "{$resourceType}/{$resourceGroup}/{$page}/{$resourceId}/{$videoId}")->setLink(array('action' => 'mode', 'l' => X_Env::encode("{$resourceType}/{$resourceGroup}/{$page}/{$resourceId}/{$videoId}")), 'default', false);
             if (APPLICATION_ENV == 'development') {
                 $item->setDescription("{$resourceType}/{$resourceGroup}/{$page}/{$resourceId}/{$videoId}");
             }
             $items->append($item);
         }
     } else {
         X_Debug::e("Youtube pattern failure {{$ytPattern}}");
     }
     $matches = array();
     if (preg_match_all('/href\\=\\"(?P<LINK>[^\\"]+)"([^\\>]*)>(?P<LABEL>[^\\<]+)<\\/a>/', $htmlString, $matches, PREG_SET_ORDER)) {
         X_Debug::i(var_export($matches, true));
         foreach ($matches as $match) {
             try {
                 $link = $match['LINK'];
                 $hoster = $this->helpers()->hoster()->findHoster($link);
                 $videoLabel = trim(strip_tags($match['LABEL'])) . " [" . ucfirst($hoster->getId()) . "]";
                 $videoId = "{$hoster->getId()}:{$hoster->getResourceId($link)}";
                 $item = new X_Page_Item_PItem("{$this->getId()}-hoster-{$videoId}", $videoLabel);
                 $item->setIcon('/images/icons/file_32.png')->setType(X_Page_Item_PItem::TYPE_ELEMENT)->setCustom(__CLASS__ . ':location', "{$resourceType}/{$resourceGroup}/{$page}/{$resourceId}/{$videoId}")->setLink(array('action' => 'mode', 'l' => X_Env::encode("{$resourceType}/{$resourceGroup}/{$page}/{$resourceId}/{$videoId}")), 'default', false);
                 if (APPLICATION_ENV == 'development') {
                     $item->setDescription("{$resourceType}/{$resourceGroup}/{$page}/{$resourceId}/{$videoId}");
                 }
                 $items->append($item);
             } catch (Exception $e) {
                 // no hoster for the link, skipped
             }
         }
     } else {
         X_Debug::e("General pattern failure");
     }
 }
 private function _fetchVideos(X_Page_ItemList_PItem $items, $type, $letter, $thread)
 {
     X_Debug::i("Fetching videos for {$type}/{$letter}/{$thread}");
     if ($type == self::TYPE_SERIES_PERGENRE || $type == self::TYPE_SERIES_PERLETTER) {
         return $this->_fetchVideosAPI($items, $type, $letter, $thread);
     }
     $baseUrl = $this->config('base.url', self::BASE_URL);
     // threads for movies have / -> : conversion
     $_thread = str_replace(':', '/', $thread);
     $baseUrl .= "{$type}/{$_thread}";
     $htmlString = $this->_loadPage($baseUrl, true);
     // XPATH doesn't work well. Maybe for kanji inside the page, so i use regex
     $cleaned = stristr(strstr($htmlString, 'Episodes:'), '</table>', true);
     $regexp = "<a\\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\\/a>";
     if (preg_match_all("/{$regexp}/siU", $cleaned, $matches, PREG_SET_ORDER)) {
         //X_Debug::i(var_export($matches, true));
         foreach ($matches as $match) {
             // $match[2] = link address
             // $match[3] = link text
             $label = $match[3];
             if ($label == '') {
                 $label = X_Env::_('p_animeftw_nonamevideo');
             }
             $href = $match[2];
             // href format: http://www.animeftw.tv/videos/baccano/ep-3
             if (X_Env::startWith($href, $this->config('base.url', self::BASE_URL))) {
                 $href = substr($href, strlen($this->config('base.url', self::BASE_URL)));
             }
             // href format: videos/baccano/ep-3
             @(list(, , $epName) = explode('/', trim($href, '/')));
             // works even without the $epName
             $href = $epName;
             //$found = true;
             X_Debug::i("Valid link found: {$href}");
             $item = new X_Page_Item_PItem($this->getId() . "-{$label}", $label);
             $item->setIcon('/images/icons/folder_32.png')->setType(X_Page_Item_PItem::TYPE_ELEMENT)->setCustom(__CLASS__ . ':location', "{$type}/{$letter}/{$thread}/{$href}")->setLink(array('action' => 'mode', 'l' => X_Env::encode("{$type}/{$letter}/{$thread}/{$href}")), 'default', false);
             if (APPLICATION_ENV == 'development') {
                 $item->setDescription("{$type}/{$letter}/{$thread}/{$href}");
             }
             $items->append($item);
         }
     }
 }
 /**
  * Find links using an alternative way
  * @author Valerio Moretti
  */
 private function _parseAlternativeScaper($htmlString, X_Page_ItemList_PItem $items, $category, $letter, $thread)
 {
     //mi suddivido il post in righe
     $htmlRows = explode('<br />', $htmlString);
     /*
     //qua volevo selezionarmi solo il codice del post per rendere il tutto piu' veloce
     //pero' sbaglio qualcosa e non mi funziona
     
     $dom = new Zend_Dom_Query($htmlString);
     $content = $dom->queryXpath('//ol[@id="posts"]/li[1]//div[@class="content"]');
     $htmlPost = $content->current();
     
     $htmlRows = explode('<br />', $htmlPost);
     */
     //analizzo riga per riga
     foreach ($htmlRows as $row) {
         //la mia ignoranza del Xpath e' immensa e questo e' l'unico modo che ho trovato per farlo funzionare
         $row = '<root>' . $row . '</root>';
         $dom = new Zend_Dom_Query($row);
         // xpath index stars from 1
         $results = $dom->queryXpath('//a');
         X_Debug::i("Links found: " . $results->count());
         $found = false;
         $title = '';
         //il testo del primo link della riga
         for ($i = 0; $i < $results->count(); $i++, $results->next()) {
             $current = $results->current();
             $label = trim(trim($current->nodeValue), chr(0xc2) . chr(0xa0));
             if ($label == '') {
                 $label = X_Env::_('p_animedb_nonamevideo');
             }
             if ($title == '') {
                 $title = $label;
             }
             $href = $current->getAttribute('href');
             try {
                 $hoster = $this->helpers()->hoster()->findHoster($href);
             } catch (Exception $e) {
                 // no hoster = no valid href
                 continue;
             }
             $href = "{$hoster->getId()}:{$hoster->getResourceId($href)}";
             $label = $label == $title ? $label : $title . ' | ' . $label;
             $label .= " [" . ucfirst($hoster->getId()) . "]";
             $found = true;
             X_Debug::i("Valid link found: {$href}");
             $item = new X_Page_Item_PItem($this->getId() . "-{$label}", $label);
             $item->setIcon('/images/icons/folder_32.png')->setType(X_Page_Item_PItem::TYPE_ELEMENT)->setCustom(__CLASS__ . ':location', "{$category}/{$letter}/{$thread}/{$href}")->setLink(array('action' => 'mode', 'l' => X_Env::encode("{$category}/{$letter}/{$thread}/{$href}")), 'default', false);
             if (APPLICATION_ENV == 'development') {
                 $item->setDescription("{$category}/{$letter}/{$thread}/{$href}");
             }
             $items->append($item);
         }
     }
 }
 private function _fetchVideos(X_Page_ItemList_PItem $items, $sortType, $subType, $page, $thread)
 {
     X_Debug::i("Fetching videos for {$sortType}/{$subType}/{$page}/{$thread}");
     $url = $this->config('index.video.url', 'http://www.gogocinema.com/movie.php?movie_id=') . $thread;
     $htmlString = $this->_loadPage($url);
     $htmlString = str_replace(array("\n", "\r", "\t", chr(0xc2), chr(0xa0), chr(157)), '', $htmlString);
     //X_Debug::i($htmlString);
     //$megavideoPattern = '/href\=\"http:\/\/megavideo\.com\/\?([^\"]+)\" /';
     //$megavideoPattern = '/<tr bgcolor\=\"#043F6E\"><td>\# ([^\"]+)\<\/td><\/tr><tr><td align\=\"center\"><a style\=\"color\:\#FFFFFF\;\" href\=\"http:\/\/megavideo\.com\/\?([^\"]+)\" target\=\"\_blank\">/';
     //$youtubePattern = '/<tr bgcolor\=\"#043F6E\"><td>\# ([^\"]+)\<\/td><\/tr><tr><td align\=\"center\"><a style\=\"color\:\#FFFFFF\;\" href\=\"http\:\/\/youtube\.com\/watch\?v\=([^\"]+)\" target\=\"\_blank\">/';
     $globalPattern = '/<tr bgcolor\\=\\"#043F6E\\"><td>\\# (?P<label>[^\\"]+)\\<\\/td><\\/tr><tr><td align\\=\\"center\\"><a style\\=\\"color\\:\\#FFFFFF\\;\\" href\\=\\"(?P<link>[^\\"]+)\\" target\\=\\"\\_blank\\">/';
     $movietitlePattern = '/<td class\\=\\"movietitle\\" colspan \\= \\"3\\"><a href\\=\\"movie\\.php\\?movie_id=([^\\"]+)\\" style=\\"color\\:\\#E95C24\\;\\">([^\\"]+)<\\/a>/';
     $matches = array();
     if (preg_match($movietitlePattern, $htmlString, $matches)) {
         $movieTitle = "{$matches[2]}: ";
     } else {
         $movieTitle = '';
     }
     $matches = array();
     if (preg_match_all($globalPattern, $htmlString, $matches, PREG_SET_ORDER)) {
         X_Debug::i("Megavideo videos found: " . count($matches));
         X_Debug::i(var_export($matches, true));
         foreach ($matches as $video) {
             //@list(,$label, $videoId) = $video;
             $label = $video['label'];
             $link = $video['link'];
             try {
                 $hoster = $this->helpers()->hoster()->findHoster($link);
                 $label = strip_tags($label) . " [" . ucfirst($hoster->getId()) . "]";
                 //$videoId = self::TYPE_MEGAVIDEO.":$videoId";
                 $videoId = "{$hoster->getId()}:{$hoster->getResourceId($link)}";
                 $item = new X_Page_Item_PItem($this->getId() . "-{$hoster->getId()}", "{$movieTitle}{$label}");
                 $item->setIcon('/images/icons/file_32.png')->setType(X_Page_Item_PItem::TYPE_ELEMENT)->setCustom(__CLASS__ . ':location', "{$sortType}/{$subType}/{$page}/{$thread}/{$videoId}")->setLink(array('action' => 'mode', 'l' => X_Env::encode("{$sortType}/{$subType}/{$page}/{$thread}/{$videoId}")), 'default', false);
                 if (APPLICATION_ENV == 'development') {
                     $item->setDescription("{$sortType}/{$subType}/{$page}/{$thread}/{$videoId}");
                 }
                 $items->append($item);
             } catch (Exception $e) {
                 // no valid hoster for this link
             }
         }
     } else {
         X_Debug::i("Megavideo videos NOT found: " . var_export($matches, true));
         X_Debug::i("No megavideo links found");
     }
     /*
     $matches = array();
     if ( preg_match_all($youtubePattern, $htmlString, $matches, PREG_SET_ORDER) ) {
     	X_Debug::i("Youtube videos found: ".count($matches));
     	
     	foreach ($matches as $video) {
     		
     		@list(,$label,$videoId) = $video;
     		
     		$label = strip_tags($label);
     		$videoId = self::TYPE_YOUTUBE.":$videoId";
     		
     		$item = new X_Page_Item_PItem($this->getId()."-youtube", "$movieTitle$label");
     		$item->setIcon('/images/icons/file_32.png')
     			->setType(X_Page_Item_PItem::TYPE_ELEMENT)
     			->setCustom(__CLASS__.':location', "$sortType/$subType/$page/$thread/$videoId")
     			->setLink(array(
     				'action'	=> 'mode',
     				'l'	=>	X_Env::encode("$sortType/$subType/$page/$thread/$videoId")
     			), 'default', false);
     			
     		if ( APPLICATION_ENV == 'development' ) {
     			$item->setDescription("$sortType/$subType/$page/$thread/$videoId");
     		}
     			
     		$items->append($item);
     		
     	}
     	
     }
     */
 }