diff options
author | 2017-02-11 16:16:56 +0100 | |
---|---|---|
committer | 2017-02-12 15:34:08 +0100 | |
commit | 6f24858124c700a8f83f9c2d8fc8ce354f4b4e28 (patch) | |
tree | e24343c80e9c77397c783d42ed9fb83ebde02c8f | |
parent | 22a7666d2b593ac531f9006ac39ee9257611c485 (diff) | |
download | rss-bridge-6f24858124c700a8f83f9c2d8fc8ce354f4b4e28.tar.gz rss-bridge-6f24858124c700a8f83f9c2d8fc8ce354f4b4e28.tar.zst rss-bridge-6f24858124c700a8f83f9c2d8fc8ce354f4b4e28.zip |
bridges: Fix coding styles
This commit is a squash of all commits that fix coding styles
for the new coding style policy.
[ABCTabsBridge] Fix coding style
[AcrimedBridge] Fix coding style
[AllocineFRBridge] Fix coding style
[AnimeUltimeBridge] Fix coding style
[Arte7Bridge] Fix coding style
[AskfmBridge] Fix coding style
[BandcampBridge] Fix coding style
[BastaBridge] Fix coding style
[BlaguesDeMerdeBridge] Fix coding style
[BooruprojectBridge] Fix coding style
[CADBridge] Fix coding style
[CNETBridge] Fix coding style
[CastorusBridge] Fix coding style
[CollegeDeFranceBridge] Fix coding style
[CommonDreamsBridge] Fix coding style
[CopieDoubleBridge] Fix coding style
[CourrierInternationalBridge] Fix coding style
[CpasbienBridge] Fix coding style
[CryptomeBridge] Fix coding style
[DailymotionBridge] Fix coding style
[DanbooruBridge] Fix coding style
[DansTonChatBridge] Fix coding style
[DauphineLibereBridge] Fix coding style
[DeveloppezDotComBridge] Fix coding style
[DemoBridge] Fix coding style
[DilbertBridge] Fix coding style
[DuckDuckGoBridge] Fix coding style
[DollbooruBridge] Fix coding style
[EliteDangerousGalnetBridge] Fix coding style
[ElsevierBridge] Fix coding style
[EstCeQuonMetEnProdBridge] Fix coding style
[EZTVBridge] Fix coding style
[FacebookBridge] Fix coding style
[FeedExpanderExampleBridge] Fix coding style
[FB2Bridge] Fix coding style
[FierPandaBridge] Fix coding style
[FlickrBridge] Fix coding style
[FootitoBridge] Fix coding style
[FourchanBridge] Fix coding style
[FuturaSciencesBridge] Fix coding style
[GBAtempBridge] Fix coding style
[GelbooruBridge] Fix coding style
[GiphyBridge] Fix coding style
[GithubIssueBridge] Fix coding style
[GizmodoBridge] Fix coding style
[GoComicsBridge] Fix coding style
[GooglePlusPostBridge] Fix coding style
[GoogleSearchBridge] Fix coding style
[HDWallpapersBridge] Fix coding style
[HentaiHavenBridge] Fix coding style
[IdenticaBridge] Fix coding style
[InstagramBridge] Fix coding style
[IsoHuntBridge] Fix coding style
[JapanExpoBridge] Fix coding style
[KonachanBridge] Fix coding style
[KoreusBridge] Fix coding style
[KununuBridge] Fix coding style
[LeBonCoinBridge] Fix coding style
[LegifranceJOBBridge] Fix coding style
[LeMondeInformatiqueBridge] Fix coding style
[LesJoiesDuCodeBridge] Fix coding style
[LichessBridge] Fix coding style
[LinkedInCompanyBridge] Fix coding style
[LolibooruBridge] Fix coding style
[LWNprevBridge] Fix coding style
[MangareaderBridge] Fix coding style
[MilbooruBridge] Fix coding style
[MixCloudBridge] Fix coding style
[MoebooruBridge] Fix coding style
[MondeDiploBridge] Fix coding style
[MsnMondeBridge] Fix coding style
[MspabooruBridge] Fix coding style
[NasaApodBridge] Fix coding style
[NeuviemeArtBridge] Fix coding style
[NextgovBridge] Fix coding style
[NextInpactBridge] Fix coding style
[NiceMatinBridge] Fix coding style
[NovelUpdatesBridge] Fix coding style
[OpenClassroomsBridge] Fix coding style
[ParuVenduImmoBridge] Fix coding style
[PickyWallpapersBridge] Fix coding style
[PinterestBridge] Fix coding style
[PlanetLibreBridge] Fix coding style
[ReadComicsBridge] Fix coding style
[Releases3DSBridge] Fix coding style
[ReporterreBridge] Fix coding style
[RTBFBridge] Fix coding style
[Rue89Bridge] Fix coding style
[Rule34Bridge] Fix coding style
[Rule34pahealBridge] Fix coding style
[SafebooruBridge] Fix coding style
[SakugabooruBridge] Fix coding style
[ScmbBridge] Fix coding style
[ScoopItBridge] Fix coding style
[SensCritiqueBridge] Fix coding style
[SexactuBridge] Fix coding style
[ShanaprojectBridge] Fix coding style
[Shimmie2Bridge] Fix coding style
[SoundcloudBridge] Fix coding style
[StripeAPIChangeLogBridge] Fix coding style
[SuperbWallpapersBridge] Fix coding style
[T411Bridge] Fix coding style
[TagBoardBridge] Fix coding style
[TbibBridge] Fix coding style
[TheCodingLoveBridge] Fix coding style
[TheHackerNewsBridge] Fix coding style
[ThePirateBayBridge] Fix coding style
[TheTVDBBridge] Fix coding style
[Torrent9Bridge] Fix coding style
[TwitterBridge] Fix coding style
[UnsplashBridge] Fix coding style
[ViadeoCompanyBridge] Fix coding style
[VineBridge] Fix coding style
[VkBridge] Fix coding style
[WallpaperStopBridge] Fix coding style
[WebfailBridge] Fix coding style
[WeLiveSecurityBridge] Fix coding style
[WhydBridge] Fix coding style
[WikipediaBridge] Fix coding style
[WordPressBridge] Fix coding style
[WorldOfTanksBridge] Fix coding style
[XbooruBridge] Fix coding style
[YandereBridge] Fix coding style
[YoutubeBridge] Fix coding style
[ZDNetBridge] Fix coding style
125 files changed, 6922 insertions, 6194 deletions
diff --git a/bridges/ABCTabsBridge.php b/bridges/ABCTabsBridge.php index 1e7e170c..8c47175f 100644 --- a/bridges/ABCTabsBridge.php +++ b/bridges/ABCTabsBridge.php @@ -1,25 +1,43 @@ <?php -class ABCTabsBridge extends BridgeAbstract{ +class ABCTabsBridge extends BridgeAbstract { - const MAINTAINER = "kranack"; - const NAME = "ABC Tabs Bridge"; - const URI = "http://www.abc-tabs.com/"; - const DESCRIPTION = "Returns 22 newest tabs"; + const MAINTAINER = 'kranack'; + const NAME = 'ABC Tabs Bridge'; + const URI = 'http://www.abc-tabs.com/'; + const DESCRIPTION = 'Returns 22 newest tabs'; public function collectData(){ $html = ''; - $html = getSimpleHTMLDOM(static::URI.'tablatures/nouveautes.html') or returnClientError('No results for this query.'); + $html = getSimpleHTMLDOM(static::URI.'tablatures/nouveautes.html') + or returnClientError('No results for this query.'); + $table = $html->find('table#myTable', 0)->children(1); foreach ($table->find('tr') as $tab) { - $item = array(); - $item['author'] = $tab->find('td', 1)->plaintext . ' - ' . $tab->find('td', 2)->plaintext; - $item['title'] = $tab->find('td', 1)->plaintext . ' - ' . $tab->find('td', 2)->plaintext; - $item['content'] = 'Le ' . $tab->find('td', 0)->plaintext . '<br> Par: ' . $tab->find('td', 5)->plaintext . '<br> Type: ' . $tab->find('td', 3)->plaintext; - $item['id'] = static::URI . $tab->find('td', 2)->find('a', 0)->getAttribute('href'); - $item['uri'] = static::URI . $tab->find('td', 2)->find('a', 0)->getAttribute('href'); - $this->items[] = $item; + $item = array(); + $item['author'] = $tab->find('td', 1)->plaintext + . ' - ' + . $tab->find('td', 2)->plaintext; + + $item['title'] = $tab->find('td', 1)->plaintext + . ' - ' + . $tab->find('td', 2)->plaintext; + + $item['content'] = 'Le ' + . $tab->find('td', 0)->plaintext + . '<br> Par: ' + . $tab->find('td', 5)->plaintext + . '<br> Type: ' + . $tab->find('td', 3)->plaintext; + + $item['id'] = static::URI + . $tab->find('td', 2)->find('a', 0)->getAttribute('href'); + + $item['uri'] = static::URI + . $tab->find('td', 2)->find('a', 0)->getAttribute('href'); + + $this->items[] = $item; } - } + } } diff --git a/bridges/AcrimedBridge.php b/bridges/AcrimedBridge.php index 31481adf..3ca8e803 100644 --- a/bridges/AcrimedBridge.php +++ b/bridges/AcrimedBridge.php @@ -1,25 +1,25 @@ <?php class AcrimedBridge extends FeedExpander { - const MAINTAINER = "qwertygc"; - const NAME = "Acrimed Bridge"; - const URI = "http://www.acrimed.org/"; - const CACHE_TIMEOUT = 4800; //2hours - const DESCRIPTION = "Returns the newest articles."; + const MAINTAINER = 'qwertygc'; + const NAME = 'Acrimed Bridge'; + const URI = 'http://www.acrimed.org/'; + const CACHE_TIMEOUT = 4800; //2hours + const DESCRIPTION = 'Returns the newest articles'; - public function collectData(){ - $this->collectExpandableDatas(static::URI.'spip.php?page=backend'); - } + public function collectData(){ + $this->collectExpandableDatas(static::URI . 'spip.php?page=backend'); + } - protected function parseItem($newsItem){ - $item = parent::parseItem($newsItem); + protected function parseItem($newsItem){ + $item = parent::parseItem($newsItem); - $articlePage = getSimpleHTMLDOM($newsItem->link); - $article = sanitize($articlePage->find('article.article1', 0)->innertext); - $article = defaultImageSrcTo($article, static::URI); - $item['content'] = $article; + $articlePage = getSimpleHTMLDOM($newsItem->link); + $article = sanitize($articlePage->find('article.article1', 0)->innertext); + $article = defaultImageSrcTo($article, static::URI); + $item['content'] = $article; - return $item; - } + return $item; + } } diff --git a/bridges/AllocineFRBridge.php b/bridges/AllocineFRBridge.php index 0c4a048f..74601c92 100644 --- a/bridges/AllocineFRBridge.php +++ b/bridges/AllocineFRBridge.php @@ -1,91 +1,88 @@ <?php -class AllocineFRBridge extends BridgeAbstract{ - - - const MAINTAINER = "superbaillot.net"; - const NAME = "Allo Cine Bridge"; - const CACHE_TIMEOUT = 25200; // 7h - const URI = "http://www.allocine.fr/"; - const DESCRIPTION = "Bridge for allocine.fr"; - const PARAMETERS = array( array( - 'category'=>array( - 'name'=>'category', - 'type'=>'list', - 'required'=>true, - 'exampleValue'=>'Faux Raccord', - 'title'=>'Select your category', - 'values'=>array( - 'Faux Raccord'=>'faux-raccord', - 'Top 5'=>'top-5', - 'Tueurs en Séries'=>'tueurs-en-serie' - ) - ) - )); - - public function getURI(){ - if(!is_null($this->getInput('category'))){ - - switch($this->getInput('category')){ - case 'faux-raccord': - $uri = static::URI.'video/programme-12284/saison-27129/'; - break; - case 'top-5': - $uri = static::URI.'video/programme-12299/saison-29561/'; - break; - case 'tueurs-en-serie': - $uri = static::URI.'video/programme-12286/saison-22938/'; - break; - } - - return $uri; - } - - return parent::getURI(); - } - - public function getName(){ - if(!is_null($this->getInput('category'))){ - return self::NAME.' : ' - .array_search( - $this->getInput('category'), - self::PARAMETERS[$this->queriedContext]['category']['values'] - ); - } - - return parent::getName(); - } - - public function collectData(){ - - $html = getSimpleHTMLDOM($this->getURI()) - or returnServerError("Could not request ".$this->getURI()." !"); - - $category=array_search( - $this->getInput('category'), - self::PARAMETERS[$this->queriedContext]['category']['values'] - ); - - - foreach($html->find('figure.media-meta-fig') as $element) - { - $item = array(); - - $title = $element->find('div.titlebar h3.title a', 0); - $content = trim($element->innertext); - $figCaption = strpos($content, $category); - - if($figCaption !== false) - { - $content = str_replace('src="/', 'src="'.static::URI, $content); - $content = str_replace('href="/', 'href="'.static::URI, $content); - $content = str_replace('src=\'/', 'src=\''.static::URI, $content); - $content = str_replace('href=\'/', 'href=\''.static::URI, $content); - $item['content'] = $content; - $item['title'] = trim($title->innertext); - $item['uri'] = static::URI . $title->href; - $this->items[] = $item; - } - } - } +class AllocineFRBridge extends BridgeAbstract { + + const MAINTAINER = 'superbaillot.net'; + const NAME = 'Allo Cine Bridge'; + const CACHE_TIMEOUT = 25200; // 7h + const URI = 'http://www.allocine.fr/'; + const DESCRIPTION = 'Bridge for allocine.fr'; + const PARAMETERS = array( array( + 'category' => array( + 'name' => 'category', + 'type' => 'list', + 'required' => true, + 'exampleValue' => 'Faux Raccord', + 'title' => 'Select your category', + 'values' => array( + 'Faux Raccord' => 'faux-raccord', + 'Top 5' => 'top-5', + 'Tueurs en Séries' => 'tueurs-en-serie' + ) + ) + )); + + public function getURI(){ + if(!is_null($this->getInput('category'))){ + + switch($this->getInput('category')){ + case 'faux-raccord': + $uri = static::URI . 'video/programme-12284/saison-27129/'; + break; + case 'top-5': + $uri = static::URI . 'video/programme-12299/saison-29561/'; + break; + case 'tueurs-en-serie': + $uri = static::URI . 'video/programme-12286/saison-22938/'; + break; + } + + return $uri; + } + + return parent::getURI(); + } + + public function getName(){ + if(!is_null($this->getInput('category'))){ + return self::NAME . ' : ' + .array_search( + $this->getInput('category'), + self::PARAMETERS[$this->queriedContext]['category']['values'] + ); + } + + return parent::getName(); + } + + public function collectData(){ + + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Could not request ' . $this->getURI() . ' !'); + + $category = array_search( + $this->getInput('category'), + self::PARAMETERS[$this->queriedContext]['category']['values'] + ); + + foreach($html->find('figure.media-meta-fig') as $element){ + $item = array(); + + $title = $element->find('div.titlebar h3.title a', 0); + $content = trim($element->innertext); + $figCaption = strpos($content, $category); + + if($figCaption !== false) + { + $content = str_replace('src="/', 'src="' . static::URI, $content); + $content = str_replace('href="/', 'href="' . static::URI, $content); + $content = str_replace('src=\'/', 'src=\'' . static::URI, $content); + $content = str_replace('href=\'/', 'href=\'' . static::URI, $content); + $item['content'] = $content; + $item['title'] = trim($title->innertext); + $item['uri'] = static::URI . $title->href; + $this->items[] = $item; + } + } + } } diff --git a/bridges/AnimeUltimeBridge.php b/bridges/AnimeUltimeBridge.php index aea376bd..caedba1e 100644 --- a/bridges/AnimeUltimeBridge.php +++ b/bridges/AnimeUltimeBridge.php @@ -1,123 +1,135 @@ <?php class AnimeUltimeBridge extends BridgeAbstract { - const MAINTAINER = 'ORelio'; - const NAME = 'Anime-Ultime'; - const URI = 'http://www.anime-ultime.net/'; - const CACHE_TIMEOUT = 10800; // 3h - const DESCRIPTION = 'Returns the 10 newest releases posted on Anime-Ultime'; - const PARAMETERS = array( array( - 'type'=>array( - 'name'=>'Type', - 'type'=>'list', - 'values'=>array( - 'Everything'=>'', - 'Anime'=>'A', - 'Drama'=>'D', - 'Tokusatsu'=>'T' - ) - ) - )); - - private $filter = 'Releases'; - - public function collectData(){ - - //Add type filter if provided - $typeFilter = array_search( - $this->getInput('type'), - self::PARAMETERS[$this->queriedContext]['type']['values'] - ); - - //Build date and filters for making requests - $thismonth = date('mY').$typeFilter; - $lastmonth = date('mY', mktime(0, 0, 0, date('n') - 1, 1, date('Y'))).$typeFilter; - - //Process each HTML page until having 10 releases - $processedOK = 0; - foreach (array($thismonth, $lastmonth) as $requestFilter) { - - //Retrive page contents - $url = self::URI.'history-0-1/'.$requestFilter; - $html = getSimpleHTMLDOM($url) - or returnServerError('Could not request Anime-Ultime: '.$url); - - //Relases are sorted by day : process each day individually - foreach ($html->find('div.history', 0)->find('h3') as $daySection) { - - //Retrieve day and build date information - $dateString = $daySection->plaintext; - $day = intval(substr($dateString, strpos($dateString, ' ') + 1, 2)); - $item_date = strtotime(str_pad($day, 2, '0', STR_PAD_LEFT).'-' - .substr($requestFilter, 0, 2).'-' - .substr($requestFilter, 2, 4)); - $release = $daySection->next_sibling()->next_sibling()->first_child(); //<h3>day</h3><br /><table><tr> <-- useful data in table rows - - //Process each release of that day, ignoring first table row: contains table headers - while (!is_null($release = $release->next_sibling())) { - if (count($release->find('td')) > 0) { - - //Retrieve metadata from table columns - $item_link_element = $release->find('td', 0)->find('a', 0); - $item_uri = self::URI.$item_link_element->href; - $item_name = html_entity_decode($item_link_element->plaintext); - $item_episode = html_entity_decode(str_pad($release->find('td', 1)->plaintext, 2, '0', STR_PAD_LEFT)); - $item_fansub = $release->find('td', 2)->plaintext; - $item_type = $release->find('td', 4)->plaintext; - - if (!empty($item_uri)) { - - //Retrieve description from description page and convert relative image src info absolute image src - $html_item = getContents($item_uri) - or returnServerError('Could not request Anime-Ultime: '.$item_uri); - $item_description = substr( - $html_item, - strpos($html_item, 'class="principal_contain" align="center">') - + 41 - ); - $item_description = substr($item_description, - 0, - strpos($item_description, '<div id="table">') - ); - $item_description = str_replace( - 'src="images', 'src="'.self::URI.'images', - $item_description - ); - $item_description = str_replace("\r", '', $item_description); - $item_description = str_replace("\n", '', $item_description); - $item_description = utf8_encode($item_description); - - //Build and add final item - $item = array(); - $item['uri'] = $item_uri; - $item['title'] = $item_name.' '.$item_type.' '.$item_episode; - $item['author'] = $item_fansub; - $item['timestamp'] = $item_date; - $item['content'] = $item_description; - $this->items[] = $item; - $processedOK++; - - //Stop processing once limit is reached - if ($processedOK >= 10) - return; - } - } - } - } - } - } - - public function getName() { - if(!is_null($this->getInput('type'))){ - $typeFilter = array_search( - $this->getInput('type'), - self::PARAMETERS[$this->queriedContext]['type']['values'] - ); - - return 'Latest '.$typeFilter.' - Anime-Ultime Bridge'; - } - - return parent::getName(); - } + const MAINTAINER = 'ORelio'; + const NAME = 'Anime-Ultime'; + const URI = 'http://www.anime-ultime.net/'; + const CACHE_TIMEOUT = 10800; // 3h + const DESCRIPTION = 'Returns the 10 newest releases posted on Anime-Ultime'; + const PARAMETERS = array( array( + 'type' => array( + 'name' => 'Type', + 'type' => 'list', + 'values' => array( + 'Everything' => '', + 'Anime' => 'A', + 'Drama' => 'D', + 'Tokusatsu' => 'T' + ) + ) + )); + + private $filter = 'Releases'; + + public function collectData(){ + + //Add type filter if provided + $typeFilter = array_search( + $this->getInput('type'), + self::PARAMETERS[$this->queriedContext]['type']['values'] + ); + + //Build date and filters for making requests + $thismonth = date('mY') . $typeFilter; + $lastmonth = date('mY', mktime(0, 0, 0, date('n') - 1, 1, date('Y'))) . $typeFilter; + + //Process each HTML page until having 10 releases + $processedOK = 0; + foreach (array($thismonth, $lastmonth) as $requestFilter) { + + //Retrive page contents + $url = self::URI . 'history-0-1/' . $requestFilter; + $html = getSimpleHTMLDOM($url) + or returnServerError('Could not request Anime-Ultime: ' . $url); + + //Relases are sorted by day : process each day individually + foreach($html->find('div.history', 0)->find('h3') as $daySection) { + + //Retrieve day and build date information + $dateString = $daySection->plaintext; + $day = intval(substr($dateString, strpos($dateString, ' ') + 1, 2)); + $item_date = strtotime(str_pad($day, 2, '0', STR_PAD_LEFT) + . '-' + . substr($requestFilter, 0, 2) + . '-' + . substr($requestFilter, 2, 4)); + + //<h3>day</h3><br /><table><tr> <-- useful data in table rows + $release = $daySection->next_sibling()->next_sibling()->first_child(); + + //Process each release of that day, ignoring first table row: contains table headers + while(!is_null($release = $release->next_sibling())) { + if(count($release->find('td')) > 0) { + + //Retrieve metadata from table columns + $item_link_element = $release->find('td', 0)->find('a', 0); + $item_uri = self::URI . $item_link_element->href; + $item_name = html_entity_decode($item_link_element->plaintext); + $item_episode = html_entity_decode( + str_pad( + $release->find('td', 1)->plaintext, + 2, + '0', + STR_PAD_LEFT + ) + ); + + $item_fansub = $release->find('td', 2)->plaintext; + $item_type = $release->find('td', 4)->plaintext; + + if(!empty($item_uri)) { + + // Retrieve description from description page and + // convert relative image src info absolute image src + $html_item = getContents($item_uri) + or returnServerError('Could not request Anime-Ultime: ' . $item_uri); + $item_description = substr( + $html_item, + strpos($html_item, 'class="principal_contain" align="center">') + 41 + ); + $item_description = substr($item_description, + 0, + strpos($item_description, '<div id="table">') + ); + $item_description = str_replace( + 'src="images', 'src="' . self::URI . 'images', + $item_description + ); + $item_description = str_replace("\r", '', $item_description); + $item_description = str_replace("\n", '', $item_description); + $item_description = utf8_encode($item_description); + + //Build and add final item + $item = array(); + $item['uri'] = $item_uri; + $item['title'] = $item_name . ' ' . $item_type . ' ' . $item_episode; + $item['author'] = $item_fansub; + $item['timestamp'] = $item_date; + $item['content'] = $item_description; + $this->items[] = $item; + $processedOK++; + + //Stop processing once limit is reached + if ($processedOK >= 10) + return; + } + } + } + } + } + } + + public function getName() { + if(!is_null($this->getInput('type'))){ + $typeFilter = array_search( + $this->getInput('type'), + self::PARAMETERS[$this->queriedContext]['type']['values'] + ); + + return 'Latest ' . $typeFilter . ' - Anime-Ultime Bridge'; + } + + return parent::getName(); + } } diff --git a/bridges/Arte7Bridge.php b/bridges/Arte7Bridge.php index 582c913d..09a1ee4d 100644 --- a/bridges/Arte7Bridge.php +++ b/bridges/Arte7Bridge.php @@ -1,91 +1,102 @@ <?php - class Arte7Bridge extends BridgeAbstract{ +class Arte7Bridge extends BridgeAbstract { - const MAINTAINER = "mitsukarenai"; - const NAME = "Arte +7"; - const URI = "http://www.arte.tv/"; - const CACHE_TIMEOUT = 1800; // 30min - const DESCRIPTION = "Returns newest videos from ARTE +7"; - const PARAMETERS = array( - 'Catégorie (Français)' => array( - 'catfr'=>array( - 'type'=>'list', - 'name'=>'Catégorie', - 'values'=>array( - 'Toutes les vidéos (français)'=>'toutes-les-videos', - 'Actu & société'=>'actu-société', - 'Séries & fiction'=>'séries-fiction', - 'Cinéma'=>'cinéma', - 'Arts & spectacles classiques'=>'arts-spectacles-classiques', - 'Culture pop'=>'culture-pop', - 'Découverte'=>'découverte', - 'Histoire'=>'histoire', - 'Junior'=>'junior' + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Arte +7'; + const URI = 'http://www.arte.tv/'; + const CACHE_TIMEOUT = 1800; // 30min + const DESCRIPTION = 'Returns newest videos from ARTE +7'; + const PARAMETERS = array( + 'Catégorie (Français)' => array( + 'catfr' => array( + 'type' => 'list', + 'name' => 'Catégorie', + 'values' => array( + 'Toutes les vidéos (français)' => 'toutes-les-videos', + 'Actu & société' => 'actu-société', + 'Séries & fiction' => 'séries-fiction', + 'Cinéma' => 'cinéma', + 'Arts & spectacles classiques' => 'arts-spectacles-classiques', + 'Culture pop' => 'culture-pop', + 'Découverte' => 'découverte', + 'Histoire' => 'histoire', + 'Junior' => 'junior' + ) + ) + ), + 'Catégorie (Allemand)' => array( + 'catde' => array( + 'type' => 'list', + 'name' => 'Catégorie', + 'values' => array( + 'Alle Videos (deutsch)' => 'alle-videos', + 'Aktuelles & Gesellschaft' => 'aktuelles-gesellschaft', + 'Fernsehfilme & Serien' => 'fernsehfilme-serien', + 'Kino' => 'kino', + 'Kunst & Kultur' => 'kunst-kultur', + 'Popkultur & Alternativ' => 'popkultur-alternativ', + 'Entdeckung' => 'entdeckung', + 'Geschichte' => 'geschichte', + 'Junior' => 'junior' + ) + ) + ) + ); - ) - ) - ), - 'Catégorie (Allemand)' => array( - 'catde'=>array( - 'type'=>'list', - 'name'=>'Catégorie', - 'values'=>array( - 'Alle Videos (deutsch)'=>'alle-videos', - 'Aktuelles & Gesellschaft'=>'aktuelles-gesellschaft', - 'Fernsehfilme & Serien'=>'fernsehfilme-serien', - 'Kino'=>'kino', - 'Kunst & Kultur'=>'kunst-kultur', - 'Popkultur & Alternativ'=>'popkultur-alternativ', - 'Entdeckung'=>'entdeckung', - 'Geschichte'=>'geschichte', - 'Junior'=>'junior' - ) - ) - ) - ); + public function collectData(){ + switch($this->queriedContext){ + case 'Catégorie (Français)': + $category = $this->getInput('catfr'); + $lang = 'fr'; + break; + case 'Catégorie (Allemand)': + $category = $this->getInput('catde'); + $lang = 'de'; + break; + } - public function collectData(){ + $url = self::URI . 'guide/' . $lang . '/plus7/' . $category; + $input = getContents($url) or die('Could not request ARTE.'); - switch($this->queriedContext){ - case 'Catégorie (Français)': - $category=$this->getInput('catfr'); - $lang='fr'; - break; - case 'Catégorie (Allemand)': - $category=$this->getInput('catde'); - $lang='de'; - break; - } + if(strpos($input, 'categoryVideoSet') !== false){ + $input = explode('categoryVideoSet="', $input); + $input = explode('}}', $input[1]); + $input = $input[0] . '}}'; + } else { + $input = explode('videoSet="', $input); + $input = explode('}]}', $input[1]); + $input = $input[0] . '}]}'; + } - $url = self::URI.'guide/'.$lang.'/plus7/'.$category; - $input = getContents($url) or die('Could not request ARTE.'); - if(strpos($input, 'categoryVideoSet') !== FALSE){ - $input = explode('categoryVideoSet="', $input); - $input = explode('}}', $input[1]); - $input = $input[0].'}}'; - }else{ - $input = explode('videoSet="', $input); - $input = explode('}]}', $input[1]); - $input = $input[0].'}]}'; - } + $input_json = json_decode(html_entity_decode($input, ENT_QUOTES), true); - $input_json = json_decode(html_entity_decode($input, ENT_QUOTES), TRUE); + foreach($input_json['videos'] as $element) { + $item = array(); + $item['uri'] = str_replace("autoplay=1", "", $element['url']); + $item['id'] = $element['id']; - foreach($input_json['videos'] as $element) { - $item = array(); - $item['uri'] = str_replace("autoplay=1", "", $element['url']); - $item['id'] = $element['id']; - $hack_broadcast_time = $element['rights_end']; - $hack_broadcast_time = strtok($hack_broadcast_time, 'T'); - $hack_broadcast_time = strtok('T'); - $item['timestamp'] = strtotime($element['scheduled_on'].'T'.$hack_broadcast_time); - $item['title'] = $element['title']; - if (!empty($element['subtitle'])) - $item['title'] = $element['title'].' | '.$element['subtitle']; - $item['duration'] = round((int)$element['duration']/60); - $item['content'] = $element['teaser'].'<br><br>'.$item['duration'].'min<br><a href="'.$item['uri'].'"><img src="' . $element['thumbnail_url'] . '" /></a>'; - $this->items[] = $item; - } - } + $hack_broadcast_time = $element['rights_end']; + $hack_broadcast_time = strtok($hack_broadcast_time, 'T'); + $hack_broadcast_time = strtok('T'); + + $item['timestamp'] = strtotime($element['scheduled_on'] . 'T' . $hack_broadcast_time); + $item['title'] = $element['title']; + + if(!empty($element['subtitle'])) + $item['title'] = $element['title'] . ' | ' . $element['subtitle']; + + $item['duration'] = round((int)$element['duration'] / 60); + $item['content'] = $element['teaser'] + . '<br><br>' + . $item['duration'] + . 'min<br><a href="' + . $item['uri'] + . '"><img src="' + . $element['thumbnail_url'] + . '" /></a>'; + + $this->items[] = $item; + } + } } diff --git a/bridges/AskfmBridge.php b/bridges/AskfmBridge.php index 45bcc36f..85d469fc 100644 --- a/bridges/AskfmBridge.php +++ b/bridges/AskfmBridge.php @@ -1,52 +1,66 @@ <?php -class AskfmBridge extends BridgeAbstract{ - - const MAINTAINER = "az5he6ch"; - const NAME = "Ask.fm Answers"; - const URI = "http://ask.fm/"; - const CACHE_TIMEOUT = 300; //5 min - const DESCRIPTION = "Returns answers from an Ask.fm user"; - const PARAMETERS = array( - 'Ask.fm username'=>array( - 'u'=>array( - 'name'=>'Username', - 'required'=>true - ) - ) - ); - - public function collectData(){ - $html = getSimpleHTMLDOM($this->getURI()) - or returnServerError('Requested username can\'t be found.'); - - foreach($html->find('div.streamItem-answer') as $element) { - $item = array(); - $item['uri'] = self::URI.$element->find('a.streamItemsAge',0)->href; - $question = trim($element->find('h1.streamItemContent-question',0)->innertext); - $item['title'] = trim(htmlspecialchars_decode($element->find('h1.streamItemContent-question',0)->plaintext, ENT_QUOTES)); - $answer = trim($element->find('p.streamItemContent-answer',0)->innertext); - #$item['update'] = $element->find('a.streamitemsage',0)->data-hint; // Doesn't work, DOM parser doesn't seem to like data-hint, dunno why - $visual = $element->find('div.streamItemContent-visual',0)->innertext; // This probably should be cleaned up, especially for YouTube embeds - //Fix tracking links, also doesn't work - foreach($element->find('a') as $link) { - if (strpos($link->href, 'l.ask.fm') !== false) { - #$link->href = str_replace('#_=_', '', get_headers($link->href, 1)['Location']); // Too slow - $link->href = $link->plaintext; - } - } - $content = '<p>' . $question . '</p><p>' . $answer . '</p><p>' . $visual . '</p>'; - // Fix relative links without breaking // scheme used by YouTube stuff - $content = preg_replace('#href="\/(?!\/)#', 'href="'.self::URI,$content); - $item['content'] = $content; - $this->items[] = $item; - } - } - - public function getName(){ - return self::NAME.' : '.$this->getInput('u'); - } - - public function getURI(){ - return self::URI.urlencode($this->getInput('u')).'/answers/more?page=0'; - } +class AskfmBridge extends BridgeAbstract { + + const MAINTAINER = 'az5he6ch'; + const NAME = 'Ask.fm Answers'; + const URI = 'http://ask.fm/'; + const CACHE_TIMEOUT = 300; //5 min + const DESCRIPTION = 'Returns answers from an Ask.fm user'; + const PARAMETERS = array( + 'Ask.fm username' => array( + 'u' => array( + 'name' => 'Username', + 'required' => true + ) + ) + ); + + public function collectData(){ + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Requested username can\'t be found.'); + + foreach($html->find('div.streamItem-answer') as $element){ + $item = array(); + $item['uri'] = self::URI . $element->find('a.streamItemsAge', 0)->href; + $question = trim($element->find('h1.streamItemContent-question', 0)->innertext); + + $item['title'] = trim( + htmlspecialchars_decode($element->find('h1.streamItemContent-question', 0)->plaintext, + ENT_QUOTES + ) + ); + + $answer = trim($element->find('p.streamItemContent-answer', 0)->innertext); + + // Doesn't work, DOM parser doesn't seem to like data-hint, dunno why + #$item['update'] = $element->find('a.streamitemsage',0)->data-hint; + + // This probably should be cleaned up, especially for YouTube embeds + $visual = $element->find('div.streamItemContent-visual', 0)->innertext; + //Fix tracking links, also doesn't work + foreach($element->find('a') as $link){ + if(strpos($link->href, 'l.ask.fm') !== false) { + + // Too slow + #$link->href = str_replace('#_=_', '', get_headers($link->href, 1)['Location']); + + $link->href = $link->plaintext; + } + } + + $content = '<p>' . $question . '</p><p>' . $answer . '</p><p>' . $visual . '</p>'; + // Fix relative links without breaking // scheme used by YouTube stuff + $content = preg_replace('#href="\/(?!\/)#', 'href="' . self::URI, $content); + $item['content'] = $content; + $this->items[] = $item; + } + } + + public function getName(){ + return self::NAME . ' : ' . $this->getInput('u'); + } + + public function getURI(){ + return self::URI . urlencode($this->getInput('u')) . '/answers/more?page=0'; + } } diff --git a/bridges/BandcampBridge.php b/bridges/BandcampBridge.php index 70df97b0..7156de46 100644 --- a/bridges/BandcampBridge.php +++ b/bridges/BandcampBridge.php @@ -1,43 +1,55 @@ <?php -class BandcampBridge extends BridgeAbstract{ - - const MAINTAINER = "sebsauvage"; - const NAME = "Bandcamp Tag"; - const URI = "http://bandcamp.com/"; - const CACHE_TIMEOUT = 600; // 10min - const DESCRIPTION = "New bandcamp release by tag"; - const PARAMETERS = array( array( - 'tag'=>array( - 'name'=>'tag', - 'type'=>'text', - 'required'=>true - ) - )); - - public function collectData(){ - $html = getSimpleHTMLDOM($this->getURI()) - or returnServerError('No results for this query.'); - - foreach($html->find('li.item') as $release) { - $script = $release->find('div.art', 0)->getAttribute('onclick'); - $uri = ltrim($script, "return 'url("); - $uri = rtrim($uri, "')"); - - $item = array(); - $item['author'] = $release->find('div.itemsubtext',0)->plaintext . ' - ' . $release->find('div.itemtext',0)->plaintext; - $item['title'] = $release->find('div.itemsubtext',0)->plaintext . ' - ' . $release->find('div.itemtext',0)->plaintext; - $item['content'] = '<img src="' . $uri . '"/><br/>' . $release->find('div.itemsubtext',0)->plaintext . ' - ' . $release->find('div.itemtext',0)->plaintext; - $item['id'] = $release->find('a',0)->getAttribute('href'); - $item['uri'] = $release->find('a',0)->getAttribute('href'); - $this->items[] = $item; - } - } - - public function getURI(){ - return self::URI.'tag/'.urlencode($this->getInput('tag')).'?sort_field=date'; - } - - public function getName(){ - return $this->getInput('tag') .' - '.'Bandcamp Tag'; - } +class BandcampBridge extends BridgeAbstract { + + const MAINTAINER = 'sebsauvage'; + const NAME = 'Bandcamp Tag'; + const URI = 'http://bandcamp.com/'; + const CACHE_TIMEOUT = 600; // 10min + const DESCRIPTION = 'New bandcamp release by tag'; + const PARAMETERS = array( array( + 'tag' => array( + 'name' => 'tag', + 'type' => 'text', + 'required' => true + ) + )); + + public function collectData(){ + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('No results for this query.'); + + foreach($html->find('li.item') as $release){ + $script = $release->find('div.art', 0)->getAttribute('onclick'); + $uri = ltrim($script, "return 'url("); + $uri = rtrim($uri, "')"); + + $item = array(); + $item['author'] = $release->find('div.itemsubtext', 0)->plaintext + . ' - ' + . $release->find('div.itemtext', 0)->plaintext; + + $item['title'] = $release->find('div.itemsubtext', 0)->plaintext + . ' - ' + . $release->find('div.itemtext', 0)->plaintext; + + $item['content'] = '<img src="' + . $uri + . '"/><br/>' + . $release->find('div.itemsubtext', 0)->plaintext + . ' - ' + . $release->find('div.itemtext', 0)->plaintext; + + $item['id'] = $release->find('a', 0)->getAttribute('href'); + $item['uri'] = $release->find('a', 0)->getAttribute('href'); + $this->items[] = $item; + } + } + + public function getURI(){ + return self::URI . 'tag/' . urlencode($this->getInput('tag')) . '?sort_field=date'; + } + + public function getName(){ + return $this->getInput('tag') . ' - Bandcamp Tag'; + } } diff --git a/bridges/BastaBridge.php b/bridges/BastaBridge.php index b700272c..11a31ac8 100644 --- a/bridges/BastaBridge.php +++ b/bridges/BastaBridge.php @@ -1,32 +1,34 @@ <?php -class BastaBridge extends BridgeAbstract{ - const MAINTAINER = "qwertygc"; - const NAME = "Bastamag Bridge"; - const URI = "http://www.bastamag.net/"; +class BastaBridge extends BridgeAbstract { + + const MAINTAINER = 'qwertygc'; + const NAME = 'Bastamag Bridge'; + const URI = 'http://www.bastamag.net/'; const CACHE_TIMEOUT = 7200; // 2h - const DESCRIPTION = "Returns the newest articles."; + const DESCRIPTION = 'Returns the newest articles.'; public function collectData(){ - // Replaces all relative image URLs by absolute URLs. Relative URLs always start with 'local/'! - function ReplaceImageUrl($content){ - return preg_replace('/src=["\']{1}([^"\']+)/ims', 'src=\''.self::URI.'$1\'', $content); + // Replaces all relative image URLs by absolute URLs. + // Relative URLs always start with 'local/'! + function replaceImageUrl($content){ + return preg_replace('/src=["\']{1}([^"\']+)/ims', 'src=\'' . self::URI . '$1\'', $content); } - $html = getSimpleHTMLDOM(self::URI.'spip.php?page=backend') - or returnServerError('Could not request Bastamag.'); + $html = getSimpleHTMLDOM(self::URI . 'spip.php?page=backend') + or returnServerError('Could not request Bastamag.'); + $limit = 0; - foreach($html->find('item') as $element) { - if($limit < 10) { + foreach($html->find('item') as $element){ + if($limit < 10){ $item = array(); $item['title'] = $element->find('title', 0)->innertext; $item['uri'] = $element->find('guid', 0)->plaintext; $item['timestamp'] = strtotime($element->find('dc:date', 0)->plaintext); - $item['content'] = ReplaceImageUrl(getSimpleHTMLDOM($item['uri'])->find('div.texte', 0)->innertext); + $item['content'] = replaceImageUrl(getSimpleHTMLDOM($item['uri'])->find('div.texte', 0)->innertext); $this->items[] = $item; $limit++; } } } } -?> diff --git a/bridges/BlaguesDeMerdeBridge.php b/bridges/BlaguesDeMerdeBridge.php index 4cda1184..12814a50 100644 --- a/bridges/BlaguesDeMerdeBridge.php +++ b/bridges/BlaguesDeMerdeBridge.php @@ -1,33 +1,31 @@ <?php -class BlaguesDeMerdeBridge extends BridgeAbstract{ +class BlaguesDeMerdeBridge extends BridgeAbstract { - const MAINTAINER = "superbaillot.net"; - const NAME = "Blagues De Merde"; - const URI = "http://www.blaguesdemerde.fr/"; - const CACHE_TIMEOUT = 7200; // 2h - const DESCRIPTION = "Blagues De Merde"; + const MAINTAINER = 'superbaillot.net'; + const NAME = 'Blagues De Merde'; + const URI = 'http://www.blaguesdemerde.fr/'; + const CACHE_TIMEOUT = 7200; // 2h + const DESCRIPTION = 'Blagues De Merde'; + public function collectData(){ + $html = getSimpleHTMLDOM(self::URI) + or returnServerError('Could not request BDM.'); - public function collectData(){ - $html = getSimpleHTMLDOM(self::URI) - or returnServerError('Could not request BDM.'); + foreach($html->find('article.joke_contener') as $element){ + $item = array(); + $temp = $element->find('a'); - foreach($html->find('article.joke_contener') as $element) { - $item = array(); - $temp = $element->find('a'); - if(isset($temp[2])) - { - $item['content'] = trim($element->find('div.joke_text_contener', 0)->innertext); - $uri = $temp[2]->href; - $item['uri'] = $uri; - $item['title'] = substr($uri, (strrpos($uri, "/") + 1)); - $date = $element->find("li.bdm_date",0)->innertext; - $time = mktime(0, 0, 0, substr($date, 3, 2), substr($date, 0, 2), substr($date, 6, 4)); - $item['timestamp'] = $time; - $item['author'] = $element->find("li.bdm_pseudo",0)->innertext;; - $this->items[] = $item; - } - } - } + if(isset($temp[2])){ + $item['content'] = trim($element->find('div.joke_text_contener', 0)->innertext); + $uri = $temp[2]->href; + $item['uri'] = $uri; + $item['title'] = substr($uri, (strrpos($uri, "/") + 1)); + $date = $element->find('li.bdm_date', 0)->innertext; + $time = mktime(0, 0, 0, substr($date, 3, 2), substr($date, 0, 2), substr($date, 6, 4)); + $item['timestamp'] = $time; + $item['author'] = $element->find('li.bdm_pseudo', 0)->innertext; + $this->items[] = $item; + } + } + } } -?> diff --git a/bridges/BooruprojectBridge.php b/bridges/BooruprojectBridge.php index b6df6654..d60a9f20 100644 --- a/bridges/BooruprojectBridge.php +++ b/bridges/BooruprojectBridge.php @@ -1,36 +1,37 @@ <?php require_once('GelbooruBridge.php'); -class BooruprojectBridge extends GelbooruBridge{ +class BooruprojectBridge extends GelbooruBridge { - const MAINTAINER = "mitsukarenai"; - const NAME = "Booruproject"; - const URI = "http://booru.org/"; - const DESCRIPTION = "Returns images from given page of booruproject"; + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Booruproject'; + const URI = 'http://booru.org/'; + const DESCRIPTION = 'Returns images from given page of booruproject'; + const PARAMETERS = array( + 'global' => array( + 'p' => array( + 'name' => 'page', + 'type' => 'number' + ), + 't' => array( + 'name' => 'tags' + ) + ), + 'Booru subdomain (subdomain.booru.org)' => array( + 'i' => array( + 'name' => 'Subdomain', + 'required' => true + ) + ) + ); - const PARAMETERS = array( - 'global'=>array( - 'p'=>array( - 'name'=>'page', - 'type'=>'number' - ), - 't'=>array('name'=>'tags') - ), - 'Booru subdomain (subdomain.booru.org)'=>array( - 'i'=>array( - 'name'=>'Subdomain', - 'required'=>true - ) - ) - ); + const PIDBYPAGE = 20; - const PIDBYPAGE=20; + public function getURI(){ + return 'http://' . $this->getInput('i') . '.booru.org/'; + } - public function getURI(){ - return 'http://'.$this->getInput('i').'.booru.org/'; - } - - public function getName(){ - return static::NAME . ' ' . $this->getInput('i'); - } + public function getName(){ + return static::NAME . ' ' . $this->getInput('i'); + } } diff --git a/bridges/CADBridge.php b/bridges/CADBridge.php index 86c0fefd..761d77f4 100644 --- a/bridges/CADBridge.php +++ b/bridges/CADBridge.php @@ -1,10 +1,10 @@ <?php class CADBridge extends FeedExpander { - const MAINTAINER = "nyutag"; - const NAME = "CAD Bridge"; - const URI = "http://www.cad-comic.com/"; + const MAINTAINER = 'nyutag'; + const NAME = 'CAD Bridge'; + const URI = 'http://www.cad-comic.com/'; const CACHE_TIMEOUT = 7200; //2h - const DESCRIPTION = "Returns the newest articles."; + const DESCRIPTION = 'Returns the newest articles.'; public function collectData(){ $this->collectExpandableDatas('http://cdn2.cad-comic.com/rss.xml', 10); @@ -12,11 +12,11 @@ class CADBridge extends FeedExpander { protected function parseItem($newsItem){ $item = parent::parseItem($newsItem); - $item['content'] = $this->CADExtractContent($item['uri']); + $item['content'] = $this->extractCADContent($item['uri']); return $item; } - private function CADExtractContent($url) { + private function extractCADContent($url) { $html3 = getSimpleHTMLDOMCached($url); // The request might fail due to missing https support or wrong URL @@ -35,12 +35,11 @@ class CADBridge extends FeedExpander { default: return 'Daily comic not released yet'; } - $img = implode ($url2[0]); + $img = implode($url2[0]); $html3->clear(); - unset ($html3); + unset($html3); if ($img == '') return 'Daily comic not released yet'; - return '<img src="'.$img.'"/>'; + return '<img src="' . $img . '"/>'; } } -?> diff --git a/bridges/CNETBridge.php b/bridges/CNETBridge.php index a890edb3..fa76ec0c 100644 --- a/bridges/CNETBridge.php +++ b/bridges/CNETBridge.php @@ -1,76 +1,89 @@ <?php class CNETBridge extends BridgeAbstract { - const MAINTAINER = 'ORelio'; - const NAME = 'CNET News'; - const URI = 'http://www.cnet.com/'; - const CACHE_TIMEOUT = 1800; // 30min - const DESCRIPTION = 'Returns the newest articles. <br /> You may specify a topic found in some section URLs, else all topics are selected.'; + const MAINTAINER = 'ORelio'; + const NAME = 'CNET News'; + const URI = 'http://www.cnet.com/'; + const CACHE_TIMEOUT = 1800; // 30min + const DESCRIPTION = 'Returns the newest articles. <br /> You may specify a +topic found in some section URLs, else all topics are selected.'; - const PARAMETERS = array( array( - 'topic'=>array('name'=>'Topic name') - )); + const PARAMETERS = array( array( + 'topic' => array( + 'name' => 'Topic name' + ) + )); - public function collectData(){ + public function collectData(){ - function ExtractFromDelimiters($string, $start, $end) { - if (strpos($string, $start) !== false) { - $section_retrieved = substr($string, strpos($string, $start) + strlen($start)); - $section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end)); - return $section_retrieved; - } return false; - } + function extractFromDelimiters($string, $start, $end){ + if(strpos($string, $start) !== false){ + $section_retrieved = substr($string, strpos($string, $start) + strlen($start)); + $section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end)); + return $section_retrieved; + } - function StripWithDelimiters($string, $start, $end) { - while (strpos($string, $start) !== false) { - $section_to_remove = substr($string, strpos($string, $start)); - $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end)); - $string = str_replace($section_to_remove, '', $string); - } return $string; - } + return false; + } - function CleanArticle($article_html) { - $article_html = '<p>'.substr($article_html, strpos($article_html, '<p>') + 3); - $article_html = StripWithDelimiters($article_html, '<span class="credit">', '</span>'); - $article_html = StripWithDelimiters($article_html, '<script', '</script>'); - $article_html = StripWithDelimiters($article_html, '<div class="shortcode related-links', '</div>'); - $article_html = StripWithDelimiters($article_html, '<a class="clickToEnlarge">', '</a>'); - return $article_html; - } + function stripWithDelimiters($string, $start, $end){ + while(strpos($string, $start) !== false){ + $section_to_remove = substr($string, strpos($string, $start)); + $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end)); + $string = str_replace($section_to_remove, '', $string); + } - $pageUrl = self::URI.(empty($this->getInput('topic')) ? '' : 'topics/'.$this->getInput('topic').'/'); - $html = getSimpleHTMLDOM($pageUrl) or returnServerError('Could not request CNET: '.$pageUrl); - $limit = 0; + return $string; + } - foreach($html->find('div.assetBody') as $element) { - if ($limit < 8) { + function cleanArticle($article_html){ + $article_html = '<p>' . substr($article_html, strpos($article_html, '<p>') + 3); + $article_html = stripWithDelimiters($article_html, '<span class="credit">', '</span>'); + $article_html = stripWithDelimiters($article_html, '<script', '</script>'); + $article_html = stripWithDelimiters($article_html, '<div class="shortcode related-links', '</div>'); + $article_html = stripWithDelimiters($article_html, '<a class="clickToEnlarge">', '</a>'); + return $article_html; + } - $article_title = trim($element->find('h2', 0)->plaintext); - $article_uri = self::URI.($element->find('a', 0)->href); - $article_timestamp = strtotime($element->find('time.assetTime', 0)->plaintext); - $article_author = trim($element->find('a[rel=author]', 0)->plaintext); + $pageUrl = self::URI . (empty($this->getInput('topic')) ? '' : 'topics/' . $this->getInput('topic') . '/'); + $html = getSimpleHTMLDOM($pageUrl) or returnServerError('Could not request CNET: ' . $pageUrl); + $limit = 0; - if (!empty($article_title) && !empty($article_uri) && strpos($article_uri, '/news/') !== false) { + foreach($html->find('div.assetBody') as $element){ + if($limit < 8){ + $article_title = trim($element->find('h2', 0)->plaintext); + $article_uri = self::URI . ($element->find('a', 0)->href); + $article_timestamp = strtotime($element->find('time.assetTime', 0)->plaintext); + $article_author = trim($element->find('a[rel=author]', 0)->plaintext); - $article_html = getSimpleHTMLDOM($article_uri) or returnServerError('Could not request CNET: '.$article_uri); + if(!empty($article_title) && !empty($article_uri) && strpos($article_uri, '/news/') !== false){ + $article_html = getSimpleHTMLDOM($article_uri) + or returnServerError('Could not request CNET: ' . $article_uri); + $article_content = trim( + cleanArticle( + extractFromDelimiters( + $article_html, + '<div class="articleContent', + '<footer>' + ) + ) + ); - $article_content = trim(CleanArticle(ExtractFromDelimiters($article_html, '<div class="articleContent', '<footer>'))); + $item = array(); + $item['uri'] = $article_uri; + $item['title'] = $article_title; + $item['author'] = $article_author; + $item['timestamp'] = $article_timestamp; + $item['content'] = $article_content; + $this->items[] = $item; + $limit++; + } + } + } + } - $item = array(); - $item['uri'] = $article_uri; - $item['title'] = $article_title; - $item['author'] = $article_author; - $item['timestamp'] = $article_timestamp; - $item['content'] = $article_content; - $this->items[] = $item; - $limit++; - } - } - } - } - - public function getName() { - $topic=$this->getInput('topic'); - return 'CNET News Bridge'.(empty($topic) ? '' : ' - '.$topic); - } + public function getName(){ + $topic = $this->getInput('topic'); + return 'CNET News Bridge' . (empty($topic) ? '' : ' - ' . $topic); + } } diff --git a/bridges/CastorusBridge.php b/bridges/CastorusBridge.php index a68645e3..119d3535 100644 --- a/bridges/CastorusBridge.php +++ b/bridges/CastorusBridge.php @@ -1,35 +1,35 @@ <?php class CastorusBridge extends BridgeAbstract { - const MAINTAINER = "logmanoriginal"; - const NAME = "Castorus Bridge"; + const MAINTAINER = 'logmanoriginal'; + const NAME = 'Castorus Bridge'; const URI = 'http://www.castorus.com'; const CACHE_TIMEOUT = 600; // 10min - const DESCRIPTION = "Returns the latest changes"; - - const PARAMETERS = array( - 'Get latest changes' => array(), - 'Get latest changes via ZIP code' => array( - 'zip'=>array( - 'name'=>'ZIP code', - 'type'=>'text', - 'required'=>true, - 'exampleValue'=>'74910, 74', - 'title'=>'Insert ZIP code (complete or partial)' - ) - ), - 'Get latest changes via city name' => array( - 'city'=>array( - 'name'=>'City name', - 'type'=>'text', - 'required'=>true, - 'exampleValue'=>'Seyssel, Seys', - 'title'=>'Insert city name (complete or partial)' - ) - ) - ); - - // Extracts the tile from an actitiy - private function ExtractActivityTitle($activity){ + const DESCRIPTION = 'Returns the latest changes'; + + const PARAMETERS = array( + 'Get latest changes' => array(), + 'Get latest changes via ZIP code' => array( + 'zip' => array( + 'name' => 'ZIP code', + 'type' => 'text', + 'required' => true, + 'exampleValue' => '74910, 74', + 'title' => 'Insert ZIP code (complete or partial)' + ) + ), + 'Get latest changes via city name' => array( + 'city' => array( + 'name' => 'City name', + 'type' => 'text', + 'required' => true, + 'exampleValue' => 'Seyssel, Seys', + 'title' => 'Insert city name (complete or partial)' + ) + ) + ); + + // Extracts the title from an actitiy + private function extractActivityTitle($activity){ $title = $activity->find('a', 0); if(!$title) @@ -39,7 +39,7 @@ class CastorusBridge extends BridgeAbstract { } // Extracts the url from an actitiy - private function ExtractActivityUrl($activity){ + private function extractActivityUrl($activity){ $url = $activity->find('a', 0); if(!$url) @@ -49,7 +49,7 @@ class CastorusBridge extends BridgeAbstract { } // Extracts the time from an activity - private function ExtractActivityTime($activity){ + private function extractActivityTime($activity){ // Unfortunately the time is part of the parent node, // so we have to clear all child nodes first $nodes = $activity->find('*'); @@ -65,7 +65,7 @@ class CastorusBridge extends BridgeAbstract { } // Extracts the price change - private function ExtractActivityPrice($activity){ + private function extractActivityPrice($activity){ $price = $activity->find('span', 1); if(!$price) @@ -75,8 +75,8 @@ class CastorusBridge extends BridgeAbstract { } public function collectData(){ - $zip_filter = trim($this->getInput('zip')); - $city_filter = trim($this->getInput('city')); + $zip_filter = trim($this->getInput('zip')); + $city_filter = trim($this->getInput('city')); $html = getSimpleHTMLDOM(self::URI); @@ -91,17 +91,24 @@ class CastorusBridge extends BridgeAbstract { foreach($activities as $activity){ $item = array(); - $item['title'] = $this->ExtractActivityTitle($activity); - $item['uri'] = $this->ExtractActivityUrl($activity); - $item['timestamp'] = $this->ExtractActivityTime($activity); - $item['content'] = '<a href="' . $item['uri'] . '">' . $item['title'] . '</a><br><p>' - . $this->ExtractActivityPrice($activity) . '</p>'; - - if(isset($zip_filter) && !(substr($item['title'], 0, strlen($zip_filter)) === $zip_filter)){ + $item['title'] = $this->extractActivityTitle($activity); + $item['uri'] = $this->extractActivityUrl($activity); + $item['timestamp'] = $this->extractActivityTime($activity); + $item['content'] = '<a href="' + . $item['uri'] + . '">' + . $item['title'] + . '</a><br><p>' + . $this->extractActivityPrice($activity) + . '</p>'; + + if(isset($zip_filter) + && !(substr($item['title'], 0, strlen($zip_filter)) === $zip_filter)){ continue; // Skip this item } - if(isset($city_filter) && !(substr($item['title'], strpos($item['title'], ' ') + 1, strlen($city_filter)) === $city_filter)){ + if(isset($city_filter) + && !(substr($item['title'], strpos($item['title'], ' ') + 1, strlen($city_filter)) === $city_filter)){ continue; // Skip this item } diff --git a/bridges/CollegeDeFranceBridge.php b/bridges/CollegeDeFranceBridge.php index 474eff94..6a570948 100644 --- a/bridges/CollegeDeFranceBridge.php +++ b/bridges/CollegeDeFranceBridge.php @@ -1,11 +1,11 @@ <?php -class CollegeDeFranceBridge extends BridgeAbstract{ +class CollegeDeFranceBridge extends BridgeAbstract { - const MAINTAINER = "pit-fgfjiudghdf"; - const NAME = "CollegeDeFrance"; - const URI = "http://www.college-de-france.fr/"; + const MAINTAINER = 'pit-fgfjiudghdf'; + const NAME = 'CollegeDeFrance'; + const URI = 'http://www.college-de-france.fr/'; const CACHE_TIMEOUT = 10800; // 3h - const DESCRIPTION = "Returns the latest audio and video from CollegeDeFrance"; + const DESCRIPTION = 'Returns the latest audio and video from CollegeDeFrance'; public function collectData(){ $months = array( @@ -22,47 +22,61 @@ class CollegeDeFranceBridge extends BridgeAbstract{ '11' => 'nov.', '12' => 'déc.' ); + // The "API" used by the site returns a list of partial HTML in this form /* <li> * <a href="/site/thomas-romer/guestlecturer-2016-04-15-14h30.htm" data-target="after"> - * <span class="date"><span class="list-icon list-icon-video"></span><span class="list-icon list-icon-audio"></span>15 avr. 2016</span> + * <span class="date"><span class="list-icon list-icon-video"></span> + * <span class="list-icon list-icon-audio"></span>15 avr. 2016</span> * <span class="lecturer">Christopher Hays</span> * <span class='title'>Imagery of Divine Suckling in the Hebrew Bible and the Ancient Near East</span> * </a> * </li> */ - $html = getSimpleHTMLDOM(self::URI.'components/search-audiovideo.jsp?fulltext=&siteid=1156951719600&lang=FR&type=all') - or returnServerError('Could not request CollegeDeFrance.'); - foreach($html->find('a[data-target]') as $element) { + $html = getSimpleHTMLDOM(self::URI + . 'components/search-audiovideo.jsp?fulltext=&siteid=1156951719600&lang=FR&type=all') + or returnServerError('Could not request CollegeDeFrance.'); + + foreach($html->find('a[data-target]') as $element){ $item = array(); $item['title'] = $element->find('.title', 0)->plaintext; + // Most relative URLs contains an hour in addition to the date, so let's use it // <a href="/site/yann-lecun/course-2016-04-08-11h00.htm" data-target="after"> // - // Sometimes there's an __1, perhaps it signifies an update "/site/patrick-boucheron/seminar-2016-05-03-18h00__1.htm" + // Sometimes there's an __1, perhaps it signifies an update + // "/site/patrick-boucheron/seminar-2016-05-03-18h00__1.htm" // // But unfortunately some don't have any hours info - // <a href="/site/institut-physique/The-Mysteries-of-Decoherence-Sebastien-Gleyzes-[Video-3-35].htm" data-target="after"> + // <a href="/site/institut-physique/ + // The-Mysteries-of-Decoherence-Sebastien-Gleyzes-[Video-3-35].htm" data-target="after"> $timezone = new DateTimeZone('Europe/Paris'); - // strpos($element->href, '201') will break in 2020 but it'll probably break prior to then due to site changes anyway - $d = DateTime::createFromFormat( - '!Y-m-d-H\hi', - substr($element->href, strpos($element->href, '201'), 16), - $timezone - ); - if(!$d){ - $d=DateTime::createFromFormat( - '!d m Y', - trim(str_replace( - array_values($months), - array_keys($months), - $element->find('.date', 0)->plaintext - )), - $timezone - ); - } - $item['timestamp'] = $d->format('U'); - $item['content'] = $element->find('.lecturer', 0)->innertext . ' - ' . $element->find('.title', 0)->innertext; + + // strpos($element->href, '201') will break in 2020 but it'll + // probably break prior to then due to site changes anyway + $d = DateTime::createFromFormat( + '!Y-m-d-H\hi', + substr($element->href, strpos($element->href, '201'), 16), + $timezone + ); + + if(!$d){ + $d = DateTime::createFromFormat( + '!d m Y', + trim(str_replace( + array_values($months), + array_keys($months), + $element->find('.date', 0)->plaintext + )), + $timezone + ); + } + + $item['timestamp'] = $d->format('U'); + $item['content'] = $element->find('.lecturer', 0)->innertext + . ' - ' + . $element->find('.title', 0)->innertext; + $item['uri'] = self::URI . $element->href; $this->items[] = $item; } diff --git a/bridges/CommonDreamsBridge.php b/bridges/CommonDreamsBridge.php index 2bec0af5..e4dcb63f 100644 --- a/bridges/CommonDreamsBridge.php +++ b/bridges/CommonDreamsBridge.php @@ -1,10 +1,10 @@ <?php class CommonDreamsBridge extends FeedExpander { - const MAINTAINER = "nyutag"; - const NAME = "CommonDreams Bridge"; - const URI = "http://www.commondreams.org/"; - const DESCRIPTION = "Returns the newest articles."; + const MAINTAINER = 'nyutag'; + const NAME = 'CommonDreams Bridge'; + const URI = 'http://www.commondreams.org/'; + const DESCRIPTION = 'Returns the newest articles.'; public function collectData(){ $this->collectExpandableDatas('http://www.commondreams.org/rss.xml', 10); @@ -12,11 +12,11 @@ class CommonDreamsBridge extends FeedExpander { protected function parseItem($newsItem){ $item = parent::parseItem($newsItem); - $item['content'] = $this->CommonDreamsExtractContent($item['uri']); + $item['content'] = $this->extractContent($item['uri']); return $item; } - private function CommonDreamsExtractContent($url) { + private function extractContent($url){ $html3 = getSimpleHTMLDOMCached($url); $text = $html3->find('div[class=field--type-text-with-summary]', 0)->innertext; $html3->clear(); diff --git a/bridges/CopieDoubleBridge.php b/bridges/CopieDoubleBridge.php index 967da624..63ec5eb1 100644 --- a/bridges/CopieDoubleBridge.php +++ b/bridges/CopieDoubleBridge.php @@ -1,39 +1,35 @@ <?php -class CopieDoubleBridge extends BridgeAbstract{ +class CopieDoubleBridge extends BridgeAbstract { - const MAINTAINER = "superbaillot.net"; - const NAME = "CopieDouble"; - const URI = "http://www.copie-double.com/"; - const CACHE_TIMEOUT = 14400; // 4h - const DESCRIPTION = "CopieDouble"; + const MAINTAINER = 'superbaillot.net'; + const NAME = 'CopieDouble'; + const URI = 'http://www.copie-double.com/'; + const CACHE_TIMEOUT = 14400; // 4h + const DESCRIPTION = 'CopieDouble'; - public function collectData(){ - $html = getSimpleHTMLDOM(self::URI) - or returnServerError('Could not request CopieDouble.'); - $table = $html->find('table table', 2); + public function collectData(){ + $html = getSimpleHTMLDOM(self::URI) + or returnServerError('Could not request CopieDouble.'); - foreach($table->find('tr') as $element) - { - $td = $element->find('td', 0); - if($td->class == "couleur_1") - { - $item = array(); + $table = $html->find('table table', 2); - $title = $td->innertext; - $pos = strpos($title, "<a"); - $title = substr($title, 0, $pos); - $item['title'] = $title; - } - elseif(strpos($element->innertext, "/images/suivant.gif") === false) - { - $a=$element->find("a", 0); - $item['uri'] = self::URI . $a->href; + foreach($table->find('tr') as $element){ + $td = $element->find('td', 0); - $content = str_replace('src="/', 'src="/'.self::URI,$element->find("td", 0)->innertext); - $content = str_replace('href="/', 'href="'.self::URI,$content); - $item['content'] = $content; - $this->items[] = $item; - } - } - } + if($td->class === 'couleur_1'){ + $item = array(); + $title = $td->innertext; + $pos = strpos($title, '<a'); + $title = substr($title, 0, $pos); + $item['title'] = $title; + } elseif(strpos($element->innertext, "/images/suivant.gif") === false){ + $a = $element->find('a', 0); + $item['uri'] = self::URI . $a->href; + $content = str_replace('src="/', 'src="/' . self::URI,$element->find("td", 0)->innertext); + $content = str_replace('href="/', 'href="' . self::URI,$content); + $item['content'] = $content; + $this->items[] = $item; + } + } + } } diff --git a/bridges/CourrierInternationalBridge.php b/bridges/CourrierInternationalBridge.php index 28237d88..e666bfd5 100644 --- a/bridges/CourrierInternationalBridge.php +++ b/bridges/CourrierInternationalBridge.php @@ -1,61 +1,55 @@ <?php -class CourrierInternationalBridge extends BridgeAbstract{ +class CourrierInternationalBridge extends BridgeAbstract { - const MAINTAINER = "teromene"; - const NAME = "Courrier International Bridge"; - const URI = "http://CourrierInternational.com/"; - const CACHE_TIMEOUT = 300; // 5 min - const DESCRIPTION = "Courrier International bridge"; + const MAINTAINER = 'teromene'; + const NAME = 'Courrier International Bridge'; + const URI = 'http://CourrierInternational.com/'; + const CACHE_TIMEOUT = 300; // 5 min + const DESCRIPTION = 'Courrier International bridge'; - public function collectData(){ + public function collectData(){ + $html = getSimpleHTMLDOM(self::URI) + or returnServerError('Error.'); - $html = getSimpleHTMLDOM(self::URI) - or returnServerError('Error.'); + $element = $html->find("article"); + $article_count = 1; - $element = $html->find("article"); + foreach($element as $article){ + $item = array(); - $article_count = 1; + $item['uri'] = $article->parent->getAttribute('href'); - foreach($element as $article) { + if(strpos($item['uri'], 'http') === false){ + $item['uri'] = self::URI . $item['uri']; + } - $item = array(); + $page = getSimpleHTMLDOMCached($item['uri']); - $item['uri'] = $article->parent->getAttribute("href"); + $content = $page->find('.article-text', 0); - if(strpos($item['uri'], "http") === FALSE) { - $item['uri'] = self::URI.$item['uri']; - } + if(!$content){ + $content = $page->find('.depeche-text', 0); + } - $page = getSimpleHTMLDOMCached($item['uri']); + $item['content'] = sanitize($content); + $item['title'] = strip_tags($article->find('.title', 0)); - $content = $page->find('.article-text',0); - if(!$content){ - $content = $page->find('.depeche-text',0); - } + $dateTime = date_parse($page->find('time', 0)); - $item['content'] = sanitize($content); - $item['title'] = strip_tags($article->find(".title",0)); + $item['timestamp'] = mktime( + $dateTime['hour'], + $dateTime['minute'], + $dateTime['second'], + $dateTime['month'], + $dateTime['day'], + $dateTime['year'] + ); - $dateTime = date_parse($page->find("time",0)); + $this->items[] = $item; + $article_count ++; - $item['timestamp'] = mktime( - $dateTime['hour'], - $dateTime['minute'], - $dateTime['second'], - $dateTime['month'], - $dateTime['day'], - $dateTime['year'] - ); - - $this->items[] = $item; - $article_count ++; - if($article_count > 5) break; - - } - - - - } + if($article_count > 5) + break; + } + } } - -?> diff --git a/bridges/CpasbienBridge.php b/bridges/CpasbienBridge.php index d6ca12a8..aced6288 100644 --- a/bridges/CpasbienBridge.php +++ b/bridges/CpasbienBridge.php @@ -1,71 +1,70 @@ <?php class CpasbienBridge extends BridgeAbstract { - const MAINTAINER = "lagaisse"; - const NAME = "Cpasbien Bridge"; - const URI = "http://www.cpasbien.cm"; - const CACHE_TIMEOUT = 86400; // 24h - const DESCRIPTION = "Returns latest torrents from a request query"; + const MAINTAINER = 'lagaisse'; + const NAME = 'Cpasbien Bridge'; + const URI = 'http://www.cpasbien.cm'; + const CACHE_TIMEOUT = 86400; // 24h + const DESCRIPTION = 'Returns latest torrents from a request query'; - const PARAMETERS = array( array( - 'q'=>array( - 'name'=>'Search', - 'required'=>true, - 'title'=>'Type your search' - ) - )); + const PARAMETERS = array( array( + 'q' => array( + 'name' => 'Search', + 'required' => true, + 'title' => 'Type your search' + ) + )); - public function collectData(){ - $request = str_replace(" ","-",trim($this->getInput('q'))); - $html = getSimpleHTMLDOM(self::URI.'/recherche/'.urlencode($request).'.html') - or returnServerError('No results for this query.'); + public function collectData(){ + $request = str_replace(" ", "-", trim($this->getInput('q'))); + $html = getSimpleHTMLDOM(self::URI . '/recherche/' . urlencode($request) . '.html') + or returnServerError('No results for this query.'); - foreach ($html->find('#gauche',0)->find('div') as $episode) { - if ($episode->getAttribute('class')=='ligne0' || - $episode->getAttribute('class')=='ligne1') - { + foreach($html->find('#gauche',0)->find('div') as $episode){ + if($episode->getAttribute('class') == 'ligne0' + || $episode->getAttribute('class') == 'ligne1'){ - $urlepisode = $episode->find('a', 0)->getAttribute('href'); - $htmlepisode=getSimpleHTMLDOMCached($urlepisode, 86400*366*30); + $urlepisode = $episode->find('a', 0)->getAttribute('href'); + $htmlepisode = getSimpleHTMLDOMCached($urlepisode, 86400 * 366 * 30); - $item = array(); - $item['author'] = $episode->find('a', 0)->text(); - $item['title'] = $episode->find('a', 0)->text(); - $item['pubdate'] = $this->getCachedDate($urlepisode); - $textefiche=$htmlepisode->find('#textefiche', 0)->find('p',1); - if (isset($textefiche)) { - $item['content'] = $textefiche->text(); - } else { - $p=$htmlepisode->find('#textefiche',0)->find('p'); - if(!empty($p)){ - $item['content'] = $htmlepisode->find('#textefiche', 0)->find('p',0)->text(); - } - } + $item = array(); + $item['author'] = $episode->find('a', 0)->text(); + $item['title'] = $episode->find('a', 0)->text(); + $item['pubdate'] = $this->getCachedDate($urlepisode); + $textefiche = $htmlepisode->find('#textefiche', 0)->find('p', 1); - $item['id'] = $episode->find('a', 0)->getAttribute('href'); - $item['uri'] = self::URI . $htmlepisode->find('#telecharger',0)->getAttribute('href'); - $this->items[] = $item; - } - } - } + if(isset($textefiche)){ + $item['content'] = $textefiche->text(); + } else { + $p = $htmlepisode->find('#textefiche', 0)->find('p'); + if(!empty($p)){ + $item['content'] = $htmlepisode->find('#textefiche', 0)->find('p', 0)->text(); + } + } + $item['id'] = $episode->find('a', 0)->getAttribute('href'); + $item['uri'] = self::URI . $htmlepisode->find('#telecharger', 0)->getAttribute('href'); + $this->items[] = $item; + } + } + } - public function getName(){ - return $this->getInput('q').' : '.self::NAME; - } + public function getName(){ + return $this->getInput('q') . ' : ' . self::NAME; + } - private function getCachedDate($url){ - debugMessage('getting pubdate from url ' . $url . ''); + private function getCachedDate($url){ + debugMessage('getting pubdate from url ' . $url . ''); - // Initialize cache - $cache = Cache::create('FileCache'); - $cache->setPath(CACHE_DIR . '/pages'); + // Initialize cache + $cache = Cache::create('FileCache'); + $cache->setPath(CACHE_DIR . '/pages'); - $params = [$url]; - $cache->setParameters($params); + $params = [$url]; + $cache->setParameters($params); - // Get cachefile timestamp - $time = $cache->getTime(); - return ($time!==false?$time:time()); - } + // Get cachefile timestamp + $time = $cache->getTime(); + return ($time !== false ? $time : time()); + } } diff --git a/bridges/CryptomeBridge.php b/bridges/CryptomeBridge.php index 7fbb68a3..78fec3c1 100644 --- a/bridges/CryptomeBridge.php +++ b/bridges/CryptomeBridge.php @@ -1,39 +1,45 @@ <?php -class CryptomeBridge extends BridgeAbstract{ +class CryptomeBridge extends BridgeAbstract { - const MAINTAINER = "BoboTiG"; - const NAME = "Cryptome"; - const URI = "https://cryptome.org/"; - const CACHE_TIMEOUT = 21600; //6h - const DESCRIPTION = "Returns the N most recent documents."; + const MAINTAINER = 'BoboTiG'; + const NAME = 'Cryptome'; + const URI = 'https://cryptome.org/'; + const CACHE_TIMEOUT = 21600; //6h + const DESCRIPTION = 'Returns the N most recent documents.'; - const PARAMETERS = array( array( - 'n'=>array( - 'name'=>'number of elements', - 'type'=>'number', - 'defaultValue'=>20, - 'exampleValue'=>10 - ) - )); + const PARAMETERS = array( array( + 'n' => array( + 'name' => 'number of elements', + 'type' => 'number', + 'defaultValue' => 20, + 'exampleValue' => 10 + ) + )); - public function collectData(){ - $html = getSimpleHTMLDOM(self::URI) - or returnServerError('Could not request Cryptome.'); - $number=$this->getInput('n'); - if (!empty($number)) { /* number of documents */ - $num = min($number, 20); - } + public function collectData(){ + $html = getSimpleHTMLDOM(self::URI) + or returnServerError('Could not request Cryptome.'); + $number = $this->getInput('n'); - foreach($html->find('pre') as $element) { - for ( $i = 0; $i < $num; ++$i ) { - $item = array(); - $item['uri'] = self::URI.substr($element->find('a', $i)->href, 20); - $item['title'] = substr($element->find('b', $i)->plaintext, 22); - $item['content'] = preg_replace('#http://cryptome.org/#', self::URI, $element->find('b', $i)->innertext); - $this->items[] = $item; - } - break; - } - } + /* number of documents */ + if(!empty($number)){ + $num = min($number, 20); + } + + foreach($html->find('pre') as $element){ + for($i = 0; $i < $num; ++$i){ + $item = array(); + $item['uri'] = self::URI . substr($element->find('a', $i)->href, 20); + $item['title'] = substr($element->find('b', $i)->plaintext, 22); + $item['content'] = preg_replace( + '#http://cryptome.org/#', + self::URI, + $element->find('b', $i)->innertext + ); + $this->items[] = $item; + } + break; + } + } } diff --git a/bridges/DailymotionBridge.php b/bridges/DailymotionBridge.php index 3cb882fd..566d4a40 100644 --- a/bridges/DailymotionBridge.php +++ b/bridges/DailymotionBridge.php @@ -1,115 +1,122 @@ <?php -class DailymotionBridge extends BridgeAbstract{ +class DailymotionBridge extends BridgeAbstract { - const MAINTAINER = "mitsukarenai"; - const NAME = "Dailymotion Bridge"; - const URI = "https://www.dailymotion.com/"; - const CACHE_TIMEOUT = 10800; // 3h - const DESCRIPTION = "Returns the 5 newest videos by username/playlist or search"; + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Dailymotion Bridge'; + const URI = 'https://www.dailymotion.com/'; + const CACHE_TIMEOUT = 10800; // 3h + const DESCRIPTION = 'Returns the 5 newest videos by username/playlist or search'; - const PARAMETERS = array ( - 'By username' => array( - 'u'=>array( - 'name'=>'username', - 'required'=>true - ) - ), + const PARAMETERS = array ( + 'By username' => array( + 'u' => array( + 'name' => 'username', + 'required' => true + ) + ), + 'By playlist id' => array( + 'p' => array( + 'name' => 'playlist id', + 'required' => true + ) + ), + 'From search results' => array( + 's' => array( + 'name' => 'Search keyword', + 'required' => true + ), + 'pa' => array( + 'name' => 'Page', + 'type' => 'number' + ) + ) + ); - 'By playlist id' => array( - 'p'=>array( - 'name'=>'playlist id', - 'required'=>true - ) - ), + protected function getMetadata($id){ + $metadata = array(); + $html2 = getSimpleHTMLDOM(self::URI . 'video/' . $id); + if(!$html2){ + return $metadata; + } - 'From search results' => array( - 's'=>array( - 'name'=>'Search keyword', - 'required'=>true - ), - 'pa'=>array( - 'name'=>'Page', - 'type'=>'number' - ) - ) - ); + $metadata['title'] = $html2->find('meta[property=og:title]', 0)->getAttribute('content'); + $metadata['timestamp'] = strtotime( + $html2->find('meta[property=video:release_date]', 0)->getAttribute('content') + ); + $metadata['thumbnailUri'] = $html2->find('meta[property=og:image]', 0)->getAttribute('content'); + $metadata['uri'] = $html2->find('meta[property=og:url]', 0)->getAttribute('content'); + return $metadata; + } - protected function getMetadata($id) { - $metadata=array(); - $html2 = getSimpleHTMLDOM(self::URI.'video/'.$id); - if(!$html2){ - return $metadata; - } + public function collectData(){ + $html = ''; + $limit = 5; + $count = 0; - $metadata['title'] = $html2->find('meta[property=og:title]', 0)->getAttribute('content'); - $metadata['timestamp'] = strtotime($html2->find('meta[property=video:release_date]', 0)->getAttribute('content') ); - $metadata['thumbnailUri'] = $html2->find('meta[property=og:image]', 0)->getAttribute('content'); - $metadata['uri'] = $html2->find('meta[property=og:url]', 0)->getAttribute('content'); - return $metadata; - } + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Could not request Dailymotion.'); - public function collectData(){ - $html = ''; - $limit = 5; - $count = 0; + foreach($html->find('div.media a.preview_link') as $element){ + if($count < $limit){ + $item = array(); + $item['id'] = str_replace('/video/', '', strtok($element->href, '_')); + $metadata = $this->getMetadata($item['id']); + if(empty($metadata)){ + continue; + } + $item['uri'] = $metadata['uri']; + $item['title'] = $metadata['title']; + $item['timestamp'] = $metadata['timestamp']; - $html = getSimpleHTMLDOM($this->getURI()) - or returnServerError('Could not request Dailymotion.'); + $item['content'] = '<a href="' + . $item['uri'] + . '"><img src="' + . $metadata['thumbnailUri'] + . '" /></a><br><a href="' + . $item['uri'] + . '">' + . $item['title'] + . '</a>'; - foreach($html->find('div.media a.preview_link') as $element) { - if($count < $limit) { - $item = array(); - $item['id'] = str_replace('/video/', '', strtok($element->href, '_')); - $metadata = $this->getMetadata($item['id']); - if(empty($metadata)){ - continue; - } - $item['uri'] = $metadata['uri']; - $item['title'] = $metadata['title']; - $item['timestamp'] = $metadata['timestamp']; - $item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $metadata['thumbnailUri'] . '" /></a><br><a href="' . $item['uri'] . '">' . $item['title'] . '</a>'; - $this->items[] = $item; - $count++; - } - } - } + $this->items[] = $item; + $count++; + } + } + } - public function getName(){ - switch($this->queriedContext){ - case 'By username': - $specific=$this->getInput('u'); - break; - case 'By playlist id': - $specific=strtok($this->getInput('p'), '_'); - break; - case 'From search results': - $specific=$this->getInput('s'); - break; - default: return parent::getName(); - } + public function getName(){ + switch($this->queriedContext){ + case 'By username': + $specific = $this->getInput('u'); + break; + case 'By playlist id': + $specific = strtok($this->getInput('p'), '_'); + break; + case 'From search results': + $specific = $this->getInput('s'); + break; + default: return parent::getName(); + } - return $specific.' : Dailymotion Bridge'; - } + return $specific . ' : Dailymotion Bridge'; + } - public function getURI(){ - $uri=self::URI; - switch($this->queriedContext){ - case 'By username': - $uri.='user/' - .urlencode($this->getInput('u')).'/1'; - break; - case 'By playlist id': - $uri.='playlist/' - .urlencode(strtok($this->getInput('p'), '_')); - break; - case 'From search results': - $uri.='search/' - .urlencode($this->getInput('s')); - if($this->getInput('pa')){ - $uri.='/'.$this->getInput('pa'); - } - break; - } - return $uri; - } + public function getURI(){ + $uri = self::URI; + switch($this->queriedContext){ + case 'By username': + $uri .= 'user/' . urlencode($this->getInput('u')) . '/1'; + break; + case 'By playlist id': + $uri .= 'playlist/' . urlencode(strtok($this->getInput('p'), '_')); + break; + case 'From search results': + $uri .= 'search/' . urlencode($this->getInput('s')); + if($this->getInput('pa')){ + $uri .= '/' . $this->getInput('pa'); + } + break; + } + return $uri; + } } diff --git a/bridges/DanbooruBridge.php b/bridges/DanbooruBridge.php index 9b7ab18a..1c9972a8 100644 --- a/bridges/DanbooruBridge.php +++ b/bridges/DanbooruBridge.php @@ -1,51 +1,59 @@ <?php -class DanbooruBridge extends BridgeAbstract{ - - const MAINTAINER = "mitsukarenai"; - const NAME = "Danbooru"; - const URI = "http://donmai.us/"; - const CACHE_TIMEOUT = 1800; // 30min - const DESCRIPTION = "Returns images from given page"; - - const PARAMETERS = array( - 'global'=>array( - 'p'=>array( - 'name'=>'page', - 'defaultValue'=>1, - 'type'=>'number' - ), - 't'=>array('name'=>'tags') - ), - 0=>array() - ); - - const PATHTODATA='article'; - const IDATTRIBUTE='data-id'; - - protected function getFullURI(){ - return $this->getURI().'posts?' - .'&page='.$this->getInput('p') - .'&tags='.urlencode($this->getInput('t')); - } - - protected function getItemFromElement($element){ - $item = array(); - $item['uri'] = $this->getURI().$element->find('a', 0)->href; - $item['postid'] = (int)preg_replace("/[^0-9]/",'', $element->getAttribute(static::IDATTRIBUTE)); - $item['timestamp'] = time(); - $thumbnailUri = $this->getURI().$element->find('img', 0)->src; - $item['tags'] = $element->find('img', 0)->getAttribute('alt'); - $item['title'] = $this->getName().' | '.$item['postid']; - $item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $thumbnailUri . '" /></a><br>Tags: '.$item['tags']; - return $item; - } - - public function collectData(){ - $html = getSimpleHTMLDOM($this->getFullURI()) - or returnServerError('Could not request '.$this->getName()); - - foreach($html->find(static::PATHTODATA) as $element) { - $this->items[] = $this->getItemFromElement($element); - } - } +class DanbooruBridge extends BridgeAbstract { + + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Danbooru'; + const URI = 'http://donmai.us/'; + const CACHE_TIMEOUT = 1800; // 30min + const DESCRIPTION = 'Returns images from given page'; + + const PARAMETERS = array( + 'global' => array( + 'p' => array( + 'name' => 'page', + 'defaultValue' => 1, + 'type' => 'number' + ), + 't' => array( + 'name' => 'tags' + ) + ), + 0 => array() + ); + + const PATHTODATA = 'article'; + const IDATTRIBUTE = 'data-id'; + + protected function getFullURI(){ + return $this->getURI() + . 'posts?&page=' . $this->getInput('p') + . '&tags=' . urlencode($this->getInput('t')); + } + + protected function getItemFromElement($element){ + $item = array(); + $item['uri'] = $this->getURI() . $element->find('a', 0)->href; + $item['postid'] = (int)preg_replace("/[^0-9]/", '', $element->getAttribute(static::IDATTRIBUTE)); + $item['timestamp'] = time(); + $thumbnailUri = $this->getURI() . $element->find('img', 0)->src; + $item['tags'] = $element->find('img', 0)->getAttribute('alt'); + $item['title'] = $this->getName() . ' | ' . $item['postid']; + $item['content'] = '<a href="' + . $item['uri'] + . '"><img src="' + . $thumbnailUri + . '" /></a><br>Tags: ' + . $item['tags']; + + return $item; + } + + public function collectData(){ + $html = getSimpleHTMLDOM($this->getFullURI()) + or returnServerError('Could not request ' . $this->getName()); + + foreach($html->find(static::PATHTODATA) as $element) { + $this->items[] = $this->getItemFromElement($element); + } + } } diff --git a/bridges/DansTonChatBridge.php b/bridges/DansTonChatBridge.php index 6cefca82..925c4a60 100644 --- a/bridges/DansTonChatBridge.php +++ b/bridges/DansTonChatBridge.php @@ -1,23 +1,23 @@ <?php -class DansTonChatBridge extends BridgeAbstract{ +class DansTonChatBridge extends BridgeAbstract { - const MAINTAINER = "Astalaseven"; - const NAME = "DansTonChat Bridge"; - const URI = "http://danstonchat.com/"; + const MAINTAINER = 'Astalaseven'; + const NAME = 'DansTonChat Bridge'; + const URI = 'http://danstonchat.com/'; const CACHE_TIMEOUT = 21600; //6h - const DESCRIPTION = "Returns latest quotes from DansTonChat."; + const DESCRIPTION = 'Returns latest quotes from DansTonChat.'; - public function collectData(){ + public function collectData(){ - $html = getSimpleHTMLDOM(self::URI.'latest.html') - or returnServerError('Could not request DansTonChat.'); + $html = getSimpleHTMLDOM(self::URI . 'latest.html') + or returnServerError('Could not request DansTonChat.'); - foreach($html->find('div.item') as $element) { - $item = array(); - $item['uri'] = $element->find('a', 0)->href; - $item['title'] = 'DansTonChat '.$element->find('a', 1)->plaintext; - $item['content'] = $element->find('a', 0)->innertext; - $this->items[] = $item; - } - } + foreach($html->find('div.item') as $element){ + $item = array(); + $item['uri'] = $element->find('a', 0)->href; + $item['title'] = 'DansTonChat ' . $element->find('a', 1)->plaintext; + $item['content'] = $element->find('a', 0)->innertext; + $this->items[] = $item; + } + } } diff --git a/bridges/DauphineLibereBridge.php b/bridges/DauphineLibereBridge.php index 0d052435..35783358 100644 --- a/bridges/DauphineLibereBridge.php +++ b/bridges/DauphineLibereBridge.php @@ -1,57 +1,56 @@ <?php class DauphineLibereBridge extends FeedExpander { - const MAINTAINER = "qwertygc"; - const NAME = "Dauphine Bridge"; - const URI = "http://www.ledauphine.com/"; - const CACHE_TIMEOUT = 7200; // 2h - const DESCRIPTION = "Returns the newest articles."; + const MAINTAINER = 'qwertygc'; + const NAME = 'Dauphine Bridge'; + const URI = 'http://www.ledauphine.com/'; + const CACHE_TIMEOUT = 7200; // 2h + const DESCRIPTION = 'Returns the newest articles.'; - const PARAMETERS = array( array( - 'u'=>array( - 'name'=>'Catégorie de l\'article', - 'type'=>'list', - 'values'=>array( - 'À la une'=>'', - 'France Monde'=>'france-monde', - 'Faits Divers'=>'faits-divers', - 'Économie et Finance'=>'economie-et-finance', - 'Politique'=>'politique', - 'Sport'=>'sport', - 'Ain'=>'ain', - 'Alpes-de-Haute-Provence'=>'haute-provence', - 'Hautes-Alpes'=>'hautes-alpes', - 'Ardèche'=>'ardeche', - 'Drôme'=>'drome', - 'Isère Sud'=>'isere-sud', - 'Savoie'=>'savoie', - 'Haute-Savoie'=>'haute-savoie', - 'Vaucluse'=>'vaucluse' - ) - ) - )); + const PARAMETERS = array( array( + 'u' => array( + 'name' => 'Catégorie de l\'article', + 'type' => 'list', + 'values' => array( + 'À la une' => '', + 'France Monde' => 'france-monde', + 'Faits Divers' => 'faits-divers', + 'Économie et Finance' => 'economie-et-finance', + 'Politique' => 'politique', + 'Sport' => 'sport', + 'Ain' => 'ain', + 'Alpes-de-Haute-Provence' => 'haute-provence', + 'Hautes-Alpes' => 'hautes-alpes', + 'Ardèche' => 'ardeche', + 'Drôme' => 'drome', + 'Isère Sud' => 'isere-sud', + 'Savoie' => 'savoie', + 'Haute-Savoie' => 'haute-savoie', + 'Vaucluse' => 'vaucluse' + ) + ) + )); - public function collectData(){ - $url = self::URI . 'rss'; + public function collectData(){ + $url = self::URI . 'rss'; - if (empty($this->getInput('u'))) { - $url = self::URI . $this->getInput('u') . '/rss'; - } + if(empty($this->getInput('u'))){ + $url = self::URI . $this->getInput('u') . '/rss'; + } - $this->collectExpandableDatas($url, 10); - } + $this->collectExpandableDatas($url, 10); + } - protected function parseItem($newsItem){ - $item = parent::parseItem($newsItem); - $item['content'] = $this->ExtractContent($item['uri']); - return $item; - } + protected function parseItem($newsItem){ + $item = parent::parseItem($newsItem); + $item['content'] = $this->extractContent($item['uri']); + return $item; + } - private function ExtractContent($url) { - $html2 = getSimpleHTMLDOMCached($url); - $text = $html2->find('div.column', 0)->innertext; - $text = preg_replace('@<script[^>]*?>.*?</script>@si', '', $text); - return $text; - } + private function extractContent($url){ + $html2 = getSimpleHTMLDOMCached($url); + $text = $html2->find('div.column', 0)->innertext; + $text = preg_replace('@<script[^>]*?>.*?</script>@si', '', $text); + return $text; + } } -?> diff --git a/bridges/DemoBridge.php b/bridges/DemoBridge.php index 89a32ea4..ea2088eb 100644 --- a/bridges/DemoBridge.php +++ b/bridges/DemoBridge.php @@ -1,49 +1,46 @@ <?php -class DemoBridge extends BridgeAbstract{ - - const MAINTAINER = "teromene"; - const NAME = "DemoBridge"; - const URI = "http://github.com/rss-bridge/rss-bridge"; - const DESCRIPTION = "Bridge used for demos"; - - const PARAMETERS = array( - 'testCheckbox' => array( - 'testCheckbox'=>array( - 'type'=>'checkbox', - 'name'=>'test des checkbox' - ) - ), - - 'testList' => array( - 'testList'=>array( - 'type'=>'list', - 'name'=>'test des listes', - 'values'=>array( - 'Test'=>'test', - 'Test 2'=>'test2' - ) - ) - ), - - 'testNumber' => array( - 'testNumber'=>array( - 'type'=>'number', - 'name'=>'test des numéros', - 'exampleValue'=>'1515632' - ) - ) - ); - - public function collectData(){ - - $item = array(); - $item['author'] = "Me!"; - $item['title'] = "Test"; - $item['content'] = "Awesome content !"; - $item['id'] = "Lalala"; - $item['uri'] = "http://example.com/test"; - - $this->items[] = $item; - - } +class DemoBridge extends BridgeAbstract { + + const MAINTAINER = 'teromene'; + const NAME = 'DemoBridge'; + const URI = 'http://github.com/rss-bridge/rss-bridge'; + const DESCRIPTION = 'Bridge used for demos'; + + const PARAMETERS = array( + 'testCheckbox' => array( + 'testCheckbox' => array( + 'type' => 'checkbox', + 'name' => 'test des checkbox' + ) + ), + 'testList' => array( + 'testList' => array( + 'type' => 'list', + 'name' => 'test des listes', + 'values' => array( + 'Test' => 'test', + 'Test 2' => 'test2' + ) + ) + ), + 'testNumber' => array( + 'testNumber' => array( + 'type' => 'number', + 'name' => 'test des numéros', + 'exampleValue' => '1515632' + ) + ) + ); + + public function collectData(){ + + $item = array(); + $item['author'] = "Me!"; + $item['title'] = "Test"; + $item['content'] = "Awesome content !"; + $item['id'] = "Lalala"; + $item['uri'] = "http://example.com/test"; + + $this->items[] = $item; + } } diff --git a/bridges/DeveloppezDotComBridge.php b/bridges/DeveloppezDotComBridge.php index 969f5ebc..5719cf3f 100644 --- a/bridges/DeveloppezDotComBridge.php +++ b/bridges/DeveloppezDotComBridge.php @@ -1,11 +1,11 @@ <?php class DeveloppezDotComBridge extends FeedExpander { - const MAINTAINER = "polopollo"; - const NAME = "Developpez.com Actus (FR)"; - const URI = "http://www.developpez.com/"; + const MAINTAINER = 'polopollo'; + const NAME = 'Developpez.com Actus (FR)'; + const URI = 'https://www.developpez.com/'; const CACHE_TIMEOUT = 1800; // 30min - const DESCRIPTION = "Returns the 15 newest posts from DeveloppezDotCom (full text)."; + const DESCRIPTION = 'Returns the 15 newest posts from DeveloppezDotCom (full text).'; public function collectData(){ $this->collectExpandableDatas(self::URI . 'index/rss', 15); @@ -13,19 +13,13 @@ class DeveloppezDotComBridge extends FeedExpander { protected function parseItem($newsItem){ $item = parent::parseItem($newsItem); - $item['content'] = $this->DeveloppezDotComExtractContent($item['uri']); + $item['content'] = $this->extractContent($item['uri']); return $item; } - private function DeveloppezDotComStripCDATA($string) { - $string = str_replace('<![CDATA[', '', $string); - $string = str_replace(']]>', '', $string); - return $string; - } - // F***ing quotes from Microsoft Word badly encoded, here was the trick: // http://stackoverflow.com/questions/1262038/how-to-replace-microsoft-encoded-quotes-in-php - private function convert_smart_quotes($string) + private function convertSmartQuotes($string) { $search = array(chr(145), chr(146), @@ -33,18 +27,20 @@ class DeveloppezDotComBridge extends FeedExpander { chr(148), chr(151)); - $replace = array("'", - "'", - '"', - '"', - '-'); + $replace = array( + "'", + "'", + '"', + '"', + '-' + ); return str_replace($search, $replace, $string); } - private function DeveloppezDotComExtractContent($url) { + private function extractContent($url){ $articleHTMLContent = getSimpleHTMLDOMCached($url); - $text = $this->convert_smart_quotes($articleHTMLContent->find('div.content', 0)->innertext); + $text = $this->convertSmartQuotes($articleHTMLContent->find('div.content', 0)->innertext); $text = utf8_encode($text); return trim($text); } diff --git a/bridges/DilbertBridge.php b/bridges/DilbertBridge.php index b741127e..2c5e6396 100644 --- a/bridges/DilbertBridge.php +++ b/bridges/DilbertBridge.php @@ -1,36 +1,36 @@ <?php class DilbertBridge extends BridgeAbstract { - const MAINTAINER = 'kranack'; - const NAME = 'Dilbert Daily Strip'; - const URI = 'http://dilbert.com'; - const CACHE_TIMEOUT = 21600; // 6h - const DESCRIPTION = 'The Unofficial Dilbert Daily Comic Strip'; + const MAINTAINER = 'kranack'; + const NAME = 'Dilbert Daily Strip'; + const URI = 'http://dilbert.com'; + const CACHE_TIMEOUT = 21600; // 6h + const DESCRIPTION = 'The Unofficial Dilbert Daily Comic Strip'; - public function collectData(){ + public function collectData(){ - $html = getSimpleHTMLDOM($this->getURI()) or returnServerError('Could not request Dilbert: '.$this->getURI()); + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Could not request Dilbert: ' . $this->getURI()); - foreach ($html->find('section.comic-item') as $element) { + foreach($html->find('section.comic-item') as $element){ - $img = $element->find('img', 0); - $link = $element->find('a', 0); - $comic = $img->src; - $title = $link->alt; - $url = $link->href; - $date = substr($url, 25); - if (empty($title)) - $title = 'Dilbert Comic Strip on '.$date; - $date = strtotime($date); + $img = $element->find('img', 0); + $link = $element->find('a', 0); + $comic = $img->src; + $title = $link->alt; + $url = $link->href; + $date = substr($url, 25); + if (empty($title)) + $title = 'Dilbert Comic Strip on ' . $date; + $date = strtotime($date); - $item = array(); - $item['uri'] = $url; - $item['title'] = $title; - $item['author'] = 'Scott Adams'; - $item['timestamp'] = $date; - $item['content'] = '<img src="'.$comic.'" alt="'.$img->alt.'" />'; - $this->items[] = $item; - } - } + $item = array(); + $item['uri'] = $url; + $item['title'] = $title; + $item['author'] = 'Scott Adams'; + $item['timestamp'] = $date; + $item['content'] = '<img src="' . $comic . '" alt="' . $img->alt . '" />'; + $this->items[] = $item; + } + } } -?> diff --git a/bridges/DollbooruBridge.php b/bridges/DollbooruBridge.php index 90da94d7..5ed4119f 100644 --- a/bridges/DollbooruBridge.php +++ b/bridges/DollbooruBridge.php @@ -1,11 +1,9 @@ <?php require_once('Shimmie2Bridge.php'); -class DollbooruBridge extends Shimmie2Bridge{ - - const MAINTAINER = "mitsukarenai"; - const NAME = "Dollbooru"; - const URI = "http://dollbooru.org/"; - const DESCRIPTION = "Returns images from given page"; - +class DollbooruBridge extends Shimmie2Bridge { + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Dollbooru'; + const URI = 'http://dollbooru.org/'; + const DESCRIPTION = 'Returns images from given page'; } diff --git a/bridges/DuckDuckGoBridge.php b/bridges/DuckDuckGoBridge.php index 89c665bf..554a050f 100644 --- a/bridges/DuckDuckGoBridge.php +++ b/bridges/DuckDuckGoBridge.php @@ -1,41 +1,42 @@ <?php -class DuckDuckGoBridge extends BridgeAbstract{ +class DuckDuckGoBridge extends BridgeAbstract { - const MAINTAINER = "Astalaseven"; - const NAME = "DuckDuckGo"; - const URI = "https://duckduckgo.com/"; + const MAINTAINER = 'Astalaseven'; + const NAME = 'DuckDuckGo'; + const URI = 'https://duckduckgo.com/'; const CACHE_TIMEOUT = 21600; // 6h - const DESCRIPTION = "Returns results from DuckDuckGo."; + const DESCRIPTION = 'Returns results from DuckDuckGo.'; const SORT_DATE = '+sort:date'; const SORT_RELEVANCE = ''; - const PARAMETERS = array( array( - 'u'=>array( - 'name'=>'keyword', - 'required'=>true), - 'sort'=>array( - 'name'=>'sort by', - 'type'=>'list', - 'required'=>false, - 'values'=>array( - 'date'=>self::SORT_DATE, - 'relevance'=>self::SORT_RELEVANCE - ), - 'defaultValue'=>self::SORT_DATE - ) - )); + const PARAMETERS = array( array( + 'u' => array( + 'name' => 'keyword', + 'required' => true + ), + 'sort' => array( + 'name' => 'sort by', + 'type' => 'list', + 'required' => false, + 'values' => array( + 'date' => self::SORT_DATE, + 'relevance' => self::SORT_RELEVANCE + ), + 'defaultValue' => self::SORT_DATE + ) + )); - public function collectData(){ - $html = getSimpleHTMLDOM(self::URI.'html/?kd=-1&q='.$this->getInput('u').$this->getInput('sort')) - or returnServerError('Could not request DuckDuckGo.'); + public function collectData(){ + $html = getSimpleHTMLDOM(self::URI . 'html/?kd=-1&q=' . $this->getInput('u') . $this->getInput('sort')) + or returnServerError('Could not request DuckDuckGo.'); - foreach($html->find('div.results_links') as $element) { - $item = array(); - $item['uri'] = $element->find('a', 0)->href; - $item['title'] = $element->find('a', 1)->innertext; - $item['content'] = $element->find('div.snippet', 0)->plaintext; - $this->items[] = $item; - } - } + foreach($html->find('div.results_links') as $element){ + $item = array(); + $item['uri'] = $element->find('a', 0)->href; + $item['title'] = $element->find('a', 1)->innertext; + $item['content'] = $element->find('div.snippet', 0)->plaintext; + $this->items[] = $item; + } + } } diff --git a/bridges/EZTVBridge.php b/bridges/EZTVBridge.php index 42793598..f17c2b46 100644 --- a/bridges/EZTVBridge.php +++ b/bridges/EZTVBridge.php @@ -1,66 +1,67 @@ <?php -class EZTVBridge extends BridgeAbstract{ +class EZTVBridge extends BridgeAbstract { const MAINTAINER = "alexAubin"; - const NAME = "EZTV"; - const URI = "https://eztv.ch/"; - const DESCRIPTION = "Returns list of *recent* torrents for a specific show on EZTV. Get showID from URLs in https://eztv.ch/shows/showID/show-full-name."; + const NAME = 'EZTV'; + const URI = 'https://eztv.ch/'; + const DESCRIPTION = 'Returns list of *recent* torrents for a specific show +on EZTV. Get showID from URLs in https://eztv.ch/shows/showID/show-full-name.'; - const PARAMETERS = array( array( - 'i'=>array( - 'name'=>'Show ids', - 'exampleValue'=>'showID1,showID2,…', - 'required'=>true - ) - )); + const PARAMETERS = array( array( + 'i' => array( + 'name' => 'Show ids', + 'exampleValue' => 'showID1,showID2,…', + 'required' => true + ) + )); public function collectData(){ - // Make timestamp from relative released time in table - function makeTimestamp($relativeReleaseTime){ + // Make timestamp from relative released time in table + function makeTimestamp($relativeReleaseTime){ - $relativeDays = 0; - $relativeHours = 0; + $relativeDays = 0; + $relativeHours = 0; - foreach (explode(" ",$relativeReleaseTime) as $relativeTimeElement) { - if (substr($relativeTimeElement,-1) == "d") $relativeDays = substr($relativeTimeElement,0,-1); - if (substr($relativeTimeElement,-1) == "h") $relativeHours = substr($relativeTimeElement,0,-1); - } - return mktime(date('h')-$relativeHours,0,0,date('m'),date('d')-$relativeDays,date('Y')); - } + foreach(explode(" ", $relativeReleaseTime) as $relativeTimeElement){ + if(substr($relativeTimeElement, -1) == "d") $relativeDays = substr($relativeTimeElement, 0, -1); + if(substr($relativeTimeElement, -1) == "h") $relativeHours = substr($relativeTimeElement, 0, -1); + } + return mktime(date('h') - $relativeHours, 0, 0, date('m'), date('d') - $relativeDays, date('Y')); + } - // Loop on show ids - $showList = explode(",",$this->getInput('i')); - foreach($showList as $showID){ + // Loop on show ids + $showList = explode(",", $this->getInput('i')); + foreach($showList as $showID){ - // Get show page - $html = getSimpleHTMLDOM(self::URI.'shows/'.rawurlencode($showID).'/') - or returnServerError('Could not request EZTV for id "'.$showID.'"'); + // Get show page + $html = getSimpleHTMLDOM(self::URI . 'shows/' . rawurlencode($showID) . '/') + or returnServerError('Could not request EZTV for id "' . $showID . '"'); - // Loop on each element that look like an episode entry... - foreach($html->find('.forum_header_border') as $element) { + // Loop on each element that look like an episode entry... + foreach($html->find('.forum_header_border') as $element){ - // Filter entries that are not episode entries - $ep = $element->find('td',1); - if (empty($ep)) continue; - $epinfo = $ep->find('.epinfo',0); - $released = $element->find('td',3); - if (empty($epinfo)) continue; - if (empty($released->plaintext)) continue; + // Filter entries that are not episode entries + $ep = $element->find('td', 1); + if(empty($ep)) continue; + $epinfo = $ep->find('.epinfo', 0); + $released = $element->find('td', 3); + if(empty($epinfo)) continue; + if(empty($released->plaintext)) continue; - // Filter entries that are older than 1 week - if ($released->plaintext == '>1 week') continue; + // Filter entries that are older than 1 week + if($released->plaintext == '>1 week') continue; - // Fill item - $item = array(); - $item['uri'] = self::URI.$epinfo->href; - $item['id'] = $item['uri']; - $item['timestamp'] = makeTimestamp($released->plaintext); - $item['title'] = $epinfo->plaintext; - $item['content'] = $epinfo->alt; - if(isset($item['title'])) - $this->items[] = $item; - } - } + // Fill item + $item = array(); + $item['uri'] = self::URI . $epinfo->href; + $item['id'] = $item['uri']; + $item['timestamp'] = makeTimestamp($released->plaintext); + $item['title'] = $epinfo->plaintext; + $item['content'] = $epinfo->alt; + if(isset($item['title'])) + $this->items[] = $item; + } + } } } diff --git a/bridges/EliteDangerousGalnetBridge.php b/bridges/EliteDangerousGalnetBridge.php index ef98e7ff..4c3362da 100644 --- a/bridges/EliteDangerousGalnetBridge.php +++ b/bridges/EliteDangerousGalnetBridge.php @@ -1,21 +1,21 @@ <?php -class EliteDangerousGalnetBridge extends BridgeAbstract -{ - const MAINTAINER = "corenting"; - const NAME = "Elite: Dangerous Galnet"; - const URI = "https://community.elitedangerous.com/galnet/"; - const CACHE_TIMEOUT = 7200; // 2h - const DESCRIPTION = "Returns the latest page of news from Galnet"; - - public function collectData() - { - $html = getSimpleHTMLDOM(self::URI) - or returnServerError('Error while downloading the website content'); - foreach($html->find('div.article') as $element) { +class EliteDangerousGalnetBridge extends BridgeAbstract { + + const MAINTAINER = 'corenting'; + const NAME = 'Elite: Dangerous Galnet'; + const URI = 'https://community.elitedangerous.com/galnet/'; + const CACHE_TIMEOUT = 7200; // 2h + const DESCRIPTION = 'Returns the latest page of news from Galnet'; + + public function collectData(){ + $html = getSimpleHTMLDOM(self::URI) + or returnServerError('Error while downloading the website content'); + + foreach($html->find('div.article') as $element){ $item = array(); $uri = $element->find('h3 a', 0)->href; - $uri = self::URI . substr($uri,strlen('/galnet/')); + $uri = self::URI . substr($uri, strlen('/galnet/')); $item['uri'] = $uri; $title = $element->find('h3 a', 0)->plaintext; diff --git a/bridges/ElsevierBridge.php b/bridges/ElsevierBridge.php index a85015a7..af9f3971 100644 --- a/bridges/ElsevierBridge.php +++ b/bridges/ElsevierBridge.php @@ -1,22 +1,23 @@ <?php -class ElsevierBridge extends BridgeAbstract{ +class ElsevierBridge extends BridgeAbstract { + const MAINTAINER = 'Pierre Mazière'; const NAME = 'Elsevier journals recent articles'; const URI = 'http://www.journals.elsevier.com/'; const CACHE_TIMEOUT = 43200; //12h const DESCRIPTION = 'Returns the recent articles published in Elsevier journals'; - const PARAMETERS = array( array( - 'j'=>array( - 'name'=>'Journal name', - 'required'=>true, - 'exampleValue'=>'academic-pediactrics', - 'title'=>'Insert html-part of your journal' - ) - )); + const PARAMETERS = array( array( + 'j' => array( + 'name' => 'Journal name', + 'required' => true, + 'exampleValue' => 'academic-pediactrics', + 'title' => 'Insert html-part of your journal' + ) + )); // Extracts the list of names from an article as string - private function ExtractArticleName ($article){ + private function extractArticleName($article){ $names = $article->find('small', 0); if($names) return trim($names->plaintext); @@ -24,7 +25,7 @@ class ElsevierBridge extends BridgeAbstract{ } // Extracts the timestamp from an article - private function ExtractArticleTimestamp ($article){ + private function extractArticleTimestamp($article){ $time = $article->find('.article-info', 0); if($time){ $timestring = trim($time->plaintext); @@ -48,7 +49,7 @@ class ElsevierBridge extends BridgeAbstract{ } // Extracts the content from an article - private function ExtractArticleContent ($article){ + private function extractArticleContent($article){ $content = $article->find('.article-content', 0); if($content){ return trim($content->plaintext); @@ -58,17 +59,17 @@ class ElsevierBridge extends BridgeAbstract{ public function collectData(){ $uri = self::URI . $this->getInput('j') . '/recent-articles/'; - $html = getSimpleHTMLDOM($uri) or returnServerError('No results for Elsevier journal '.$this->getInput('j')); + $html = getSimpleHTMLDOM($uri) + or returnServerError('No results for Elsevier journal ' . $this->getInput('j')); foreach($html->find('.pod-listing') as $article){ $item = array(); - $item['uri'] = $article->find('.pod-listing-header>a',0)->getAttribute('href').'?np=y'; - $item['title'] = $article->find('.pod-listing-header>a',0)->plaintext; - $item['author'] = $this->ExtractArticleName($article); - $item['timestamp'] = $this->ExtractArticleTimestamp($article); - $item['content'] = $this->ExtractArticleContent($article); + $item['uri'] = $article->find('.pod-listing-header>a', 0)->getAttribute('href') . '?np=y'; + $item['title'] = $article->find('.pod-listing-header>a', 0)->plaintext; + $item['author'] = $this->extractArticleName($article); + $item['timestamp'] = $this->extractArticleTimestamp($article); + $item['content'] = $this->extractArticleContent($article); $this->items[] = $item; } } } -?> diff --git a/bridges/EstCeQuonMetEnProdBridge.php b/bridges/EstCeQuonMetEnProdBridge.php index e625e441..5526eae2 100644 --- a/bridges/EstCeQuonMetEnProdBridge.php +++ b/bridges/EstCeQuonMetEnProdBridge.php @@ -1,30 +1,37 @@ <?php class EstCeQuonMetEnProdBridge extends BridgeAbstract { - const MAINTAINER = 'ORelio'; - const NAME = 'Est-ce qu\'on met en prod aujourd\'hui ?'; - const URI = 'https://www.estcequonmetenprodaujourdhui.info/'; - const CACHE_TIMEOUT = 21600; // 6h - const DESCRIPTION = 'Should we put a website in production today? (French)'; + const MAINTAINER = 'ORelio'; + const NAME = 'Est-ce qu\'on met en prod aujourd\'hui ?'; + const URI = 'https://www.estcequonmetenprodaujourdhui.info/'; + const CACHE_TIMEOUT = 21600; // 6h + const DESCRIPTION = 'Should we put a website in production today? (French)'; - public function collectData(){ - function ExtractFromDelimiters($string, $start, $end) { - if (strpos($string, $start) !== false) { - $section_retrieved = substr($string, strpos($string, $start) + strlen($start)); - $section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end)); - return $section_retrieved; - } return false; - } + public function collectData(){ + function extractFromDelimiters($string, $start, $end){ + if(strpos($string, $start) !== false){ + $section_retrieved = substr($string, strpos($string, $start) + strlen($start)); + $section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end)); + return $section_retrieved; + } - $html = getSimpleHTMLDOM($this->getURI()) or returnServerError('Could not request EstCeQuonMetEnProd: '.$this->getURI()); + return false; + } - $item = array(); - $item['uri'] = $this->getURI().'#'.date('Y-m-d'); - $item['title'] = $this->getName(); - $item['author'] = 'Nicolas Hoffmann'; - $item['timestamp'] = strtotime('today midnight'); - $item['content'] = str_replace('src="/', 'src="'.$this->getURI(), trim(ExtractFromDelimiters($html->outertext, '<body role="document">', '<br /><br />'))); - $this->items[] = $item; - } + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Could not request EstCeQuonMetEnProd: ' . $this->getURI()); + + $item = array(); + $item['uri'] = $this->getURI() . '#' . date('Y-m-d'); + $item['title'] = $this->getName(); + $item['author'] = 'Nicolas Hoffmann'; + $item['timestamp'] = strtotime('today midnight'); + $item['content'] = str_replace( + 'src="/', + 'src="' . $this->getURI(), + trim(extractFromDelimiters($html->outertext, '<body role="document">', '<br /><br />')) + ); + + $this->items[] = $item; + } } -?> diff --git a/bridges/FB2Bridge.php b/bridges/FB2Bridge.php index 081e96ed..fb68b67d 100644 --- a/bridges/FB2Bridge.php +++ b/bridges/FB2Bridge.php @@ -1,44 +1,46 @@ <?php -class FB2Bridge extends BridgeAbstract{ +class FB2Bridge extends BridgeAbstract { - const MAINTAINER = "teromene"; - const NAME = "Facebook Alternate"; - const URI = "https://www.facebook.com/"; + const MAINTAINER = 'teromene'; + const NAME = 'Facebook Alternate'; + const URI = 'https://www.facebook.com/'; const CACHE_TIMEOUT = 1000; - const DESCRIPTION = "Input a page title or a profile log. For a profile log, please insert the parameter as follow : myExamplePage/132621766841117"; + const DESCRIPTION = 'Input a page title or a profile log. For a profile log, + please insert the parameter as follow : myExamplePage/132621766841117'; - const PARAMETERS =array( array( - 'u'=>array( - 'name'=>'Username', - 'required'=>true - ) - )); + const PARAMETERS = array( array( + 'u' => array( + 'name' => 'Username', + 'required' => true + ) + )); + public function collectData(){ - public function collectData() { - - function ExtractFromDelimiters($string, $start, $end) { - if (strpos($string, $start) !== false) { + function extractFromDelimiters($string, $start, $end){ + if(strpos($string, $start) !== false){ $section_retrieved = substr($string, strpos($string, $start) + strlen($start)); $section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end)); return $section_retrieved; - } return false; + } + + return false; } //Utility function for cleaning a Facebook link - $unescape_fb_link = function ($matches) { - if (is_array($matches) && count($matches) > 1) { + $unescape_fb_link = function($matches){ + if(is_array($matches) && count($matches) > 1){ $link = $matches[1]; - if (strpos($link, '/') === 0) - $link = self::URI.$link.'"'; - if (strpos($link, 'facebook.com/l.php?u=') !== false) - $link = urldecode(ExtractFromDelimiters($link, 'facebook.com/l.php?u=', '&')); - return ' href="'.$link.'"'; + if(strpos($link, '/') === 0) + $link = self::URI . $link . '"'; + if(strpos($link, 'facebook.com/l.php?u=') !== false) + $link = urldecode(extractFromDelimiters($link, 'facebook.com/l.php?u=', '&')); + return ' href="' . $link . '"'; } }; //Utility function for converting facebook emoticons - $unescape_fb_emote = function ($matches) { + $unescape_fb_emote = function($matches){ static $facebook_emoticons = array( 'smile' => ':)', 'frown' => ':(', @@ -70,21 +72,23 @@ class FB2Bridge extends BridgeAbstract{ return $matches[0]; }; - if($this->getInput('u') !== NULL) { - $page = "https://touch.facebook.com/" . $this->getInput('u'); + if($this->getInput('u') !== null){ + $page = 'https://touch.facebook.com/' . $this->getInput('u'); $cookies = $this->getCookies($page); $pageID = $this->getPageID($page, $cookies); - - if($pageID === null) { - echo "Unable to get the page id. You should consider getting the ID by hand, then importing it into FB2Bridge"; + if($pageID === null){ + echo <<<EOD +Unable to get the page id. You should consider getting the ID by hand, then importing it into FB2Bridge +EOD; die(); - } } //Build the string for the first request - $requestString = "https://touch.facebook.com/pages_reaction_units/more/?page_id=" . $pageID . "&cursor={\"card_id\"%3A\"videos\"%2C\"has_next_page\"%3Atrue}&surface=mobile_page_home&unit_count=8"; + $requestString = 'https://touch.facebook.com/pages_reaction_units/more/?page_id=' + . $pageID + . '&cursor={"card_id"%3A"videos"%2C"has_next_page"%3Atrue}&surface=mobile_page_home&unit_count=8'; $fileContent = file_get_contents($requestString); @@ -92,79 +96,93 @@ class FB2Bridge extends BridgeAbstract{ $maxArticle = 3; $html = $this->buildContent($fileContent); - - $author = $this->getInput('u'); - foreach($html->find("article") as $content) { + foreach($html->find("article") as $content){ $item = array(); - - $item['uri'] = "http://touch.facebook.com" . $content->find("div._52jc", 0)->find("a", 0)->getAttribute("href"); + $item['uri'] = "http://touch.facebook.com" + . $content->find("div._52jc", 0)->find("a", 0)->getAttribute("href"); $content->find("header", 0)->innertext = ""; $content->find("footer", 0)->innertext = ""; //Remove html nodes, keep only img, links, basic formatting - $content = strip_tags($content,'<a><img><i><u><br><p>'); + $content = strip_tags($content, '<a><img><i><u><br><p>'); //Adapt link hrefs: convert relative links into absolute links and bypass external link redirection $content = preg_replace_callback('/ href=\"([^"]+)\"/i', $unescape_fb_link, $content); //Clean useless html tag properties and fix link closing tags - foreach (array('onmouseover', 'onclick', 'target', 'ajaxify', 'tabindex', - 'class', 'style', 'data-[^=]*', 'aria-[^=]*', 'role', 'rel', 'id') as $property_name) - $content = preg_replace('/ '.$property_name.'=\"[^"]*\"/i', '', $content); + foreach (array( + 'onmouseover', + 'onclick', + 'target', + 'ajaxify', + 'tabindex', + 'class', + 'style', + 'data-[^=]*', + 'aria-[^=]*', + 'role', + 'rel', + 'id') as $property_name) + $content = preg_replace('/ ' . $property_name . '=\"[^"]*\"/i', '', $content); $content = preg_replace('/<\/a [^>]+>/i', '</a>', $content); - //Convert textual representation of emoticons eg "<i><u>smile emoticon</u></i>" back to ASCII emoticons eg ":)" + //Convert textual representation of emoticons eg + // "<i><u>smile emoticon</u></i>" back to ASCII emoticons eg ":)" $content = preg_replace_callback('/<i><u>([^ <>]+) ([^<>]+)<\/u><\/i>/i', $unescape_fb_emote, $content); - - $item['content'] = $content; $title = $author; if (strlen($title) > 24) - $title = substr($title, 0, strpos(wordwrap($title, 24), "\n")).'...'; - $title = $title.' | '.strip_tags($content); + $title = substr($title, 0, strpos(wordwrap($title, 24), "\n")) . '...'; + $title = $title . ' | ' . strip_tags($content); if (strlen($title) > 64) - $title = substr($title, 0, strpos(wordwrap($title, 64), "\n")).'...'; + $title = substr($title, 0, strpos(wordwrap($title, 64), "\n")) . '...'; $item['title'] = $title; $item['author'] = $author; array_push($this->items, $item); - } - } // Currently not used. Is used to get more than only 3 elements, as they appear on another page. - private function computeNextLink($string, $pageID) { + private function computeNextLink($string, $pageID){ - $regex = "/timeline_unit\\\\\\\\u00253A1\\\\\\\\u00253A([0-9]*)\\\\\\\\u00253A([0-9]*)\\\\\\\\u00253A([0-9]*)\\\\\\\\u00253A([0-9]*)/"; + $regex = "/timeline_unit\\\\\\\\u00253A1\\\\\\\\u00253A([0-9]*)\\\\\\\\u00253A([0-9]*)\\\\\\\\u00253A([0-9]*)\\\\\\\\u00253A([0-9]*)/"; preg_match($regex, $string, $result); - return "https://touch.facebook.com/pages_reaction_units/more/?page_id=".$pageID."&cursor=%7B%22timeline_cursor%22%3A%22timeline_unit%3A1%3A".$result[1]."%3A".$result[2]."%3A".$result[3]."%3A".$result[4]."%22%2C%22timeline_section_cursor%22%3A%7B%7D%2C%22has_next_page%22%3Atrue%7D&surface=mobile_page_home&unit_count=3"; - - + return "https://touch.facebook.com/pages_reaction_units/more/?page_id=" + . $pageID + . "&cursor=%7B%22timeline_cursor%22%3A%22timeline_unit%3A1%3A" + . $result[1] + . "%3A" + . $result[2] + . "%3A" + . $result[3] + . "%3A" + . $result[4] + . "%22%2C%22timeline_section_cursor%22%3A%7B%7D%2C%22has_next_page%22%3Atrue%7D&surface=mobile_page_home&unit_count=3"; } //Builds the HTML from the encoded JS that Facebook provides. - private function buildContent($pageContent) { + private function buildContent($pageContent){ $regex = "/\\\"html\\\":\\\"(.*?)\\\",\\\"replace/"; preg_match($regex, $pageContent, $result); return str_get_html(html_entity_decode(json_decode('"' . $result[1] . '"'))); - } - //Builds the cookie from the page, as Facebook sometimes refuses to give the page if no cookie is provided. - private function getCookies($pageURL) { + //Builds the cookie from the page, as Facebook sometimes refuses to give + //the page if no cookie is provided. + private function getCookies($pageURL){ $ctx = stream_context_create(array( 'http' => array( @@ -172,63 +190,60 @@ class FB2Bridge extends BridgeAbstract{ 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' ) ) - ); + ); $a = file_get_contents($pageURL, 0, $ctx); //First request to get the cookie $cookies = ""; - foreach ($http_response_header as $hdr) { - if(strpos($hdr, "Set-Cookie") !== false) { + foreach($http_response_header as $hdr){ + if(strpos($hdr, "Set-Cookie") !== false){ $cLine = explode(":", $hdr)[1]; $cLine = explode(";", $cLine)[0]; - $cookies .= ";".$cLine; + $cookies .= ";" . $cLine; } } return substr($cookies, 1); - } //Get the page ID from the Facebook page. - private function getPageID($page, $cookies) { + private function getPageID($page, $cookies){ $context = stream_context_create(array( 'http' => array( 'user_agent' => "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0", - 'header' => 'Cookie: ' .$cookies + 'header' => 'Cookie: ' . $cookies ) ) - ); + ); $pageContent = file_get_contents($page, 0, $context); //Get the page ID if we don't have a captcha - $regex = "/page_id=([0-9]*)&/"; + $regex = "/page_id=([0-9]*)&/"; preg_match($regex, $pageContent, $matches); - if(count($matches) > 0) { - + if(count($matches) > 0){ return $matches[1]; - } //Get the page ID if we do have a captcha - $regex = "/\"pageID\":\"([0-9]*)\"/"; + $regex = "/\"pageID\":\"([0-9]*)\"/"; preg_match($regex, $pageContent, $matches); return $matches[1]; } - public function getName() { - return (isset($this->name) ? $this->name.' - ' : '').'Facebook Bridge'; + public function getName(){ + return (isset($this->name) ? $this->name . ' - ' : '') . 'Facebook Bridge'; } - public function getURI() { + public function getURI(){ return 'http://facebook.com'; } - public function getCacheDuration() { + public function getCacheDuration(){ return 60 * 60 * 3; // 5 minutes } } diff --git a/bridges/FacebookBridge.php b/bridges/FacebookBridge.php index 38c5e5b1..04898cb0 100644 --- a/bridges/FacebookBridge.php +++ b/bridges/FacebookBridge.php @@ -1,46 +1,49 @@ <?php -class FacebookBridge extends BridgeAbstract{ +class FacebookBridge extends BridgeAbstract { - const MAINTAINER = "teromene"; - const NAME = "Facebook"; - const URI = "https://www.facebook.com/"; + const MAINTAINER = 'teromene'; + const NAME = 'Facebook'; + const URI = 'https://www.facebook.com/'; const CACHE_TIMEOUT = 300; // 5min - const DESCRIPTION = "Input a page title or a profile log. For a profile log, please insert the parameter as follow : myExamplePage/132621766841117"; + const DESCRIPTION = 'Input a page title or a profile log. For a profile log, + please insert the parameter as follow : myExamplePage/132621766841117'; - const PARAMETERS =array( array( - 'u'=>array( - 'name'=>'Username', - 'required'=>true - ) - )); + const PARAMETERS = array( array( + 'u' => array( + 'name' => 'Username', + 'required' => true + ) + )); - private $authorName=''; + private $authorName = ''; public function collectData(){ //Extract a string using start and end delimiters - function ExtractFromDelimiters($string, $start, $end) { - if (strpos($string, $start) !== false) { + function extractFromDelimiters($string, $start, $end){ + if(strpos($string, $start) !== false){ $section_retrieved = substr($string, strpos($string, $start) + strlen($start)); $section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end)); return $section_retrieved; - } return false; + } + + return false; } //Utility function for cleaning a Facebook link - $unescape_fb_link = function ($matches) { - if (is_array($matches) && count($matches) > 1) { + $unescape_fb_link = function($matches){ + if(is_array($matches) && count($matches) > 1){ $link = $matches[1]; - if (strpos($link, '/') === 0) - $link = self::URI.$link.'"'; - if (strpos($link, 'facebook.com/l.php?u=') !== false) - $link = urldecode(ExtractFromDelimiters($link, 'facebook.com/l.php?u=', '&')); - return ' href="'.$link.'"'; + if(strpos($link, '/') === 0) + $link = self::URI . $link . '"'; + if(strpos($link, 'facebook.com/l.php?u=') !== false) + $link = urldecode(extractFromDelimiters($link, 'facebook.com/l.php?u=', '&')); + return ' href="' . $link . '"'; } }; //Utility function for converting facebook emoticons - $unescape_fb_emote = function ($matches) { + $unescape_fb_emote = function($matches){ static $facebook_emoticons = array( 'smile' => ':)', 'frown' => ':(', @@ -87,14 +90,18 @@ class FacebookBridge extends BridgeAbstract{ $http_options = array( 'http' => array( 'method' => 'POST', - 'user_agent'=> ini_get('user_agent'), - 'header'=>array("Content-type: application/x-www-form-urlencoded\r\nReferer: $captcha_action\r\nCookie: noscript=1\r\n"), - 'content' => http_build_query($captcha_fields), + 'user_agent' => ini_get('user_agent'), + 'header' => array("Content-type: + application/x-www-form-urlencoded\r\nReferer: $captcha_action\r\nCookie: noscript=1\r\n"), + 'content' => http_build_query($captcha_fields) ), ); - $context = stream_context_create($http_options); + $context = stream_context_create($http_options); $html = getContents($captcha_action, false, $context); - if ($html === FALSE) { returnServerError('Failed to submit captcha response back to Facebook'); } + + if($html === false){ + returnServerError('Failed to submit captcha response back to Facebook'); + } unset($_SESSION['captcha_fields']); $html = str_get_html($html); } @@ -103,13 +110,13 @@ class FacebookBridge extends BridgeAbstract{ } //Retrieve page contents - if (is_null($html)) { - if (!strpos($this->getInput('u'), "/")) { - $html = getSimpleHTMLDOM(self::URI.urlencode($this->getInput('u')).'?_fb_noscript=1') - or returnServerError('No results for this query.'); + if(is_null($html)){ + if(!strpos($this->getInput('u'), "/")){ + $html = getSimpleHTMLDOM(self::URI . urlencode($this->getInput('u')) . '?_fb_noscript=1') + or returnServerError('No results for this query.'); } else { - $html = getSimpleHTMLDOM(self::URI.'pages/'.$this->getInput('u').'?_fb_noscript=1') - or returnServerError('No results for this query.'); + $html = getSimpleHTMLDOM(self::URI . 'pages/' . $this->getInput('u') . '?_fb_noscript=1') + or returnServerError('No results for this query.'); } } @@ -128,59 +135,102 @@ class FacebookBridge extends BridgeAbstract{ //Show captcha filling form to the viewer, proxying the captcha image $img = base64_encode(getContents($captcha->find('img', 0)->src)); - header('HTTP/1.1 500 '.Http::getMessageForCode(500)); + header('HTTP/1.1 500 ' . Http::getMessageForCode(500)); header('Content-Type: text/html'); - die('<form method="post" action="?'.$_SERVER['QUERY_STRING'].'">' - .'<h2>Facebook captcha challenge</h2>' - .'<p>Unfortunately, rss-bridge cannot fetch the requested page.<br />' - .'Facebook wants rss-bridge to resolve the following captcha:</p>' - .'<p><img src="data:image/png;base64,'.$img.'" /></p>' - .'<p><b>Response:</b> <input name="captcha_response" placeholder="please fill in" />' - .'<input type="submit" value="Submit!" /></p>' - .'</form>'); + $message = <<<EOD +<form method="post" action="?{$_SERVER['QUERY_STRING']}"> + <h2>Facebook captcha challenge</h2> + <p>Unfortunately, rss-bridge cannot fetch the requested page.<br /> + Facebook wants rss-bridge to resolve the following captcha:</p> + <p><img src="data:image/png;base64,{$img}" /></p> + <p><b>Response:</b> <input name="captcha_response" placeholder="please fill in" /> + <input type="submit" value="Submit!" /></p> +</form> +EOD; + die($message); } //No captcha? We can carry on retrieving page contents :) - $element = $html->find('#pagelet_timeline_main_column')[0]->children(0)->children(0)->children(0)->next_sibling()->children(0); + $element = $html + ->find('#pagelet_timeline_main_column')[0] + ->children(0) + ->children(0) + ->children(0) + ->next_sibling() + ->children(0); - if(isset($element)) { + if(isset($element)){ $author = str_replace(' | Facebook', '', $html->find('title#pageTitle', 0)->innertext); - $profilePic = 'https://graph.facebook.com/'.$this->getInput('u').'/picture?width=200&height=200'; + $profilePic = 'https://graph.facebook.com/' + . $this->getInput('u') + . '/picture?width=200&height=200'; + $this->authorName = $author; - foreach($element->children() as $post) { + foreach($element->children() as $post){ // Ignore summary posts - if ( strpos($post->class, '_3xaf') !== false ) continue; + if(strpos($post->class, '_3xaf') !== false) continue; $item = array(); - if (count($post->find('abbr')) > 0) { + if(count($post->find('abbr')) > 0){ //Retrieve post contents - $content = preg_replace('/(?i)><div class=\"clearfix([^>]+)>(.+?)div\ class=\"userContent\"/i', '', $post); - $content = preg_replace('/(?i)><div class=\"_59tj([^>]+)>(.+?)<\/div><\/div><a/i', '', $content); - $content = preg_replace('/(?i)><div class=\"_3dp([^>]+)>(.+?)div\ class=\"[^u]+userContent\"/i', '', $content); - $content = preg_replace('/(?i)><div class=\"_4l5([^>]+)>(.+?)<\/div>/i', '', $content); + $content = preg_replace( + '/(?i)><div class=\"clearfix([^>]+)>(.+?)div\ class=\"userContent\"/i', + '', + $post); + + $content = preg_replace( + '/(?i)><div class=\"_59tj([^>]+)>(.+?)<\/div><\/div><a/i', + '', + $content); + + $content = preg_replace( + '/(?i)><div class=\"_3dp([^>]+)>(.+?)div\ class=\"[^u]+userContent\"/i', + '', + $content); + + $content = preg_replace( + '/(?i)><div class=\"_4l5([^>]+)>(.+?)<\/div>/i', + '', + $content); //Remove html nodes, keep only img, links, basic formatting - $content = strip_tags($content,'<a><img><i><u><br><p>'); + $content = strip_tags($content, '<a><img><i><u><br><p>'); //Adapt link hrefs: convert relative links into absolute links and bypass external link redirection $content = preg_replace_callback('/ href=\"([^"]+)\"/i', $unescape_fb_link, $content); //Clean useless html tag properties and fix link closing tags - foreach (array('onmouseover', 'onclick', 'target', 'ajaxify', 'tabindex', - 'class', 'style', 'data-[^=]*', 'aria-[^=]*', 'role', 'rel', 'id') as $property_name) - $content = preg_replace('/ '.$property_name.'=\"[^"]*\"/i', '', $content); + foreach (array( + 'onmouseover', + 'onclick', + 'target', + 'ajaxify', + 'tabindex', + 'class', + 'style', + 'data-[^=]*', + 'aria-[^=]*', + 'role', + 'rel', + 'id') as $property_name) + $content = preg_replace('/ ' . $property_name . '=\"[^"]*\"/i', '', $content); $content = preg_replace('/<\/a [^>]+>/i', '</a>', $content); - //Convert textual representation of emoticons eg "<i><u>smile emoticon</u></i>" back to ASCII emoticons eg ":)" - $content = preg_replace_callback('/<i><u>([^ <>]+) ([^<>]+)<\/u><\/i>/i', $unescape_fb_emote, $content); + //Convert textual representation of emoticons eg + //"<i><u>smile emoticon</u></i>" back to ASCII emoticons eg ":)" + $content = preg_replace_callback( + '/<i><u>([^ <>]+) ([^<>]+)<\/u><\/i>/i', + $unescape_fb_emote, + $content + ); //Retrieve date of the post $date = $post->find("abbr")[0]; - if(isset($date) && $date->hasAttribute('data-utime')) { + if(isset($date) && $date->hasAttribute('data-utime')){ $date = $date->getAttribute('data-utime'); } else { $date = 0; @@ -188,14 +238,14 @@ class FacebookBridge extends BridgeAbstract{ //Build title from username and content $title = $author; - if (strlen($title) > 24) - $title = substr($title, 0, strpos(wordwrap($title, 24), "\n")).'...'; - $title = $title.' | '.strip_tags($content); - if (strlen($title) > 64) - $title = substr($title, 0, strpos(wordwrap($title, 64), "\n")).'...'; + if(strlen($title) > 24) + $title = substr($title, 0, strpos(wordwrap($title, 24), "\n")) . '...'; + $title = $title . ' | ' . strip_tags($content); + if(strlen($title) > 64) + $title = substr($title, 0, strpos(wordwrap($title, 64), "\n")) . '...'; //Build and add final item - $item['uri'] = self::URI.$post->find('abbr')[0]->parent()->getAttribute('href'); + $item['uri'] = self::URI . $post->find('abbr')[0]->parent()->getAttribute('href'); $item['content'] = $content; $item['title'] = $title; $item['author'] = $author; @@ -206,7 +256,7 @@ class FacebookBridge extends BridgeAbstract{ } } - public function getName() { - return isset($this->extraInfos['name']) ? $this->extraInfos['name'] : $this->authorName.' - Facebook Bridge'; + public function getName(){ + return isset($this->extraInfos['name']) ? $this->extraInfos['name'] : $this->authorName . ' - Facebook Bridge'; } } diff --git a/bridges/FeedExpanderExampleBridge.php b/bridges/FeedExpanderExampleBridge.php index e9d955d6..b855c2e3 100644 --- a/bridges/FeedExpanderExampleBridge.php +++ b/bridges/FeedExpanderExampleBridge.php @@ -1,62 +1,62 @@ <?php class FeedExpanderExampleBridge extends FeedExpander { - const MAINTAINER = 'logmanoriginal'; - const NAME = 'FeedExpander Example'; - const URI = '#'; - const DESCRIPTION = 'Example bridge to test FeedExpander'; + const MAINTAINER = 'logmanoriginal'; + const NAME = 'FeedExpander Example'; + const URI = '#'; + const DESCRIPTION = 'Example bridge to test FeedExpander'; - const PARAMETERS = array( - 'Feed' => array( - 'version' => array( - 'name' => 'Version', - 'type' => 'list', - 'required' => true, - 'title' => 'Select your feed format/version', - 'defaultValue' => 'RSS 2.0', - 'values' => array( - 'RSS 0.91' => 'rss_0_9_1', - 'RSS 1.0' => 'rss_1_0', - 'RSS 2.0' => 'rss_2_0', - 'ATOM 1.0' => 'atom_1_0' - ) - ) - ) - ); + const PARAMETERS = array( + 'Feed' => array( + 'version' => array( + 'name' => 'Version', + 'type' => 'list', + 'required' => true, + 'title' => 'Select your feed format/version', + 'defaultValue' => 'RSS 2.0', + 'values' => array( + 'RSS 0.91' => 'rss_0_9_1', + 'RSS 1.0' => 'rss_1_0', + 'RSS 2.0' => 'rss_2_0', + 'ATOM 1.0' => 'atom_1_0' + ) + ) + ) + ); - public function collectData(){ - switch($this->getInput('version')){ - case 'rss_0_9_1': - parent::collectExpandableDatas('http://static.userland.com/gems/backend/sampleRss.xml'); - break; - case 'rss_1_0': - parent::collectExpandableDatas('http://feeds.nature.com/nature/rss/current?format=xml'); - break; - case 'rss_2_0': - parent::collectExpandableDatas('http://feeds.rssboard.org/rssboard?format=xml'); - break; - case 'atom_1_0': - parent::collectExpandableDatas('http://segfault.linuxmint.com/feed/atom/'); - break; - default: returnClientError('Unknown version ' . $this->getInput('version') . '!'); - } - } + public function collectData(){ + switch($this->getInput('version')){ + case 'rss_0_9_1': + parent::collectExpandableDatas('http://static.userland.com/gems/backend/sampleRss.xml'); + break; + case 'rss_1_0': + parent::collectExpandableDatas('http://feeds.nature.com/nature/rss/current?format=xml'); + break; + case 'rss_2_0': + parent::collectExpandableDatas('http://feeds.rssboard.org/rssboard?format=xml'); + break; + case 'atom_1_0': + parent::collectExpandableDatas('http://segfault.linuxmint.com/feed/atom/'); + break; + default: returnClientError('Unknown version ' . $this->getInput('version') . '!'); + } + } - protected function parseItem($newsItem) { - switch($this->getInput('version')){ - case 'rss_0_9_1': - return $this->parseRSS_0_9_1_Item($newsItem); - break; - case 'rss_1_0': - return $this->parseRSS_1_0_Item($newsItem); - break; - case 'rss_2_0': - return $this->parseRSS_2_0_Item($newsItem); - break; - case 'atom_1_0': - return $this->parseATOMItem($newsItem); - break; - default: returnClientError('Unknown version ' . $this->getInput('version') . '!'); - } - } + protected function parseItem($newsItem) { + switch($this->getInput('version')){ + case 'rss_0_9_1': + return $this->parseRSS_0_9_1_Item($newsItem); + break; + case 'rss_1_0': + return $this->parseRSS_1_0_Item($newsItem); + break; + case 'rss_2_0': + return $this->parseRSS_2_0_Item($newsItem); + break; + case 'atom_1_0': + return $this->parseATOMItem($newsItem); + break; + default: returnClientError('Unknown version ' . $this->getInput('version') . '!'); + } + } } diff --git a/bridges/FierPandaBridge.php b/bridges/FierPandaBridge.php index 2d8f71e4..13864715 100644 --- a/bridges/FierPandaBridge.php +++ b/bridges/FierPandaBridge.php @@ -1,23 +1,24 @@ <?php class FierPandaBridge extends BridgeAbstract { - const MAINTAINER = "snroki"; - const NAME = "Fier Panda Bridge"; - const URI = "http://www.fier-panda.fr/"; - const CACHE_TIMEOUT = 21600; // 6h - const DESCRIPTION = "Returns latest articles from Fier Panda."; + const MAINTAINER = 'snroki'; + const NAME = 'Fier Panda Bridge'; + const URI = 'http://www.fier-panda.fr/'; + const CACHE_TIMEOUT = 21600; // 6h + const DESCRIPTION = 'Returns latest articles from Fier Panda.'; - public function collectData(){ - $html = getSimpleHTMLDOM(self::URI) or returnServerError('Could not request Fier Panda.'); + public function collectData(){ + $html = getSimpleHTMLDOM(self::URI) + or returnServerError('Could not request Fier Panda.'); - foreach($html->find('div.container-content article') as $element) { - $item = array(); - $item['uri'] = $this->getURI().$element->find('a', 0)->href; - $item['title'] = trim($element->find('h1 a', 0)->innertext); - // Remove the link at the end of the article - $element->find('p a', 0)->outertext = ''; - $item['content'] = $element->find('p', 0)->innertext; - $this->items[] = $item; - } - } + foreach($html->find('div.container-content article') as $element){ + $item = array(); + $item['uri'] = $this->getURI() . $element->find('a', 0)->href; + $item['title'] = trim($element->find('h1 a', 0)->innertext); + // Remove the link at the end of the article + $element->find('p a', 0)->outertext = ''; + $item['content'] = $element->find('p', 0)->innertext; + $this->items[] = $item; + } + } } diff --git a/bridges/FlickrBridge.php b/bridges/FlickrBridge.php index 988c55fe..57f53a3c 100644 --- a/bridges/FlickrBridge.php +++ b/bridges/FlickrBridge.php @@ -5,117 +5,116 @@ */ class FlickrBridge extends BridgeAbstract { - const MAINTAINER = "logmanoriginal"; - const NAME = "Flickr Bridge"; - const URI = "https://www.flickr.com/"; - const CACHE_TIMEOUT = 21600; // 6 hours - const DESCRIPTION = "Returns images from Flickr"; - - const PARAMETERS = array( - 'Explore' => array(), - 'By keyword' => array( - 'q' => array( - 'name' => 'Keyword', - 'type' => 'text', - 'required' => true, - 'title' => 'Insert keyword', - 'exampleValue' => 'bird' - ) - ), - 'By username' => array( - 'u' => array( - 'name' => 'Username', - 'type' => 'text', - 'required' => true, - 'title' => 'Insert username (as shown in the address bar)', - 'exampleValue' => 'flickr' - ) - ), - ); - - public function collectData(){ - switch($this->queriedContext){ - case 'Explore': - $key = 'photos'; - $html = getSimpleHTMLDOM(self::URI . 'explore') - or returnServerError('Could not request Flickr.'); - break; - case 'By keyword': - $key = 'photos'; - $html = getSimpleHTMLDOM(self::URI . 'search/?q=' . urlencode($this->getInput('q')) . '&s=rec') - or returnServerError('No results for this query.'); - break; - case 'By username': - $key = 'photoPageList'; - $html = getSimpleHTMLDOM(self::URI . 'photos/' . urlencode($this->getInput('u'))) - or returnServerError('Requested username can\'t be found.'); - break; - default: - returnClientError('Invalid context: ' . $this->queriedContext); - } - - // Find SCRIPT containing JSON data - $model = $html->find('.modelExport', 0); - $model_text = $model->innertext; - - // Find start and end of JSON data - $start = strpos($model_text, 'modelExport:') + strlen('modelExport:'); - $end = strpos($model_text, 'auth:') - strlen('auth:'); - - // Dissect JSON data and remove trailing comma - $model_text = trim(substr($model_text, $start, $end - $start)); - $model_text = substr($model_text, 0, strlen($model_text) - 1); - - $model_json = json_decode($model_text, true); - - foreach($html->find('.photo-list-photo-view') as $element){ - // Get the styles - $style = explode(';', $element->style); - - // Get the background-image style - $backgroundImage = explode(':', end($style)); - - // URI type : url(//cX.staticflickr.com/X/XXXXX/XXXXXXXXX.jpg) - $imageURI = trim(str_replace(['url(', ')'], '', end($backgroundImage))); - - // Get the image ID - $imageURIs = explode('_', basename($imageURI)); - $imageID = reset($imageURIs); - - // Use JSON data to build items - foreach(reset($model_json)[0][$key]['_data'] as $element){ - if($element['id'] === $imageID){ - $item = array(); - - /* Author name depends on scope. On a keyword search the - * author is part of the picture data. On a username search - * the author is part of the owner data. - */ - if(array_key_exists('username', $element)){ - $item['author'] = $element['username']; - } elseif (array_key_exists('owner', reset($model_json)[0])){ - $item['author'] = reset($model_json)[0]['owner']['username']; - } - - $item['title'] = (array_key_exists('title', $element) ? $element['title'] : 'Untitled'); - $item['uri'] = self::URI . 'photo.gne?id=' . $imageID; - - $description = (array_key_exists('description', $element) ? $element['description'] : ''); - - $item['content'] = '<a href="' - . $item['uri'] - . '"><img src="' - . $imageURI . '" /></a>' - . '<br>' - . '<p>' - . $description - . '</p>'; - - $this->items[] = $item; - - break; - } - } - } - } + const MAINTAINER = 'logmanoriginal'; + const NAME = 'Flickr Bridge'; + const URI = 'https://www.flickr.com/'; + const CACHE_TIMEOUT = 21600; // 6 hours + const DESCRIPTION = 'Returns images from Flickr'; + + const PARAMETERS = array( + 'Explore' => array(), + 'By keyword' => array( + 'q' => array( + 'name' => 'Keyword', + 'type' => 'text', + 'required' => true, + 'title' => 'Insert keyword', + 'exampleValue' => 'bird' + ) + ), + 'By username' => array( + 'u' => array( + 'name' => 'Username', + 'type' => 'text', + 'required' => true, + 'title' => 'Insert username (as shown in the address bar)', + 'exampleValue' => 'flickr' + ) + ), + ); + + public function collectData(){ + switch($this->queriedContext){ + case 'Explore': + $key = 'photos'; + $html = getSimpleHTMLDOM(self::URI . 'explore') + or returnServerError('Could not request Flickr.'); + break; + case 'By keyword': + $key = 'photos'; + $html = getSimpleHTMLDOM(self::URI . 'search/?q=' . urlencode($this->getInput('q')) . '&s=rec') + or returnServerError('No results for this query.'); + break; + case 'By username': + $key = 'photoPageList'; + $html = getSimpleHTMLDOM(self::URI . 'photos/' . urlencode($this->getInput('u'))) + or returnServerError('Requested username can\'t be found.'); + break; + default: + returnClientError('Invalid context: ' . $this->queriedContext); + } + + // Find SCRIPT containing JSON data + $model = $html->find('.modelExport', 0); + $model_text = $model->innertext; + + // Find start and end of JSON data + $start = strpos($model_text, 'modelExport:') + strlen('modelExport:'); + $end = strpos($model_text, 'auth:') - strlen('auth:'); + + // Dissect JSON data and remove trailing comma + $model_text = trim(substr($model_text, $start, $end - $start)); + $model_text = substr($model_text, 0, strlen($model_text) - 1); + + $model_json = json_decode($model_text, true); + + foreach($html->find('.photo-list-photo-view') as $element){ + // Get the styles + $style = explode(';', $element->style); + + // Get the background-image style + $backgroundImage = explode(':', end($style)); + + // URI type : url(//cX.staticflickr.com/X/XXXXX/XXXXXXXXX.jpg) + $imageURI = trim(str_replace(['url(', ')'], '', end($backgroundImage))); + + // Get the image ID + $imageURIs = explode('_', basename($imageURI)); + $imageID = reset($imageURIs); + + // Use JSON data to build items + foreach(reset($model_json)[0][$key]['_data'] as $element){ + if($element['id'] === $imageID){ + $item = array(); + + /* Author name depends on scope. On a keyword search the + * author is part of the picture data. On a username search + * the author is part of the owner data. + */ + if(array_key_exists('username', $element)){ + $item['author'] = $element['username']; + } elseif (array_key_exists('owner', reset($model_json)[0])){ + $item['author'] = reset($model_json)[0]['owner']['username']; + } + + $item['title'] = (array_key_exists('title', $element) ? $element['title'] : 'Untitled'); + $item['uri'] = self::URI . 'photo.gne?id=' . $imageID; + + $description = (array_key_exists('description', $element) ? $element['description'] : ''); + + $item['content'] = '<a href="' + . $item['uri'] + . '"><img src="' + . $imageURI + . '" /></a><br><p>' + . $description + . '</p>'; + + $this->items[] = $item; + + break; + } + } + } + } } diff --git a/bridges/FootitoBridge.php b/bridges/FootitoBridge.php index 8b7a12a6..17cbda8d 100644 --- a/bridges/FootitoBridge.php +++ b/bridges/FootitoBridge.php @@ -1,40 +1,75 @@ <?php -class FootitoBridge extends BridgeAbstract{ +class FootitoBridge extends BridgeAbstract { - const MAINTAINER = "superbaillot.net"; - const NAME = "Footito"; - const URI = "http://www.footito.fr/"; - const DESCRIPTION = "Footito"; + const MAINTAINER = 'superbaillot.net'; + const NAME = 'Footito'; + const URI = 'http://www.footito.fr/'; + const DESCRIPTION = 'Footito'; - public function collectData(){ - $html = getSimpleHTMLDOM(self::URI) - or returnServerError('Could not request Footito.'); + public function collectData(){ + $html = getSimpleHTMLDOM(self::URI) + or returnServerError('Could not request Footito.'); - foreach($html->find('div.post') as $element) { - $item = array(); + foreach($html->find('div.post') as $element){ + $item = array(); - $content = trim($element->innertext); - $content = str_replace("<img", "<img style='float : left;'", $content ); - $content = str_replace("class=\"logo\"", "style='float : left;'", $content ); - $content = str_replace("class=\"contenu\"", "style='margin-left : 60px;'", $content ); - $content = str_replace("class=\"responsive-comment\"", "style='border-top : 1px #DDD solid; background-color : white; padding : 10px;'", $content ); - $content = str_replace("class=\"jaime\"", "style='display : none;'", $content ); - $content = str_replace("class=\"auteur-event responsive\"", "style='display : none;'", $content ); - $content = str_replace("class=\"report-abuse-button\"", "style='display : none;'", $content ); - $content = str_replace("class=\"reaction clearfix\"", "style='margin : 10px 0px; padding : 5px; border-bottom : 1px #DDD solid;'", $content ); - $content = str_replace("class=\"infos\"", "style='font-size : 0.7em;'", $content ); + $content = trim($element->innertext); + $content = str_replace( + "<img", + "<img style='float : left;'", + $content ); - $item['content'] = $content; + $content = str_replace( + "class=\"logo\"", + "style='float : left;'", + $content ); - $title = $element->find('.contenu .texte ', 0)->plaintext; - $item['title'] = $title; + $content = str_replace( + "class=\"contenu\"", + "style='margin-left : 60px;'", + $content ); - $info = $element->find('div.infos', 0); + $content = str_replace( + "class=\"responsive-comment\"", + "style='border-top : 1px #DDD solid; background-color : white; padding : 10px;'", + $content ); - $item['timestamp'] = strtotime($info->find('time', 0)->datetime); - $item['author'] = $info->find('a.auteur', 0)->plaintext; + $content = str_replace( + "class=\"jaime\"", + "style='display : none;'", + $content ); - $this->items[] = $item; - } - } + $content = str_replace( + "class=\"auteur-event responsive\"", + "style='display : none;'", + $content ); + + $content = str_replace( + "class=\"report-abuse-button\"", + "style='display : none;'", + $content ); + + $content = str_replace( + "class=\"reaction clearfix\"", + "style='margin : 10px 0px; padding : 5px; border-bottom : 1px #DDD solid;'", + $content ); + + $content = str_replace( + "class=\"infos\"", + "style='font-size : 0.7em;'", + $content ); + + $item['content'] = $content; + + $title = $element->find('.contenu .texte ', 0)->plaintext; + $item['title'] = $title; + + $info = $element->find('div.infos', 0); + + $item['timestamp'] = strtotime($info->find('time', 0)->datetime); + $item['author'] = $info->find('a.auteur', 0)->plaintext; + + $this->items[] = $item; + } + } } diff --git a/bridges/FourchanBridge.php b/bridges/FourchanBridge.php index 64dfaa21..ab9cbee8 100644 --- a/bridges/FourchanBridge.php +++ b/bridges/FourchanBridge.php @@ -1,68 +1,74 @@ <?php -class FourchanBridge extends BridgeAbstract{ +class FourchanBridge extends BridgeAbstract { - const MAINTAINER = "mitsukarenai"; - const NAME = "4chan"; - const URI = "https://boards.4chan.org/"; + const MAINTAINER = 'mitsukarenai'; + const NAME = '4chan'; + const URI = 'https://boards.4chan.org/'; const CACHE_TIMEOUT = 300; // 5min - const DESCRIPTION = "Returns posts from the specified thread"; + const DESCRIPTION = 'Returns posts from the specified thread'; - const PARAMETERS = array( array( - 'c'=>array( - 'name'=>'Thread category', - 'required'=>true - ), - 't'=>array( - 'name'=>'Thread number', - 'type'=>'number', - 'required'=>true - ) - )); + const PARAMETERS = array( array( + 'c' => array( + 'name' => 'Thread category', + 'required' => true + ), + 't' => array( + 'name' => 'Thread number', + 'type' => 'number', + 'required' => true + ) + )); - public function getURI(){ - return static::URI.$this->getInput('c').'/thread/'.$this->getInput('t'); + public function getURI(){ + return static::URI . $this->getInput('c') . '/thread/' . $this->getInput('t'); + } - } + public function collectData(){ - public function collectData(){ + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError("Could not request 4chan, thread not found"); - $html = getSimpleHTMLDOM($this->getURI()) - or returnServerError("Could not request 4chan, thread not found"); + foreach($html->find('div.postContainer') as $element){ + $item = array(); + $item['id'] = $element->find('.post', 0)->getAttribute('id'); + $item['uri'] = $this->getURI() . '#' . $item['id']; + $item['timestamp'] = $element->find('span.dateTime', 0)->getAttribute('data-utc'); + $item['author'] = $element->find('span.name', 0)->plaintext; - foreach($html->find('div.postContainer') as $element) { - $item = array(); - $item['id'] = $element->find('.post', 0)->getAttribute('id'); - $item['uri'] = $this->getURI().'#'.$item['id']; - $item['timestamp'] = $element->find('span.dateTime', 0)->getAttribute('data-utc'); - $item['author'] = $element->find('span.name', 0)->plaintext; + $file = $element->find('.file', 0); - $file=$element->find('.file', 0); - if(!empty($file) ) { - $item['image'] = $element->find('.file a', 0)->href; - $item['imageThumb'] = $element->find('.file img', 0)->src; - if(!isset($item['imageThumb']) and strpos($item['image'], '.swf') !== FALSE) - $item['imageThumb'] = 'http://i.imgur.com/eO0cxf9.jpg'; - } - if(!empty($element->find('span.subject', 0)->innertext )) { - $item['subject'] = $element->find('span.subject', 0)->innertext; - } + if(!empty($file)){ + $item['image'] = $element->find('.file a', 0)->href; + $item['imageThumb'] = $element->find('.file img', 0)->src; + if(!isset($item['imageThumb']) and strpos($item['image'], '.swf') !== false) + $item['imageThumb'] = 'http://i.imgur.com/eO0cxf9.jpg'; + } - $item['title'] = 'reply '.$item['id'].' | '.$item['author']; - if(isset($item['subject'])){ - $item['title'] = $item['subject'].' - '.$item['title']; - } + if(!empty($element->find('span.subject', 0)->innertext)){ + $item['subject'] = $element->find('span.subject', 0)->innertext; + } - $content = $element->find('.postMessage', 0)->innertext; - $content = str_replace('href="#p','href="'.$this->getURI().'#p',$content); - $item['content'] = '<span id="'.$item['id'].'">'.$content.'</span>'; - if(isset($item['image'])){ - $item['content'] = '<a href="'.$item['image'].'">' - .'<img alt="'.$item['id'].'" src="'.$item['imageThumb'].'" />' - .'</a><br>' - .$item['content']; - } - $this->items[] = $item; + $item['title'] = 'reply ' . $item['id'] . ' | ' . $item['author']; + if(isset($item['subject'])){ + $item['title'] = $item['subject'] . ' - ' . $item['title']; + } + + $content = $element->find('.postMessage', 0)->innertext; + $content = str_replace('href="#p','href="' . $this->getURI() . '#p', $content); + $item['content'] = '<span id="' . $item['id'] . '">' . $content . '</span>'; + + if(isset($item['image'])){ + $item['content'] = '<a href="' + . $item['image'] + . '"><img alt="' + . $item['id'] + . '" src="' + . $item['imageThumb'] + . '" /></a><br>' + .$item['content']; + } + $this->items[] = $item; + } + $this->items = array_reverse($this->items); } - $this->items = array_reverse($this->items); - } } diff --git a/bridges/FuturaSciencesBridge.php b/bridges/FuturaSciencesBridge.php index 0b810668..4e8f0eb2 100644 --- a/bridges/FuturaSciencesBridge.php +++ b/bridges/FuturaSciencesBridge.php @@ -1,173 +1,173 @@ <?php class FuturaSciencesBridge extends FeedExpander { - const MAINTAINER = 'ORelio'; - const NAME = 'Futura-Sciences Bridge'; - const URI = 'http://www.futura-sciences.com/'; - const DESCRIPTION = 'Returns the newest articles.'; + const MAINTAINER = 'ORelio'; + const NAME = 'Futura-Sciences Bridge'; + const URI = 'http://www.futura-sciences.com/'; + const DESCRIPTION = 'Returns the newest articles.'; - const PARAMETERS = array( array( - 'feed'=> array( - 'name'=>'Feed', - 'type'=>'list', - 'values'=>array( - 'Les flux multi-magazines'=>array( - 'Les dernières actualités de Futura-Sciences'=>'actualites', - 'Les dernières définitions de Futura-Sciences'=>'definitions', - 'Les dernières photos de Futura-Sciences'=>'photos', - 'Les dernières questions - réponses de Futura-Sciences'=>'questions-reponses', - 'Les derniers dossiers de Futura-Sciences'=>'dossiers' - ), - 'Les flux Services'=> array( - 'Les cartes virtuelles de Futura-Sciences'=>'services/cartes-virtuelles', - 'Les fonds d\'écran de Futura-Sciences'=>'services/fonds-ecran' - ), - 'Les flux Santé'=>array( - 'Les dernières actualités de Futura-Santé'=>'sante/actualites', - 'Les dernières définitions de Futura-Santé'=>'sante/definitions', - 'Les dernières questions-réponses de Futura-Santé'=>'sante/question-reponses', - 'Les derniers dossiers de Futura-Santé'=>'sante/dossiers' - ), - 'Les flux High-Tech'=>array( - 'Les dernières actualités de Futura-High-Tech'=>'high-tech/actualites', - 'Les dernières astuces de Futura-High-Tech'=>'high-tech/question-reponses', - 'Les dernières définitions de Futura-High-Tech'=>'high-tech/definitions', - 'Les derniers dossiers de Futura-High-Tech'=>'high-tech/dossiers' - ), - 'Les flux Espace'=>array( - 'Les dernières actualités de Futura-Espace'=>'espace/actualites', - 'Les dernières définitions de Futura-Espace'=>'espace/definitions', - 'Les dernières questions-réponses de Futura-Espace'=>'espace/question-reponses', - 'Les derniers dossiers de Futura-Espace'=>'espace/dossiers' - ), - 'Les flux Environnement'=>array( - 'Les dernières actualités de Futura-Environnement'=>'environnement/actualites', - 'Les dernières définitions de Futura-Environnement'=>'environnement/definitions', - 'Les dernières questions-réponses de Futura-Environnement'=>'environnement/question-reponses', - 'Les derniers dossiers de Futura-Environnement'=>'environnement/dossiers' - ), - 'Les flux Maison'=>array( - 'Les dernières actualités de Futura-Maison'=>'maison/actualites', - 'Les dernières astuces de Futura-Maison'=>'maison/question-reponses', - 'Les dernières définitions de Futura-Maison'=>'maison/definitions', - 'Les derniers dossiers de Futura-Maison'=>'maison/dossiers' - ), - 'Les flux Nature'=>array( - 'Les dernières actualités de Futura-Nature'=>'nature/actualites', - 'Les dernières définitions de Futura-Nature'=>'nature/definitions', - 'Les dernières questions-réponses de Futura-Nature'=>'nature/question-reponses', - 'Les derniers dossiers de Futura-Nature'=>'nature/dossiers' - ), - 'Les flux Terre'=>array( - 'Les dernières actualités de Futura-Terre'=>'terre/actualites', - 'Les dernières définitions de Futura-Terre'=>'terre/definitions', - 'Les dernières questions-réponses de Futura-Terre'=>'terre/question-reponses', - 'Les derniers dossiers de Futura-Terre'=>'terre/dossiers' - ), - 'Les flux Matière'=>array( - 'Les dernières actualités de Futura-Matière'=>'matiere/actualites', - 'Les dernières définitions de Futura-Matière'=>'matiere/definitions', - 'Les dernières questions-réponses de Futura-Matière'=>'matiere/question-reponses', - 'Les derniers dossiers de Futura-Matière'=>'matiere/dossiers' - ), - 'Les flux Mathématiques'=>array( - 'Les dernières actualités de Futura-Mathématiques'=>'mathematiques/actualites', - 'Les derniers dossiers de Futura-Mathématiques'=>'mathematiques/dossiers' - ) - ) - ) - )); + const PARAMETERS = array( array( + 'feed' => array( + 'name' => 'Feed', + 'type' => 'list', + 'values' => array( + 'Les flux multi-magazines' => array( + 'Les dernières actualités de Futura-Sciences' => 'actualites', + 'Les dernières définitions de Futura-Sciences' => 'definitions', + 'Les dernières photos de Futura-Sciences' => 'photos', + 'Les dernières questions - réponses de Futura-Sciences' => 'questions-reponses', + 'Les derniers dossiers de Futura-Sciences' => 'dossiers' + ), + 'Les flux Services' => array( + 'Les cartes virtuelles de Futura-Sciences' => 'services/cartes-virtuelles', + 'Les fonds d\'écran de Futura-Sciences' => 'services/fonds-ecran' + ), + 'Les flux Santé' => array( + 'Les dernières actualités de Futura-Santé' => 'sante/actualites', + 'Les dernières définitions de Futura-Santé' => 'sante/definitions', + 'Les dernières questions-réponses de Futura-Santé' => 'sante/question-reponses', + 'Les derniers dossiers de Futura-Santé' => 'sante/dossiers' + ), + 'Les flux High-Tech' => array( + 'Les dernières actualités de Futura-High-Tech' => 'high-tech/actualites', + 'Les dernières astuces de Futura-High-Tech' => 'high-tech/question-reponses', + 'Les dernières définitions de Futura-High-Tech' => 'high-tech/definitions', + 'Les derniers dossiers de Futura-High-Tech' => 'high-tech/dossiers' + ), + 'Les flux Espace' => array( + 'Les dernières actualités de Futura-Espace' => 'espace/actualites', + 'Les dernières définitions de Futura-Espace' => 'espace/definitions', + 'Les dernières questions-réponses de Futura-Espace' => 'espace/question-reponses', + 'Les derniers dossiers de Futura-Espace' => 'espace/dossiers' + ), + 'Les flux Environnement' => array( + 'Les dernières actualités de Futura-Environnement' => 'environnement/actualites', + 'Les dernières définitions de Futura-Environnement' => 'environnement/definitions', + 'Les dernières questions-réponses de Futura-Environnement' => 'environnement/question-reponses', + 'Les derniers dossiers de Futura-Environnement' => 'environnement/dossiers' + ), + 'Les flux Maison' => array( + 'Les dernières actualités de Futura-Maison' => 'maison/actualites', + 'Les dernières astuces de Futura-Maison' => 'maison/question-reponses', + 'Les dernières définitions de Futura-Maison' => 'maison/definitions', + 'Les derniers dossiers de Futura-Maison' => 'maison/dossiers' + ), + 'Les flux Nature' => array( + 'Les dernières actualités de Futura-Nature' => 'nature/actualites', + 'Les dernières définitions de Futura-Nature' => 'nature/definitions', + 'Les dernières questions-réponses de Futura-Nature' => 'nature/question-reponses', + 'Les derniers dossiers de Futura-Nature' => 'nature/dossiers' + ), + 'Les flux Terre' => array( + 'Les dernières actualités de Futura-Terre' => 'terre/actualites', + 'Les dernières définitions de Futura-Terre' => 'terre/definitions', + 'Les dernières questions-réponses de Futura-Terre' => 'terre/question-reponses', + 'Les derniers dossiers de Futura-Terre' => 'terre/dossiers' + ), + 'Les flux Matière' => array( + 'Les dernières actualités de Futura-Matière' => 'matiere/actualites', + 'Les dernières définitions de Futura-Matière' => 'matiere/definitions', + 'Les dernières questions-réponses de Futura-Matière' => 'matiere/question-reponses', + 'Les derniers dossiers de Futura-Matière' => 'matiere/dossiers' + ), + 'Les flux Mathématiques' => array( + 'Les dernières actualités de Futura-Mathématiques' => 'mathematiques/actualites', + 'Les derniers dossiers de Futura-Mathématiques' => 'mathematiques/dossiers' + ) + ) + ) + )); - public function collectData(){ - $url = self::URI . 'rss/' . $this->getInput('feed') . '.xml'; - $this->collectExpandableDatas($url, 10); - } + public function collectData(){ + $url = self::URI . 'rss/' . $this->getInput('feed') . '.xml'; + $this->collectExpandableDatas($url, 10); + } - protected function parseItem($newsItem){ - $item = parent::parseItem($newsItem); - $item['uri'] = str_replace('#xtor=RSS-8', '', $item['uri']); - $article = getSimpleHTMLDOMCached($item['uri']) - or returnServerError('Could not request Futura-Sciences: ' . $item['uri']); - $item['content'] = $this->ExtractArticleContent($article); - $author = $this->ExtractAuthor($article); - $item['author'] = empty($author) ? $item['author'] : $author; - return $item; - } + protected function parseItem($newsItem){ + $item = parent::parseItem($newsItem); + $item['uri'] = str_replace('#xtor=RSS-8', '', $item['uri']); + $article = getSimpleHTMLDOMCached($item['uri']) + or returnServerError('Could not request Futura-Sciences: ' . $item['uri']); + $item['content'] = $this->extractArticleContent($article); + $author = $this->extractAuthor($article); + $item['author'] = empty($author) ? $item['author'] : $author; + return $item; + } - private function StripWithDelimiters($string, $start, $end) { - while (strpos($string, $start) !== false) { - $section_to_remove = substr($string, strpos($string, $start)); - $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end)); - $string = str_replace($section_to_remove, '', $string); - } return $string; - } + private function stripWithDelimiters($string, $start, $end){ + while(strpos($string, $start) !== false){ + $section_to_remove = substr($string, strpos($string, $start)); + $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end)); + $string = str_replace($section_to_remove, '', $string); + } return $string; + } - private function StripRecursiveHTMLSection($string, $tag_name, $tag_start) { - $open_tag = '<'.$tag_name; - $close_tag = '</'.$tag_name.'>'; - $close_tag_length = strlen($close_tag); - if (strpos($tag_start, $open_tag) === 0) { - while (strpos($string, $tag_start) !== false) { - $max_recursion = 100; - $section_to_remove = null; - $section_start = strpos($string, $tag_start); - $search_offset = $section_start; - do { - $max_recursion--; - $section_end = strpos($string, $close_tag, $search_offset); - $search_offset = $section_end + $close_tag_length; - $section_to_remove = substr($string, $section_start, $section_end - $section_start + $close_tag_length); - $open_tag_count = substr_count($section_to_remove, $open_tag); - $close_tag_count = substr_count($section_to_remove, $close_tag); - } while ($open_tag_count > $close_tag_count && $max_recursion > 0); - $string = str_replace($section_to_remove, '', $string); - } - } - return $string; - } + private function stripRecursiveHTMLSection($string, $tag_name, $tag_start){ + $open_tag = '<' . $tag_name; + $close_tag = '</' . $tag_name . '>'; + $close_tag_length = strlen($close_tag); + if(strpos($tag_start, $open_tag) === 0){ + while(strpos($string, $tag_start) !== false){ + $max_recursion = 100; + $section_to_remove = null; + $section_start = strpos($string, $tag_start); + $search_offset = $section_start; + do { + $max_recursion--; + $section_end = strpos($string, $close_tag, $search_offset); + $search_offset = $section_end + $close_tag_length; + $section_to_remove = substr($string, $section_start, $section_end - $section_start + $close_tag_length); + $open_tag_count = substr_count($section_to_remove, $open_tag); + $close_tag_count = substr_count($section_to_remove, $close_tag); + } while ($open_tag_count > $close_tag_count && $max_recursion > 0); + $string = str_replace($section_to_remove, '', $string); + } + } + return $string; + } - private function ExtractArticleContent($article){ - $contents = $article->find('section.article-text-classic', 0)->innertext; - $headline = trim($article->find('p.description', 0)->plaintext); - if (!empty($headline)) - $headline = '<p><b>'.$headline.'</b></p>'; + private function extractArticleContent($article){ + $contents = $article->find('section.article-text-classic', 0)->innertext; + $headline = trim($article->find('p.description', 0)->plaintext); + if(!empty($headline)) + $headline = '<p><b>' . $headline . '</b></p>'; - foreach (array( - '<div class="clear', - '<div class="sharebar2', - '<div class="diaporamafullscreen"', - '<div class="module social-button', - '<div style="margin-bottom:10px;" class="noprint"', - '<div class="ficheprevnext', - '<div class="bar noprint', - '<div class="toolbar noprint', - '<div class="addthis_toolbox', - '<div class="noprint', - '<div class="bg bglight border border-full noprint', - '<div class="httplogbar-wrapper noprint', - '<div id="forumcomments', - '<div ng-if="active"' - ) as $div_start) { - $contents = $this->StripRecursiveHTMLSection($contents , 'div', $div_start); - } + foreach (array( + '<div class="clear', + '<div class="sharebar2', + '<div class="diaporamafullscreen"', + '<div class="module social-button', + '<div style="margin-bottom:10px;" class="noprint"', + '<div class="ficheprevnext', + '<div class="bar noprint', + '<div class="toolbar noprint', + '<div class="addthis_toolbox', + '<div class="noprint', + '<div class="bg bglight border border-full noprint', + '<div class="httplogbar-wrapper noprint', + '<div id="forumcomments', + '<div ng-if="active"' + ) as $div_start) { + $contents = $this->stripRecursiveHTMLSection($contents , 'div', $div_start); + } - $contents = $this->StripWithDelimiters($contents, '<hr ', '/>'); - $contents = $this->StripWithDelimiters($contents, '<p class="content-date', '</p>'); - $contents = $this->StripWithDelimiters($contents, '<h1 class="content-title', '</h1>'); - $contents = $this->StripWithDelimiters($contents, 'fs:definition="', '"'); - $contents = $this->StripWithDelimiters($contents, 'fs:xt:clicktype="', '"'); - $contents = $this->StripWithDelimiters($contents, 'fs:xt:clickname="', '"'); - $contents = $this->StripWithDelimiters($contents, '<script ', '</script>'); + $contents = $this->stripWithDelimiters($contents, '<hr ', '/>'); + $contents = $this->stripWithDelimiters($contents, '<p class="content-date', '</p>'); + $contents = $this->stripWithDelimiters($contents, '<h1 class="content-title', '</h1>'); + $contents = $this->stripWithDelimiters($contents, 'fs:definition="', '"'); + $contents = $this->stripWithDelimiters($contents, 'fs:xt:clicktype="', '"'); + $contents = $this->stripWithDelimiters($contents, 'fs:xt:clickname="', '"'); + $contents = $this->stripWithDelimiters($contents, '<script ', '</script>'); - return $headline.trim($contents); - } + return $headline . trim($contents); + } - // Extracts the author from an article or element - private function ExtractAuthor($article){ - $article_author = $article->find('h3.epsilon', 0); - if($article_author){ - return trim(str_replace(', Futura-Sciences', '', $article_author->plaintext)); - } - return ''; - } + // Extracts the author from an article or element + private function extractAuthor($article){ + $article_author = $article->find('h3.epsilon', 0); + if($article_author){ + return trim(str_replace(', Futura-Sciences', '', $article_author->plaintext)); + } + return ''; + } } diff --git a/bridges/GBAtempBridge.php b/bridges/GBAtempBridge.php index cf0c8e0c..fc979aec 100644 --- a/bridges/GBAtempBridge.php +++ b/bridges/GBAtempBridge.php @@ -1,128 +1,157 @@ <?php class GBAtempBridge extends BridgeAbstract { - const MAINTAINER = 'ORelio'; - const NAME = 'GBAtemp'; - const URI = 'http://gbatemp.net/'; - const DESCRIPTION = 'GBAtemp is a user friendly underground video game community.'; + const MAINTAINER = 'ORelio'; + const NAME = 'GBAtemp'; + const URI = 'http://gbatemp.net/'; + const DESCRIPTION = 'GBAtemp is a user friendly underground video game community.'; - const PARAMETERS = array( array( - 'type'=>array( - 'name'=>'Type', - 'type'=>'list', - 'required'=>true, - 'values'=>array( - 'News'=>'N', - 'Reviews'=>'R', - 'Tutorials'=>'T', - 'Forum'=>'F' - ) - ) - )); + const PARAMETERS = array( array( + 'type' => array( + 'name' => 'Type', + 'type' => 'list', + 'required' => true, + 'values' => array( + 'News' => 'N', + 'Reviews' => 'R', + 'Tutorials' => 'T', + 'Forum' => 'F' + ) + ) + )); - private function ExtractFromDelimiters($string, $start, $end) { - if (strpos($string, $start) !== false) { - $section_retrieved = substr($string, strpos($string, $start) + strlen($start)); - $section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end)); - return $section_retrieved; - } return false; - } + private function extractFromDelimiters($string, $start, $end){ + if(strpos($string, $start) !== false){ + $section_retrieved = substr($string, strpos($string, $start) + strlen($start)); + $section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end)); + return $section_retrieved; + } - private function StripWithDelimiters($string, $start, $end) { - while (strpos($string, $start) !== false) { - $section_to_remove = substr($string, strpos($string, $start)); - $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end)); - $string = str_replace($section_to_remove, '', $string); - } return $string; - } + return false; + } - private function build_item($uri, $title, $author, $timestamp, $content) { - $item = array(); - $item['uri'] = $uri; - $item['title'] = $title; - $item['author'] = $author; - $item['timestamp'] = $timestamp; - $item['content'] = $content; - return $item; - } + private function stripWithDelimiters($string, $start, $end){ + while(strpos($string, $start) !== false){ + $section_to_remove = substr($string, strpos($string, $start)); + $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end)); + $string = str_replace($section_to_remove, '', $string); + } - private function cleanup_post_content($content, $site_url) { - $content = str_replace(':arrow:', '➤', $content); - $content = str_replace('href="attachments/', 'href="'.$site_url.'attachments/', $content); - $content = $this->StripWithDelimiters($content, '<script', '</script>'); - return $content; - } + return $string; + } - private function fetch_post_content($uri, $site_url) { - $html = getSimpleHTMLDOM($uri); - if(!$html){ - return 'Could not request GBAtemp '.$uri; - } + private function buildItem($uri, $title, $author, $timestamp, $content){ + $item = array(); + $item['uri'] = $uri; + $item['title'] = $title; + $item['author'] = $author; + $item['timestamp'] = $timestamp; + $item['content'] = $content; + return $item; + } - $content = $html->find('div.messageContent', 0)->innertext; - return $this->cleanup_post_content($content, $site_url); - } + private function cleanupPostContent($content, $site_url){ + $content = str_replace(':arrow:', '➤', $content); + $content = str_replace('href="attachments/', 'href="'.$site_url.'attachments/', $content); + $content = $this->stripWithDelimiters($content, '<script', '</script>'); + return $content; + } - public function collectData(){ + private function fetchPostContent($uri, $site_url){ + $html = getSimpleHTMLDOM($uri); + if(!$html){ + return 'Could not request GBAtemp ' . $uri; + } - $html = getSimpleHTMLDOM(self::URI) - or returnServerError('Could not request GBAtemp.'); + $content = $html->find('div.messageContent', 0)->innertext; + return $this->cleanupPostContent($content, $site_url); + } - switch($this->getInput('type')){ - case 'N': - foreach ($html->find('li[class=news_item full]') as $newsItem) { - $url = self::URI.$newsItem->find('a', 0)->href; - $time = intval($this->ExtractFromDelimiters($newsItem->find('abbr.DateTime', 0)->outertext, 'data-time="', '"')); - $author = $newsItem->find('a.username', 0)->plaintext; - $title = $newsItem->find('a', 1)->plaintext; - $content = $this->fetch_post_content($url, self::URI); - $this->items[] = $this->build_item($url, $title, $author, $time, $content); - } - case 'R': - foreach ($html->find('li.portal_review') as $reviewItem) { - $url = self::URI.$reviewItem->find('a', 0)->href; - $title = $reviewItem->find('span.review_title', 0)->plaintext; - $content = getSimpleHTMLDOM($url) or returnServerError('Could not request GBAtemp: '.$uri); - $author = $content->find('a.username', 0)->plaintext; - $time = intval($this->ExtractFromDelimiters($content->find('abbr.DateTime', 0)->outertext, 'data-time="', '"')); - $intro = '<p><b>'.($content->find('div#review_intro', 0)->plaintext).'</b></p>'; - $review = $content->find('div#review_main', 0)->innertext; - $subheader = '<p><b>'.$content->find('div.review_subheader', 0)->plaintext.'</b></p>'; - $procons = $content->find('table.review_procons', 0)->outertext; - $scores = $content->find('table.reviewscores', 0)->outertext; - $content = $this->cleanup_post_content($intro.$review.$subheader.$procons.$scores, self::URI); - $this->items[] = $this->build_item($url, $title, $author, $time, $content); - } - case 'T': - foreach ($html->find('li.portal-tutorial') as $tutorialItem) { - $url = self::URI.$tutorialItem->find('a', 0)->href; - $title = $tutorialItem->find('a', 0)->plaintext; - $time = intval($this->ExtractFromDelimiters($tutorialItem->find('abbr.DateTime', 0)->outertext, 'data-time="', '"')); - $author = $tutorialItem->find('a.username', 0)->plaintext; - $content = $this->fetch_post_content($url, self::URI); - $this->items[] = $this->build_item($url, $title, $author, $time, $content); - } - case 'F': - foreach ($html->find('li.rc_item') as $postItem) { - $url = self::URI.$postItem->find('a', 1)->href; - $title = $postItem->find('a', 1)->plaintext; - $time = intval($this->ExtractFromDelimiters($postItem->find('abbr.DateTime', 0)->outertext, 'data-time="', '"')); - $author = $postItem->find('a.username', 0)->plaintext; - $content = $this->fetch_post_content($url, self::URI); - $this->items[] = $this->build_item($url, $title, $author, $time, $content); - } - } - } + public function collectData(){ - public function getName() { - if(!is_null($this->getInput('type'))){ - $type=array_search( - $this->getInput('type'), - self::PARAMETERS[$this->queriedContext]['type']['values'] - ); - return 'GBAtemp '.$type.' Bridge'; - } + $html = getSimpleHTMLDOM(self::URI) + or returnServerError('Could not request GBAtemp.'); - return parent::getName(); - } + switch($this->getInput('type')){ + case 'N': + foreach($html->find('li[class=news_item full]') as $newsItem){ + $url = self::URI . $newsItem->find('a', 0)->href; + $time = intval( + $this->extractFromDelimiters( + $newsItem->find('abbr.DateTime', 0)->outertext, + 'data-time="', + '"' + ) + ); + $author = $newsItem->find('a.username', 0)->plaintext; + $title = $newsItem->find('a', 1)->plaintext; + $content = $this->fetchPostContent($url, self::URI); + $this->items[] = $this->buildItem($url, $title, $author, $time, $content); + } + case 'R': + foreach($html->find('li.portal_review') as $reviewItem){ + $url = self::URI . $reviewItem->find('a', 0)->href; + $title = $reviewItem->find('span.review_title', 0)->plaintext; + $content = getSimpleHTMLDOM($url) + or returnServerError('Could not request GBAtemp: ' . $uri); + $author = $content->find('a.username', 0)->plaintext; + $time = intval( + $this->extractFromDelimiters( + $content->find('abbr.DateTime', 0)->outertext, + 'data-time="', + '"' + ) + ); + $intro = '<p><b>' . ($content->find('div#review_intro', 0)->plaintext) . '</b></p>'; + $review = $content->find('div#review_main', 0)->innertext; + $subheader = '<p><b>' . $content->find('div.review_subheader', 0)->plaintext . '</b></p>'; + $procons = $content->find('table.review_procons', 0)->outertext; + $scores = $content->find('table.reviewscores', 0)->outertext; + $content = $this->cleanupPostContent($intro . $review . $subheader . $procons . $scores, self::URI); + $this->items[] = $this->buildItem($url, $title, $author, $time, $content); + } + case 'T': + foreach($html->find('li.portal-tutorial') as $tutorialItem){ + $url = self::URI . $tutorialItem->find('a', 0)->href; + $title = $tutorialItem->find('a', 0)->plaintext; + $time = intval( + $this->extractFromDelimiters( + $tutorialItem->find('abbr.DateTime', 0)->outertext, + 'data-time="', + '"' + ) + ); + $author = $tutorialItem->find('a.username', 0)->plaintext; + $content = $this->fetchPostContent($url, self::URI); + $this->items[] = $this->buildItem($url, $title, $author, $time, $content); + } + case 'F': + foreach($html->find('li.rc_item') as $postItem){ + $url = self::URI . $postItem->find('a', 1)->href; + $title = $postItem->find('a', 1)->plaintext; + $time = intval( + $this->extractFromDelimiters( + $postItem->find('abbr.DateTime', 0)->outertext, + 'data-time="', + '"' + ) + ); + $author = $postItem->find('a.username', 0)->plaintext; + $content = $this->fetchPostContent($url, self::URI); + $this->items[] = $this->buildItem($url, $title, $author, $time, $content); + } + } + } + + public function getName() { + if(!is_null($this->getInput('type'))){ + $type = array_search( + $this->getInput('type'), + self::PARAMETERS[$this->queriedContext]['type']['values'] + ); + return 'GBAtemp ' . $type . ' Bridge'; + } + + return parent::getName(); + } } diff --git a/bridges/GelbooruBridge.php b/bridges/GelbooruBridge.php index 25cd6a3a..fa4ce11a 100644 --- a/bridges/GelbooruBridge.php +++ b/bridges/GelbooruBridge.php @@ -1,21 +1,22 @@ <?php require_once('DanbooruBridge.php'); -class GelbooruBridge extends DanbooruBridge{ +class GelbooruBridge extends DanbooruBridge { - const MAINTAINER = "mitsukarenai"; - const NAME = "Gelbooru"; - const URI = "http://gelbooru.com/"; - const DESCRIPTION = "Returns images from given page"; + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Gelbooru'; + const URI = 'http://gelbooru.com/'; + const DESCRIPTION = 'Returns images from given page'; - const PATHTODATA='.thumb'; - const IDATTRIBUTE='id'; + const PATHTODATA = '.thumb'; + const IDATTRIBUTE = 'id'; - const PIDBYPAGE=63; + const PIDBYPAGE = 63; - protected function getFullURI(){ - return $this->getURI().'index.php?page=post&s=list&' - .'&pid='.($this->getInput('p')?($this->getInput('p') -1)*static::PIDBYPAGE:'') - .'&tags='.urlencode($this->getInput('t')); - } + protected function getFullURI(){ + return $this->getURI() + . 'index.php?page=post&s=list&pid=' + . ($this->getInput('p') ? ($this->getInput('p') - 1) * static::PIDBYPAGE : '') + . '&tags=' . urlencode($this->getInput('t')); + } } diff --git a/bridges/GiphyBridge.php b/bridges/GiphyBridge.php index 90f23a99..182d2a3f 100644 --- a/bridges/GiphyBridge.php +++ b/bridges/GiphyBridge.php @@ -1,71 +1,76 @@ <?php define('GIPHY_LIMIT', 10); -class GiphyBridge extends BridgeAbstract{ +class GiphyBridge extends BridgeAbstract { - const MAINTAINER = "kraoc"; - const NAME = "Giphy Bridge"; - const URI = "http://giphy.com/"; + const MAINTAINER = 'kraoc'; + const NAME = 'Giphy Bridge'; + const URI = 'http://giphy.com/'; const CACHE_TIMEOUT = 300; //5min - const DESCRIPTION = "Bridge for giphy.com"; + const DESCRIPTION = 'Bridge for giphy.com'; - const PARAMETERS = array( array( - 's'=>array( - 'name'=>'search tag', - 'required'=>true - ), - 'n'=>array( - 'name'=>'max number of returned items', - 'type'=>'number' - ) - )); + const PARAMETERS = array( array( + 's' => array( + 'name' => 'search tag', + 'required' => true + ), + 'n' => array( + 'name' => 'max number of returned items', + 'type' => 'number' + ) + )); public function collectData(){ $html = ''; - $base_url = 'http://giphy.com'; - $html = getSimpleHTMLDOM(self::URI.'/search/'.urlencode($this->getInput('s').'/')) - or returnServerError('No results for this query.'); + $base_url = 'http://giphy.com'; + $html = getSimpleHTMLDOM(self::URI . '/search/' . urlencode($this->getInput('s') . '/')) + or returnServerError('No results for this query.'); - $max = GIPHY_LIMIT; - if ($this->getInput('n')) { - $max = $this->getInput('n'); - } + $max = GIPHY_LIMIT; + if($this->getInput('n')){ + $max = $this->getInput('n'); + } - $limit = 0; - $kw = urlencode($this->getInput('s')); - foreach($html->find('div.hoverable-gif') as $entry) { - if($limit < $max) { - $node = $entry->first_child(); - $href = $node->getAttribute('href'); + $limit = 0; + $kw = urlencode($this->getInput('s')); + foreach($html->find('div.hoverable-gif') as $entry){ + if($limit < $max){ + $node = $entry->first_child(); + $href = $node->getAttribute('href'); - $html2 = getSimpleHTMLDOM(self::URI . $href) - or returnServerError('No results for this query.'); - $figure = $html2->getElementByTagName('figure'); - $img = $figure->firstChild(); - $caption = $figure->lastChild(); + $html2 = getSimpleHTMLDOM(self::URI . $href) + or returnServerError('No results for this query.'); + $figure = $html2->getElementByTagName('figure'); + $img = $figure->firstChild(); + $caption = $figure->lastChild(); - $item = array(); - $item['id'] = $img->getAttribute('data-gif_id'); - $item['uri'] = $img->getAttribute('data-bitly_gif_url'); - $item['username'] = 'Giphy - '.ucfirst($kw); - $title = $caption->innertext(); - $title = preg_replace('/\s+/', ' ',$title); - $title = str_replace('animated GIF', '', $title); - $title = str_replace($kw, '', $title); - $title = preg_replace('/\s+/', ' ',$title); - $title = trim($title); - if (strlen($title) <= 0) { - $title = $item['id']; - } - $item['title'] = trim($title); - $item['content'] = - '<a href="'.$item['uri'].'">' - .'<img src="'.$img->getAttribute('src').'" width="'.$img->getAttribute('data-original-width').'" height="'.$img->getAttribute('data-original-height').'" />' - .'</a>'; + $item = array(); + $item['id'] = $img->getAttribute('data-gif_id'); + $item['uri'] = $img->getAttribute('data-bitly_gif_url'); + $item['username'] = 'Giphy - ' . ucfirst($kw); + $title = $caption->innertext(); + $title = preg_replace('/\s+/', ' ', $title); + $title = str_replace('animated GIF', '', $title); + $title = str_replace($kw, '', $title); + $title = preg_replace('/\s+/', ' ',$title); + $title = trim($title); + if(strlen($title) <= 0){ + $title = $item['id']; + } + $item['title'] = trim($title); + $item['content'] = '<a href="' + . $item['uri'] + . '"><img src="' + . $img->getAttribute('src') + . '" width="' + . $img->getAttribute('data-original-width') + . '" height="' + . $img->getAttribute('data-original-height') + . '" /></a>'; - $this->items[] = $item; - $limit++; - } - } + $this->items[] = $item; + $limit++; + } + } } } diff --git a/bridges/GithubIssueBridge.php b/bridges/GithubIssueBridge.php index 58dfc37e..ba5b5e26 100644 --- a/bridges/GithubIssueBridge.php +++ b/bridges/GithubIssueBridge.php @@ -1,190 +1,187 @@ <?php -class GithubIssueBridge extends BridgeAbstract{ - - const MAINTAINER = 'Pierre Mazière'; - const NAME = 'Github Issue'; - const URI = 'https://github.com/'; - const CACHE_TIMEOUT = 600; // 10min - const DESCRIPTION = 'Returns the issues or comments of an issue of a github project'; - - const PARAMETERS=array( - 'global'=>array ( - 'u'=>array( - 'name'=>'User name', - 'required'=>true - ), - 'p'=>array( - 'name'=>'Project name', - 'required'=>true - ) - ), - - 'Project Issues'=>array( - 'c'=>array( - 'name'=>'Show Issues Comments', - 'type'=>'checkbox' - ) - ), - 'Issue comments'=>array( - 'i'=>array( - 'name'=>'Issue number', - 'type'=>'number', - 'required'=>'true' - ) - ) - ); - - public function getName(){ - $name=$this->getInput('u').'/'.$this->getInput('p'); - switch($this->queriedContext){ - case 'Project Issues': - if($this->getInput('c')){ - $prefix=static::NAME.'s comments for '; - }else{ - $prefix=static::NAME.'s for '; - } - $name=$prefix.$name; - break; - case 'Issue comments': - $name=static::NAME.' '.$name.' #'.$this->getInput('i'); - break; - } - return $name; - } - - public function getURI(){ - $uri = static::URI.$this->getInput('u').'/'.$this->getInput('p').'/issues'; - if($this->queriedContext==='Issue comments'){ - $uri.='/'.$this->getInput('i'); - }else if($this->getInput('c')){ - $uri.='?q=is%3Aissue+sort%3Aupdated-desc'; - } - return $uri; - } - - protected function extractIssueComment($issueNbr,$title,$comment){ - $class=$comment->getAttribute('class'); - $classes=explode(' ',$class); - $event=false; - if(in_array('discussion-item',$classes)){ - $event=true; - } - - $author='unknown'; - if($comment->find('.author',0)){ - $author=$comment->find('.author',0)->plaintext; - } - - $uri=static::URI.$this->getInput('u').'/'.$this->getInput('p').'/issues/' - .$issueNbr; - - $comment=$comment->firstChild(); - if(!$event){ - $comment=$comment->nextSibling(); - } - - if($event){ - $title.=' / '.substr($class,strpos($class,'discussion-item-')+strlen('discussion-item-')); - if(!$comment->hasAttribute('id')){ - $items=array(); - $timestamp=strtotime($comment->find('relative-time',0)->getAttribute('datetime')); - $content=$comment->innertext; - while($comment=$comment->nextSibling()){ - $item=array(); - $item['author']=$author; - $item['title']=html_entity_decode($title,ENT_QUOTES,'UTF-8'); - $item['timestamp']=$timestamp; - $item['content']=$content.'<p>'.$comment->children(1)->innertext.'</p>'; - $item['uri']=$uri.'#'.$comment->children(1)->getAttribute('id'); - $items[]=$item; - } - return $items; - } - $content=$comment->parent()->innertext; - }else{ - $title.=' / '.trim($comment->firstChild()->plaintext); - $content="<pre>".$comment->find('.comment-body',0)->innertext."</pre>"; - } - - $item = array(); - $item['author']=$author; - $item['uri']= $uri.'#'.$comment->getAttribute('id'); - $item['title']=html_entity_decode($title,ENT_QUOTES,'UTF-8'); - $item['timestamp']=strtotime($comment->find('relative-time',0)->getAttribute('datetime')); - $item['content']=$content; - return $item; - } - - protected function extractIssueComments($issue){ - $items=array(); - $title=$issue->find('.gh-header-title',0)->plaintext; - $issueNbr=trim(substr($issue->find('.gh-header-number',0)->plaintext,1)); - $comments=$issue->find('.js-discussion',0); - foreach($comments->children() as $comment){ - $classes=explode(' ',$comment->getAttribute('class')); - if(in_array('discussion-item',$classes) || - in_array('timeline-comment-wrapper',$classes) - ){ - $item=$this->extractIssueComment($issueNbr,$title,$comment); - if(array_keys($item)!==range(0,count($item)-1)){ - $item=array($item); - } - $items=array_merge($items,$item); - } - } - return $items; - } - - public function collectData(){ - $html = getSimpleHTMLDOM($this->getURI()) - or returnServerError('No results for Github Issue '.$this->getURI()); - - switch($this->queriedContext){ - case 'Issue comments': - $this->items=$this->extractIssueComments($html); - break; - case 'Project Issues': - foreach($html->find('.js-active-navigation-container .js-navigation-item') as $issue){ - $info=$issue->find('.opened-by',0); - $issueNbr=substr(trim($info->plaintext),1,strpos(trim($info->plaintext),' ')); - - $item=array(); - $item['content']=''; - - if($this->getInput('c')){ - $uri=static::URI.$this->getInput('u').'/'.$this->getInput('p').'/issues/'.$issueNbr; - $issue=getSimpleHTMLDOMCached($uri,static::CACHE_TIMEOUT); - if($issue){ - $this->items=array_merge($this->items,$this->extractIssueComments($issue)); - continue; - } - $item['content']='Can not extract comments from '.$uri; - } - - $item['author']=$info->find('a',0)->plaintext; - $item['timestamp']=strtotime($info->find('relative-time',0)->getAttribute('datetime')); - $item['title']=html_entity_decode( - $issue->find('.js-navigation-open',0)->plaintext, - ENT_QUOTES, - 'UTF-8' - ); - $comments=$issue->find('.col-5',0)->plaintext; - $item['content'].="\n".'Comments: '.($comments?$comments:'0'); - $item['uri']=self::URI.$issue->find('.js-navigation-open',0)->getAttribute('href'); - $this->items[]=$item; - } - break; - } - - array_walk($this->items, function(&$item){ - $item['content']=preg_replace('/\s+/',' ',$item['content']); - $item['content']=str_replace('href="/','href="'.static::URI,$item['content']); - $item['content']=str_replace( - 'href="#', - 'href="'.substr($item['uri'],0,strpos($item['uri'],'#')+1), - $item['content'] - ); - $item['title']=preg_replace('/\s+/',' ',$item['title']); - }); - } +class GithubIssueBridge extends BridgeAbstract { + + const MAINTAINER = 'Pierre Mazière'; + const NAME = 'Github Issue'; + const URI = 'https://github.com/'; + const CACHE_TIMEOUT = 600; // 10min + const DESCRIPTION = 'Returns the issues or comments of an issue of a github project'; + + const PARAMETERS = array( + 'global' => array( + 'u' => array( + 'name' => 'User name', + 'required' => true + ), + 'p' => array( + 'name' => 'Project name', + 'required' => true + ) + ), + 'Project Issues' => array( + 'c' => array( + 'name' => 'Show Issues Comments', + 'type' => 'checkbox' + ) + ), + 'Issue comments' => array( + 'i' => array( + 'name' => 'Issue number', + 'type' => 'number', + 'required' => 'true' + ) + ) + ); + + public function getName(){ + $name = $this->getInput('u') . '/' . $this->getInput('p'); + switch($this->queriedContext){ + case 'Project Issues': + if($this->getInput('c')){ + $prefix = static::NAME . 's comments for '; + } else { + $prefix = static::NAME . 's for '; + } + $name = $prefix . $name; + break; + case 'Issue comments': + $name = static::NAME . ' ' . $name . ' #' . $this->getInput('i'); + break; + } + return $name; + } + + public function getURI(){ + $uri = static::URI . $this->getInput('u') . '/' . $this->getInput('p') . '/issues'; + if($this->queriedContext === 'Issue comments'){ + $uri .= '/' . $this->getInput('i'); + } elseif($this->getInput('c')){ + $uri .= '?q=is%3Aissue+sort%3Aupdated-desc'; + } + return $uri; + } + + protected function extractIssueComment($issueNbr, $title, $comment){ + $class = $comment->getAttribute('class'); + $classes = explode(' ', $class); + $event = false; + if(in_array('discussion-item', $classes)){ + $event = true; + } + + $author = 'unknown'; + if($comment->find('.author', 0)){ + $author = $comment->find('.author', 0)->plaintext; + } + + $uri = static::URI . $this->getInput('u') . '/' . $this->getInput('p') . '/issues/' . $issueNbr; + + $comment = $comment->firstChild(); + if(!$event){ + $comment = $comment->nextSibling(); + } + + if($event){ + $title .= ' / ' . substr($class, strpos($class, 'discussion-item-') + strlen('discussion-item-')); + if(!$comment->hasAttribute('id')){ + $items = array(); + $timestamp = strtotime($comment->find('relative-time', 0)->getAttribute('datetime')); + $content = $comment->innertext; + while($comment = $comment->nextSibling()){ + $item = array(); + $item['author'] = $author; + $item['title'] = html_entity_decode($title, ENT_QUOTES, 'UTF-8'); + $item['timestamp'] = $timestamp; + $item['content'] = $content . '<p>' . $comment->children(1)->innertext . '</p>'; + $item['uri'] = $uri . '#' . $comment->children(1)->getAttribute('id'); + $items[] = $item; + } + return $items; + } + $content = $comment->parent()->innertext; + } else { + $title .= ' / ' . trim($comment->firstChild()->plaintext); + $content = "<pre>" . $comment->find('.comment-body', 0)->innertext . "</pre>"; + } + + $item = array(); + $item['author'] = $author; + $item['uri'] = $uri . '#' . $comment->getAttribute('id'); + $item['title'] = html_entity_decode($title, ENT_QUOTES, 'UTF-8'); + $item['timestamp'] = strtotime($comment->find('relative-time', 0)->getAttribute('datetime')); + $item['content'] = $content; + return $item; + } + + protected function extractIssueComments($issue){ + $items = array(); + $title = $issue->find('.gh-header-title', 0)->plaintext; + $issueNbr = trim(substr($issue->find('.gh-header-number', 0)->plaintext, 1)); + $comments = $issue->find('.js-discussion', 0); + foreach($comments->children() as $comment){ + $classes = explode(' ', $comment->getAttribute('class')); + if(in_array('discussion-item', $classes) + || in_array('timeline-comment-wrapper', $classes)){ + $item = $this->extractIssueComment($issueNbr, $title, $comment); + if(array_keys($item) !== range(0, count($item) - 1)){ + $item = array($item); + } + $items = array_merge($items, $item); + } + } + return $items; + } + + public function collectData(){ + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('No results for Github Issue ' . $this->getURI()); + + switch($this->queriedContext){ + case 'Issue comments': + $this->items = $this->extractIssueComments($html); + break; + case 'Project Issues': + foreach($html->find('.js-active-navigation-container .js-navigation-item') as $issue){ + $info = $issue->find('.opened-by', 0); + $issueNbr = substr(trim($info->plaintext), 1, strpos(trim($info->plaintext), ' ')); + + $item = array(); + $item['content'] = ''; + + if($this->getInput('c')){ + $uri = static::URI . $this->getInput('u') . '/' . $this->getInput('p') . '/issues/' . $issueNbr; + $issue = getSimpleHTMLDOMCached($uri, static::CACHE_TIMEOUT); + if($issue){ + $this->items = array_merge($this->items, $this->extractIssueComments($issue)); + continue; + } + $item['content'] = 'Can not extract comments from ' . $uri; + } + + $item['author'] = $info->find('a', 0)->plaintext; + $item['timestamp'] = strtotime($info->find('relative-time', 0)->getAttribute('datetime')); + $item['title'] = html_entity_decode( + $issue->find('.js-navigation-open', 0)->plaintext, + ENT_QUOTES, + 'UTF-8' + ); + $comments = $issue->find('.col-5', 0)->plaintext; + $item['content'] .= "\n" . 'Comments: ' . ($comments ? $comments : '0'); + $item['uri'] = self::URI . $issue->find('.js-navigation-open', 0)->getAttribute('href'); + $this->items[] = $item; + } + break; + } + + array_walk($this->items, function(&$item){ + $item['content'] = preg_replace('/\s+/', ' ', $item['content']); + $item['content'] = str_replace('href="/', 'href="' . static::URI, $item['content']); + $item['content'] = str_replace( + 'href="#', + 'href="' . substr($item['uri'], 0, strpos($item['uri'], '#') + 1), + $item['content'] + ); + $item['title'] = preg_replace('/\s+/', ' ', $item['title']); + }); + } } diff --git a/bridges/GizmodoBridge.php b/bridges/GizmodoBridge.php index bb99c668..c98f7550 100644 --- a/bridges/GizmodoBridge.php +++ b/bridges/GizmodoBridge.php @@ -1,22 +1,26 @@ <?php class GizmodoBridge extends FeedExpander { - const MAINTAINER = "polopollo"; - const NAME = "Gizmodo"; - const URI = "http://gizmodo.com/"; + const MAINTAINER = 'polopollo'; + const NAME = 'Gizmodo'; + const URI = 'http://gizmodo.com/'; const CACHE_TIMEOUT = 1800; // 30min - const DESCRIPTION = "Returns the newest posts from Gizmodo (full text)."; + const DESCRIPTION = 'Returns the newest posts from Gizmodo (full text).'; protected function parseItem($item){ $item = parent::parseItem($item); $articleHTMLContent = getSimpleHTMLDOMCached($item['uri']); if(!$articleHTMLContent){ - $text = 'Could not load '.$item['uri']; - }else{ + $text = 'Could not load ' . $item['uri']; + } else { $text = $articleHTMLContent->find('div.entry-content', 0)->innertext; - foreach($articleHTMLContent->find('pagespeed_iframe') as $element) { - $text .= '<p>link to a iframe (could be a video): <a href="'.$element->src.'">'.$element->src.'</a></p><br>'; + foreach($articleHTMLContent->find('pagespeed_iframe') as $element){ + $text .= '<p>link to a iframe (could be a video): <a href="' + . $element->src + . '">' + . $element->src + . '</a></p><br>'; } $text = strip_tags($text, '<p><b><a><blockquote><img><em>'); diff --git a/bridges/GoComicsBridge.php b/bridges/GoComicsBridge.php index 87c30df0..b9d6b2d8 100644 --- a/bridges/GoComicsBridge.php +++ b/bridges/GoComicsBridge.php @@ -1,51 +1,51 @@ <?php class GoComicsBridge extends BridgeAbstract { - const MAINTAINER = 'sky'; - const NAME = 'GoComics Unofficial RSS'; - const URI = 'http://www.gocomics.com/'; - const CACHE_TIMEOUT = 21600; // 6h - const DESCRIPTION = 'The Unofficial GoComics RSS'; - const PARAMETERS = array( array( - 'comicname' => array( - 'name' => 'comicname', - 'type' => 'text', - 'required' => true - ) - )); + const MAINTAINER = 'sky'; + const NAME = 'GoComics Unofficial RSS'; + const URI = 'http://www.gocomics.com/'; + const CACHE_TIMEOUT = 21600; // 6h + const DESCRIPTION = 'The Unofficial GoComics RSS'; + const PARAMETERS = array( array( + 'comicname' => array( + 'name' => 'comicname', + 'type' => 'text', + 'required' => true + ) + )); - public function collectData() { - $html = getSimpleHTMLDOM($this->getURI()) or returnServerError('Could not request GoComics: '.$this->getURI()); + public function collectData(){ + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Could not request GoComics: ' . $this->getURI()); - foreach ($html->find('div.item-comic-container') as $element) { + foreach($html->find('div.item-comic-container') as $element){ - $img = $element->find('img', 0); - $link = $element->find('a.item-comic-link', 0); - $comic = $img->src; - $title = $link->title; - $url = $html->find('input.js-copy-link', 0)->value; - $date = substr($title, -10); - if (empty($title)) - $title = 'GoComics '.$this->getInput('comicname').' on '.$date; - $date = strtotime($date); + $img = $element->find('img', 0); + $link = $element->find('a.item-comic-link', 0); + $comic = $img->src; + $title = $link->title; + $url = $html->find('input.js-copy-link', 0)->value; + $date = substr($title, -10); + if (empty($title)) + $title = 'GoComics ' . $this->getInput('comicname') . ' on ' . $date; + $date = strtotime($date); - $item = array(); - $item['id'] = $url; - $item['uri'] = $url; - $item['title'] = $title; - $item['author'] = preg_replace('/by /', '', $element->find('a.link-blended small', 0)->plaintext); - $item['timestamp'] = $date; - $item['content'] = '<img src="'.$comic.'" alt="'.$title.'" />'; - $this->items[] = $item; - } - } + $item = array(); + $item['id'] = $url; + $item['uri'] = $url; + $item['title'] = $title; + $item['author'] = preg_replace('/by /', '', $element->find('a.link-blended small', 0)->plaintext); + $item['timestamp'] = $date; + $item['content'] = '<img src="' . $comic . '" alt="' . $title . '" />'; + $this->items[] = $item; + } + } - public function getURI() { - return self::URI.urlencode($this->getInput('comicname')); - } + public function getURI(){ + return self::URI . urlencode($this->getInput('comicname')); + } - public function getName() { - return $this->getInput('comicname') .' - '.'GoComics'; - } + public function getName(){ + return $this->getInput('comicname') . ' - GoComics'; + } } -?> diff --git a/bridges/GooglePlusPostBridge.php b/bridges/GooglePlusPostBridge.php index 64cc5ef8..5d4680e1 100644 --- a/bridges/GooglePlusPostBridge.php +++ b/bridges/GooglePlusPostBridge.php @@ -1,39 +1,40 @@ <?php -class GooglePlusPostBridge extends BridgeAbstract -{ +class GooglePlusPostBridge extends BridgeAbstract{ + protected $_title; protected $_url; - const MAINTAINER = "Grummfy"; - const NAME = "Google Plus Post Bridge"; - const URI = "https://plus.google.com/"; + const MAINTAINER = 'Grummfy'; + const NAME = 'Google Plus Post Bridge'; + const URI = 'https://plus.google.com/'; const CACHE_TIMEOUT = 600; //10min - const DESCRIPTION = "Returns user public post (without API)."; + const DESCRIPTION = 'Returns user public post (without API).'; - const PARAMETERS = array( array( - 'username'=>array( - 'name'=>'username or Id', - 'required'=>true - ) - )); + const PARAMETERS = array( array( + 'username' => array( + 'name' => 'username or Id', + 'required' => true + ) + )); - public function collectData() - { + public function collectData(){ // get content parsed $html = getSimpleHTMLDOMCached(self::URI . urlencode($this->getInput('username')) . '/posts' // force language - , 84600, false, stream_context_create(array('http'=> array( - 'header' => 'Accept-Language: fr,fr-be,fr-fr;q=0.8,en;q=0.4,en-us;q=0.2;*' . "\r\n" + , 84600 + , false + , stream_context_create(array( + 'http' => array( + 'header' => 'Accept-Language: fr,fr-be,fr-fr;q=0.8,en;q=0.4,en-us;q=0.2;*' . "\r\n" ))) - ) OR returnServerError('No results for this query.'); + ) or returnServerError('No results for this query.'); // get title, url, ... there is a lot of intresting stuff in meta $this->_title = $html->find('meta[property]', 0)->getAttribute('content'); $this->_url = $html->find('meta[itemprop=url]', 0)->getAttribute('content'); // div[jsmodel=XNmfOc] - foreach($html->find('div.yt') as $post) - { + foreach($html->find('div.yt') as $post){ $item = array(); // $item['content'] = $post->find('div.Al', 0)->innertext; $item['author'] = $item['fullname'] = $post->find('header.lea h3 a', 0)->innertext; @@ -45,34 +46,39 @@ class GooglePlusPostBridge extends BridgeAbstract // hashtag to treat : https://plus.google.com/explore/tag $hashtags = array(); - foreach($post->find('a.d-s') as $hashtag) - { - $hashtags[ trim($hashtag->plaintext) ] = self::URI . $hashtag->href; + foreach($post->find('a.d-s') as $hashtag){ + $hashtags[trim($hashtag->plaintext)] = self::URI . $hashtag->href; } $item['content'] = ''; // avatar display - $item['content'] .= '<div style="float:left; margin: 0 0.5em 0.5em 0;"><a href="' . self::URI . urlencode($this->getInput('username')); - $item['content'] .= '"><img align="top" alt="' . $item['author'] . '" src="' . $item['avatar'].'" /></a></div>'; + $item['content'] .= '<div style="float:left; margin: 0 0.5em 0.5em 0;"><a href="' + . self::URI + . urlencode($this->getInput('username')); + + $item['content'] .= '"><img align="top" alt="' + . $item['author'] + . '" src="' + . $item['avatar'] + . '" /></a></div>'; $content = $post->find('div.Al', 0); - // XXX ugly but I don't have any idea how to do a better stuff, str_replace on link doesn't work as expected and ask too many checks - foreach($content->find('a') as $link) - { + // XXX ugly but I don't have any idea how to do a better stuff, + // str_replace on link doesn't work as expected and ask too many checks + foreach($content->find('a') as $link){ $hasHttp = strpos($link->href, 'http'); $hasDoubleSlash = strpos($link->href, '//'); - if ((!$hasHttp && !$hasDoubleSlash) - || (false !== $hasHttp && strpos($link->href, 'http') != 0) - || (false === $hasHttp && false !== $hasDoubleSlash && $hasDoubleSlash != 0)) - { + if((!$hasHttp && !$hasDoubleSlash) + || (false !== $hasHttp && strpos($link->href, 'http') != 0) + || (false === $hasHttp && false !== $hasDoubleSlash && $hasDoubleSlash != 0)){ // skipp bad link, for some hashtag or other stuff - if (strpos($link->href, '/') == 0) - { + if(strpos($link->href, '/') == 0){ $link->href = substr($link->href, 1); } + $link->href = self::URI . $link->href; } } @@ -86,13 +92,11 @@ class GooglePlusPostBridge extends BridgeAbstract } } - public function getName() - { + public function getName(){ return $this->_title ?: 'Google Plus Post Bridge'; } - public function getURI() - { + public function getURI(){ return $this->_url ?: self::URI; } } diff --git a/bridges/GoogleSearchBridge.php b/bridges/GoogleSearchBridge.php index 4e97210d..bd07f36d 100644 --- a/bridges/GoogleSearchBridge.php +++ b/bridges/GoogleSearchBridge.php @@ -9,11 +9,11 @@ */ class GoogleSearchBridge extends BridgeAbstract { - const MAINTAINER = "sebsauvage"; - const NAME = "Google search"; - const URI = "https://www.google.com/"; + const MAINTAINER = 'sebsauvage'; + const NAME = 'Google search'; + const URI = 'https://www.google.com/'; const CACHE_TIMEOUT = 1800; // 30min - const DESCRIPTION = "Returns most recent results from Google search."; + const DESCRIPTION = 'Returns most recent results from Google search.'; const PARAMETERS = array(array( 'q' => array( @@ -22,30 +22,31 @@ class GoogleSearchBridge extends BridgeAbstract { ) )); - - public function collectData() { + public function collectData(){ $html = ''; - $html = getSimpleHTMLDOM(self::URI.'search?q='.urlencode($this->getInput('q')) - .'&num=100&complete=0&tbs=qdr:y,sbd:1') - or returnServerError('No results for this query.'); + $html = getSimpleHTMLDOM(self::URI + . 'search?q=' + . urlencode($this->getInput('q')) + .'&num=100&complete=0&tbs=qdr:y,sbd:1') + or returnServerError('No results for this query.'); $emIsRes = $html->find('div[id=ires]', 0); - if( !is_null($emIsRes) ) { - - foreach($emIsRes->find('div[class=g]') as $element) { + if(!is_null($emIsRes)){ + foreach($emIsRes->find('div[class=g]') as $element){ $item = array(); // Extract direct URL from google href (eg. /url?q=...) $t = $element->find('a[href]', 0)->href; - $item['uri'] = ''.$t; + $item['uri'] = '' . $t; parse_str(parse_url($t, PHP_URL_QUERY), $parameters); - if (isset($parameters['q'])) { $item['uri'] = $parameters['q']; } + if(isset($parameters['q'])){ + $item['uri'] = $parameters['q']; + } $item['title'] = $element->find('h3', 0)->plaintext; - $item['content'] = $element->find('span[class=st]', 0)->plaintext; $this->items[] = $item; @@ -54,7 +55,6 @@ class GoogleSearchBridge extends BridgeAbstract { } public function getName(){ - - return $this->getInput('q') .' - Google search'; + return $this->getInput('q') . ' - Google search'; } } diff --git a/bridges/HDWallpapersBridge.php b/bridges/HDWallpapersBridge.php index 740b7005..309c3fdf 100644 --- a/bridges/HDWallpapersBridge.php +++ b/bridges/HDWallpapersBridge.php @@ -1,62 +1,79 @@ <?php class HDWallpapersBridge extends BridgeAbstract { - const MAINTAINER = "nel50n"; - const NAME = "HD Wallpapers Bridge"; - const URI = "http://www.hdwallpapers.in/"; + const MAINTAINER = 'nel50n'; + const NAME = 'HD Wallpapers Bridge'; + const URI = 'http://www.hdwallpapers.in/'; const CACHE_TIMEOUT = 43200; //12h - const DESCRIPTION = "Returns the latests wallpapers from HDWallpapers"; - - const PARAMETERS = array( array( - 'c'=>array( - 'name'=>'category', - 'defaultValue'=>'latest_wallpapers' - ), - 'm'=>array('name'=>'max number of wallpapers'), - 'r'=>array( - 'name'=>'resolution', - 'defaultValue'=>'1920x1200', - 'exampleValue'=>'1920x1200, 1680x1050,…' - ) - )); - - public function collectData(){ - $category = $this->category; - if (strrpos($category, 'wallpapers') !== strlen($category)-strlen('wallpapers')) { - $category .= '-desktop-wallpapers'; - } - - $num = 0; - $max = $this->getInput('m') ?: 14; - $lastpage = 1; - - for ($page = 1; $page <= $lastpage; $page++) { - $link = self::URI.'/'.$category.'/page/'.$page; - $html = getSimpleHTMLDOM($link) or returnServerError('No results for this query.'); - - if ($page === 1) { - preg_match('/page\/(\d+)$/', $html->find('.pagination a', -2)->href, $matches); - $lastpage = min($matches[1], ceil($max/14)); - } - - foreach($html->find('.wallpapers .wall a') as $element) { - $thumbnail = $element->find('img', 0); - - $item = array(); - // http://www.hdwallpapers.in/download/yosemite_reflections-1680x1050.jpg - $item['uri'] = self::URI.'/download'.str_replace('wallpapers.html', $this->getInput('r').'.jpg', $element->href); - $item['timestamp'] = time(); - $item['title'] = $element->find('p', 0)->text(); - $item['content'] = $item['title'].'<br><a href="'.$item['uri'].'"><img src="'.self::URI.$thumbnail->src.'" /></a>'; - $this->items[] = $item; - - $num++; - if ($num >= $max) - break 2; - } - } - } - - public function getName(){ - return 'HDWallpapers - '.str_replace(['__', '_'], [' & ', ' '], $this->getInput('c')).' ['.$this->getInput('r').']'; - } + const DESCRIPTION = 'Returns the latests wallpapers from HDWallpapers'; + + const PARAMETERS = array( array( + 'c' => array( + 'name' => 'category', + 'defaultValue' => 'latest_wallpapers' + ), + 'm' => array( + 'name' => 'max number of wallpapers' + ), + 'r' => array( + 'name' => 'resolution', + 'defaultValue' => '1920x1200', + 'exampleValue' => '1920x1200, 1680x1050,…' + ) + )); + + public function collectData(){ + $category = $this->category; + if(strrpos($category, 'wallpapers') !== strlen($category) - strlen('wallpapers')){ + $category .= '-desktop-wallpapers'; + } + + $num = 0; + $max = $this->getInput('m') ?: 14; + $lastpage = 1; + + for($page = 1; $page <= $lastpage; $page++){ + $link = self::URI . '/' . $category . '/page/' . $page; + $html = getSimpleHTMLDOM($link) + or returnServerError('No results for this query.'); + + if($page === 1){ + preg_match('/page\/(\d+)$/', $html->find('.pagination a', -2)->href, $matches); + $lastpage = min($matches[1], ceil($max / 14)); + } + + foreach($html->find('.wallpapers .wall a') as $element){ + $thumbnail = $element->find('img', 0); + + $item = array(); + // http://www.hdwallpapers.in/download/yosemite_reflections-1680x1050.jpg + $item['uri'] = self::URI + . '/download' + . str_replace('wallpapers.html', $this->getInput('r') . '.jpg', $element->href); + + $item['timestamp'] = time(); + $item['title'] = $element->find('p', 0)->text(); + $item['content'] = $item['title'] + . '<br><a href="' + . $item['uri'] + . '"><img src="' + . self::URI + . $thumbnail->src + . '" /></a>'; + + $this->items[] = $item; + + $num++; + if ($num >= $max) + break 2; + } + } + } + + public function getName(){ + return 'HDWallpapers - ' + . str_replace(['__', '_'], [' & ', ' '], $this->getInput('c')) + . ' [' + . $this->getInput('r') + . ']'; + } } diff --git a/bridges/HentaiHavenBridge.php b/bridges/HentaiHavenBridge.php index f075cb6a..14f4ee57 100644 --- a/bridges/HentaiHavenBridge.php +++ b/bridges/HentaiHavenBridge.php @@ -1,23 +1,37 @@ <?php -class HentaiHavenBridge extends BridgeAbstract{ +class HentaiHavenBridge extends BridgeAbstract { - const MAINTAINER = "albirew"; - const NAME = "Hentai Haven"; - const URI = "http://hentaihaven.org/"; + const MAINTAINER = 'albirew'; + const NAME = 'Hentai Haven'; + const URI = 'http://hentaihaven.org/'; const CACHE_TIMEOUT = 21600; // 6h - const DESCRIPTION = "Returns releases from Hentai Haven"; + const DESCRIPTION = 'Returns releases from Hentai Haven'; - public function collectData(){ - $html = getSimpleHTMLDOM(self::URI) - or returnServerError('Could not request Hentai Haven.'); - foreach($html->find('div.zoe-grid') as $element) { - $item = array(); - $item['uri'] = $element->find('div.brick-content h3 a', 0)->href; - $thumbnailUri = $element->find('a.thumbnail-image img', 0)->getAttribute('data-src'); - $item['title'] = mb_convert_encoding(trim($element->find('div.brick-content h3 a', 0)->innertext), 'UTF-8', 'HTML-ENTITIES'); - $item['tags'] = $element->find('div.oFlyout_bg div.oFlyout div.flyoutContent span.tags', 0)->plaintext; - $item['content'] = 'Tags: ' . $item['tags'].'<br><br><a href="' . $item['uri'] . '"><img width="300" height="169" src="' . $thumbnailUri . '" /></a><br>' . $element->find('div.oFlyout_bg div.oFlyout div.flyoutContent p.description', 0)->innertext; - $this->items[] = $item; - } - } + public function collectData(){ + $html = getSimpleHTMLDOM(self::URI) + or returnServerError('Could not request Hentai Haven.'); + + foreach($html->find('div.zoe-grid') as $element){ + $item = array(); + $item['uri'] = $element->find('div.brick-content h3 a', 0)->href; + $thumbnailUri = $element->find('a.thumbnail-image img', 0)->getAttribute('data-src'); + $item['title'] = mb_convert_encoding( + trim($element->find('div.brick-content h3 a', 0)->innertext), + 'UTF-8', + 'HTML-ENTITIES' + ); + + $item['tags'] = $element->find('div.oFlyout_bg div.oFlyout div.flyoutContent span.tags', 0)->plaintext; + $item['content'] = 'Tags: ' + . $item['tags'] + . '<br><br><a href="' + . $item['uri'] + . '"><img width="300" height="169" src="' + . $thumbnailUri + . '" /></a><br>' + . $element->find('div.oFlyout_bg div.oFlyout div.flyoutContent p.description', 0)->innertext; + + $this->items[] = $item; + } + } } diff --git a/bridges/IdenticaBridge.php b/bridges/IdenticaBridge.php index a0c3bb2e..05d832ad 100644 --- a/bridges/IdenticaBridge.php +++ b/bridges/IdenticaBridge.php @@ -1,38 +1,44 @@ <?php -class IdenticaBridge extends BridgeAbstract{ +class IdenticaBridge extends BridgeAbstract { - const MAINTAINER = "mitsukarenai"; - const NAME = "Identica Bridge"; - const URI = "https://identi.ca/"; + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Identica Bridge'; + const URI = 'https://identi.ca/'; const CACHE_TIMEOUT = 300; // 5min - const DESCRIPTION = "Returns user timelines"; - - const PARAMETERS = array( array( - 'u'=>array( - 'name'=>'username', - 'required'=>true - ) - )); - - public function collectData(){ - $html = getSimpleHTMLDOM($this->getURI()) - or returnServerError('Requested username can\'t be found.'); - - foreach($html->find('li.major') as $dent) { - $item = array(); - $item['uri'] = html_entity_decode($dent->find('a', 0)->href); // get dent link - $item['timestamp'] = strtotime($dent->find('abbr.easydate', 0)->plaintext); // extract dent timestamp - $item['content'] = trim($dent->find('div.activity-content', 0)->innertext); // extract dent text - $item['title'] = $this->getInput('u') . ' | ' . $item['content']; - $this->items[] = $item; - } - } - - public function getName(){ - return $this->getInput('u') .' - Identica Bridge'; - } - - public function getURI(){ - return self::URI.urlencode($this->getInput('u')); - } + const DESCRIPTION = 'Returns user timelines'; + + const PARAMETERS = array( array( + 'u' => array( + 'name' => 'username', + 'required' => true + ) + )); + + public function collectData(){ + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Requested username can\'t be found.'); + + foreach($html->find('li.major') as $dent){ + $item = array(); + + // get dent link + $item['uri'] = html_entity_decode($dent->find('a', 0)->href); + + // extract dent timestamp + $item['timestamp'] = strtotime($dent->find('abbr.easydate', 0)->plaintext); + + // extract dent text + $item['content'] = trim($dent->find('div.activity-content', 0)->innertext); + $item['title'] = $this->getInput('u') . ' | ' . $item['content']; + $this->items[] = $item; + } + } + + public function getName(){ + return $this->getInput('u') . ' - Identica Bridge'; + } + + public function getURI(){ + return self::URI . urlencode($this->getInput('u')); + } } diff --git a/bridges/InstagramBridge.php b/bridges/InstagramBridge.php index e3c4b511..36240b10 100644 --- a/bridges/InstagramBridge.php +++ b/bridges/InstagramBridge.php @@ -1,71 +1,62 @@ <?php -class InstagramBridge extends BridgeAbstract{ - - const MAINTAINER = "pauder"; - const NAME = "Instagram Bridge"; - const URI = "http://instagram.com/"; - const DESCRIPTION = "Returns the newest images"; - - const PARAMETERS = array( array( - 'u'=>array( - 'name'=>'username', - 'required'=>true - ) - )); - - public function collectData(){ - $html = getSimpleHTMLDOM($this->getURI()) - or returnServerError('Could not request Instagram.'); - - $innertext = null; - - foreach($html->find('script') as $script) - { - if ('' === $script->innertext) { - continue; - } - - $pos = strpos(trim($script->innertext), 'window._sharedData'); - if (0 !== $pos) - { - continue; - } - - $innertext = $script->innertext; - break; - } - - $json = trim(substr($innertext, $pos+18), ' =;'); - $data = json_decode($json); - - - - $userMedia = $data->entry_data->ProfilePage[0]->user->media->nodes; - - foreach($userMedia as $media) - { - - $item = array(); - $item['uri'] = self::URI.'p/'.$media->code.'/'; - $item['content'] = '<img src="' . htmlentities($media->display_src) . '" />'; - if (isset($media->caption)) - { - $item['title'] = $media->caption; - } else { - $item['title'] = basename($media->display_src); - } - $item['timestamp'] = $media->date; - $this->items[] = $item; - - } - } - - public function getName(){ - return $this->getInput('u') .' - Instagram Bridge'; - } - - public function getURI(){ - return self::URI.urlencode($this->getInput('u')); - } +class InstagramBridge extends BridgeAbstract { + + const MAINTAINER = 'pauder'; + const NAME = 'Instagram Bridge'; + const URI = 'http://instagram.com/'; + const DESCRIPTION = 'Returns the newest images'; + + const PARAMETERS = array( array( + 'u' => array( + 'name' => 'username', + 'required' => true + ) + )); + + public function collectData(){ + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Could not request Instagram.'); + + $innertext = null; + + foreach($html->find('script') as $script){ + if('' === $script->innertext){ + continue; + } + + $pos = strpos(trim($script->innertext), 'window._sharedData'); + if(0 !== $pos){ + continue; + } + + $innertext = $script->innertext; + break; + } + + $json = trim(substr($innertext, $pos + 18), ' =;'); + $data = json_decode($json); + + $userMedia = $data->entry_data->ProfilePage[0]->user->media->nodes; + + foreach($userMedia as $media){ + $item = array(); + $item['uri'] = self::URI . 'p/' . $media->code . '/'; + $item['content'] = '<img src="' . htmlentities($media->display_src) . '" />'; + if (isset($media->caption)){ + $item['title'] = $media->caption; + } else { + $item['title'] = basename($media->display_src); + } + $item['timestamp'] = $media->date; + $this->items[] = $item; + } + } + + public function getName(){ + return $this->getInput('u') . ' - Instagram Bridge'; + } + + public function getURI(){ + return self::URI . urlencode($this->getInput('u')); + } } - diff --git a/bridges/IsoHuntBridge.php b/bridges/IsoHuntBridge.php index 8101d327..a465bdd0 100644 --- a/bridges/IsoHuntBridge.php +++ b/bridges/IsoHuntBridge.php @@ -1,472 +1,465 @@ <?php -class IsoHuntBridge extends BridgeAbstract{ - const MAINTAINER = 'logmanoriginal'; - const NAME = 'isoHunt Bridge'; - const URI = 'https://isohunt.to/'; - const CACHE_TIMEOUT = 300; //5min - const DESCRIPTION = 'Returns the latest results by category or search result'; - - const PARAMETERS = array( - /* - * Get feeds for one of the "latest" categories - * Notice: The categories "News" and "Top Searches" are received from the main page - * Elements are sorted by name ascending! - */ - 'By "Latest" category' => array( - 'latest_category'=>array( - 'name'=>'Latest category', - 'type'=>'list', - 'required'=>true, - 'title'=>'Select your category', - 'defaultValue'=>'news', - 'values'=>array( - 'Hot Torrents'=>'hot_torrents', - 'News'=>'news', - 'Releases'=>'releases', - 'Torrents'=>'torrents' - ) - ) - ), - - /* - * Get feeds for one of the "torrent" categories - * Make sure to add new categories also to get_torrent_category_index($)! - * Elements are sorted by name ascending! - */ - 'By "Torrent" category' => array( - 'torrent_category'=>array( - 'name'=>'Torrent category', - 'type'=>'list', - 'required'=>true, - 'title'=>'Select your category', - 'defaultValue'=>'anime', - 'values'=>array( - 'Adult'=>'adult', - 'Anime'=>'anime', - 'Books'=>'books', - 'Games'=>'games', - 'Movies'=>'movies', - 'Music'=>'music', - 'Other'=>'other', - 'Series & TV'=>'series_tv', - 'Software'=>'software' - ) - ), - 'torrent_popularity'=>array( - 'name'=>'Sort by popularity', - 'type'=>'checkbox', - 'title'=>'Activate to receive results by popularity' - ) - ), - - /* - * Get feeds for a specific search request - */ - 'Search torrent by name' => array( - 'search_name'=>array( - 'name'=>'Name', - 'required'=>true, - 'title'=>'Insert your search query', - 'exampleValue'=>'Bridge' - ), - 'search_category'=>array( - 'name'=>'Category', - 'type'=>'list', - 'title'=>'Select your category', - 'defaultValue'=>'all', - 'values'=>array( - 'Adult'=>'adult', - 'All'=>'all', - 'Anime'=>'anime', - 'Books'=>'books', - 'Games'=>'games', - 'Movies'=>'movies', - 'Music'=>'music', - 'Other'=>'other', - 'Series & TV'=>'series_tv', - 'Software'=>'software' - ) - ) - ) - ); - - public function getURI(){ - $uri=self::URI; - switch($this->queriedContext){ - case 'By "Latest" category': - switch($this->getInput('latest_category')){ - case 'hot_torrents': - $uri .= 'statistic/hot/torrents'; - break; - case 'news': - break; - case 'releases': - $uri .= 'releases.php'; - break; - case 'torrents': - $uri .= 'latest.php'; - break; - } - break; - - case 'By "Torrent" category': - $uri .= $this->build_category_uri( - $this->getInput('torrent_category'), - $this->getInput('torrent_popularity') - ); - break; - - case 'Search torrent by name': - $category=$this->getInput('search_category'); - $uri .= $this->build_category_uri($category); - if($category!=='movies') - $uri .= '&ihq=' . urlencode($this->getInput('search_name')); - break; - - default: parent::getURI(); - } - - return $uri; - } - - public function getName(){ - switch($this->queriedContext){ - case 'By "Latest" category': - $categoryName = - array_search( - $this->getInput('latest_category'), - self::PARAMETERS['By "Latest" category']['latest_category']['values'] - ); - $name = 'Latest '.$categoryName.' - ' . self::NAME; - break; - - case 'By "Torrent" category': - $categoryName = - array_search( - $this->getInput('torrent_category'), - self::PARAMETERS['By "Torrent" category']['torrent_category']['values'] - ); - $name = 'Category: ' . $categoryName . ' - ' . self::NAME; - break; - - case 'Search torrent by name': - $categoryName = - array_search( - $this->getInput('search_category'), - self::PARAMETERS['Search torrent by name']['search_category']['values'] - ); - $name = 'Search: "' . $this->getInput('search_name') . '" in category: ' . $categoryName . ' - ' . self::NAME; - break; - - default: return parent::getName(); - } - - return $name; - } - - - public function collectData(){ - $html = $this->load_html($this->getURI()); - - switch($this->queriedContext){ - case 'By "Latest" category': - switch($this->getInput('latest_category')){ - case 'hot_torrents': - $this->get_latest_hot_torrents($html); - break; - case 'news': - $this->get_latest_news($html); - break; - case 'releases': - case 'torrents': - $this->get_latest_torrents($html); - break; - } - break; - - case 'By "Torrent" category': - if($this->getInput('torrent_category') === 'movies'){ - // This one is special (content wise) - $this->get_movie_torrents($html); - }else{ - $this->get_latest_torrents($html); - } - break; - - case 'Search torrent by name': - if( $this->getInput('search_category') === 'movies'){ - // This one is special (content wise) - $this->get_movie_torrents($html); - } else { - $this->get_latest_torrents($html); - } - break; - } - } - - #region Helper functions for "Movie Torrents" - - private function get_movie_torrents($html){ - $container = $html->find('div#w0', 0); - if(!$container) - returnServerError('Unable to find torrent container!'); - - $torrents = $container->find('article'); - if(!$torrents) - returnServerError('Unable to find torrents!'); - - foreach($torrents as $torrent){ - - $anchor = $torrent->find('a', 0); - if(!$anchor) - returnServerError('Unable to find anchor!'); - - $date = $torrent->find('small', 0); - if(!$date) - returnServerError('Unable to find date!'); - - $item = array(); - - $item['uri'] = $this->fix_relative_uri($anchor->href); - $item['title'] = $anchor->title; - // $item['author'] = - $item['timestamp'] = strtotime($date->plaintext); - $item['content'] = $this->fix_relative_uri($torrent->innertext); - - $this->items[] = $item; - } - } - - #endregion - - #region Helper functions for "Latest Hot Torrents" - - private function get_latest_hot_torrents($html){ - $container = $html->find('div#serps', 0); - if(!$container) - returnServerError('Unable to find torrent container!'); - - $torrents = $container->find('tr'); - if(!$torrents) - returnServerError('Unable to find torrents!'); - - // Remove first element (header row) - $torrents = array_slice($torrents, 1); - - foreach($torrents as $torrent){ - - $cell = $torrent->find('td', 0); - if(!$cell) - returnServerError('Unable to find cell!'); - - $element = $cell->find('a', 0); - if(!$element) - returnServerError('Unable to find element!'); - - $item = array(); - - $item['uri'] = $element->href; - $item['title'] = $element->plaintext; - // $item['author'] = - // $item['timestamp'] = - // $item['content'] = - - $this->items[] = $item; - } - } - - #endregion +class IsoHuntBridge extends BridgeAbstract { + const MAINTAINER = 'logmanoriginal'; + const NAME = 'isoHunt Bridge'; + const URI = 'https://isohunt.to/'; + const CACHE_TIMEOUT = 300; //5min + const DESCRIPTION = 'Returns the latest results by category or search result'; + + const PARAMETERS = array( + /* + * Get feeds for one of the "latest" categories + * Notice: The categories "News" and "Top Searches" are received from the main page + * Elements are sorted by name ascending! + */ + 'By "Latest" category' => array( + 'latest_category' => array( + 'name' => 'Latest category', + 'type' => 'list', + 'required' => true, + 'title' => 'Select your category', + 'defaultValue' => 'news', + 'values' => array( + 'Hot Torrents' => 'hot_torrents', + 'News' => 'news', + 'Releases' => 'releases', + 'Torrents' => 'torrents' + ) + ) + ), + + /* + * Get feeds for one of the "torrent" categories + * Make sure to add new categories also to get_torrent_category_index($)! + * Elements are sorted by name ascending! + */ + 'By "Torrent" category' => array( + 'torrent_category' => array( + 'name' => 'Torrent category', + 'type' => 'list', + 'required' => true, + 'title' => 'Select your category', + 'defaultValue' => 'anime', + 'values' => array( + 'Adult' => 'adult', + 'Anime' => 'anime', + 'Books' => 'books', + 'Games' => 'games', + 'Movies' => 'movies', + 'Music' => 'music', + 'Other' => 'other', + 'Series & TV' => 'series_tv', + 'Software' => 'software' + ) + ), + 'torrent_popularity' => array( + 'name' => 'Sort by popularity', + 'type' => 'checkbox', + 'title' => 'Activate to receive results by popularity' + ) + ), + + /* + * Get feeds for a specific search request + */ + 'Search torrent by name' => array( + 'search_name' => array( + 'name' => 'Name', + 'required' => true, + 'title' => 'Insert your search query', + 'exampleValue' => 'Bridge' + ), + 'search_category' => array( + 'name' => 'Category', + 'type' => 'list', + 'title' => 'Select your category', + 'defaultValue' => 'all', + 'values' => array( + 'Adult' => 'adult', + 'All' => 'all', + 'Anime' => 'anime', + 'Books' => 'books', + 'Games' => 'games', + 'Movies' => 'movies', + 'Music' => 'music', + 'Other' => 'other', + 'Series & TV' => 'series_tv', + 'Software' => 'software' + ) + ) + ) + ); + + public function getURI(){ + $uri = self::URI; + switch($this->queriedContext){ + case 'By "Latest" category': + switch($this->getInput('latest_category')){ + case 'hot_torrents': + $uri .= 'statistic/hot/torrents'; + break; + case 'news': + break; + case 'releases': + $uri .= 'releases.php'; + break; + case 'torrents': + $uri .= 'latest.php'; + break; + } + break; + case 'By "Torrent" category': + $uri .= $this->buildCategoryUri( + $this->getInput('torrent_category'), + $this->getInput('torrent_popularity') + ); + break; + case 'Search torrent by name': + $category = $this->getInput('search_category'); + $uri .= $this->buildCategoryUri($category); + if($category !== 'movies') + $uri .= '&ihq=' . urlencode($this->getInput('search_name')); + break; + + default: parent::getURI(); + } + + return $uri; + } + + public function getName(){ + switch($this->queriedContext){ + case 'By "Latest" category': + $categoryName = array_search( + $this->getInput('latest_category'), + self::PARAMETERS['By "Latest" category']['latest_category']['values'] + ); + $name = 'Latest ' . $categoryName . ' - ' . self::NAME; + break; + case 'By "Torrent" category': + $categoryName = array_search( + $this->getInput('torrent_category'), + self::PARAMETERS['By "Torrent" category']['torrent_category']['values'] + ); + $name = 'Category: ' . $categoryName . ' - ' . self::NAME; + break; + case 'Search torrent by name': + $categoryName = array_search( + $this->getInput('search_category'), + self::PARAMETERS['Search torrent by name']['search_category']['values'] + ); + $name = 'Search: "' + . $this->getInput('search_name') + . '" in category: ' + . $categoryName . ' - ' + . self::NAME; + break; + default: return parent::getName(); + } + + return $name; + } + + public function collectData(){ + $html = $this->loadHtml($this->getURI()); + + switch($this->queriedContext){ + case 'By "Latest" category': + switch($this->getInput('latest_category')){ + case 'hot_torrents': + $this->getLatestHotTorrents($html); + break; + case 'news': + $this->getLatestNews($html); + break; + case 'releases': + case 'torrents': + $this->getLatestTorrents($html); + break; + } + break; + case 'By "Torrent" category': + if($this->getInput('torrent_category') === 'movies'){ + // This one is special (content wise) + $this->getMovieTorrents($html); + } else { + $this->getLatestTorrents($html); + } + break; + case 'Search torrent by name': + if( $this->getInput('search_category') === 'movies'){ + // This one is special (content wise) + $this->getMovieTorrents($html); + } else { + $this->getLatestTorrents($html); + } + break; + } + } + + #region Helper functions for "Movie Torrents" + + private function getMovieTorrents($html){ + $container = $html->find('div#w0', 0); + if(!$container) + returnServerError('Unable to find torrent container!'); + + $torrents = $container->find('article'); + if(!$torrents) + returnServerError('Unable to find torrents!'); + + foreach($torrents as $torrent){ + + $anchor = $torrent->find('a', 0); + if(!$anchor) + returnServerError('Unable to find anchor!'); + + $date = $torrent->find('small', 0); + if(!$date) + returnServerError('Unable to find date!'); + + $item = array(); + + $item['uri'] = $this->fixRelativeUri($anchor->href); + $item['title'] = $anchor->title; + // $item['author'] = + $item['timestamp'] = strtotime($date->plaintext); + $item['content'] = $this->fixRelativeUri($torrent->innertext); + + $this->items[] = $item; + } + } + + #endregion + + #region Helper functions for "Latest Hot Torrents" + + private function getLatestHotTorrents($html){ + $container = $html->find('div#serps', 0); + if(!$container) + returnServerError('Unable to find torrent container!'); + + $torrents = $container->find('tr'); + if(!$torrents) + returnServerError('Unable to find torrents!'); + + // Remove first element (header row) + $torrents = array_slice($torrents, 1); + + foreach($torrents as $torrent){ + + $cell = $torrent->find('td', 0); + if(!$cell) + returnServerError('Unable to find cell!'); + + $element = $cell->find('a', 0); + if(!$element) + returnServerError('Unable to find element!'); + + $item = array(); + + $item['uri'] = $element->href; + $item['title'] = $element->plaintext; + // $item['author'] = + // $item['timestamp'] = + // $item['content'] = + + $this->items[] = $item; + } + } + + #endregion + + #region Helper functions for "Latest News" + + private function getLatestNews($html){ + $container = $html->find('div#postcontainer', 0); + if(!$container) + returnServerError('Unable to find post container!'); + + $posts = $container->find('div.index-post'); + if(!$posts) + returnServerError('Unable to find posts!'); - #region Helper functions for "Latest News" + foreach($posts as $post){ + $item = array(); - private function get_latest_news($html){ - $container = $html->find('div#postcontainer', 0); - if(!$container) - returnServerError('Unable to find post container!'); + $item['uri'] = $this->latestNewsExtractUri($post); + $item['title'] = $this->latestNewsExtractTitle($post); + $item['author'] = $this->latestNewsExtractAuthor($post); + $item['timestamp'] = $this->latestNewsExtractTimestamp($post); + $item['content'] = $this->latestNewsExtractContent($post); - $posts = $container->find('div.index-post'); - if(!$posts) - returnServerError('Unable to find posts!'); + $this->items[] = $item; + } + } - foreach($posts as $post){ - $item = array(); + private function latestNewsExtractAuthor($post){ + $author = $post->find('small', 0); + if(!$author) + returnServerError('Unable to find author!'); - $item['uri'] = $this->latest_news_extract_uri($post); - $item['title'] = $this->latest_news_extract_title($post); - $item['author'] = $this->latest_news_extract_author($post); - $item['timestamp'] = $this->latest_news_extract_timestamp($post); - $item['content'] = $this->latest_news_extract_content($post); + // The author is hidden within a string like: 'Posted by {author} on {date}' + preg_match('/Posted\sby\s(.*)\son/i', $author->innertext, $matches); - $this->items[] = $item; - } - } + return $matches[1]; + } - private function latest_news_extract_author($post){ - $author = $post->find('small', 0); - if(!$author) - returnServerError('Unable to find author!'); + private function latestNewsExtractTimestamp($post){ + $date = $post->find('small', 0); + if(!$date) + returnServerError('Unable to find date!'); - // The author is hidden within a string like: 'Posted by {author} on {date}' - preg_match('/Posted\sby\s(.*)\son/i', $author->innertext, $matches); + // The date is hidden within a string like: 'Posted by {author} on {date}' + preg_match('/Posted\sby\s.*\son\s(.*)/i', $date->innertext, $matches); - return $matches[1]; - } + $timestamp = strtotime($matches[1]); - private function latest_news_extract_timestamp($post){ - $date = $post->find('small', 0); - if(!$date) - returnServerError('Unable to find date!'); + // Make sure date is not in the future (dates are given like 'Nov. 20' without year) + if($timestamp > time()){ + $timestamp = strtotime('-1 year', $timestamp); + } - // The date is hidden within a string like: 'Posted by {author} on {date}' - preg_match('/Posted\sby\s.*\son\s(.*)/i', $date->innertext, $matches); + return $timestamp; + } - $timestamp = strtotime($matches[1]); + private function latestNewsExtractTitle($post){ + $title = $post->find('a', 0); + if(!$title) + returnServerError('Unable to find title!'); - // Make sure date is not in the future (dates are given like 'Nov. 20' without year) - if($timestamp > time()){ - $timestamp = strtotime('-1 year', $timestamp); - } + return $title->plaintext; + } - return $timestamp; - } + private function latestNewsExtractUri($post){ + $uri = $post->find('a', 0); + if(!$uri) + returnServerError('Unable to find uri!'); - private function latest_news_extract_title($post){ - $title = $post->find('a', 0); - if(!$title) - returnServerError('Unable to find title!'); + return $uri->href; + } - return $title->plaintext; - } + private function latestNewsExtractContent($post){ + $content = $post->find('div', 0); + if(!$content) + returnServerError('Unable to find content!'); - private function latest_news_extract_uri($post){ - $uri = $post->find('a', 0); - if(!$uri) - returnServerError('Unable to find uri!'); + // Remove <h2>...</h2> (title) + foreach($content->find('h2') as $element){ + $element->outertext = ''; + } - return $uri->href; - } + // Remove <small>...</small> (author) + foreach($content->find('small') as $element){ + $element->outertext = ''; + } - private function latest_news_extract_content($post){ - $content = $post->find('div', 0); - if(!$content) - returnServerError('Unable to find content!'); + return $content->innertext; + } + + #endregion + + #region Helper functions for "Latest Torrents", "Latest Releases" and "Torrent Category" - // Remove <h2>...</h2> (title) - foreach($content->find('h2') as $element){ - $element->outertext = ''; - } + private function getLatestTorrents($html){ + $container = $html->find('div#serps', 0); + if(!$container) + returnServerError('Unable to find torrent container!'); - // Remove <small>...</small> (author) - foreach($content->find('small') as $element){ - $element->outertext = ''; - } + $torrents = $container->find('tr[data-key]'); + if(!$torrents) + returnServerError('Unable to find torrents!'); - return $content->innertext; - } - - #endregion - - #region Helper functions for "Latest Torrents", "Latest Releases" and "Torrent Category" + foreach($torrents as $torrent){ + $item = array(); + + $item['uri'] = $this->latestTorrentsExtractUri($torrent); + $item['title'] = $this->latestTorrentsExtractTitle($torrent); + $item['author'] = $this->latestTorrentsExtractAuthor($torrent); + $item['timestamp'] = $this->latestTorrentsExtractTimestamp($torrent); + $item['content'] = ''; // There is no valuable content + + $this->items[] = $item; + } + } + + private function latestTorrentsExtractTitle($torrent){ + $cell = $torrent->find('td.title-row', 0); + if(!$cell) + returnServerError('Unable to find title cell!'); - private function get_latest_torrents($html){ - $container = $html->find('div#serps', 0); - if(!$container) - returnServerError('Unable to find torrent container!'); + $title = $cell->find('span', 0); + if(!$title) + returnServerError('Unable to find title!'); - $torrents = $container->find('tr[data-key]'); - if(!$torrents) - returnServerError('Unable to find torrents!'); + return $title->plaintext; + } + + private function latestTorrentsExtractUri($torrent){ + $cell = $torrent->find('td.title-row', 0); + if(!$cell) + returnServerError('Unable to find title cell!'); - foreach($torrents as $torrent){ - $item = array(); - - $item['uri'] = $this->latest_torrents_extract_uri($torrent); - $item['title'] = $this->latest_torrents_extract_title($torrent); - $item['author'] = $this->latest_torrents_extract_author($torrent); - $item['timestamp'] = $this->latest_torrents_extract_timestamp($torrent); - $item['content'] = ''; // There is no valuable content - - $this->items[] = $item; - } - } - - private function latest_torrents_extract_title($torrent){ - $cell = $torrent->find('td.title-row', 0); - if(!$cell) - returnServerError('Unable to find title cell!'); + $uri = $cell->find('a', 0); + if(!$uri) + returnServerError('Unable to find uri!'); - $title = $cell->find('span', 0); - if(!$title) - returnServerError('Unable to find title!'); + return $this->fixRelativeUri($uri->href); + } + + private function latestTorrentsExtractAuthor($torrent){ + $cell = $torrent->find('td.user-row', 0); + if(!$cell) + return; // No author - return $title->plaintext; - } - - private function latest_torrents_extract_uri($torrent){ - $cell = $torrent->find('td.title-row', 0); - if(!$cell) - returnServerError('Unable to find title cell!'); + $user = $cell->find('a', 0); + if(!$user) + returnServerError('Unable to find user!'); + + return $user->plaintext; + } + + private function latestTorrentsExtractTimestamp($torrent){ + $cell = $torrent->find('td.date-row', 0); + if(!$cell) + returnServerError('Unable to find date cell!'); + + return strtotime('-' . $cell->plaintext, time()); + } + + #endregion + + #region Generic helper functions + + private function loadHtml($uri){ + $html = getSimpleHTMLDOM($uri); + if(!$html) + returnServerError('Unable to load ' . $uri . '!'); - $uri = $cell->find('a', 0); - if(!$uri) - returnServerError('Unable to find uri!'); - - return $this->fix_relative_uri($uri->href); - } - - private function latest_torrents_extract_author($torrent){ - $cell = $torrent->find('td.user-row', 0); - if(!$cell) - return; // No author - - $user = $cell->find('a', 0); - if(!$user) - returnServerError('Unable to find user!'); - - return $user->plaintext; - } - - private function latest_torrents_extract_timestamp($torrent){ - $cell = $torrent->find('td.date-row', 0); - if(!$cell) - returnServerError('Unable to find date cell!'); - - return strtotime('-' . $cell->plaintext, time()); - } - - #endregion - - #region Generic helper functions - - private function load_html($uri){ - $html = getSimpleHTMLDOM($uri); - if(!$html) - returnServerError('Unable to load ' . $uri . '!'); - - return $html; - } - - private function fix_relative_uri($uri){ - return preg_replace('/\//i', self::URI, $uri, 1); - } - - private function build_category_uri($category, $order_popularity = false){ - switch($category){ - case 'anime': $index = 1; break; - case 'software' : $index = 2; break; - case 'games' : $index = 3; break; - case 'adult' : $index = 4; break; - case 'movies' : $index = 5; break; - case 'music' : $index = 6; break; - case 'other' : $index = 7; break; - case 'series_tv' : $index = 8; break; - case 'books': $index = 9; break; - case 'all': - default: $index = 0; break; - } - - return 'torrents/?iht=' . $index . '&ihs=' . ($order_popularity ? 1 : 0) . '&age=0'; - } - - #endregion + return $html; + } + + private function fixRelativeUri($uri){ + return preg_replace('/\//i', self::URI, $uri, 1); + } + + private function buildCategoryUri($category, $order_popularity = false){ + switch($category){ + case 'anime': $index = 1; break; + case 'software' : $index = 2; break; + case 'games' : $index = 3; break; + case 'adult' : $index = 4; break; + case 'movies' : $index = 5; break; + case 'music' : $index = 6; break; + case 'other' : $index = 7; break; + case 'series_tv' : $index = 8; break; + case 'books': $index = 9; break; + case 'all': + default: $index = 0; break; + } + + return 'torrents/?iht=' . $index . '&ihs=' . ($order_popularity ? 1 : 0) . '&age=0'; + } + + #endregion } diff --git a/bridges/JapanExpoBridge.php b/bridges/JapanExpoBridge.php index 72dd0a6c..040754cd 100644 --- a/bridges/JapanExpoBridge.php +++ b/bridges/JapanExpoBridge.php @@ -1,89 +1,100 @@ <?php class JapanExpoBridge extends BridgeAbstract { - const MAINTAINER = 'Ginko'; - const NAME = 'Japan Expo Actualités'; - const URI = 'http://www.japan-expo-paris.com/fr/actualites'; - const CACHE_TIMEOUT = 14400; // 4h - const DESCRIPTION = 'Returns most recent entries from Japan Expo actualités.'; - const PARAMETERS = array( array( - 'mode'=>array( - 'name'=>'Show full contents', - 'type'=>'checkbox', - ) - )); + const MAINTAINER = 'Ginko'; + const NAME = 'Japan Expo Actualités'; + const URI = 'http://www.japan-expo-paris.com/fr/actualites'; + const CACHE_TIMEOUT = 14400; // 4h + const DESCRIPTION = 'Returns most recent entries from Japan Expo actualités.'; + const PARAMETERS = array( array( + 'mode' => array( + 'name' => 'Show full contents', + 'type' => 'checkbox', + ) + )); - public function collectData(){ + public function collectData(){ - function french_pubdate_to_timestamp($date_to_parse) { - return strtotime( - strtr( - strtolower(str_replace('Publié le ', '', $date_to_parse)), - array( - 'janvier' => 'jan', - 'février' => 'feb', - 'mars' => 'march', - 'avril' => 'apr', - 'mai' => 'may', - 'juin' => 'jun', - 'juillet' => 'jul', - 'août' => 'aug', - 'septembre' => 'sep', - 'octobre' => 'oct', - 'novembre' => 'nov', - 'décembre' => 'dec' - ) - ) - ); - } + function frenchPubDateToTimestamp($date_to_parse) { + return strtotime( + strtr( + strtolower(str_replace('Publié le ', '', $date_to_parse)), + array( + 'janvier' => 'jan', + 'février' => 'feb', + 'mars' => 'march', + 'avril' => 'apr', + 'mai' => 'may', + 'juin' => 'jun', + 'juillet' => 'jul', + 'août' => 'aug', + 'septembre' => 'sep', + 'octobre' => 'oct', + 'novembre' => 'nov', + 'décembre' => 'dec' + ) + ) + ); + } - $convert_article_images = function ($matches) { - if (is_array($matches) && count($matches) > 1) { - return '<img src="'.$matches[1].'" />'; - } - }; + $convert_article_images = function($matches){ + if(is_array($matches) && count($matches) > 1){ + return '<img src="' . $matches[1] . '" />'; + } + }; - $html = getSimpleHTMLDOM(self::URI) - or returnServerError('Could not request JapanExpo: '.self::URI); - $fullcontent = $this->getInput('mode'); - $count = 0; + $html = getSimpleHTMLDOM(self::URI) + or returnServerError('Could not request JapanExpo: ' . self::URI); + $fullcontent = $this->getInput('mode'); + $count = 0; - foreach ($html->find('a._tile2') as $element) { + foreach($html->find('a._tile2') as $element){ - $url = $element->href; - $thumbnail = 'http://s.japan-expo.com/katana/images/JES049/paris.png'; - preg_match('/url\(([^)]+)\)/', $element->find('img.rspvimgset', 0)->style, $img_search_result); - if (count($img_search_result) >= 2) - $thumbnail = trim($img_search_result[1], "'"); + $url = $element->href; + $thumbnail = 'http://s.japan-expo.com/katana/images/JES049/paris.png'; + preg_match('/url\(([^)]+)\)/', $element->find('img.rspvimgset', 0)->style, $img_search_result); - if ($fullcontent) { - if ($count >= 5) { - break; - } + if(count($img_search_result) >= 2) + $thumbnail = trim($img_search_result[1], "'"); - $article_html = getSimpleHTMLDOMCached('Could not request JapanExpo: '.$url); - $header = $article_html->find('header.pageHeadBox', 0); - $timestamp = strtotime($header->find('time', 0)->datetime); - $title_html = $header->find('div.section', 0)->next_sibling(); - $title = $title_html->plaintext; - $headings = $title_html->next_sibling()->outertext; - $article = $article_html->find('div.content', 0)->innertext; - $article = preg_replace_callback('/<img [^>]+ style="[^\(]+\(\'([^\']+)\'[^>]+>/i', $convert_article_images, $article); - $content = $headings.$article; - } else { - $date_text = $element->find('span.date', 0)->plaintext; - $timestamp = french_pubdate_to_timestamp($date_text); - $title = trim($element->find('span._title', 0)->plaintext); - $content = '<img src="'.$thumbnail.'"></img><br />'.$date_text.'<br /><a href="'.$url.'">Lire l\'article</a>'; - } + if($fullcontent){ + if($count >= 5){ + break; + } - $item = array(); - $item['uri'] = $url; - $item['title'] = $title; - $item['timestamp'] = $timestamp; - $item['content'] = $content; - $this->items[] = $item; - $count++; - } - } + $article_html = getSimpleHTMLDOMCached('Could not request JapanExpo: ' . $url); + $header = $article_html->find('header.pageHeadBox', 0); + $timestamp = strtotime($header->find('time', 0)->datetime); + $title_html = $header->find('div.section', 0)->next_sibling(); + $title = $title_html->plaintext; + $headings = $title_html->next_sibling()->outertext; + $article = $article_html->find('div.content', 0)->innertext; + $article = preg_replace_callback( + '/<img [^>]+ style="[^\(]+\(\'([^\']+)\'[^>]+>/i', + $convert_article_images, + $article); + + $content = $headings . $article; + } else { + $date_text = $element->find('span.date', 0)->plaintext; + $timestamp = frenchPubDateToTimestamp($date_text); + $title = trim($element->find('span._title', 0)->plaintext); + $content = '<img src="' + . $thumbnail + . '"></img><br />' + . $date_text + . '<br /><a href="' + . $url + . '">Lire l\'article</a>'; + } + + $item = array(); + $item['uri'] = $url; + $item['title'] = $title; + $item['timestamp'] = $timestamp; + $item['content'] = $content; + $this->items[] = $item; + $count++; + } + } } diff --git a/bridges/KonachanBridge.php b/bridges/KonachanBridge.php index 6d170312..4250e8b8 100644 --- a/bridges/KonachanBridge.php +++ b/bridges/KonachanBridge.php @@ -3,9 +3,9 @@ require_once('MoebooruBridge.php'); class KonachanBridge extends MoebooruBridge { - const MAINTAINER = "mitsukarenai"; - const NAME = "Konachan"; - const URI = "http://konachan.com/"; - const DESCRIPTION = "Returns images from given page"; + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Konachan'; + const URI = 'http://konachan.com/'; + const DESCRIPTION = 'Returns images from given page'; } diff --git a/bridges/KoreusBridge.php b/bridges/KoreusBridge.php index 25d8dbf9..a5e09cbd 100644 --- a/bridges/KoreusBridge.php +++ b/bridges/KoreusBridge.php @@ -1,12 +1,12 @@ <?php class KoreusBridge extends FeedExpander { - const MAINTAINER = "pit-fgfjiudghdf"; - const NAME = "Koreus"; - const URI = "http://www.koreus.com/"; - const DESCRIPTION = "Returns the newest posts from Koreus (full text)"; + const MAINTAINER = 'pit-fgfjiudghdf'; + const NAME = 'Koreus'; + const URI = 'http://www.koreus.com/'; + const DESCRIPTION = 'Returns the newest posts from Koreus (full text)'; - protected function parseItem($item) { + protected function parseItem($item){ $item = parent::parseItem($item); $html = getSimpleHTMLDOMCached($item['uri']); diff --git a/bridges/KununuBridge.php b/bridges/KununuBridge.php index 9e00148e..083f660d 100644 --- a/bridges/KununuBridge.php +++ b/bridges/KununuBridge.php @@ -1,40 +1,39 @@ <?php class KununuBridge extends BridgeAbstract { - const MAINTAINER = "logmanoriginal"; - const NAME = "Kununu Bridge"; - const URI = "https://www.kununu.com/"; + const MAINTAINER = 'logmanoriginal'; + const NAME = 'Kununu Bridge'; + const URI = 'https://www.kununu.com/'; const CACHE_TIMEOUT = 86400; // 24h - const DESCRIPTION = "Returns the latest reviews for a company and site of your choice."; + const DESCRIPTION = 'Returns the latest reviews for a company and site of your choice.'; const PARAMETERS = array( 'global' => array( - 'site'=>array( - 'name'=>'Site', - 'type'=>'list', - 'required'=>true, - 'title'=>'Select your site', - 'values'=>array( - 'Austria'=>'at', - 'Germany'=>'de', - 'Switzerland'=>'ch', - 'United States'=>'us' + 'site' => array( + 'name' => 'Site', + 'type' => 'list', + 'required' => true, + 'title' => 'Select your site', + 'values' => array( + 'Austria' => 'at', + 'Germany' => 'de', + 'Switzerland' => 'ch', + 'United States' => 'us' ) - ), - 'full'=>array( - 'name'=>'Load full article', - 'type'=>'checkbox', - 'required'=>false, - 'exampleValue'=>'checked', - 'title'=>'Activate to load full article' + ), + 'full' => array( + 'name' => 'Load full article', + 'type' => 'checkbox', + 'required' => false, + 'exampleValue' => 'checked', + 'title' => 'Activate to load full article' ) ), - array( - 'company'=>array( - 'name'=>'Company', - 'required'=>true, - 'exampleValue'=>'kununu-us', - 'title'=>'Insert company name (i.e. Kununu US) or URI path (i.e. kununu-us)' + 'company' => array( + 'name' => 'Company', + 'required' => true, + 'exampleValue' => 'kununu-us', + 'title' => 'Insert company name (i.e. Kununu US) or URI path (i.e. kununu-us)' ) ) ); @@ -44,7 +43,7 @@ class KununuBridge extends BridgeAbstract { public function getURI(){ if(!is_null($this->getInput('company')) && !is_null($this->getInput('site'))){ - $company = $this->fix_company_name($this->getInput('company')); + $company = $this->fixCompanyName($this->getInput('company')); $site = $this->getInput('site'); $section = ''; @@ -67,8 +66,8 @@ class KununuBridge extends BridgeAbstract { function getName(){ if(!is_null($this->getInput('company'))){ - $company = $this->fix_company_name($this->getInput('company')); - return ($this->companyName?:$company).' - '.self::NAME; + $company = $this->fixCompanyName($this->getInput('company')); + return ($this->companyName ?: $company) . ' - ' . self::NAME; } return paren::getName(); @@ -82,7 +81,7 @@ class KununuBridge extends BridgeAbstract { if(!$html) returnServerError('Unable to receive data from ' . $this->getURI() . '!'); // Update name for this request - $this->companyName = $this->extract_company_name($html); + $this->companyName = $this->extractCompanyName($html); // Find the section with all the panels (reviews) $section = $html->find('section.kununu-scroll-element', 0); @@ -98,15 +97,18 @@ class KununuBridge extends BridgeAbstract { foreach($articles as $article){ $item = array(); - $item['author'] = $this->extract_article_author_position($article); - $item['timestamp'] = $this->extract_article_date($article); - $item['title'] = $this->extract_article_rating($article) . ' : ' . $this->extract_article_summary($article); - $item['uri'] = $this->extract_article_uri($article); + $item['author'] = $this->extractArticleAuthorPosition($article); + $item['timestamp'] = $this->extractArticleDate($article); + $item['title'] = $this->extractArticleRating($article) + . ' : ' + . $this->extractArticleSummary($article); + + $item['uri'] = $this->extractArticleUri($article); if($full) - $item['content'] = $this->extract_full_description($item['uri']); + $item['content'] = $this->extractFullDescription($item['uri']); else - $item['content'] = $this->extract_article_description($article); + $item['content'] = $this->extractArticleDescription($article); $this->items[] = $item; } @@ -115,24 +117,24 @@ class KununuBridge extends BridgeAbstract { /** * Fixes relative URLs in the given text */ - private function fix_url($text){ + private function fixUrl($text){ return preg_replace('/href=(\'|\")\//i', 'href="'.self::URI, $text); } /* * Returns a fixed version of the provided company name */ - private function fix_company_name($company){ + private function fixCompanyName($company){ $company = trim($company); $company = str_replace(' ', '-', $company); $company = strtolower($company); - return $this->encode_umlauts($company); + return $this->encodeUmlauts($company); } /** * Encodes unmlauts in the given text */ - private function encode_umlauts($text){ + private function encodeUmlauts($text){ $umlauts = Array("/ä/","/ö/","/ü/","/Ä/","/Ö/","/Ü/","/ß/"); $replace = Array("ae","oe","ue","Ae","Oe","Ue","ss"); @@ -142,7 +144,7 @@ class KununuBridge extends BridgeAbstract { /** * Returns the company name from the review html */ - private function extract_company_name($html){ + private function extractCompanyName($html){ $company_name = $html->find('h1[itemprop=name]', 0); if(is_null($company_name)) returnServerError('Cannot find company name!'); @@ -153,7 +155,7 @@ class KununuBridge extends BridgeAbstract { /** * Returns the date from a given article */ - private function extract_article_date($article){ + private function extractArticleDate($article){ // They conviniently provide a time attribute for us :) $date = $article->find('meta[itemprop=dateCreated]', 0); if(is_null($date)) @@ -165,7 +167,7 @@ class KununuBridge extends BridgeAbstract { /** * Returns the rating from a given article */ - private function extract_article_rating($article){ + private function extractArticleRating($article){ $rating = $article->find('span.rating', 0); if(is_null($rating)) returnServerError('Cannot find article rating!'); @@ -176,7 +178,7 @@ class KununuBridge extends BridgeAbstract { /** * Returns the summary from a given article */ - private function extract_article_summary($article){ + private function extractArticleSummary($article){ $summary = $article->find('[itemprop=name]', 0); if(is_null($summary)) returnServerError('Cannot find article summary!'); @@ -187,7 +189,7 @@ class KununuBridge extends BridgeAbstract { /** * Returns the URI from a given article */ - private function extract_article_uri($article){ + private function extractArticleUri($article){ $anchor = $article->find('ku-company-review-more', 0); if(is_null($anchor)) returnServerError('Cannot find article URI!'); @@ -198,7 +200,7 @@ class KununuBridge extends BridgeAbstract { /** * Returns the position of the author from a given article */ - private function extract_article_author_position($article){ + private function extractArticleAuthorPosition($article){ // We need to parse the user-content manually $user_content = $article->find('div.user-content', 0); if(is_null($user_content)) @@ -219,18 +221,18 @@ class KununuBridge extends BridgeAbstract { /** * Returns the description from a given article */ - private function extract_article_description($article){ + private function extractArticleDescription($article){ $description = $article->find('[itemprop=reviewBody]', 0); if(is_null($description)) returnServerError('Cannot find article description!'); - return $this->fix_url($description->innertext); + return $this->fixUrl($description->innertext); } /** * Returns the full description from a given uri */ - private function extract_full_description($uri){ + private function extractFullDescription($uri){ // Load full article $html = getSimpleHTMLDOMCached($uri); if($html === false) @@ -242,6 +244,6 @@ class KununuBridge extends BridgeAbstract { returnServerError('Cannot find article!'); // Luckily they use the same layout for the review overview and full article pages :) - return $this->extract_article_description($article); + return $this->extractArticleDescription($article); } } diff --git a/bridges/LWNprevBridge.php b/bridges/LWNprevBridge.php index 8c2c4356..c0ad4109 100644 --- a/bridges/LWNprevBridge.php +++ b/bridges/LWNprevBridge.php @@ -1,144 +1,145 @@ <?php class LWNprevBridge extends BridgeAbstract{ - const MAINTAINER = 'Pierre Mazière'; - const NAME = 'LWN Free Weekly Edition'; - const URI = 'https://lwn.net/'; - const CACHE_TIMEOUT = 604800; // 1 week - const DESCRIPTION = 'LWN Free Weekly Edition available one week late'; - - function getURI(){ - return self::URI.'free/bigpage'; - } - - private function jumpToNextTag(&$node){ - while($node && $node->nodeType===XML_TEXT_NODE){ - $nextNode=$node->nextSibling; - if(!$nextNode){ - break; - } - $node=$nextNode; - } - } - - private function jumpToPreviousTag(&$node){ - while($node && $node->nodeType===XML_TEXT_NODE){ - $previousNode=$node->previousSibling; - if(!$previousNode){ - break; - } - $node=$previousNode; - } - } - - public function collectData(){ - // Because the LWN page is written in loose HTML and not XHTML, - // Simple HTML Dom is not accurate enough for the job - $content=getContents($this->getURI()) - or returnServerError('No results for LWNprev'); - - libxml_use_internal_errors(true); - $html=new DOMDocument(); - $html->loadHTML($content); - libxml_clear_errors(); - - $cat1=''; - $cat2=''; - - foreach($html->getElementsByTagName('a') as $a){ - if($a->textContent==='Multi-page format'){ - break; - } - } - $realURI=self::URI.$a->getAttribute('href'); - $URICounter=0; - - $edition=$html->getElementsByTagName('h1')->item(0)->textContent; - $editionTimeStamp=strtotime( - substr($edition,strpos($edition,'for ')+strlen('for ')) - ); - - foreach($html->getElementsByTagName('h2') as $h2){ - if($h2->getAttribute('class')!=='SummaryHL'){ - continue; - } - - $item = array(); - - $h2NextSibling=$h2->nextSibling; - $this->jumpToNextTag($h2NextSibling); - - switch($h2NextSibling->getAttribute('class')){ - case 'FeatureByline': - $item['author']=$h2NextSibling->getElementsByTagName('b')->item(0)->textContent; - break; - case 'GAByline': - $text=$h2NextSibling->textContent; - $item['author']=substr($text,strpos($text,'by ')); - break; - default: - $item['author']='LWN'; - break; - }; - - $h2FirstChild=$h2->firstChild; - $this->jumpToNextTag($h2FirstChild); - if($h2FirstChild->nodeName==='a'){ - $item['uri']=self::URI.$h2FirstChild->getAttribute('href'); - }else{ - $item['uri']=$realURI.'#'.$URICounter; - } - $URICounter++; - - $item['timestamp']=$editionTimeStamp+$URICounter; - - $h2PrevSibling=$h2->previousSibling; - $this->jumpToPreviousTag($h2PrevSibling); - switch($h2PrevSibling->getAttribute('class')){ - case 'Cat2HL': - $cat2=$h2PrevSibling->textContent; - $h2PrevSibling=$h2PrevSibling->previousSibling; - $this->jumpToPreviousTag($h2PrevSibling); - if($h2PrevSibling->getAttribute('class')!=='Cat1HL'){ - break; - } - $cat1=$h2PrevSibling->textContent; - break; - case 'Cat1HL': - $cat1=$h2PrevSibling->textContent; - $cat2=''; - break; - default: - break; - } - $h2PrevSibling=null; - - $item['title']=''; - if(!empty($cat1)){ - $item['title'].='['.$cat1.($cat2?'/'.$cat2:'').'] '; - } - $item['title'].=$h2->textContent; - - $node=$h2; - $content=''; - $contentEnd=false; - while(!$contentEnd){ - $node=$node->nextSibling; - if( - !$node || ( - $node->nodeType!==XML_TEXT_NODE && ( - $node->nodeName==='h2' || - (!is_null($node->attributes) && !is_null($class=$node->attributes->getNamedItem('class')) && - in_array($class->nodeValue,array('Cat1HL','Cat2HL'))) - ) - ) - ){ - $contentEnd=true; - }else{ - $content.=$node->C14N(); - } - } - $item['content']=$content; - $this->items[]=$item; - } - } + const MAINTAINER = 'Pierre Mazière'; + const NAME = 'LWN Free Weekly Edition'; + const URI = 'https://lwn.net/'; + const CACHE_TIMEOUT = 604800; // 1 week + const DESCRIPTION = 'LWN Free Weekly Edition available one week late'; + + function getURI(){ + return self::URI . 'free/bigpage'; + } + + private function jumpToNextTag(&$node){ + while($node && $node->nodeType === XML_TEXT_NODE){ + $nextNode = $node->nextSibling; + if(!$nextNode){ + break; + } + $node = $nextNode; + } + } + + private function jumpToPreviousTag(&$node){ + while($node && $node->nodeType === XML_TEXT_NODE){ + $previousNode = $node->previousSibling; + if(!$previousNode){ + break; + } + $node = $previousNode; + } + } + + public function collectData(){ + // Because the LWN page is written in loose HTML and not XHTML, + // Simple HTML Dom is not accurate enough for the job + $content = getContents($this->getURI()) + or returnServerError('No results for LWNprev'); + + libxml_use_internal_errors(true); + $html = new DOMDocument(); + $html->loadHTML($content); + libxml_clear_errors(); + + $cat1 = ''; + $cat2 = ''; + + foreach($html->getElementsByTagName('a') as $a){ + if($a->textContent === 'Multi-page format'){ + break; + } + } + $realURI = self::URI . $a->getAttribute('href'); + $URICounter = 0; + + $edition = $html->getElementsByTagName('h1')->item(0)->textContent; + $editionTimeStamp = strtotime( + substr($edition, strpos($edition, 'for ') + strlen('for ')) + ); + + foreach($html->getElementsByTagName('h2') as $h2){ + if($h2->getAttribute('class') !== 'SummaryHL'){ + continue; + } + + $item = array(); + + $h2NextSibling = $h2->nextSibling; + $this->jumpToNextTag($h2NextSibling); + + switch($h2NextSibling->getAttribute('class')){ + case 'FeatureByline': + $item['author'] = $h2NextSibling->getElementsByTagName('b')->item(0)->textContent; + break; + case 'GAByline': + $text = $h2NextSibling->textContent; + $item['author'] = substr($text,strpos($text, 'by ')); + break; + default: + $item['author'] = 'LWN'; + break; + }; + + $h2FirstChild = $h2->firstChild; + $this->jumpToNextTag($h2FirstChild); + if($h2FirstChild->nodeName === 'a'){ + $item['uri'] = self::URI . $h2FirstChild->getAttribute('href'); + }else{ + $item['uri'] = $realURI . '#' . $URICounter; + } + $URICounter++; + + $item['timestamp'] = $editionTimeStamp + $URICounter; + + $h2PrevSibling = $h2->previousSibling; + $this->jumpToPreviousTag($h2PrevSibling); + switch($h2PrevSibling->getAttribute('class')){ + case 'Cat2HL': + $cat2 = $h2PrevSibling->textContent; + $h2PrevSibling = $h2PrevSibling->previousSibling; + $this->jumpToPreviousTag($h2PrevSibling); + if($h2PrevSibling->getAttribute('class') !== 'Cat1HL'){ + break; + } + $cat1 = $h2PrevSibling->textContent; + break; + case 'Cat1HL': + $cat1 = $h2PrevSibling->textContent; + $cat2 = ''; + break; + default: + break; + } + $h2PrevSibling = null; + + $item['title'] = ''; + if(!empty($cat1)){ + $item['title'] .= '[' . $cat1 . ($cat2 ? '/' . $cat2 : '') . '] '; + } + $item['title'] .= $h2->textContent; + + $node = $h2; + $content = ''; + $contentEnd = false; + while(!$contentEnd){ + $node = $node->nextSibling; + if(!$node || ( + $node->nodeType !== XML_TEXT_NODE && ( + $node->nodeName === 'h2' || ( + !is_null($node->attributes) && + !is_null($class = $node->attributes->getNamedItem('class')) && + in_array($class->nodeValue, array('Cat1HL', 'Cat2HL')) + ) + ) + ) + ){ + $contentEnd = true; + }else{ + $content .= $node->C14N(); + } + } + $item['content'] = $content; + $this->items[] = $item; + } + } } diff --git a/bridges/LeBonCoinBridge.php b/bridges/LeBonCoinBridge.php index 54c0f5ec..624401eb 100755 --- a/bridges/LeBonCoinBridge.php +++ b/bridges/LeBonCoinBridge.php @@ -1,162 +1,166 @@ <?php -class LeBonCoinBridge extends BridgeAbstract{ +class LeBonCoinBridge extends BridgeAbstract { - const MAINTAINER = "16mhz"; - const NAME = "LeBonCoin"; - const URI = "http://www.leboncoin.fr/"; - const DESCRIPTION = "Returns most recent results from LeBonCoin for a region, and optionally a category and a keyword ."; + const MAINTAINER = '16mhz'; + const NAME = 'LeBonCoin'; + const URI = 'http://www.leboncoin.fr/'; + const DESCRIPTION = 'Returns most recent results from LeBonCoin for a +region, and optionally a category and a keyword .'; - const PARAMETERS = array( array( - 'k'=>array('name'=>'Mot Clé'), - 'r'=>array( - 'name'=>'Région', - 'type'=>'list', - 'values'=>array( - 'Toute la France'=>'ile_de_france/occasions', - 'Alsace'=>'alsace', - 'Aquitaine'=>'aquitaine', - 'Auvergne'=>'auvergne', - 'Basse Normandie'=>'basse_normandie', - 'Bourgogne'=>'bourgogne', - 'Bretagne'=>'bretagne', - 'Centre'=>'centre', - 'Champagne Ardenne'=>'champagne_ardenne', - 'Corse'=>'corse', - 'Franche Comté'=>'franche_comte', - 'Haute Normandie'=>'haute_normandie', - 'Ile de France'=>'ile_de_france', - 'Languedoc Roussillon'=>'languedoc_roussillon', - 'Limousin'=>'limousin', - 'Lorraine'=>'lorraine', - 'Midi Pyrénées'=>'midi_pyrenees', - 'Nord Pas De Calais'=>'nord_pas_de_calais', - 'Pays de la Loire'=>'pays_de_la_loire', - 'Picardie'=>'picardie', - 'Poitou Charentes'=>'poitou_charentes', - 'Provence Alpes Côte d\'Azur'=>'provence_alpes_cote_d_azur', - 'Rhône-Alpes'=>'rhone_alpes', - 'Guadeloupe'=>'guadeloupe', - 'Martinique'=>'martinique', - 'Guyane'=>'guyane', - 'Réunion'=>'reunion' - ) - ), - 'c'=>array( - 'name'=>'Catégorie', - 'type'=>'list', - 'values'=>array( - 'TOUS'=>'', - 'EMPLOI'=>'_emploi_', - 'VEHICULES'=>array( - 'Tous'=>'_vehicules_', - 'Voitures'=>'voitures', - 'Motos'=>'motos', - 'Caravaning'=>'caravaning', - 'Utilitaires'=>'utilitaires', - 'Équipement Auto'=>'equipement_auto', - 'Équipement Moto'=>'equipement_moto', - 'Équipement Caravaning'=>'equipement_caravaning', - 'Nautisme'=>'nautisme', - 'Équipement Nautisme'=>'equipement_nautisme' - ), - 'IMMOBILIER'=>array( - 'Tous'=>'_immobilier_', - 'Ventes immobilières'=>'ventes_immobilieres', - 'Locations'=>'locations', - 'Colocations'=>'colocations', - 'Bureaux & Commerces'=>'bureaux_commerces' - ), - 'VACANCES'=>array( - 'Tous'=>'_vacances_', - 'Location gîtes'=>'locations_gites', - 'Chambres d\'hôtes'=>'chambres_d_hotes', - 'Campings'=>'campings', - 'Hôtels'=>'hotels', - 'Hébergements insolites'=>'hebergements_insolites' - ), - 'MULTIMEDIA'=>array( - 'Tous'=>'_multimedia_', - 'Informatique'=>'informatique', - 'Consoles & Jeux vidéo'=>'consoles_jeux_video', - 'Image & Son'=>'image_son', - 'Téléphonie'=>'telephonie' - ), - 'LOISIRS'=>array( - 'Tous'=>'_loisirs_', - 'DVD / Films'=>'dvd_films', - 'CD / Musique'=>'cd_musique', - 'Livres'=>'livres', - 'Animaux'=>'animaux', - 'Vélos'=>'velos', - 'Sports & Hobbies'=>'sports_hobbies', - 'Instruments de musique'=>'instruments_de_musique', - 'Collection'=>'collection', - 'Jeux & Jouets'=>'jeux_jouets', - 'Vins & Gastronomie'=>'vins_gastronomie' - ), - 'MATÉRIEL PROFESSIONNEL'=>array( - 'Tous'=>'_materiel_professionnel_', - 'Matériel Agricole'=>'mateiel_agricole', - 'Transport - Manutention'=>'transport_manutention', - 'BTP - Chantier - Gros-œuvre'=>'btp_chantier_gros_oeuvre', - 'Outillage - Matériaux 2nd-œuvre'=>'outillage_materiaux_2nd_oeuvre', - 'Équipements Industriels'=>'equipement_industriels', - 'Restauration - Hôtellerie'=>'restauration_hotellerie', - 'Fournitures de Bureau'=>'fournitures_de_bureau', - 'Commerces & Marchés'=>'commerces_marches', - 'Matériel médical'=>'materiel_medical' - ), - 'SERVICES'=>array( - 'Tous'=>'_services_', - 'Prestations de services'=>'prestations_de_services', - 'Billetterie'=>'billetterie', - 'Évènements'=>'evenements', - 'Cours particuliers'=>'cours_particuliers', - 'Covoiturage'=>'covoiturage' - ), - 'MAISON'=>array( - 'Tous'=>'_maison_', - 'Ameublement'=>'ameublement', - 'Électroménager'=>'electromenager', - 'Arts de la table'=>'arts_de_la_table', - 'Décoration'=>'decoration', - 'Linge de maison'=>'linge_de_maison', - 'Bricolage'=>'bricolage', - 'Jardinage'=>'jardinage', - 'Vêtements'=>'vetements', - 'Chaussures'=>'chaussures', - 'Accessoires & Bagagerie'=>'accessoires_bagagerie', - 'Montres & Bijoux'=>'montres_bijoux', - 'Équipement bébé'=>'equipement_bebe', - 'Vêtements bébé'=>'vetements_bebe' - ), - 'AUTRES'=>'autres' - ) - ) - ) - ); + const PARAMETERS = array( + array( + 'k' => array('name' => 'Mot Clé'), + 'r' => array( + 'name' => 'Région', + 'type' => 'list', + 'values' => array( + 'Toute la France' => 'ile_de_france/occasions', + 'Alsace' => 'alsace', + 'Aquitaine' => 'aquitaine', + 'Auvergne' => 'auvergne', + 'Basse Normandie' => 'basse_normandie', + 'Bourgogne' => 'bourgogne', + 'Bretagne' => 'bretagne', + 'Centre' => 'centre', + 'Champagne Ardenne' => 'champagne_ardenne', + 'Corse' => 'corse', + 'Franche Comté' => 'franche_comte', + 'Haute Normandie' => 'haute_normandie', + 'Ile de France' => 'ile_de_france', + 'Languedoc Roussillon' => 'languedoc_roussillon', + 'Limousin' => 'limousin', + 'Lorraine' => 'lorraine', + 'Midi Pyrénées' => 'midi_pyrenees', + 'Nord Pas De Calais' => 'nord_pas_de_calais', + 'Pays de la Loire' => 'pays_de_la_loire', + 'Picardie' => 'picardie', + 'Poitou Charentes' => 'poitou_charentes', + 'Provence Alpes Côte d\'Azur' => 'provence_alpes_cote_d_azur', + 'Rhône-Alpes' => 'rhone_alpes', + 'Guadeloupe' => 'guadeloupe', + 'Martinique' => 'martinique', + 'Guyane' => 'guyane', + 'Réunion' => 'reunion' + ) + ), + 'c' => array( + 'name' => 'Catégorie', + 'type' => 'list', + 'values' => array( + 'TOUS' => '', + 'EMPLOI' => '_emploi_', + 'VEHICULES' => array( + 'Tous' => '_vehicules_', + 'Voitures' => 'voitures', + 'Motos' => 'motos', + 'Caravaning' => 'caravaning', + 'Utilitaires' => 'utilitaires', + 'Équipement Auto' => 'equipement_auto', + 'Équipement Moto' => 'equipement_moto', + 'Équipement Caravaning' => 'equipement_caravaning', + 'Nautisme' => 'nautisme', + 'Équipement Nautisme' => 'equipement_nautisme' + ), + 'IMMOBILIER' => array( + 'Tous' => '_immobilier_', + 'Ventes immobilières' => 'ventes_immobilieres', + 'Locations' => 'locations', + 'Colocations' => 'colocations', + 'Bureaux & Commerces' => 'bureaux_commerces' + ), + 'VACANCES' => array( + 'Tous' => '_vacances_', + 'Location gîtes' => 'locations_gites', + 'Chambres d\'hôtes' => 'chambres_d_hotes', + 'Campings' => 'campings', + 'Hôtels' => 'hotels', + 'Hébergements insolites' => 'hebergements_insolites' + ), + 'MULTIMEDIA' => array( + 'Tous' => '_multimedia_', + 'Informatique' => 'informatique', + 'Consoles & Jeux vidéo' => 'consoles_jeux_video', + 'Image & Son' => 'image_son', + 'Téléphonie' => 'telephonie' + ), + 'LOISIRS' => array( + 'Tous' => '_loisirs_', + 'DVD / Films' => 'dvd_films', + 'CD / Musique' => 'cd_musique', + 'Livres' => 'livres', + 'Animaux' => 'animaux', + 'Vélos' => 'velos', + 'Sports & Hobbies' => 'sports_hobbies', + 'Instruments de musique' => 'instruments_de_musique', + 'Collection' => 'collection', + 'Jeux & Jouets' => 'jeux_jouets', + 'Vins & Gastronomie' => 'vins_gastronomie' + ), + 'MATÉRIEL PROFESSIONNEL' => array( + 'Tous' => '_materiel_professionnel_', + 'Matériel Agricole' => 'mateiel_agricole', + 'Transport - Manutention' => 'transport_manutention', + 'BTP - Chantier - Gros-œuvre' => 'btp_chantier_gros_oeuvre', + 'Outillage - Matériaux 2nd-œuvre' => 'outillage_materiaux_2nd_oeuvre', + 'Équipements Industriels' => 'equipement_industriels', + 'Restauration - Hôtellerie' => 'restauration_hotellerie', + 'Fournitures de Bureau' => 'fournitures_de_bureau', + 'Commerces & Marchés' => 'commerces_marches', + 'Matériel médical' => 'materiel_medical' + ), + 'SERVICES' => array( + 'Tous' => '_services_', + 'Prestations de services' => 'prestations_de_services', + 'Billetterie' => 'billetterie', + 'Évènements' => 'evenements', + 'Cours particuliers' => 'cours_particuliers', + 'Covoiturage' => 'covoiturage' + ), + 'MAISON' => array( + 'Tous' => '_maison_', + 'Ameublement' => 'ameublement', + 'Électroménager' => 'electromenager', + 'Arts de la table' => 'arts_de_la_table', + 'Décoration' => 'decoration', + 'Linge de maison' => 'linge_de_maison', + 'Bricolage' => 'bricolage', + 'Jardinage' => 'jardinage', + 'Vêtements' => 'vetements', + 'Chaussures' => 'chaussures', + 'Accessoires & Bagagerie' => 'accessoires_bagagerie', + 'Montres & Bijoux' => 'montres_bijoux', + 'Équipement bébé' => 'equipement_bebe', + 'Vêtements bébé' => 'vetements_bebe' + ), + 'AUTRES' => 'autres' + ) + ) + ) + ); public function collectData(){ - $category=$this->getInput('c'); - if (empty($category)){ - $category='annonces'; - } + $category = $this->getInput('c'); + if(empty($category)){ + $category = 'annonces'; + } - $html = getSimpleHTMLDOM( - self::URI.$category.'/offres/' . $this->getInput('r') . '/?' - .'f=a&th=1&' - .'q=' . urlencode($this->getInput('k')) - ) or returnServerError('Could not request LeBonCoin.'); + $html = getSimpleHTMLDOM(self::URI + . $category + . '/offres/' + . $this->getInput('r') + . '/?f=a&th=1&q=' + . urlencode($this->getInput('k'))) + or returnServerError('Could not request LeBonCoin.'); $list = $html->find('.tabsContent', 0); - if($list === NULL) { + if($list === null){ return; } $tags = $list->find('li'); - foreach($tags as $element) { + foreach($tags as $element){ $element = $element->find('a', 0); @@ -165,7 +169,7 @@ class LeBonCoinBridge extends BridgeAbstract{ $title = html_entity_decode($element->getAttribute('title')); $content_image = $element->find('div.item_image', 0)->find('.lazyload', 0); - if($content_image !== NULL) { + if($content_image !== null){ $content = '<img src="' . $content_image->getAttribute('data-imgsrc') . '" alt="thumbnail">'; } else { $content = ""; @@ -176,7 +180,7 @@ class LeBonCoinBridge extends BridgeAbstract{ for($i = 0; $i <= 1; $i++) $content .= $detailsList->find('p.item_supp', $i)->plaintext; $price = $detailsList->find('h3.item_price', 0); - $content .= $price === NULL ? '' : $price->plaintext; + $content .= $price === null ? '' : $price->plaintext; $item['title'] = $title; $item['content'] = $content . $date; diff --git a/bridges/LeMondeInformatiqueBridge.php b/bridges/LeMondeInformatiqueBridge.php index de6ac66d..e315f937 100644 --- a/bridges/LeMondeInformatiqueBridge.php +++ b/bridges/LeMondeInformatiqueBridge.php @@ -1,42 +1,44 @@ <?php class LeMondeInformatiqueBridge extends FeedExpander { - const MAINTAINER = "ORelio"; - const NAME = "Le Monde Informatique"; - const URI = "http://www.lemondeinformatique.fr/"; - const CACHE_TIMEOUT = 1800; // 30min - const DESCRIPTION = "Returns the newest articles."; + const MAINTAINER = 'ORelio'; + const NAME = 'Le Monde Informatique'; + const URI = 'http://www.lemondeinformatique.fr/'; + const CACHE_TIMEOUT = 1800; // 30min + const DESCRIPTION = 'Returns the newest articles.'; - public function collectData(){ - $this->collectExpandableDatas(self::URI . 'rss/rss.xml', 10); - } + public function collectData(){ + $this->collectExpandableDatas(self::URI . 'rss/rss.xml', 10); + } - protected function parseItem($newsItem){ - $item = parent::parseItem($newsItem); - $article_html = getSimpleHTMLDOMCached($item['uri']) - or returnServerError('Could not request LeMondeInformatique: ' . $item['uri']); - $item['content'] = $this->CleanArticle($article_html->find('div#article', 0)->innertext); - $item['title'] = $article_html->find('h1.cleanprint-title', 0)->plaintext; - return $item; - } + protected function parseItem($newsItem){ + $item = parent::parseItem($newsItem); + $article_html = getSimpleHTMLDOMCached($item['uri']) + or returnServerError('Could not request LeMondeInformatique: ' . $item['uri']); + $item['content'] = $this->cleanArticle($article_html->find('div#article', 0)->innertext); + $item['title'] = $article_html->find('h1.cleanprint-title', 0)->plaintext; + return $item; + } - private function StripCDATA($string) { - $string = str_replace('<![CDATA[', '', $string); - $string = str_replace(']]>', '', $string); - return $string; - } + private function stripCDATA($string){ + $string = str_replace('<![CDATA[', '', $string); + $string = str_replace(']]>', '', $string); + return $string; + } - private function StripWithDelimiters($string, $start, $end) { - while (strpos($string, $start) !== false) { - $section_to_remove = substr($string, strpos($string, $start)); - $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end)); - $string = str_replace($section_to_remove, '', $string); - } return $string; - } + private function stripWithDelimiters($string, $start, $end){ + while(strpos($string, $start) !== false){ + $section_to_remove = substr($string, strpos($string, $start)); + $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end)); + $string = str_replace($section_to_remove, '', $string); + } - private function CleanArticle($article_html) { - $article_html = $this->StripWithDelimiters($article_html, '<script', '</script>'); - $article_html = $this->StripWithDelimiters($article_html, '<h1 class="cleanprint-title"', '</h1>'); - return $article_html; - } + return $string; + } + + private function cleanArticle($article_html){ + $article_html = $this->stripWithDelimiters($article_html, '<script', '</script>'); + $article_html = $this->stripWithDelimiters($article_html, '<h1 class="cleanprint-title"', '</h1>'); + return $article_html; + } } diff --git a/bridges/LegifranceJOBridge.php b/bridges/LegifranceJOBridge.php index 6cc8086b..2233db4a 100644 --- a/bridges/LegifranceJOBridge.php +++ b/bridges/LegifranceJOBridge.php @@ -1,70 +1,68 @@ <?php -class LegifranceJOBridge extends BridgeAbstract{ +class LegifranceJOBridge extends BridgeAbstract { - const MAINTAINER = 'Pierre Mazière'; - const NAME = 'Journal Officiel de la République Française'; - const URI = 'https://www.legifrance.gouv.fr/affichJO.do'; - const DESCRIPTION = 'Returns the laws and decrees officially registered daily in France'; + const MAINTAINER = 'Pierre Mazière'; + const NAME = 'Journal Officiel de la République Française'; + const URI = 'https://www.legifrance.gouv.fr/affichJO.do'; + const DESCRIPTION = 'Returns the laws and decrees officially registered daily in France'; - const PARAMETERS=array(); + const PARAMETERS = array(); - private $author; - private $timestamp; - private $uri; + private $author; + private $timestamp; + private $uri; - private function extractItem($section,$subsection=null,$origin=null){ - $item=array(); - $item['author']=$this->author; - $item['timestamp']=$this->timestamp; - $item['uri']=$this->uri.'#'.count($this->items); - $item['title']=$section->plaintext; + private function extractItem($section, $subsection = null, $origin = null){ + $item = array(); + $item['author'] = $this->author; + $item['timestamp'] = $this->timestamp; + $item['uri'] = $this->uri . '#' . count($this->items); + $item['title'] = $section->plaintext; - if(!is_null($origin)){ - $item['title']='[ '.$item['title'].' / '.$subsection->plaintext.' ] '.$origin->plaintext; - $data=$origin; - }elseif(!is_null($subsection)){ - $item['title']='[ '.$item['title'].' ] '.$subsection->plaintext; - $data=$subsection; - }else{ - $data=$section; - } + if(!is_null($origin)){ + $item['title'] = '[ ' . $item['title'] . ' / ' . $subsection->plaintext . ' ] ' . $origin->plaintext; + $data = $origin; + } elseif(!is_null($subsection)){ + $item['title'] = '[ ' . $item['title'] . ' ] ' . $subsection->plaintext; + $data = $subsection; + } else { + $data = $section; + } - $item['content']=''; - foreach($data->nextSibling()->find('a') as $content){ - $text=$content->plaintext; - $href=$content->nextSibling()->getAttribute('resource'); - $item['content'].='<p><a href="'.$href.'">'.$text.'</a></p>'; - } - return $item; - } + $item['content'] = ''; + foreach($data->nextSibling()->find('a') as $content){ + $text = $content->plaintext; + $href = $content->nextSibling()->getAttribute('resource'); + $item['content'] .= '<p><a href="' . $href . '">' . $text . '</a></p>'; + } + return $item; + } - public function collectData(){ - $html=getSimpleHTMLDOM(self::URI) - or $this->returnServer('Unable to download '.self::URI); + public function collectData(){ + $html = getSimpleHTMLDOM(self::URI) + or $this->returnServer('Unable to download ' . self::URI); - $this->author=trim($html->find('h2.title',0)->plaintext); - $uri=$html->find('h2.titleELI',0)->plaintext; - $this->uri=trim(substr($uri,strpos($uri,'https'))); - $this->timestamp=strtotime(substr($this->uri,strpos($this->uri,'eli/jo/')+strlen('eli/jo/'))); + $this->author = trim($html->find('h2.title', 0)->plaintext); + $uri = $html->find('h2.titleELI', 0)->plaintext; + $this->uri = trim(substr($uri, strpos($uri, 'https'))); + $this->timestamp = strtotime(substr($this->uri, strpos($this->uri, 'eli/jo/') + strlen('eli/jo/'))); - foreach($html->find('h3') as $section){ - $subsections=$section->nextSibling()->find('h4'); - foreach($subsections as $subsection){ - $origins=$subsection->nextSibling()->find('h5'); - foreach($origins as $origin){ - $this->items[]=$this->extractItem($section,$subsection,$origin); - } - if(!empty($origins)){ - continue; - } - $this->items[]=$this->extractItem($section,$subsection); - } - if(!empty($subsections)){ - continue; - } - $this->items[]=$this->extractItem($section); - } - } + foreach($html->find('h3') as $section){ + $subsections = $section->nextSibling()->find('h4'); + foreach($subsections as $subsection){ + $origins = $subsection->nextSibling()->find('h5'); + foreach($origins as $origin){ + $this->items[] = $this->extractItem($section, $subsection, $origin); + } + if(!empty($origins)){ + continue; + } + $this->items[] = $this->extractItem($section, $subsection); + } + if(!empty($subsections)){ + continue; + } + $this->items[] = $this->extractItem($section); + } + } } - - diff --git a/bridges/LesJoiesDuCodeBridge.php b/bridges/LesJoiesDuCodeBridge.php index cde49776..79dfc5ea 100644 --- a/bridges/LesJoiesDuCodeBridge.php +++ b/bridges/LesJoiesDuCodeBridge.php @@ -1,47 +1,45 @@ <?php -class LesJoiesDuCodeBridge extends BridgeAbstract{ +class LesJoiesDuCodeBridge extends BridgeAbstract { - const MAINTAINER = "superbaillot.net"; - const NAME = "Les Joies Du Code"; - const URI = "http://lesjoiesducode.fr/"; + const MAINTAINER = 'superbaillot.net'; + const NAME = 'Les Joies Du Code'; + const URI = 'http://lesjoiesducode.fr/'; const CACHE_TIMEOUT = 7200; // 2h - const DESCRIPTION = "LesJoiesDuCode"; - - public function collectData(){ - $html = getSimpleHTMLDOM(self::URI) - or returnServerError('Could not request LesJoiesDuCode.'); - - foreach($html->find('div.blog-post') as $element) { - $item = array(); - $temp = $element->find('h1 a', 0); - $titre = html_entity_decode($temp->innertext); - $url = $temp->href; - - $temp = $element->find('div.blog-post-content', 0); - - // retrieve .gif instead of static .jpg - $images = $temp->find('p img'); - foreach($images as $image){ - $img_src = str_replace(".jpg",".gif",$image->src); - $image->src = $img_src; - } - $content = $temp->innertext; - - $auteur = $temp->find('i', 0); - $pos = strpos($auteur->innertext, "by"); - - if($pos > 0) - { - $auteur = trim(str_replace("*/", "", substr($auteur->innertext, ($pos + 2)))); - $item['author'] = $auteur; - } - - - $item['content'] .= trim($content); - $item['uri'] = $url; - $item['title'] = trim($titre); - - $this->items[] = $item; - } - } + const DESCRIPTION = 'LesJoiesDuCode'; + + public function collectData(){ + $html = getSimpleHTMLDOM(self::URI) + or returnServerError('Could not request LesJoiesDuCode.'); + + foreach($html->find('div.blog-post') as $element){ + $item = array(); + $temp = $element->find('h1 a', 0); + $titre = html_entity_decode($temp->innertext); + $url = $temp->href; + + $temp = $element->find('div.blog-post-content', 0); + + // retrieve .gif instead of static .jpg + $images = $temp->find('p img'); + foreach($images as $image){ + $img_src = str_replace(".jpg", ".gif", $image->src); + $image->src = $img_src; + } + $content = $temp->innertext; + + $auteur = $temp->find('i', 0); + $pos = strpos($auteur->innertext, "by"); + + if($pos > 0){ + $auteur = trim(str_replace("*/", "", substr($auteur->innertext, ($pos + 2)))); + $item['author'] = $auteur; + } + + $item['content'] .= trim($content); + $item['uri'] = $url; + $item['title'] = trim($titre); + + $this->items[] = $item; + } + } } diff --git a/bridges/LichessBridge.php b/bridges/LichessBridge.php index e0657b86..bf7369fb 100644 --- a/bridges/LichessBridge.php +++ b/bridges/LichessBridge.php @@ -1,31 +1,31 @@ <?php class LichessBridge extends FeedExpander { - const MAINTAINER = 'AmauryCarrade'; - const NAME = 'Lichess Blog'; - const URI = 'http://fr.lichess.org/blog'; - const DESCRIPTION = 'Returns the 5 newest posts from the Lichess blog (full text)'; + const MAINTAINER = 'AmauryCarrade'; + const NAME = 'Lichess Blog'; + const URI = 'http://fr.lichess.org/blog'; + const DESCRIPTION = 'Returns the 5 newest posts from the Lichess blog (full text)'; - public function collectData(){ - $this->collectExpandableDatas(self::URI . '.atom', 5); - } + public function collectData(){ + $this->collectExpandableDatas(self::URI . '.atom', 5); + } - protected function parseItem($newsItem){ - $item = parent::parseItem($newsItem); - $item['content'] = $this->retrieve_lichess_post($item['uri']); - return $item; - } + protected function parseItem($newsItem){ + $item = parent::parseItem($newsItem); + $item['content'] = $this->retrieveLichessPost($item['uri']); + return $item; + } - private function retrieve_lichess_post($blog_post_uri){ - $blog_post_html = getSimpleHTMLDOMCached($blog_post_uri); - $blog_post_div = $blog_post_html->find('#lichess_blog', 0); + private function retrieveLichessPost($blog_post_uri){ + $blog_post_html = getSimpleHTMLDOMCached($blog_post_uri); + $blog_post_div = $blog_post_html->find('#lichess_blog', 0); - $post_chapo = $blog_post_div->find('.shortlede', 0)->innertext; - $post_content = $blog_post_div->find('.body', 0)->innertext; + $post_chapo = $blog_post_div->find('.shortlede', 0)->innertext; + $post_content = $blog_post_div->find('.body', 0)->innertext; - $content = '<p><em>' . $post_chapo . '</em></p>'; - $content .= '<div>' . $post_content . '</div>'; + $content = '<p><em>' . $post_chapo . '</em></p>'; + $content .= '<div>' . $post_content . '</div>'; - return $content; - } + return $content; + } } diff --git a/bridges/LinkedInCompanyBridge.php b/bridges/LinkedInCompanyBridge.php index 7e966f61..73cdcbf0 100644 --- a/bridges/LinkedInCompanyBridge.php +++ b/bridges/LinkedInCompanyBridge.php @@ -1,36 +1,37 @@ <?php -class LinkedInCompanyBridge extends BridgeAbstract{ +class LinkedInCompanyBridge extends BridgeAbstract { - const MAINTAINER = "regisenguehard"; - const NAME = "LinkedIn Company"; - const URI = "https://www.linkedin.com/"; + const MAINTAINER = 'regisenguehard'; + const NAME = 'LinkedIn Company'; + const URI = 'https://www.linkedin.com/'; const CACHE_TIMEOUT = 21600; //6 - const DESCRIPTION = "Returns most recent actus from Company on LinkedIn. (https://www.linkedin.com/company/<strong style=\"font-weight:bold;\">apple</strong>)"; + const DESCRIPTION = 'Returns most recent actus from Company on LinkedIn. + (https://www.linkedin.com/company/<strong style=\"font-weight:bold;\">apple</strong>)'; - const PARAMETERS = array( array( - 'c'=>array( - 'name'=>'Company name', - 'required'=>true - ) - )); + const PARAMETERS = array( array( + 'c' => array( + 'name' => 'Company name', + 'required' => true + ) + )); - public function collectData(){ - $html = ''; - $link = self::URI.'company/'.$this->getInput('c'); + public function collectData(){ + $html = ''; + $link = self::URI . 'company/' . $this->getInput('c'); - $html = getSimpleHTMLDOM($link) - or returnServerError('Could not request LinkedIn.'); + $html = getSimpleHTMLDOM($link) + or returnServerError('Could not request LinkedIn.'); - foreach($html->find('//*[@id="my-feed-post"]/li') as $element) { - $title = $element->find('span.share-body', 0)->innertext; - if ($title) { - $item = array(); - $item['uri'] = $link; - $item['title'] = mb_substr(strip_tags($element->find('span.share-body', 0)->innertext), 0 ,100); - $item['content'] = strip_tags($element->find('span.share-body', 0)->innertext); - $this->items[] = $item; - $i++; - } - } - } + foreach($html->find('//*[@id="my-feed-post"]/li') as $element){ + $title = $element->find('span.share-body', 0)->innertext; + if($title){ + $item = array(); + $item['uri'] = $link; + $item['title'] = mb_substr(strip_tags($element->find('span.share-body', 0)->innertext), 0, 100); + $item['content'] = strip_tags($element->find('span.share-body', 0)->innertext); + $this->items[] = $item; + $i++; + } + } + } } diff --git a/bridges/LolibooruBridge.php b/bridges/LolibooruBridge.php index 781bc238..b5bbd754 100644 --- a/bridges/LolibooruBridge.php +++ b/bridges/LolibooruBridge.php @@ -1,11 +1,11 @@ <?php require_once('MoebooruBridge.php'); -class LolibooruBridge extends MoebooruBridge{ +class LolibooruBridge extends MoebooruBridge { - const MAINTAINER = "mitsukarenai"; - const NAME = "Lolibooru"; - const URI = "https://lolibooru.moe/"; - const DESCRIPTION = "Returns images from given page and tags"; + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Lolibooru'; + const URI = 'https://lolibooru.moe/'; + const DESCRIPTION = 'Returns images from given page and tags'; } diff --git a/bridges/MangareaderBridge.php b/bridges/MangareaderBridge.php index 1a408e30..45986242 100644 --- a/bridges/MangareaderBridge.php +++ b/bridges/MangareaderBridge.php @@ -1,252 +1,249 @@ <?php class MangareaderBridge extends BridgeAbstract { - const MAINTAINER = "logmanoriginal"; - const NAME = "Mangareader Bridge"; - const URI = "http://www.mangareader.net/"; - const CACHE_TIMEOUT = 10800; // 3h - const DESCRIPTION = "Returns the latest updates, popular mangas or manga updates (new chapters)"; - - const PARAMETERS = array( - 'Get latest updates' => array(), - 'Get popular mangas' => array( - 'category' => array( - 'name' => 'Category', - 'type' => 'list', - 'required' => true, - 'values' => array( - 'All' => 'all', - 'Action' => 'action', - 'Adventure' => 'adventure', - 'Comedy' => 'comedy', - 'Demons' => 'demons', - 'Drama' => 'drama', - 'Ecchi' => 'ecchi', - 'Fantasy' => 'fantasy', - 'Gender Bender' => 'gender-bender', - 'Harem' => 'harem', - 'Historical' => 'historical', - 'Horror' => 'horror', - 'Josei' => 'josei', - 'Magic' => 'magic', - 'Martial Arts' => 'martial-arts', - 'Mature' => 'mature', - 'Mecha' => 'mecha', - 'Military' => 'military', - 'Mystery' => 'mystery', - 'One Shot' => 'one-shot', - 'Psychological' => 'psychological', - 'Romance' => 'romance', - 'School Life' => 'school-life', - 'Sci-Fi' => 'sci-fi', - 'Seinen' => 'seinen', - 'Shoujo' => 'shoujo', - 'Shoujoai' => 'shoujoai', - 'Shounen' => 'shounen', - 'Shounenai' => 'shounenai', - 'Slice of Life' => 'slice-of-life', - 'Smut' => 'smut', - 'Sports' => 'sports', - 'Super Power' => 'super-power', - 'Supernatural' => 'supernatural', - 'Tragedy' => 'tragedy', - 'Vampire' => 'vampire', - 'Yaoi' => 'yaoi', - 'Yuri' => 'yuri' - ), - 'exampleValue' => 'All', - 'title' => 'Select your category' - ) - ), - 'Get manga updates' => array( - 'path' => array( - 'name' => 'Path', - 'required' => true, - 'pattern' => '[a-zA-Z0-9-_]*', - 'exampleValue' => 'bleach, umi-no-kishidan', - 'title' => 'URL part of desired manga' - ), - 'limit' => array( - 'name' => 'Limit', - 'type' => 'number', - 'defaultValue' => 10, - 'title' => 'Number of items to return [-1 returns all]' - ) - ) - ); - - private $request = ''; - - public function collectData(){ - // We'll use the DOM parser for this as it makes navigation easier - $html = getContents($this->getURI()); - if(!$html){ - returnClientError('Could not receive data for ' . $path . '!'); - } - libxml_use_internal_errors(true); - $doc = new DomDocument; - @$doc->loadHTML($html); - libxml_clear_errors(); - - // Navigate via XPath - $xpath = new DomXPath($doc); - - $this->request = ''; - switch($this->queriedContext){ - case 'Get latest updates': - $this->request = 'Latest updates'; - $this->get_latest_updates($xpath); - break; - case 'Get popular mangas': - // Find manga name within "Popular mangas for ..." - $pagetitle = $xpath->query(".//*[@id='bodyalt']/h1")->item(0)->nodeValue; - $this->request = substr($pagetitle, 0, strrpos($pagetitle, " -")); - $this->get_popular_mangas($xpath); - break; - case 'Get manga updates': - $limit = $this->getInput('limit'); - if(empty($limit)){ - $limit = self::PARAMETERS[$this->queriedContext]['limit']['defaultValue']; - } - - $this->request = $xpath->query(".//*[@id='mangaproperties']//*[@class='aname']") - ->item(0) - ->nodeValue; - - $this->get_manga_updates($xpath, $limit); - break; - } - - // Return some dummy-data if no content available - if(empty($this->items)){ - $item = array(); - $item['content'] = "<p>No updates available</p>"; - - $this->items[] = $item; - } - } - - private function get_latest_updates($xpath){ - // Query each item (consists of Manga + chapters) - $nodes = $xpath->query("//*[@id='latestchapters']/table//td"); - - foreach ($nodes as $node){ - // Query the manga - $manga = $xpath->query("a[@class='chapter']", $node)->item(0); - - // Collect the chapters for each Manga - $chapters = $xpath->query("a[@class='chaptersrec']", $node); - - if (isset($manga) && $chapters->length >= 1){ - $item = array(); - $item['uri'] = self::URI . htmlspecialchars($manga->getAttribute('href')); - $item['title'] = htmlspecialchars($manga->nodeValue); - - // Add each chapter to the feed - $item['content'] = ""; - - foreach ($chapters as $chapter){ - if($item['content'] <> ""){ - $item['content'] .= "<br>"; - } - $item['content'] .= - "<a href='" - . self::URI - . htmlspecialchars($chapter->getAttribute('href')) - . "'>" - . htmlspecialchars($chapter->nodeValue) - . "</a>"; - } - - $this->items[] = $item; - } - } - } - - private function get_popular_mangas($xpath){ - // Query all mangas - $mangas = $xpath->query("//*[@id='mangaresults']/*[@class='mangaresultitem']"); - - foreach ($mangas as $manga){ - - // The thumbnail is encrypted in a css-style... - // format: "background-image:url('<the part which is actually interesting>')" - $mangaimgelement = $xpath->query(".//*[@class='imgsearchresults']", $manga) - ->item(0) - ->getAttribute('style'); - $thumbnail = substr($mangaimgelement, 22, strlen($mangaimgelement) - 24); - - $item = array(); - $item['title'] = htmlspecialchars($xpath->query(".//*[@class='manga_name']//a", $manga) - ->item(0) - ->nodeValue); - $item['uri'] = self::URI . $xpath->query(".//*[@class='manga_name']//a", $manga) - ->item(0) - ->getAttribute('href'); - $item['author'] = htmlspecialchars($xpath->query("//*[@class='author_name']", $manga) - ->item(0) - ->nodeValue); - $item['chaptercount'] = $xpath->query(".//*[@class='chapter_count']", $manga) - ->item(0) - ->nodeValue; - $item['genre'] = htmlspecialchars($xpath->query(".//*[@class='manga_genre']", $manga) - ->item(0) - ->nodeValue); - $item['content'] = <<<EOD + const MAINTAINER = 'logmanoriginal'; + const NAME = 'Mangareader Bridge'; + const URI = 'http://www.mangareader.net/'; + const CACHE_TIMEOUT = 10800; // 3h + const DESCRIPTION = 'Returns the latest updates, popular mangas or manga updates (new chapters)'; + + const PARAMETERS = array( + 'Get latest updates' => array(), + 'Get popular mangas' => array( + 'category' => array( + 'name' => 'Category', + 'type' => 'list', + 'required' => true, + 'values' => array( + 'All' => 'all', + 'Action' => 'action', + 'Adventure' => 'adventure', + 'Comedy' => 'comedy', + 'Demons' => 'demons', + 'Drama' => 'drama', + 'Ecchi' => 'ecchi', + 'Fantasy' => 'fantasy', + 'Gender Bender' => 'gender-bender', + 'Harem' => 'harem', + 'Historical' => 'historical', + 'Horror' => 'horror', + 'Josei' => 'josei', + 'Magic' => 'magic', + 'Martial Arts' => 'martial-arts', + 'Mature' => 'mature', + 'Mecha' => 'mecha', + 'Military' => 'military', + 'Mystery' => 'mystery', + 'One Shot' => 'one-shot', + 'Psychological' => 'psychological', + 'Romance' => 'romance', + 'School Life' => 'school-life', + 'Sci-Fi' => 'sci-fi', + 'Seinen' => 'seinen', + 'Shoujo' => 'shoujo', + 'Shoujoai' => 'shoujoai', + 'Shounen' => 'shounen', + 'Shounenai' => 'shounenai', + 'Slice of Life' => 'slice-of-life', + 'Smut' => 'smut', + 'Sports' => 'sports', + 'Super Power' => 'super-power', + 'Supernatural' => 'supernatural', + 'Tragedy' => 'tragedy', + 'Vampire' => 'vampire', + 'Yaoi' => 'yaoi', + 'Yuri' => 'yuri' + ), + 'exampleValue' => 'All', + 'title' => 'Select your category' + ) + ), + 'Get manga updates' => array( + 'path' => array( + 'name' => 'Path', + 'required' => true, + 'pattern' => '[a-zA-Z0-9-_]*', + 'exampleValue' => 'bleach, umi-no-kishidan', + 'title' => 'URL part of desired manga' + ), + 'limit' => array( + 'name' => 'Limit', + 'type' => 'number', + 'defaultValue' => 10, + 'title' => 'Number of items to return [-1 returns all]' + ) + ) + ); + + private $request = ''; + + public function collectData(){ + // We'll use the DOM parser for this as it makes navigation easier + $html = getContents($this->getURI()); + if(!$html){ + returnClientError('Could not receive data for ' . $path . '!'); + } + libxml_use_internal_errors(true); + $doc = new DomDocument; + @$doc->loadHTML($html); + libxml_clear_errors(); + + // Navigate via XPath + $xpath = new DomXPath($doc); + + $this->request = ''; + switch($this->queriedContext){ + case 'Get latest updates': + $this->request = 'Latest updates'; + $this->getLatestUpdates($xpath); + break; + case 'Get popular mangas': + // Find manga name within "Popular mangas for ..." + $pagetitle = $xpath->query(".//*[@id='bodyalt']/h1")->item(0)->nodeValue; + $this->request = substr($pagetitle, 0, strrpos($pagetitle, " -")); + $this->getPopularMangas($xpath); + break; + case 'Get manga updates': + $limit = $this->getInput('limit'); + if(empty($limit)){ + $limit = self::PARAMETERS[$this->queriedContext]['limit']['defaultValue']; + } + + $this->request = $xpath->query(".//*[@id='mangaproperties']//*[@class='aname']") + ->item(0) + ->nodeValue; + + $this->getMangaUpdates($xpath, $limit); + break; + } + + // Return some dummy-data if no content available + if(empty($this->items)){ + $item = array(); + $item['content'] = "<p>No updates available</p>"; + + $this->items[] = $item; + } + } + + private function getLatestUpdates($xpath){ + // Query each item (consists of Manga + chapters) + $nodes = $xpath->query("//*[@id='latestchapters']/table//td"); + + foreach ($nodes as $node){ + // Query the manga + $manga = $xpath->query("a[@class='chapter']", $node)->item(0); + + // Collect the chapters for each Manga + $chapters = $xpath->query("a[@class='chaptersrec']", $node); + + if (isset($manga) && $chapters->length >= 1){ + $item = array(); + $item['uri'] = self::URI . htmlspecialchars($manga->getAttribute('href')); + $item['title'] = htmlspecialchars($manga->nodeValue); + + // Add each chapter to the feed + $item['content'] = ""; + + foreach ($chapters as $chapter){ + if($item['content'] <> ""){ + $item['content'] .= "<br>"; + } + $item['content'] .= "<a href='" + . self::URI + . htmlspecialchars($chapter->getAttribute('href')) + . "'>" + . htmlspecialchars($chapter->nodeValue) + . "</a>"; + } + + $this->items[] = $item; + } + } + } + + private function getPopularMangas($xpath){ + // Query all mangas + $mangas = $xpath->query("//*[@id='mangaresults']/*[@class='mangaresultitem']"); + + foreach ($mangas as $manga){ + + // The thumbnail is encrypted in a css-style... + // format: "background-image:url('<the part which is actually interesting>')" + $mangaimgelement = $xpath->query(".//*[@class='imgsearchresults']", $manga) + ->item(0) + ->getAttribute('style'); + $thumbnail = substr($mangaimgelement, 22, strlen($mangaimgelement) - 24); + + $item = array(); + $item['title'] = htmlspecialchars($xpath->query(".//*[@class='manga_name']//a", $manga) + ->item(0) + ->nodeValue); + $item['uri'] = self::URI . $xpath->query(".//*[@class='manga_name']//a", $manga) + ->item(0) + ->getAttribute('href'); + $item['author'] = htmlspecialchars($xpath->query("//*[@class='author_name']", $manga) + ->item(0) + ->nodeValue); + $item['chaptercount'] = $xpath->query(".//*[@class='chapter_count']", $manga) + ->item(0) + ->nodeValue; + $item['genre'] = htmlspecialchars($xpath->query(".//*[@class='manga_genre']", $manga) + ->item(0) + ->nodeValue); + $item['content'] = <<<EOD <a href="{$item['uri']}"><img src="{$thumbnail}" alt="{$item['title']}" /></a> <p>{$item['genre']}</p> <p>{$item['chaptercount']}</p> EOD; - $this->items[] = $item; - } - } - - private function get_manga_updates($xpath, $limit){ - $query = "(.//*[@id='listing']//tr)[position() > 1]"; - - if($limit !== -1){ - $query = "(.//*[@id='listing']//tr)[position() > 1][position() > last() - {$limit}]"; - } - - $chapters = $xpath->query($query); - - foreach ($chapters as $chapter){ - $item = array(); - $item['title'] = htmlspecialchars($xpath->query("td[1]", $chapter) - ->item(0) - ->nodeValue); - $item['uri'] = self::URI . $xpath->query("td[1]/a", $chapter) - ->item(0) - ->getAttribute('href'); - $item['timestamp'] = strtotime($xpath->query("td[2]", $chapter) - ->item(0) - ->nodeValue); - array_unshift($this->items, $item); - } - } - - public function getURI(){ - switch($this->queriedContext){ - case 'Get latest updates': - $path = "latest"; - break; - case 'Get popular mangas': - $path = "popular"; - if($this->getInput('category') !== "all"){ - $path .= "/" . $this->getInput('category'); - } - break; - case 'Get manga updates': - $path = $this->getInput('path'); - break; - default: return parent::getURI(); - } - return self::URI . $path; - } - - - public function getName(){ - return (!empty($this->request) ? $this->request . ' - ' : '') . 'Mangareader Bridge'; - } + $this->items[] = $item; + } + } + + private function getMangaUpdates($xpath, $limit){ + $query = "(.//*[@id='listing']//tr)[position() > 1]"; + + if($limit !== -1){ + $query = "(.//*[@id='listing']//tr)[position() > 1][position() > last() - {$limit}]"; + } + + $chapters = $xpath->query($query); + + foreach ($chapters as $chapter){ + $item = array(); + $item['title'] = htmlspecialchars($xpath->query("td[1]", $chapter) + ->item(0) + ->nodeValue); + $item['uri'] = self::URI . $xpath->query("td[1]/a", $chapter) + ->item(0) + ->getAttribute('href'); + $item['timestamp'] = strtotime($xpath->query("td[2]", $chapter) + ->item(0) + ->nodeValue); + array_unshift($this->items, $item); + } + } + + public function getURI(){ + switch($this->queriedContext){ + case 'Get latest updates': + $path = "latest"; + break; + case 'Get popular mangas': + $path = "popular"; + if($this->getInput('category') !== "all"){ + $path .= "/" . $this->getInput('category'); + } + break; + case 'Get manga updates': + $path = $this->getInput('path'); + break; + default: return parent::getURI(); + } + return self::URI . $path; + } + + public function getName(){ + return (!empty($this->request) ? $this->request . ' - ' : '') . 'Mangareader Bridge'; + } } -?> diff --git a/bridges/MilbooruBridge.php b/bridges/MilbooruBridge.php index bc10c3f9..c3b633ea 100644 --- a/bridges/MilbooruBridge.php +++ b/bridges/MilbooruBridge.php @@ -1,11 +1,11 @@ <?php require_once('Shimmie2Bridge.php'); -class MilbooruBridge extends Shimmie2Bridge{ +class MilbooruBridge extends Shimmie2Bridge { - const MAINTAINER = "mitsukarenai"; - const NAME = "Milbooru"; - const URI = "http://sheslostcontrol.net/moe/shimmie/"; - const DESCRIPTION = "Returns images from given page"; + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Milbooru'; + const URI = 'http://sheslostcontrol.net/moe/shimmie/'; + const DESCRIPTION = 'Returns images from given page'; } diff --git a/bridges/MixCloudBridge.php b/bridges/MixCloudBridge.php index 505cac50..f9ae7fe3 100644 --- a/bridges/MixCloudBridge.php +++ b/bridges/MixCloudBridge.php @@ -2,45 +2,47 @@ class MixCloudBridge extends BridgeAbstract { - const MAINTAINER = "Alexis CHEMEL"; - const NAME = "MixCloud"; - const URI = "https://mixcloud.com/"; + const MAINTAINER = 'Alexis CHEMEL'; + const NAME = 'MixCloud'; + const URI = 'https://mixcloud.com/'; const CACHE_TIMEOUT = 3600; // 1h - const DESCRIPTION = "Returns latest musics on user stream"; + const DESCRIPTION = 'Returns latest musics on user stream'; - const PARAMETERS = array(array( - 'u' => array( - 'name' => 'username', - 'required' => true, - ))); + const PARAMETERS = array(array( + 'u' => array( + 'name' => 'username', + 'required' => true, + ) + )); - public function getName(){ + public function getName(){ + return 'MixCloud - ' . $this->getInput('u'); + } - return 'MixCloud - '.$this->getInput('u'); - } + public function collectData(){ - public function collectData() { + $html = getSimpleHTMLDOM(self::URI . '/' . $this->getInput('u')) + or returnServerError('Could not request MixCloud.'); - $html = getSimpleHTMLDOM(self::URI.'/'.$this->getInput('u')) - or returnServerError('Could not request MixCloud.'); + foreach($html->find('div.card-elements-container') as $element){ - foreach($html->find('div.card-elements-container') as $element) { + $item = array(); - $item = array(); + $item['uri'] = self::URI . $element->find('h3.card-cloudcast-title a', 0)->getAttribute('href'); + $item['title'] = html_entity_decode( + $element->find('h3.card-cloudcast-title a span', 0)->getAttribute('title'), + ENT_QUOTES + ); - $item['uri'] = self::URI.$element->find('h3.card-cloudcast-title a', 0)->getAttribute('href'); - $item['title'] = html_entity_decode($element->find('h3.card-cloudcast-title a span', 0)->getAttribute('title'), ENT_QUOTES); + $image = $element->find('img.image-for-cloudcast', 0); - $image = $element->find('img.image-for-cloudcast', 0); + if($image){ + $item['content'] = '<img src="' . $image->getAttribute('src') . '" />'; + } - if( $image ) { + $item['author'] = trim($element->find('h4.card-cloudcast-user a', 0)->innertext); - $item['content'] = '<img src="'.$image->getAttribute('src').'" />'; - } - - $item['author'] = trim($element->find('h4.card-cloudcast-user a', 0)->innertext); - - $this->items[] = $item; - } - } + $this->items[] = $item; + } + } } diff --git a/bridges/MoebooruBridge.php b/bridges/MoebooruBridge.php index 716ae81a..787a45f7 100644 --- a/bridges/MoebooruBridge.php +++ b/bridges/MoebooruBridge.php @@ -1,47 +1,56 @@ <?php -class MoebooruBridge extends BridgeAbstract{ +class MoebooruBridge extends BridgeAbstract { - const NAME = "Moebooru"; - const URI = "https://moe.dev.myconan.net/"; - const CACHE_TIMEOUT = 1800; // 30min - const DESCRIPTION = "Returns images from given page"; - const MAINTAINER = 'pmaziere'; + const NAME = 'Moebooru'; + const URI = 'https://moe.dev.myconan.net/'; + const CACHE_TIMEOUT = 1800; // 30min + const DESCRIPTION = 'Returns images from given page'; + const MAINTAINER = 'pmaziere'; - const PARAMETERS = array( array( - 'p'=>array( - 'name'=>'page', - 'defaultValue'=>1, - 'type'=>'number' - ), - 't'=>array('name'=>'tags') - )); + const PARAMETERS = array( array( + 'p' => array( + 'name' => 'page', + 'defaultValue' => 1, + 'type' => 'number' + ), + 't' => array( + 'name' => 'tags' + ) + )); - protected function getFullURI(){ - return $this->getURI().'post?' - .'page='.$this->getInput('p') - .'&tags='.urlencode($this->getInput('t')); - } + protected function getFullURI(){ + return $this->getURI() + . 'post?page=' + . $this->getInput('p') + . '&tags=' + . urlencode($this->getInput('t')); + } - public function collectData(){ - $html = getSimpleHTMLDOM($this->getFullURI()) - or returnServerError('Could not request '.$this->getName()); + public function collectData(){ + $html = getSimpleHTMLDOM($this->getFullURI()) + or returnServerError('Could not request ' . $this->getName()); + $input_json = explode('Post.register(', $html); + foreach($input_json as $element) + $data[] = preg_replace('/}\)(.*)/', '}', $element); + unset($data[0]); - $input_json = explode('Post.register(', $html); - foreach($input_json as $element) - $data[] = preg_replace('/}\)(.*)/', '}', $element); - unset($data[0]); + foreach($data as $datai){ + $json = json_decode($datai, true); + $item = array(); + $item['uri'] = $this->getURI() . '/post/show/' . $json['id']; + $item['postid'] = $json['id']; + $item['timestamp'] = $json['created_at']; + $item['imageUri'] = $json['file_url']; + $item['title'] = $this->getName() . ' | ' . $json['id']; + $item['content'] = '<a href="' + . $item['imageUri'] + . '"><img src="' + . $json['preview_url'] + . '" /></a><br>Tags: ' + . $json['tags']; - foreach($data as $datai) { - $json = json_decode($datai, TRUE); - $item = array(); - $item['uri'] = $this->getURI().'/post/show/'.$json['id']; - $item['postid'] = $json['id']; - $item['timestamp'] = $json['created_at']; - $item['imageUri'] = $json['file_url']; - $item['title'] = $this->getName().' | '.$json['id']; - $item['content'] = '<a href="' . $item['imageUri'] . '"><img src="' . $json['preview_url'] . '" /></a><br>Tags: '.$json['tags']; - $this->items[] = $item; - } - } + $this->items[] = $item; + } + } } diff --git a/bridges/MondeDiploBridge.php b/bridges/MondeDiploBridge.php index e0cf78c0..b543c64b 100644 --- a/bridges/MondeDiploBridge.php +++ b/bridges/MondeDiploBridge.php @@ -1,22 +1,25 @@ <?php -class MondeDiploBridge extends BridgeAbstract{ +class MondeDiploBridge extends BridgeAbstract { - const MAINTAINER = "Pitchoule"; + const MAINTAINER = 'Pitchoule'; const NAME = 'Monde Diplomatique'; const URI = 'http://www.monde-diplomatique.fr/'; const CACHE_TIMEOUT = 21600; //6h - const DESCRIPTION = "Returns most recent results from MondeDiplo."; + const DESCRIPTION = 'Returns most recent results from MondeDiplo.'; public function collectData(){ - $html = getSimpleHTMLDOM(self::URI) - or returnServerError('Could not request MondeDiplo. for : ' . self::URI); + $html = getSimpleHTMLDOM(self::URI) + or returnServerError('Could not request MondeDiplo. for : ' . self::URI); - foreach($html->find('div.unarticle') as $article) { + foreach($html->find('div.unarticle') as $article){ $element = $article->parent(); $item = array(); $item['uri'] = self::URI . $element->href; $item['title'] = $element->find('h3', 0)->plaintext; - $item['content'] = $element->find('div.dates_auteurs', 0)->plaintext . '<br>' . strstr($element->find('div', 0)->plaintext, $element->find('div.dates_auteurs', 0)->plaintext, true); + $item['content'] = $element->find('div.dates_auteurs', 0)->plaintext + . '<br>' + . strstr($element->find('div', 0)->plaintext, $element->find('div.dates_auteurs', 0)->plaintext, true); + $this->items[] = $item; } } diff --git a/bridges/MsnMondeBridge.php b/bridges/MsnMondeBridge.php index 348bdb91..a6679f2d 100644 --- a/bridges/MsnMondeBridge.php +++ b/bridges/MsnMondeBridge.php @@ -1,30 +1,32 @@ <?php -class MsnMondeBridge extends BridgeAbstract{ +class MsnMondeBridge extends BridgeAbstrac { - const MAINTAINER = "kranack"; + const MAINTAINER = 'kranack'; const NAME = 'MSN Actu Monde'; const URI = 'http://www.msn.com/'; - const DESCRIPTION = "Returns the 10 newest posts from MSN Actualités (full text)"; + const DESCRIPTION = 'Returns the 10 newest posts from MSN Actualités (full text)'; - public function getURI(){ - return self::URI.'fr-fr/actualite/monde'; - } + public function getURI(){ + return self::URI . 'fr-fr/actualite/monde'; + } - private function MsnMondeExtractContent($url, &$item) { + private function msnMondeExtractContent($url, &$item){ $html2 = getSimpleHTMLDOM($url); $item['content'] = $html2->find('#content', 0)->find('article', 0)->find('section', 0)->plaintext; $item['timestamp'] = strtotime($html2->find('.authorinfo-txt', 0)->find('time', 0)->datetime); } public function collectData(){ - $html = getSimpleHTMLDOM($this->getURI()) or returnServerError('Could not request MsnMonde.'); + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Could not request MsnMonde.'); + $limit = 0; - foreach($html->find('.smalla') as $article) { - if($limit < 10) { + foreach($html->find('.smalla') as $article){ + if($limit < 10){ $item = array(); $item['title'] = utf8_decode($article->find('h4', 0)->innertext); $item['uri'] = self::URI . utf8_decode($article->find('a', 0)->href); - $this->MsnMondeExtractContent($item['uri'], $item); + $this->msnMondeExtractContent($item['uri'], $item); $this->items[] = $item; $limit++; } diff --git a/bridges/MspabooruBridge.php b/bridges/MspabooruBridge.php index 96ae52ad..00a7bd71 100644 --- a/bridges/MspabooruBridge.php +++ b/bridges/MspabooruBridge.php @@ -1,12 +1,12 @@ <?php require_once('GelbooruBridge.php'); -class MspabooruBridge extends GelbooruBridge{ +class MspabooruBridge extends GelbooruBridge { - const MAINTAINER = "mitsukarenai"; - const NAME = "Mspabooru"; - const URI = "http://mspabooru.com/"; - const DESCRIPTION = "Returns images from given page"; + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Mspabooru'; + const URI = 'http://mspabooru.com/'; + const DESCRIPTION = 'Returns images from given page'; + const PIDBYPAGE = 50; - const PIDBYPAGE=50; } diff --git a/bridges/NasaApodBridge.php b/bridges/NasaApodBridge.php index bc284cf0..48bc060e 100644 --- a/bridges/NasaApodBridge.php +++ b/bridges/NasaApodBridge.php @@ -1,43 +1,44 @@ <?php -class NasaApodBridge extends BridgeAbstract{ +class NasaApodBridge extends BridgeAbstract { - const MAINTAINER = "corenting"; - const NAME = "NASA APOD Bridge"; - const URI = "http://apod.nasa.gov/apod/"; + const MAINTAINER = 'corenting'; + const NAME = 'NASA APOD Bridge'; + const URI = 'http://apod.nasa.gov/apod/'; const CACHE_TIMEOUT = 43200; // 12h - const DESCRIPTION = "Returns the 3 latest NASA APOD pictures and explanations"; + const DESCRIPTION = 'Returns the 3 latest NASA APOD pictures and explanations'; - public function collectData(){ + public function collectData(){ - $html = getSimpleHTMLDOM(self::URI.'archivepix.html') or returnServerError('Error while downloading the website content'); - $list = explode("<br>", $html->find('b', 0)->innertext); + $html = getSimpleHTMLDOM(self::URI . 'archivepix.html') + or returnServerError('Error while downloading the website content'); - for($i = 0; $i < 3;$i++) - { - $line = $list[$i]; - $item = array(); + $list = explode("<br>", $html->find('b', 0)->innertext); - $uri_page = $html->find('a',$i + 3)->href; - $uri = self::URI.$uri_page; - $item['uri'] = $uri; + for($i = 0; $i < 3; $i++){ + $line = $list[$i]; + $item = array(); - $picture_html = getSimpleHTMLDOM($uri); - $picture_html_string = $picture_html->innertext; + $uri_page = $html->find('a', $i + 3)->href; + $uri = self::URI . $uri_page; + $item['uri'] = $uri; - //Extract image and explanation - $media = $picture_html->find('p',1)->innertext; - $media = strstr($media, '<br>'); - $media = preg_replace('/<br>/', '', $media, 1); - $explanation = $picture_html->find('p',2)->innertext; + $picture_html = getSimpleHTMLDOM($uri); + $picture_html_string = $picture_html->innertext; - //Extract date from the picture page - $date = explode(" ", $picture_html->find('p',1)->innertext); - $item['timestamp'] = strtotime($date[4].$date[3].$date[2]); + //Extract image and explanation + $media = $picture_html->find('p', 1)->innertext; + $media = strstr($media, '<br>'); + $media = preg_replace('/<br>/', '', $media, 1); + $explanation = $picture_html->find('p', 2)->innertext; - //Other informations - $item['content'] = $media.'<br />'.$explanation; - $item['title'] = $picture_html->find('b',0)->innertext; - $this->items[] = $item; - } - } + //Extract date from the picture page + $date = explode(" ", $picture_html->find('p', 1)->innertext); + $item['timestamp'] = strtotime($date[4] . $date[3] . $date[2]); + + //Other informations + $item['content'] = $media . '<br />' . $explanation; + $item['title'] = $picture_html->find('b', 0)->innertext; + $this->items[] = $item; + } + } } diff --git a/bridges/NeuviemeArtBridge.php b/bridges/NeuviemeArtBridge.php index 0bf3ce38..2b899411 100644 --- a/bridges/NeuviemeArtBridge.php +++ b/bridges/NeuviemeArtBridge.php @@ -1,17 +1,19 @@ <?php class NeuviemeArtBridge extends FeedExpander { - const MAINTAINER = "ORelio"; + const MAINTAINER = 'ORelio'; const NAME = '9ème Art Bridge'; - const URI = "http://www.9emeart.fr/"; - const DESCRIPTION = "Returns the newest articles."; + const URI = 'http://www.9emeart.fr/'; + const DESCRIPTION = 'Returns the newest articles.'; - private function StripWithDelimiters($string, $start, $end) { - while (strpos($string, $start) !== false) { + private function stripWithDelimiters($string, $start, $end){ + while(strpos($string, $start) !== false){ $section_to_remove = substr($string, strpos($string, $start)); $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end)); $string = str_replace($section_to_remove, '', $string); - } return $string; + } + + return $string; } protected function parseItem($item){ @@ -19,29 +21,29 @@ class NeuviemeArtBridge extends FeedExpander { $article_html = getSimpleHTMLDOMCached($item['uri']); if(!$article_html){ - $item['content'] = 'Could not request 9eme Art: '.$item['uri']; + $item['content'] = 'Could not request 9eme Art: ' . $item['uri']; return $item; } $article_image = ''; foreach ($article_html->find('img.img_full') as $img){ if ($img->alt == $item['title']){ - $article_image = self::URI.$img->src; + $article_image = self::URI . $img->src; break; } } - $article_content=''; + $article_content = ''; if($article_image){ - $article_content = '<p><img src="'.$article_image.'" /></p>'; + $article_content = '<p><img src="' . $article_image . '" /></p>'; } $article_content .= str_replace( - 'src="/', 'src="'.self::URI, + 'src="/', 'src="' . self::URI, $article_html->find('div.newsGenerique_con', 0)->innertext ); - $article_content = $this->StripWithDelimiters($article_content, '<script', '</script>'); - $article_content = $this->StripWithDelimiters($article_content, '<style', '</style>'); - $article_content = $this->StripWithDelimiters($article_content, '<link', '>'); + $article_content = $this->stripWithDelimiters($article_content, '<script', '</script>'); + $article_content = $this->stripWithDelimiters($article_content, '<style', '</style>'); + $article_content = $this->stripWithDelimiters($article_content, '<link', '>'); $item['content'] = $article_content; @@ -49,7 +51,7 @@ class NeuviemeArtBridge extends FeedExpander { } public function collectData(){ - $feedUrl = self::URI.'9emeart.rss'; + $feedUrl = self::URI . '9emeart.rss'; $this->collectExpandableDatas($feedUrl); } } diff --git a/bridges/NextInpactBridge.php b/bridges/NextInpactBridge.php index 21baf4c5..0e098286 100644 --- a/bridges/NextInpactBridge.php +++ b/bridges/NextInpactBridge.php @@ -1,10 +1,10 @@ <?php class NextInpactBridge extends FeedExpander { - const MAINTAINER = "qwertygc"; - const NAME = "NextInpact Bridge"; - const URI = "http://www.nextinpact.com/"; - const DESCRIPTION = "Returns the newest articles."; + const MAINTAINER = 'qwertygc'; + const NAME = 'NextInpact Bridge'; + const URI = 'http://www.nextinpact.com/'; + const DESCRIPTION = 'Returns the newest articles.'; public function collectData(){ $this->collectExpandableDatas(self::URI . 'rss/news.xml', 10); @@ -12,18 +12,23 @@ class NextInpactBridge extends FeedExpander { protected function parseItem($newsItem){ $item = parent::parseItem($newsItem); - $item['content'] = $this->ExtractContent($item['uri']); + $item['content'] = $this->extractContent($item['uri']); return $item; } - private function ExtractContent($url) { + private function extractContent($url){ $html2 = getSimpleHTMLDOMCached($url); - $text = '<p><em>'.$html2->find('span.sub_title', 0)->innertext.'</em></p>' - .'<p><img src="'.$html2->find('div.container_main_image_article', 0)->find('img.dedicated',0)->src.'" alt="-" /></p>' - .'<div>'.$html2->find('div[itemprop=articleBody]', 0)->innertext.'</div>'; + $text = '<p><em>' + . $html2->find('span.sub_title', 0)->innertext + . '</em></p><p><img src="' + . $html2->find('div.container_main_image_article', 0)->find('img.dedicated',0)->src + . '" alt="-" /></p><div>' + . $html2->find('div[itemprop=articleBody]', 0)->innertext + . '</div>'; + $premium_article = $html2->find('h2.title_reserve_article', 0); if (is_object($premium_article)) - $text = $text.'<p><em>'.$premium_article->innertext.'</em></p>'; + $text = $text . '<p><em>' . $premium_article->innertext . '</em></p>'; return $text; } } diff --git a/bridges/NextgovBridge.php b/bridges/NextgovBridge.php index 78ffb055..c141e612 100644 --- a/bridges/NextgovBridge.php +++ b/bridges/NextgovBridge.php @@ -1,70 +1,74 @@ <?php class NextgovBridge extends FeedExpander { - const MAINTAINER = 'ORelio'; - const NAME = 'Nextgov Bridge'; - const URI = 'https://www.nextgov.com/'; - const DESCRIPTION = 'USA Federal technology news, best practices, and web 2.0 tools.'; + const MAINTAINER = 'ORelio'; + const NAME = 'Nextgov Bridge'; + const URI = 'https://www.nextgov.com/'; + const DESCRIPTION = 'USA Federal technology news, best practices, and web 2.0 tools.'; - const PARAMETERS = array( array( - 'category'=>array( - 'name'=>'Category', - 'type'=>'list', - 'values'=>array( - 'All'=>'all', - 'Technology News'=>'technology-news', - 'CIO Briefing'=>'cio-briefing', - 'Emerging Tech'=>'emerging-tech', - 'Cloud'=>'cloud-computing', - 'Cybersecurity'=>'cybersecurity', - 'Mobile'=>'mobile', - 'Health'=>'health', - 'Defense'=>'defense', - 'Big Data'=>'big-data' - ) - ) - )); + const PARAMETERS = array( array( + 'category' => array( + 'name' => 'Category', + 'type' => 'list', + 'values' => array( + 'All' => 'all', + 'Technology News' => 'technology-news', + 'CIO Briefing' => 'cio-briefing', + 'Emerging Tech' => 'emerging-tech', + 'Cloud' => 'cloud-computing', + 'Cybersecurity' => 'cybersecurity', + 'Mobile' => 'mobile', + 'Health' => 'health', + 'Defense' => 'defense', + 'Big Data' => 'big-data' + ) + ) + )); - public function collectData(){ - $this->collectExpandableDatas(self::URI . 'rss/' . $this->getInput('category') . '/', 10); - } + public function collectData(){ + $this->collectExpandableDatas(self::URI . 'rss/' . $this->getInput('category') . '/', 10); + } - protected function parseItem($newsItem){ - $item = parent::parseItem($newsItem); + protected function parseItem($newsItem){ + $item = parent::parseItem($newsItem); - $item['content'] = ''; + $item['content'] = ''; - $namespaces = $newsItem->getNamespaces(true); - if(isset($namespaces['media'])){ - $media = $newsItem->children($namespaces['media']); - if(isset($media->content)){ - $attributes = $media->content->attributes(); - $item['content'] = '<img src="' . $attributes['url'] . '">'; - } - } + $namespaces = $newsItem->getNamespaces(true); + if(isset($namespaces['media'])){ + $media = $newsItem->children($namespaces['media']); + if(isset($media->content)){ + $attributes = $media->content->attributes(); + $item['content'] = '<img src="' . $attributes['url'] . '">'; + } + } - $item['content'] .= $this->ExtractContent($item['uri']); - return $item; - } + $item['content'] .= $this->extractContent($item['uri']); + return $item; + } - private function StripWithDelimiters($string, $start, $end) { - while (strpos($string, $start) !== false) { - $section_to_remove = substr($string, strpos($string, $start)); - $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end)); - $string = str_replace($section_to_remove, '', $string); - } return $string; - } + private function stripWithDelimiters($string, $start, $end){ + while (strpos($string, $start) !== false) { + $section_to_remove = substr($string, strpos($string, $start)); + $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end)); + $string = str_replace($section_to_remove, '', $string); + } - private function ExtractContent($url){ - $article = getSimpleHTMLDOMCached($url) - or returnServerError('Could not request Nextgov: ' . $url); + return $string; + } - $contents = $article->find('div.wysiwyg', 0)->innertext; - $contents = $this->StripWithDelimiters($contents, '<div class="ad-container">', '</div>'); - $contents = $this->StripWithDelimiters($contents, '<div', '</div>'); //ad outer div - return $this->StripWithDelimiters($contents, '<script', '</script>'); - $contents = ($article_thumbnail == '' ? '' : '<p><img src="'.$article_thumbnail.'" /></p>') - .'<p><b>'.$article_subtitle.'</b></p>' - .trim($contents); - } + private function extractContent($url){ + $article = getSimpleHTMLDOMCached($url) + or returnServerError('Could not request Nextgov: ' . $url); + + $contents = $article->find('div.wysiwyg', 0)->innertext; + $contents = $this->stripWithDelimiters($contents, '<div class="ad-container">', '</div>'); + $contents = $this->stripWithDelimiters($contents, '<div', '</div>'); //ad outer div + return $this->stripWithDelimiters($contents, '<script', '</script>'); + $contents = ($article_thumbnail == '' ? '' : '<p><img src="' . $article_thumbnail . '" /></p>') + . '<p><b>' + . $article_subtitle + . '</b></p>' + . trim($contents); + } } diff --git a/bridges/NiceMatinBridge.php b/bridges/NiceMatinBridge.php index 678b4f77..117c7794 100644 --- a/bridges/NiceMatinBridge.php +++ b/bridges/NiceMatinBridge.php @@ -1,10 +1,10 @@ <?php class NiceMatinBridge extends FeedExpander { - const MAINTAINER = "pit-fgfjiudghdf"; - const NAME = "NiceMatin"; - const URI = "http://www.nicematin.com/"; - const DESCRIPTION = "Returns the 10 newest posts from NiceMatin (full text)"; + const MAINTAINER = 'pit-fgfjiudghdf'; + const NAME = 'NiceMatin'; + const URI = 'http://www.nicematin.com/'; + const DESCRIPTION = 'Returns the 10 newest posts from NiceMatin (full text)'; public function collectData(){ $this->collectExpandableDatas(self::URI . 'derniere-minute/rss', 10); @@ -12,11 +12,11 @@ class NiceMatinBridge extends FeedExpander { protected function parseItem($newsItem){ $item = parent::parseItem($newsItem); - $item['content'] = $this->NiceMatinExtractContent($item['uri']); + $item['content'] = $this->extractContent($item['uri']); return $item; } - private function NiceMatinExtractContent($url) { + private function extractContent($url){ $html = getSimpleHTMLDOMCached($url); if(!$html) return 'Could not acquire content from url: ' . $url . '!'; diff --git a/bridges/NovelUpdatesBridge.php b/bridges/NovelUpdatesBridge.php index d0a6d713..bb40b89f 100644 --- a/bridges/NovelUpdatesBridge.php +++ b/bridges/NovelUpdatesBridge.php @@ -1,52 +1,61 @@ <?php -class NovelUpdatesBridge extends BridgeAbstract{ +class NovelUpdatesBridge extends BridgeAbstract { - const MAINTAINER = "albirew"; - const NAME = "Novel Updates"; - const URI = "http://www.novelupdates.com/"; + const MAINTAINER = 'albirew'; + const NAME = 'Novel Updates'; + const URI = 'http://www.novelupdates.com/'; const CACHE_TIMEOUT = 21600; // 6h - const DESCRIPTION = "Returns releases from Novel Updates"; + const DESCRIPTION = 'Returns releases from Novel Updates'; const PARAMETERS = array( array( - 'n'=>array( - 'name'=>'Novel name as found in the url', - 'exampleValue'=>'spirit-realm', - 'required'=>true - ) - )); + 'n' => array( + 'name' => 'Novel name as found in the url', + 'exampleValue' => 'spirit-realm', + 'required' => true + ) + )); - private $seriesTitle=''; + private $seriesTitle = ''; - public function getURI(){ - return static::URI.'/series/'.$this->getInput('n').'/'; - } + public function getURI(){ + return static::URI . '/series/' . $this->getInput('n') . '/'; + } - public function collectData(){ - $fullhtml = getSimpleHTMLDOM($this->getURI()) - or returnServerError('Could not request NovelUpdates, novel "'.$this->getInput('n').'" not found'); + public function collectData(){ + $fullhtml = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Could not request NovelUpdates, novel "' . $this->getInput('n') . '" not found'); - $this->seriesTitle = $fullhtml->find('h4.seriestitle', 0)->plaintext; - // dirty fix for nasty simpledom bug: https://github.com/sebsauvage/rss-bridge/issues/259 - // forcefully removes tbody - $html = $fullhtml->find('table#myTable', 0)->innertext; - $html = stristr($html, '<tbody>'); //strip thead - $html = stristr($html, '<tr>'); //remove tbody - $html = str_get_html(stristr($html, '</tbody>', true)); //remove last tbody and get back as an array - foreach($html->find('tr') as $element){ - $item = array(); - $item['uri'] = $element->find('td', 2)->find('a', 0)->href; - $item['title'] = $element->find('td', 2)->find('a', 0)->plaintext; - $item['team'] = $element->find('td', 1)->innertext; - $item['timestamp'] = strtotime($element->find('td', 0)->plaintext); - $item['content'] = - '<a href="'.$item['uri'].'">' - .$this->seriesTitle.' - '.$item['title'] - .'</a> by '.$item['team'].'<br>' - .'<a href="'.$item['uri'].'">'.$fullhtml->find('div.seriesimg', 0)->innertext.'</a>'; - $this->items[] = $item; - } - } + $this->seriesTitle = $fullhtml->find('h4.seriestitle', 0)->plaintext; + // dirty fix for nasty simpledom bug: https://github.com/sebsauvage/rss-bridge/issues/259 + // forcefully removes tbody + $html = $fullhtml->find('table#myTable', 0)->innertext; + $html = stristr($html, '<tbody>'); //strip thead + $html = stristr($html, '<tr>'); //remove tbody + $html = str_get_html(stristr($html, '</tbody>', true)); //remove last tbody and get back as an array + foreach($html->find('tr') as $element){ + $item = array(); + $item['uri'] = $element->find('td', 2)->find('a', 0)->href; + $item['title'] = $element->find('td', 2)->find('a', 0)->plaintext; + $item['team'] = $element->find('td', 1)->innertext; + $item['timestamp'] = strtotime($element->find('td', 0)->plaintext); + $item['content'] = '<a href="' + . $item['uri'] + . '">' + . $this->seriesTitle + . ' - ' + . $item['title'] + . '</a> by ' + . $item['team'] + . '<br><a href="' + . $item['uri'] + . '">' + . $fullhtml->find('div.seriesimg', 0)->innertext + . '</a>'; - public function getName(){ - return $this->seriesTitle. ' - ' . static::NAME; - } + $this->items[] = $item; + } + } + + public function getName(){ + return $this->seriesTitle . ' - ' . static::NAME; + } } diff --git a/bridges/OpenClassroomsBridge.php b/bridges/OpenClassroomsBridge.php index d5424eae..24afb29c 100644 --- a/bridges/OpenClassroomsBridge.php +++ b/bridges/OpenClassroomsBridge.php @@ -1,46 +1,45 @@ <?php -class OpenClassroomsBridge extends BridgeAbstract{ +class OpenClassroomsBridge extends BridgeAbstract { - const MAINTAINER = "sebsauvage"; - const NAME = "OpenClassrooms Bridge"; - const URI = "https://openclassrooms.com/"; + const MAINTAINER = 'sebsauvage'; + const NAME = 'OpenClassrooms Bridge'; + const URI = 'https://openclassrooms.com/'; const CACHE_TIMEOUT = 21600; // 6h - const DESCRIPTION = "Returns latest tutorials from OpenClassrooms."; + const DESCRIPTION = 'Returns latest tutorials from OpenClassrooms.'; - const PARAMETERS = array( array( - 'u'=>array( - 'name'=>'Catégorie', - 'type'=>'list', - 'required'=>true, - 'values'=>array( - 'Arts & Culture'=>'arts', - 'Code'=>'code', - 'Design'=>'design', - 'Entreprise'=>'business', - 'Numérique'=>'digital', - 'Sciences'=>'sciences', - 'Sciences Humaines'=>'humainities', - 'Systèmes d\'information'=>'it', - 'Autres'=>'others' - ) - ) - )); + const PARAMETERS = array( array( + 'u' => array( + 'name' => 'Catégorie', + 'type' => 'list', + 'required' => true, + 'values' => array( + 'Arts & Culture' => 'arts', + 'Code' => 'code', + 'Design' => 'design', + 'Entreprise' => 'business', + 'Numérique' => 'digital', + 'Sciences' => 'sciences', + 'Sciences Humaines' => 'humainities', + 'Systèmes d\'information' => 'it', + 'Autres' => 'others' + ) + ) + )); - public function getURI(){ - return self::URI.'/courses?categories='.$this->getInput('u').'&' - .'title=&sort=updatedAt+desc'; - } + public function getURI(){ + return self::URI . '/courses?categories=' . $this->getInput('u') . '&title=&sort=updatedAt+desc'; + } - public function collectData(){ - $html = getSimpleHTMLDOM($this->getURI()) - or returnServerError('Could not request OpenClassrooms.'); + public function collectData(){ + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Could not request OpenClassrooms.'); - foreach($html->find('.courseListItem') as $element) { - $item = array(); - $item['uri'] = self::URI.$element->find('a', 0)->href; - $item['title'] = $element->find('h3', 0)->plaintext; - $item['content'] = $element->find('slidingItem__descriptionContent', 0)->plaintext; - $this->items[] = $item; - } - } + foreach($html->find('.courseListItem') as $element){ + $item = array(); + $item['uri'] = self::URI . $element->find('a', 0)->href; + $item['title'] = $element->find('h3', 0)->plaintext; + $item['content'] = $element->find('slidingItem__descriptionContent', 0)->plaintext; + $this->items[] = $item; + } + } } diff --git a/bridges/ParuVenduImmoBridge.php b/bridges/ParuVenduImmoBridge.php index ee94e700..6a6f1440 100644 --- a/bridges/ParuVenduImmoBridge.php +++ b/bridges/ParuVenduImmoBridge.php @@ -1,96 +1,98 @@ <?php -class ParuVenduImmoBridge extends BridgeAbstract -{ - const MAINTAINER = "polo2ro"; - const NAME = "Paru Vendu Immobilier"; - const URI = "http://www.paruvendu.fr"; +class ParuVenduImmoBridge extends BridgeAbstract { + + const MAINTAINER = 'polo2ro'; + const NAME = 'Paru Vendu Immobilier'; + const URI = 'http://www.paruvendu.fr'; const CACHE_TIMEOUT = 10800; // 3h - const DESCRIPTION = "Returns the ads from the first page of search result."; - - - const PARAMETERS = array( array( - 'minarea'=>array( - 'name'=>'Minimal surface m²', - 'type'=>'number' - ), - 'maxprice'=>array( - 'name'=>'Max price', - 'type'=>'number' - ), - 'pa'=>array( - 'name'=>'Country code', - 'exampleValue'=>'FR' - ), - 'lo'=>array('name'=>'department numbers or postal codes, comma-separated') - )); - - public function collectData() - { - $html = getSimpleHTMLDOM($this->getURI()) - or returnServerError('Could not request paruvendu.'); - - foreach($html->find('div.annonce a') as $element) { - - if (!$element->title) { - continue; - } - - $img =''; - foreach($element->find('span.img img') as $img) { - if ($img->original) { - $img = '<img src="'.$img->original.'" />'; - } - } - - $desc = $element->find('span.desc')[0]->innertext; - $desc = str_replace("voir l'annonce", '', $desc); - - $price = $element->find('span.price')[0]->innertext; - - list($href) = explode('#', $element->href); - - $item = array(); - $item['uri'] = self::URI.$href; - $item['title'] = $element->title; - $item['content'] = $img.$desc.$price; - $this->items[] = $item; - - } - } - - public function getURI(){ - $appartment = '&tbApp=1&tbDup=1&tbChb=1&tbLof=1&tbAtl=1&tbPla=1'; - $maison = '&tbMai=1&tbVil=1&tbCha=1&tbPro=1&tbHot=1&tbMou=1&tbFer=1'; - $link = self::URI.'/immobilier/annonceimmofo/liste/listeAnnonces?tt=1'.$appartment.$maison; - - if ($this->getInput('minarea')) { - $link .= '&sur0='.urlencode($this->getInput('minarea')); - } - - if ($this->getInput('maxprice')) { - $link .= '&px1='.urlencode($this->getInput('maxprice')); - } - - if ($this->getInput('pa')) { - $link .= '&pa='.urlencode($this->getInput('pa')); - } - - if ($this->getInput('lo')) { - $link .= '&lo='.urlencode($this->getInput('lo')); - } - return $link; - } - - public function getName(){ - $request=''; - $minarea=$this->getInput('minarea'); - if(!empty($minarea)){ - $request .= ' '.$minarea.' m2'; - } - $location=$this->getInput('lo'); - if(!empty($location)){ - $request .= ' In: '.$location; - } - return 'Paru Vendu Immobilier'.$request; - } + const DESCRIPTION = 'Returns the ads from the first page of search result.'; + + const PARAMETERS = array( array( + 'minarea' => array( + 'name' => 'Minimal surface m²', + 'type' => 'number' + ), + 'maxprice' => array( + 'name' => 'Max price', + 'type' => 'number' + ), + 'pa' => array( + 'name' => 'Country code', + 'exampleValue' => 'FR' + ), + 'lo' => array( + 'name' => 'department numbers or postal codes, comma-separated' + ) + )); + + public function collectData(){ + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Could not request paruvendu.'); + + foreach($html->find('div.annonce a') as $element){ + + if(!$element->title){ + continue; + } + + $img = ''; + foreach($element->find('span.img img') as $img){ + if($img->original){ + $img = '<img src="' . $img->original . '" />'; + } + } + + $desc = $element->find('span.desc')[0]->innertext; + $desc = str_replace("voir l'annonce", '', $desc); + + $price = $element->find('span.price')[0]->innertext; + + list($href) = explode('#', $element->href); + + $item = array(); + $item['uri'] = self::URI . $href; + $item['title'] = $element->title; + $item['content'] = $img . $desc . $price; + $this->items[] = $item; + } + } + + public function getURI(){ + $appartment = '&tbApp=1&tbDup=1&tbChb=1&tbLof=1&tbAtl=1&tbPla=1'; + $maison = '&tbMai=1&tbVil=1&tbCha=1&tbPro=1&tbHot=1&tbMou=1&tbFer=1'; + $link = self::URI + . '/immobilier/annonceimmofo/liste/listeAnnonces?tt=1' + . $appartment + . $maison; + + if($this->getInput('minarea')){ + $link .= '&sur0=' . urlencode($this->getInput('minarea')); + } + + if($this->getInput('maxprice')){ + $link .= '&px1=' . urlencode($this->getInput('maxprice')); + } + + if($this->getInput('pa')){ + $link .= '&pa=' . urlencode($this->getInput('pa')); + } + + if($this->getInput('lo')){ + $link .= '&lo=' . urlencode($this->getInput('lo')); + } + return $link; + } + + public function getName(){ + $request = ''; + $minarea = $this->getInput('minarea'); + if(!empty($minarea)){ + $request .= ' ' . $minarea . ' m2'; + } + $location = $this->getInput('lo'); + if(!empty($location)){ + $request .= ' In: ' . $location; + } + return 'Paru Vendu Immobilier' . $request; + } } diff --git a/bridges/PickyWallpapersBridge.php b/bridges/PickyWallpapersBridge.php index cef99a28..a2be7edd 100644 --- a/bridges/PickyWallpapersBridge.php +++ b/bridges/PickyWallpapersBridge.php @@ -1,73 +1,93 @@ <?php class PickyWallpapersBridge extends BridgeAbstract { - const MAINTAINER = "nel50n"; - const NAME = "PickyWallpapers Bridge"; - const URI = "http://www.pickywallpapers.com/"; + const MAINTAINER = 'nel50n'; + const NAME = 'PickyWallpapers Bridge'; + const URI = 'http://www.pickywallpapers.com/'; const CACHE_TIMEOUT = 43200; // 12h - const DESCRIPTION = "Returns the latests wallpapers from PickyWallpapers"; + const DESCRIPTION = 'Returns the latests wallpapers from PickyWallpapers'; - const PARAMETERS = array( array( - 'c'=>array( - 'name'=>'category', - 'required'=>true - ), - 's'=>array('name'=>'subcategory'), - 'm'=>array( - 'name'=>'Max number of wallpapers', - 'defaultValue'=>12, - 'type'=>'number' - ), - 'r'=>array( - 'name'=>'resolution', - 'exampleValue'=>'1920x1200, 1680x1050,…', - 'defaultValue'=>'1920x1200', - 'pattern'=>'[0-9]{3,4}x[0-9]{3,4}' - ) - )); + const PARAMETERS = array( array( + 'c' => array( + 'name' => 'category', + 'required' => true + ), + 's' => array( + 'name' => 'subcategory' + ), + 'm' => array( + 'name' => 'Max number of wallpapers', + 'defaultValue' => 12, + 'type' => 'number' + ), + 'r' => array( + 'name' => 'resolution', + 'exampleValue' => '1920x1200, 1680x1050,…', + 'defaultValue' => '1920x1200', + 'pattern' => '[0-9]{3,4}x[0-9]{3,4}' + ) + )); + public function collectData(){ + $lastpage = 1; + $num = 0; + $max = $this->getInput('m'); + $resolution = $this->getInput('r'); // Wide wallpaper default - public function collectData(){ - $lastpage = 1; - $num = 0; - $max = $this->getInput('m'); - $resolution = $this->getInput('r'); // Wide wallpaper default + for($page = 1; $page <= $lastpage; $page++){ + $html = getSimpleHTMLDOM($this->getURI() . '/page-' . $page . '/') + or returnServerError('No results for this query.'); - for ($page = 1; $page <= $lastpage; $page++) { - $html = getSimpleHTMLDOM($this->getURI().'/page-'.$page.'/') - or returnServerError('No results for this query.'); + if($page === 1){ + preg_match('/page-(\d+)\/$/', $html->find('.pages li a', -2)->href, $matches); + $lastpage = min($matches[1], ceil($max / 12)); + } - if ($page === 1) { - preg_match('/page-(\d+)\/$/', $html->find('.pages li a', -2)->href, $matches); - $lastpage = min($matches[1], ceil($max/12)); - } + foreach($html->find('.items li img') as $element){ + $item = array(); + $item['uri'] = str_replace('www', 'wallpaper', self::URI) + . '/' + . $resolution + . '/' + . basename($element->src); - foreach($html->find('.items li img') as $element) { + $item['timestamp'] = time(); + $item['title'] = $element->alt; + $item['content'] = $item['title'] + . '<br><a href="' + . $item['uri'] + . '">' + . $element + . '</a>'; - $item = array(); - $item['uri'] = str_replace('www', 'wallpaper', self::URI).'/'.$resolution.'/'.basename($element->src); - $item['timestamp'] = time(); - $item['title'] = $element->alt; - $item['content'] = $item['title'].'<br><a href="'.$item['uri'].'">'.$element.'</a>'; - $this->items[] = $item; + $this->items[] = $item; - $num++; - if ($num >= $max) - break 2; - } - } - } + $num++; + if ($num >= $max) + break 2; + } + } + } - public function getURI(){ - $subcategory = $this->getInput('s'); - $link = self::URI.$this->getInput('r').'/'.$this->getInput('c').'/'.$subcategory; - return $link; - } + public function getURI(){ + $subcategory = $this->getInput('s'); + $link = self::URI + . $this->getInput('r') + . '/' + . $this->getInput('c') + . '/' + . $subcategory; - public function getName(){ - $subcategory = $this->getInput('s'); - return 'PickyWallpapers - '.$this->getInput('c') - .($subcategory? ' > '.$subcategory : '') - .' ['.$this->getInput('r').']'; - } + return $link; + } + + public function getName(){ + $subcategory = $this->getInput('s'); + return 'PickyWallpapers - ' + . $this->getInput('c') + . ($subcategory ? ' > ' . $subcategory : '') + . ' [' + . $this->getInput('r') + . ']'; + } } diff --git a/bridges/PinterestBridge.php b/bridges/PinterestBridge.php index 1d8895e2..68989790 100644 --- a/bridges/PinterestBridge.php +++ b/bridges/PinterestBridge.php @@ -1,10 +1,10 @@ <?php class PinterestBridge extends BridgeAbstract { - const MAINTAINER = "pauder"; - const NAME = "Pinterest Bridge"; - const URI = "http://www.pinterest.com/"; - const DESCRIPTION = "Returns the newest images on a board"; + const MAINTAINER = 'pauder'; + const NAME = 'Pinterest Bridge'; + const URI = 'http://www.pinterest.com/'; + const DESCRIPTION = 'Returns the newest images on a board'; const PARAMETERS = array( 'By username and board' => array( @@ -63,8 +63,7 @@ class PinterestBridge extends BridgeAbstract { . htmlentities($item['avatar']) . '" /> <strong>' . $item['username'] - . '</strong>' - . '<br />' + . '</strong><br />' . $item['fullname']; $item['title'] = $img->getAttribute('alt'); diff --git a/bridges/PlanetLibreBridge.php b/bridges/PlanetLibreBridge.php index 469c37e4..ecf687bd 100644 --- a/bridges/PlanetLibreBridge.php +++ b/bridges/PlanetLibreBridge.php @@ -1,28 +1,35 @@ <?php -class PlanetLibreBridge extends BridgeAbstract{ +class PlanetLibreBridge extends BridgeAbstract { - const MAINTAINER = "pit-fgfjiudghdf"; - const NAME = "PlanetLibre"; - const URI = "http://www.planet-libre.org"; - const DESCRIPTION = "Returns the 5 newest posts from PlanetLibre (full text)"; + const MAINTAINER = 'pit-fgfjiudghdf'; + const NAME = 'PlanetLibre'; + const URI = 'http://www.planet-libre.org'; + const DESCRIPTION = 'Returns the 5 newest posts from PlanetLibre (full text)'; - private function PlanetLibreExtractContent($url){ + private function extractContent($url){ $html2 = getSimpleHTMLDOM($url); $text = $html2->find('div[class="post-text"]', 0)->innertext; return $text; } public function collectData(){ - $html = getSimpleHTMLDOM(self::URI) - or returnServerError('Could not request PlanetLibre.'); + $html = getSimpleHTMLDOM(self::URI) + or returnServerError('Could not request PlanetLibre.'); $limit = 0; - foreach($html->find('div.post') as $element) { - if($limit < 5) { + foreach($html->find('div.post') as $element){ + if($limit < 5){ $item = array(); $item['title'] = $element->find('h1', 0)->plaintext; $item['uri'] = $element->find('a', 0)->href; - $item['timestamp'] = strtotime(str_replace('/', '-', $element->find('div[class="post-date"]', 0)->plaintext)); - $item['content'] = $this->PlanetLibreExtractContent($item['uri']); + $item['timestamp'] = strtotime( + str_replace( + '/', + '-', + $element->find('div[class="post-date"]', 0)->plaintext + ) + ); + + $item['content'] = $this->extractContent($item['uri']); $this->items[] = $item; $limit++; } diff --git a/bridges/RTBFBridge.php b/bridges/RTBFBridge.php index 54e1a58a..dda01f5b 100644 --- a/bridges/RTBFBridge.php +++ b/bridges/RTBFBridge.php @@ -1,38 +1,46 @@ <?php class RTBFBridge extends BridgeAbstract { - const NAME = "RTBF Bridge"; - const URI = "http://www.rtbf.be/auvio/emissions/"; + const NAME = 'RTBF Bridge'; + const URI = 'http://www.rtbf.be/auvio/emissions/'; const CACHE_TIMEOUT = 21600; //6h - const DESCRIPTION = "Returns the newest RTBF videos by series ID"; - const MAINTAINER = "Frenzie"; + const DESCRIPTION = 'Returns the newest RTBF videos by series ID'; + const MAINTAINER = 'Frenzie'; - const PARAMETERS = array( array( - 'c'=>array( - 'name'=>'series id', - 'exampleValue'=>9500, - 'required'=>true - ) - )); + const PARAMETERS = array( array( + 'c' => array( + 'name' => 'series id', + 'exampleValue' => 9500, + 'required' => true + ) + )); public function collectData(){ $html = ''; $limit = 10; $count = 0; - $html = getSimpleHTMLDOM($this->getURI()) - or returnServerError('Could not request RTBF.'); + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Could not request RTBF.'); + + foreach($html->find('section[id!=widget-ml-avoiraussi-] .rtbf-media-grid article') as $element){ + if($count >= $limit){ + break; + } - foreach($html->find('section[id!=widget-ml-avoiraussi-] .rtbf-media-grid article') as $element) { - if($count >= $limit) { - break; - } $item = array(); $item['id'] = $element->getAttribute('data-id'); - $item['uri'] = self::URI.'detail?id='.$item['id']; - $thumbnailUriSrcSet = explode(',', $element->find('figure .www-img-16by9 img', 0)->getAttribute('data-srcset')); + $item['uri'] = self::URI . 'detail?id=' . $item['id']; + $thumbnailUriSrcSet = explode( + ',', + $element->find('figure .www-img-16by9 img', 0)->getAttribute('data-srcset') + ); + $thumbnailUriLastSrc = end($thumbnailUriSrcSet); $thumbnailUri = explode(' ', $thumbnailUriLastSrc)[0]; - $item['title'] = trim($element->find('h3',0)->plaintext) . ' - ' . trim($element->find('h4',0)->plaintext); + $item['title'] = trim($element->find('h3',0)->plaintext) + . ' - ' + . trim($element->find('h4',0)->plaintext); + $item['timestamp'] = strtotime($element->find('time', 0)->getAttribute('datetime')); $item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $thumbnailUri . '" /></a>'; $this->items[] = $item; @@ -40,9 +48,9 @@ class RTBFBridge extends BridgeAbstract { } } - public function getURI(){ - return self::URI.'detail?id='.$this->getInput('c'); - } + public function getURI(){ + return self::URI . 'detail?id=' . $this->getInput('c'); + } public function getName(){ return $this->getInput('c') .' - RTBF Bridge'; diff --git a/bridges/ReadComicsBridge.php b/bridges/ReadComicsBridge.php index 59f48d3c..8540fe3e 100644 --- a/bridges/ReadComicsBridge.php +++ b/bridges/ReadComicsBridge.php @@ -1,43 +1,44 @@ <?php -class ReadComicsBridge extends BridgeAbstract{ +class ReadComicsBridge extends BridgeAbstract { - const MAINTAINER = "niawag"; - const NAME = "Read Comics"; - const URI = "http://www.readcomics.tv/"; - const DESCRIPTION = "Enter the comics as they appear in the website uri, separated by semicolons, ex: good-comic-1;good-comic-2; ..."; + const MAINTAINER = 'niawag'; + const NAME = 'Read Comics'; + const URI = 'http://www.readcomics.tv/'; + const DESCRIPTION = 'Enter the comics as they appear in the website uri, + separated by semicolons, ex: good-comic-1;good-comic-2; ...'; - const PARAMETERS = array( array( - 'q'=>array( - 'name'=>'keywords, separated by semicolons', - 'exampleValue'=>'first list;second list;...', - 'required'=>true - ), - )); + const PARAMETERS = array( array( + 'q' => array( + 'name' => 'keywords, separated by semicolons', + 'exampleValue' => 'first list;second list;...', + 'required' => true + ), + )); public function collectData(){ - function parseDateTimestamp($element){ - $guessedDate = $element->find('span',0)->plaintext; - $guessedDate = strptime($guessedDate, '%m/%d/%Y'); - $timestamp = mktime(0, 0, 0, $guessedDate['tm_mon'] + 1, $guessedDate['tm_mday'], date('Y')); - - return $timestamp; - } + function parseDateTimestamp($element){ + $guessedDate = $element->find('span', 0)->plaintext; + $guessedDate = strptime($guessedDate, '%m/%d/%Y'); + $timestamp = mktime(0, 0, 0, $guessedDate['tm_mon'] + 1, $guessedDate['tm_mday'], date('Y')); - $keywordsList = explode(";",$this->getInput('q')); - foreach($keywordsList as $keywords){ - $html = $this->getSimpleHTMLDOM(self::URI.'comic/'.rawurlencode($keywords)) - or $this->returnServerError('Could not request readcomics.tv.'); + return $timestamp; + } - foreach($html->find('li') as $element) { - $item = array(); - $item['uri'] = $element->find('a.ch-name',0)->href; - $item['id'] = $item['uri']; - $item['timestamp'] = parseDateTimestamp($element); - $item['title'] = $element->find('a.ch-name',0)->plaintext; - if(isset($item['title'])) - $this->items[] = $item; - } - } + $keywordsList = explode(";", $this->getInput('q')); + foreach($keywordsList as $keywords){ + $html = $this->getSimpleHTMLDOM(self::URI . 'comic/' . rawurlencode($keywords)) + or $this->returnServerError('Could not request readcomics.tv.'); + + foreach($html->find('li') as $element){ + $item = array(); + $item['uri'] = $element->find('a.ch-name', 0)->href; + $item['id'] = $item['uri']; + $item['timestamp'] = parseDateTimestamp($element); + $item['title'] = $element->find('a.ch-name', 0)->plaintext; + if(isset($item['title'])) + $this->items[] = $item; + } + } } } diff --git a/bridges/Releases3DSBridge.php b/bridges/Releases3DSBridge.php index 535ecf34..c14e576e 100644 --- a/bridges/Releases3DSBridge.php +++ b/bridges/Releases3DSBridge.php @@ -1,120 +1,136 @@ <?php class Releases3DSBridge extends BridgeAbstract { - const MAINTAINER = "ORelio"; - const NAME = "3DS Scene Releases"; - const URI = "http://www.3dsdb.com/"; + const MAINTAINER = 'ORelio'; + const NAME = '3DS Scene Releases'; + const URI = 'http://www.3dsdb.com/'; const CACHE_TIMEOUT = 10800; // 3h - const DESCRIPTION = "Returns the newest scene releases."; - - public function collectData(){ - - function ExtractFromDelimiters($string, $start, $end) { - if (strpos($string, $start) !== false) { - $section_retrieved = substr($string, strpos($string, $start) + strlen($start)); - $section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end)); - return $section_retrieved; - } return false; - } - - function TypeToString($type) { - switch ($type) { - case 1: return '3DS Game'; - case 4: return 'eShop'; - default: return '??? ('.$type.')'; - } - } - - function CardToString($card) { - switch ($card) { - case 1: return 'Regular (CARD1)'; - case 2: return 'NAND (CARD2)'; - default: return '??? ('.$card.')'; - } - } - - $dataUrl = self::URI.'xml.php'; - $xml = getContents($dataUrl) or returnServerError('Could not request 3dsdb: '.$dataUrl); - $limit = 0; - - foreach (array_reverse(explode('<release>', $xml)) as $element) { - if ($limit >= 5) { - break; - } - - if (strpos($element, '</release>') === false) { - continue; - } - - $releasename = ExtractFromDelimiters($element, '<releasename>', '</releasename>'); - if (empty($releasename)) { - continue; - } - - $id = ExtractFromDelimiters($element, '<id>', '</id>'); - $name = ExtractFromDelimiters($element, '<name>', '</name>'); - $publisher = ExtractFromDelimiters($element, '<publisher>', '</publisher>'); - $region = ExtractFromDelimiters($element, '<region>', '</region>'); - $group = ExtractFromDelimiters($element, '<group>', '</group>'); - $imagesize = ExtractFromDelimiters($element, '<imagesize>', '</imagesize>'); - $serial = ExtractFromDelimiters($element, '<serial>', '</serial>'); - $titleid = ExtractFromDelimiters($element, '<titleid>', '</titleid>'); - $imgcrc = ExtractFromDelimiters($element, '<imgcrc>', '</imgcrc>'); - $filename = ExtractFromDelimiters($element, '<filename>', '</filename>'); - $trimmedsize = ExtractFromDelimiters($element, '<trimmedsize>', '</trimmedsize>'); - $firmware = ExtractFromDelimiters($element, '<firmware>', '</firmware>'); - $type = ExtractFromDelimiters($element, '<type>', '</type>'); - $card = ExtractFromDelimiters($element, '<card>', '</card>'); - - //Retrieve cover art and short desc from IGN? - $ignResult = false; $ignDescription = ''; $ignLink = ''; $ignDate = time(); $ignCoverArt = ''; - $ignSearchUrl = 'http://www.ign.com/search?q='.urlencode($name); - if ($ignResult = getSimpleHTMLDOM($ignSearchUrl)) { - $ignCoverArt = $ignResult->find('div.search-item-media', 0)->find('img', 0)->src; - $ignDesc = $ignResult->find('div.search-item-description', 0)->plaintext; - $ignLink = $ignResult->find('div.search-item-sub-title', 0)->find('a', 1)->href; - $ignDate = strtotime(trim($ignResult->find('span.publish-date', 0)->plaintext)); - $ignDescription = '<div><img src="'.$ignCoverArt.'" /></div><div>'.$ignDesc.' <a href="'.$ignLink.'">More at IGN</a></div>'; - } - - //Main section : Release description from 3DS database - $releaseDescription = '<h3>Release Details</h3>' - .'<b>Release ID: </b>'.$id.'<br />' - .'<b>Game Name: </b>'.$name.'<br />' - .'<b>Publisher: </b>'.$publisher.'<br />' - .'<b>Region: </b>'.$region.'<br />' - .'<b>Group: </b>'.$group.'<br />' - .'<b>Image size: </b>'.(intval($imagesize)/8).'MB<br />' - .'<b>Serial: </b>'.$serial.'<br />' - .'<b>Title ID: </b>'.$titleid.'<br />' - .'<b>Image CRC: </b>'.$imgcrc.'<br />' - .'<b>File Name: </b>'.$filename.'<br />' - .'<b>Release Name: </b>'.$releasename.'<br />' - .'<b>Trimmed size: </b>'.intval(intval($trimmedsize)/1048576).'MB<br />' - .'<b>Firmware: </b>'.$firmware.'<br />' - .'<b>Type: </b>'.TypeToString($type).'<br />' - .'<b>Card: </b>'.CardToString($card).'<br />'; - - //Build search links section to facilitate release search using search engines - $releaseNameEncoded = urlencode(str_replace(' ', '+', $releasename)); - $searchLinkGoogle = 'https://google.com/?q='.$releaseNameEncoded; - $searchLinkDuckDuckGo = 'https://duckduckgo.com/?q='.$releaseNameEncoded; - $searchLinkQwant = 'https://lite.qwant.com/?q='.$releaseNameEncoded.'&t=web'; - $releaseSearchLinks = '<h3>Search this release</h3><ul>' - .'<li><a href="'.$searchLinkGoogle.'">Search using Google</a></li>' - .'<li><a href="'.$searchLinkDuckDuckGo.'">Search using DuckDuckGo</a></li>' - .'<li><a href="'.$searchLinkQwant.'">Search using Qwant</a></li>' - .'</ul>'; - - //Build and add final item with the above three sections - $item = array(); - $item['title'] = $name; - $item['author'] = $publisher; - $item['timestamp'] = $ignDate; - $item['uri'] = empty($ignLink) ? $searchLinkDuckDuckGo : $ignLink; - $item['content'] = $ignDescription.$releaseDescription.$releaseSearchLinks; - $this->items[] = $item; - $limit++; - } - } + const DESCRIPTION = 'Returns the newest scene releases.'; + + public function collectData(){ + + function extractFromDelimiters($string, $start, $end){ + if(strpos($string, $start) !== false){ + $section_retrieved = substr($string, strpos($string, $start) + strlen($start)); + $section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end)); + return $section_retrieved; + } + + return false; + } + + function typeToString($type){ + switch($type){ + case 1: return '3DS Game'; + case 4: return 'eShop'; + default: return '??? (' . $type . ')'; + } + } + + function cardToString($card){ + switch($card){ + case 1: return 'Regular (CARD1)'; + case 2: return 'NAND (CARD2)'; + default: return '??? (' . $card . ')'; + } + } + + $dataUrl = self::URI . 'xml.php'; + $xml = getContents($dataUrl) + or returnServerError('Could not request 3dsdb: ' . $dataUrl); + $limit = 0; + + foreach(array_reverse(explode('<release>', $xml)) as $element){ + if($limit >= 5){ + break; + } + + if(strpos($element, '</release>') === false){ + continue; + } + + $releasename = extractFromDelimiters($element, '<releasename>', '</releasename>'); + if(empty($releasename)){ + continue; + } + + $id = extractFromDelimiters($element, '<id>', '</id>'); + $name = extractFromDelimiters($element, '<name>', '</name>'); + $publisher = extractFromDelimiters($element, '<publisher>', '</publisher>'); + $region = extractFromDelimiters($element, '<region>', '</region>'); + $group = extractFromDelimiters($element, '<group>', '</group>'); + $imagesize = extractFromDelimiters($element, '<imagesize>', '</imagesize>'); + $serial = extractFromDelimiters($element, '<serial>', '</serial>'); + $titleid = extractFromDelimiters($element, '<titleid>', '</titleid>'); + $imgcrc = extractFromDelimiters($element, '<imgcrc>', '</imgcrc>'); + $filename = extractFromDelimiters($element, '<filename>', '</filename>'); + $trimmedsize = extractFromDelimiters($element, '<trimmedsize>', '</trimmedsize>'); + $firmware = extractFromDelimiters($element, '<firmware>', '</firmware>'); + $type = extractFromDelimiters($element, '<type>', '</type>'); + $card = extractFromDelimiters($element, '<card>', '</card>'); + + //Retrieve cover art and short desc from IGN? + $ignResult = false; + $ignDescription = ''; + $ignLink = ''; + $ignDate = time(); + $ignCoverArt = ''; + + $ignSearchUrl = 'http://www.ign.com/search?q=' . urlencode($name); + if($ignResult = getSimpleHTMLDOM($ignSearchUrl)){ + $ignCoverArt = $ignResult->find('div.search-item-media', 0)->find('img', 0)->src; + $ignDesc = $ignResult->find('div.search-item-description', 0)->plaintext; + $ignLink = $ignResult->find('div.search-item-sub-title', 0)->find('a', 1)->href; + $ignDate = strtotime(trim($ignResult->find('span.publish-date', 0)->plaintext)); + $ignDescription = '<div><img src="' + . $ignCoverArt + . '" /></div><div>' + . $ignDesc + . ' <a href="' + . $ignLink + . '">More at IGN</a></div>'; + } + + //Main section : Release description from 3DS database + $releaseDescription = '<h3>Release Details</h3><b>Release ID: </b>' . $id + . '<br /><b>Game Name: </b>' . $name + . '<br /><b>Publisher: </b>' . $publisher + . '<br /><b>Region: </b>' . $region + . '<br /><b>Group: </b>' . $group + . '<br /><b>Image size: </b>' . (intval($imagesize) / 8) + . 'MB<br /><b>Serial: </b>' . $serial + . '<br /><b>Title ID: </b>' . $titleid + . '<br /><b>Image CRC: </b>' . $imgcrc + . '<br /><b>File Name: </b>' . $filename + . '<br /><b>Release Name: </b>' . $releasename + . '<br /><b>Trimmed size: </b>' . intval(intval($trimmedsize) / 1048576) + . 'MB<br /><b>Firmware: </b>' . $firmware + . '<br /><b>Type: </b>' . typeToString($type) + . '<br /><b>Card: </b>' . cardToString($card) + . '<br />'; + + //Build search links section to facilitate release search using search engines + $releaseNameEncoded = urlencode(str_replace(' ', '+', $releasename)); + $searchLinkGoogle = 'https://google.com/?q=' . $releaseNameEncoded; + $searchLinkDuckDuckGo = 'https://duckduckgo.com/?q=' . $releaseNameEncoded; + $searchLinkQwant = 'https://lite.qwant.com/?q=' . $releaseNameEncoded . '&t=web'; + $releaseSearchLinks = '<h3>Search this release</h3><ul><li><a href="' + . $searchLinkGoogle + . '">Search using Google</a></li><li><a href="' + . $searchLinkDuckDuckGo + . '">Search using DuckDuckGo</a></li><li><a href="' + . $searchLinkQwant + . '">Search using Qwant</a></li></ul>'; + + //Build and add final item with the above three sections + $item = array(); + $item['title'] = $name; + $item['author'] = $publisher; + $item['timestamp'] = $ignDate; + $item['uri'] = empty($ignLink) ? $searchLinkDuckDuckGo : $ignLink; + $item['content'] = $ignDescription . $releaseDescription . $releaseSearchLinks; + $this->items[] = $item; + $limit++; + } + } } diff --git a/bridges/ReporterreBridge.php b/bridges/ReporterreBridge.php index be4ceee3..dff8818f 100644 --- a/bridges/ReporterreBridge.php +++ b/bridges/ReporterreBridge.php @@ -1,39 +1,44 @@ <?php -class ReporterreBridge extends BridgeAbstract{ +class ReporterreBridge extends BridgeAbstract { - const MAINTAINER = "nyutag"; - const NAME = "Reporterre Bridge"; - const URI = "http://www.reporterre.net/"; - const DESCRIPTION = "Returns the newest articles."; + const MAINTAINER = 'nyutag'; + const NAME = 'Reporterre Bridge'; + const URI = 'http://www.reporterre.net/'; + const DESCRIPTION = 'Returns the newest articles.'; - private function ExtractContentReporterre($url) { + private function extractContent($url){ $html2 = getSimpleHTMLDOM($url); - foreach($html2->find('div[style=text-align:justify]') as $e) { + foreach($html2->find('div[style=text-align:justify]') as $e){ $text = $e->outertext; } $html2->clear(); - unset ($html2); + unset($html2); // Replace all relative urls with absolute ones - $text = preg_replace('/(href|src)(\=[\"\'])(?!http)([^"\']+)/ims', "$1$2" . self::URI . "$3", $text); + $text = preg_replace( + '/(href|src)(\=[\"\'])(?!http)([^"\']+)/ims', + "$1$2" . self::URI . "$3", + $text + ); $text = strip_tags($text, '<p><br><a><img>'); return $text; } public function collectData(){ - $html = getSimpleHTMLDOM(self::URI.'spip.php?page=backend') or returnServerError('Could not request Reporterre.'); + $html = getSimpleHTMLDOM(self::URI . 'spip.php?page=backend') + or returnServerError('Could not request Reporterre.'); $limit = 0; - foreach($html->find('item') as $element) { + foreach($html->find('item') as $element){ if($limit < 5) { $item = array(); $item['title'] = html_entity_decode($element->find('title', 0)->plaintext); $item['timestamp'] = strtotime($element->find('dc:date', 0)->plaintext); $item['uri'] = $element->find('guid', 0)->innertext; - $item['content'] = html_entity_decode($this->ExtractContentReporterre($item['uri'])); + $item['content'] = html_entity_decode($this->extractContent($item['uri'])); $this->items[] = $item; $limit++; } diff --git a/bridges/Rue89Bridge.php b/bridges/Rue89Bridge.php index 400943eb..65991225 100644 --- a/bridges/Rue89Bridge.php +++ b/bridges/Rue89Bridge.php @@ -1,22 +1,25 @@ <?php class Rue89Bridge extends FeedExpander { - const MAINTAINER = "pit-fgfjiudghdf"; - const NAME = "Rue89"; - const URI = "http://rue89.nouvelobs.com/"; - const DESCRIPTION = "Returns the 5 newest posts from Rue89 (full text)"; + const MAINTAINER = 'pit-fgfjiudghdf'; + const NAME = 'Rue89'; + const URI = 'http://rue89.nouvelobs.com/'; + const DESCRIPTION = 'Returns the 5 newest posts from Rue89 (full text)'; protected function parseItem($item){ $item = parent::parseItem($item); - $url = "http://api.rue89.nouvelobs.com/export/mobile2/node/" . str_replace(" ", "", substr($item['uri'], -8)) . "/full"; + $url = "http://api.rue89.nouvelobs.com/export/mobile2/node/" + . str_replace(" ", "", substr($item['uri'], -8)) + . "/full"; + $datas = json_decode(getContents($url), true); $item['content'] = $datas['node']['body']; return $item; } - public function collectData(){ + public function collectData(){ $this->collectExpandableDatas('http://api.rue89.nouvelobs.com/feed'); - } + } } diff --git a/bridges/Rule34Bridge.php b/bridges/Rule34Bridge.php index 62a9e105..b46ec00a 100644 --- a/bridges/Rule34Bridge.php +++ b/bridges/Rule34Bridge.php @@ -1,12 +1,12 @@ <?php require_once('GelbooruBridge.php'); -class Rule34Bridge extends GelbooruBridge{ +class Rule34Bridge extends GelbooruBridge { - const MAINTAINER = "mitsukarenai"; - const NAME = "Rule34"; - const URI = "http://rule34.xxx/"; - const DESCRIPTION = "Returns images from given page"; + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Rule34'; + const URI = 'http://rule34.xxx/'; + const DESCRIPTION = 'Returns images from given page'; - const PIDBYPAGE=50; + const PIDBYPAGE = 50; } diff --git a/bridges/Rule34pahealBridge.php b/bridges/Rule34pahealBridge.php index abba0b6f..1a746162 100644 --- a/bridges/Rule34pahealBridge.php +++ b/bridges/Rule34pahealBridge.php @@ -1,10 +1,10 @@ <?php require_once('Shimmie2Bridge.php'); -class Rule34pahealBridge extends Shimmie2Bridge{ +class Rule34pahealBridge extends Shimmie2Bridge { - const MAINTAINER = "mitsukarenai"; - const NAME = "Rule34paheal"; - const URI = "http://rule34.paheal.net/"; - const DESCRIPTION = "Returns images from given page"; + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Rule34paheal'; + const URI = 'http://rule34.paheal.net/'; + const DESCRIPTION = 'Returns images from given page'; } diff --git a/bridges/SafebooruBridge.php b/bridges/SafebooruBridge.php index ea1c0043..d95e5572 100644 --- a/bridges/SafebooruBridge.php +++ b/bridges/SafebooruBridge.php @@ -1,12 +1,12 @@ <?php require_once('GelbooruBridge.php'); -class SafebooruBridge extends GelbooruBridge{ +class SafebooruBridge extends GelbooruBridge { - const MAINTAINER = "mitsukarenai"; - const NAME = "Safebooru"; - const URI = "http://safebooru.org/"; - const DESCRIPTION = "Returns images from given page"; + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Safebooru'; + const URI = 'http://safebooru.org/'; + const DESCRIPTION = 'Returns images from given page'; - const PIDBYPAGE=40; + const PIDBYPAGE = 40; } diff --git a/bridges/SakugabooruBridge.php b/bridges/SakugabooruBridge.php index 11c56036..1d6cee0a 100644 --- a/bridges/SakugabooruBridge.php +++ b/bridges/SakugabooruBridge.php @@ -1,11 +1,11 @@ <?php require_once('MoebooruBridge.php'); -class SakugabooruBridge extends MoebooruBridge{ +class SakugabooruBridge extends MoebooruBridge { - const MAINTAINER = "mitsukarenai"; - const NAME = "Sakugabooru"; - const URI = "http://sakuga.yshi.org/"; - const DESCRIPTION = "Returns images from given page"; + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Sakugabooru'; + const URI = 'http://sakuga.yshi.org/'; + const DESCRIPTION = 'Returns images from given page'; } diff --git a/bridges/ScmbBridge.php b/bridges/ScmbBridge.php index 556f4904..aefd29ff 100644 --- a/bridges/ScmbBridge.php +++ b/bridges/ScmbBridge.php @@ -1,37 +1,39 @@ <?php -class ScmbBridge extends BridgeAbstract{ +class ScmbBridge extends BridgeAbstract { - const MAINTAINER = "Astalaseven"; - const NAME = "Se Coucher Moins Bête Bridge"; - const URI = "http://secouchermoinsbete.fr"; + const MAINTAINER = 'Astalaseven'; + const NAME = 'Se Coucher Moins Bête Bridge'; + const URI = 'http://secouchermoinsbete.fr'; const CACHE_TIMEOUT = 21600; // 6h - const DESCRIPTION = "Returns the newest anecdotes."; + const DESCRIPTION = 'Returns the newest anecdotes.'; - public function collectData(){ - $html = ''; - $html = getSimpleHTMLDOM(self::URI) - or returnServerError('Could not request Se Coucher Moins Bete.'); + public function collectData(){ + $html = ''; + $html = getSimpleHTMLDOM(self::URI) + or returnServerError('Could not request Se Coucher Moins Bete.'); - foreach($html->find('article') as $article) { - $item = array(); - $item['uri'] = self::URI.$article->find('p.summary a',0)->href; - $item['title'] = $article->find('header h1 a',0)->innertext; + foreach($html->find('article') as $article){ + $item = array(); + $item['uri'] = self::URI . $article->find('p.summary a', 0)->href; + $item['title'] = $article->find('header h1 a', 0)->innertext; - $article->find('span.read-more',0)->outertext=''; // remove text "En savoir plus" from anecdote content - $content = $article->find('p.summary a',0)->innertext; - $content =substr($content,0,strlen($content)-17); // remove superfluous spaces at the end + // remove text "En savoir plus" from anecdote content + $article->find('span.read-more', 0)->outertext = ''; + $content = $article->find('p.summary a', 0)->innertext; + + // remove superfluous spaces at the end + $content = substr($content, 0, strlen($content) - 17); // get publication date - $str_date = $article->find('time',0)->datetime; + $str_date = $article->find('time', 0)->datetime; list($date, $time) = explode(' ', $str_date); list($y, $m, $d) = explode('-', $date); list($h, $i) = explode(':', $time); - $timestamp = mktime($h,$i,0,$m,$d,$y); + $timestamp = mktime($h, $i, 0, $m, $d, $y); $item['timestamp'] = $timestamp; - $item['content'] = $content; $this->items[] = $item; } - } + } } diff --git a/bridges/ScoopItBridge.php b/bridges/ScoopItBridge.php index 999519b5..462e7e56 100644 --- a/bridges/ScoopItBridge.php +++ b/bridges/ScoopItBridge.php @@ -1,33 +1,42 @@ <?php -class ScoopItBridge extends BridgeAbstract{ +class ScoopItBridge extends BridgeAbstract { - const MAINTAINER = "Pitchoule"; - const NAME = "ScoopIt"; - const URI = "http://www.scoop.it/"; + const MAINTAINER = 'Pitchoule'; + const NAME = 'ScoopIt'; + const URI = 'http://www.scoop.it/'; const CACHE_TIMEOUT = 21600; // 6h - const DESCRIPTION = "Returns most recent results from ScoopIt."; + const DESCRIPTION = 'Returns most recent results from ScoopIt.'; - const PARAMETERS = array( array( - 'u'=>array( - 'name'=>'keyword', - 'required'=>true - ) - )); + const PARAMETERS = array( array( + 'u' => array( + 'name' => 'keyword', + 'required' => true + ) + )); - public function collectData(){ - $this->request = $this->getInput('u'); - $link = self::URI.'search?q=' .urlencode($this->getInput('u')); + public function collectData(){ + $this->request = $this->getInput('u'); + $link = self::URI . 'search?q=' . urlencode($this->getInput('u')); - $html = getSimpleHTMLDOM($link) - or returnServerError('Could not request ScoopIt. for : ' . $link); + $html = getSimpleHTMLDOM($link) + or returnServerError('Could not request ScoopIt. for : ' . $link); - foreach($html->find('div.post-view') as $element) { - $item = array(); - $item['uri'] = $element->find('a', 0)->href; - $item['title'] = preg_replace('~[[:cntrl:]]~', '', $element->find('div.tCustomization_post_title',0)->plaintext); - $item['content'] = preg_replace('~[[:cntrl:]]~', '', $element->find('div.tCustomization_post_description', 0)->plaintext); - $this->items[] = $item; - } - } -} + foreach($html->find('div.post-view') as $element){ + $item = array(); + $item['uri'] = $element->find('a', 0)->href; + $item['title'] = preg_replace( + '~[[:cntrl:]]~', + '', + $element->find('div.tCustomization_post_title',0)->plaintext + ); + + $item['content'] = preg_replace( + '~[[:cntrl:]]~', + '', + $element->find('div.tCustomization_post_description', 0)->plaintext + ); + $this->items[] = $item; + } + } +} diff --git a/bridges/SensCritiqueBridge.php b/bridges/SensCritiqueBridge.php index 3daee27e..d8ba094d 100644 --- a/bridges/SensCritiqueBridge.php +++ b/bridges/SensCritiqueBridge.php @@ -1,78 +1,97 @@ <?php class SensCritiqueBridge extends BridgeAbstract { - const MAINTAINER = "kranack"; - const NAME = "Sens Critique"; - const URI = "http://www.senscritique.com/"; + const MAINTAINER = 'kranack'; + const NAME = 'Sens Critique'; + const URI = 'http://www.senscritique.com/'; const CACHE_TIMEOUT = 21600; // 6h - const DESCRIPTION = "Sens Critique news"; + const DESCRIPTION = 'Sens Critique news'; - const PARAMETERS = array( array( - 'm'=>array( - 'name'=>'Movies', - 'type'=>'checkbox' - ), - 's'=>array( - 'name'=>'Series', - 'type'=>'checkbox' - ), - 'g'=>array( - 'name'=>'Video Games', - 'type'=>'checkbox' - ), - 'b'=>array( - 'name'=>'Books', - 'type'=>'checkbox' - ), - 'bd'=>array( - 'name'=>'BD', - 'type'=>'checkbox' - ), - 'mu'=>array( - 'name'=>'Music', - 'type'=>'checkbox' - ) - )); + const PARAMETERS = array( array( + 'm' => array( + 'name' => 'Movies', + 'type' => 'checkbox' + ), + 's' => array( + 'name' => 'Series', + 'type' => 'checkbox' + ), + 'g' => array( + 'name' => 'Video Games', + 'type' => 'checkbox' + ), + 'b' => array( + 'name' => 'Books', + 'type' => 'checkbox' + ), + 'bd' => array( + 'name' => 'BD', + 'type' => 'checkbox' + ), + 'mu' => array( + 'name' => 'Music', + 'type' => 'checkbox' + ) + )); public function collectData(){ - $categories=array(); - foreach(self::PARAMETERS[$this->queriedContext] as $category=>$properties){ - if($this->getInput($category)){ - $uri=self::URI; - switch($category){ - case 'm': $uri.='films/cette-semaine'; break; - case 's': $uri.='series/actualite'; break; - case 'g': $uri.='jeuxvideo/actualite'; break; - case 'b': $uri.='livres/actualite'; break; - case 'bd': $uri.='bd/actualite'; break; - case 'mu': $uri.='musique/actualite'; break; - } - $html = getSimpleHTMLDOM($uri) - or returnServerError('No results for this query.'); - $list = $html->find('ul.elpr-list', 0); + $categories = array(); + foreach(self::PARAMETERS[$this->queriedContext] as $category => $properties){ + if($this->getInput($category)){ + $uri = self::URI; + switch($category){ + case 'm': $uri .= 'films/cette-semaine'; + break; + case 's': $uri .= 'series/actualite'; + break; + case 'g': $uri .= 'jeuxvideo/actualite'; + break; + case 'b': $uri .= 'livres/actualite'; + break; + case 'bd': $uri .= 'bd/actualite'; + break; + case 'mu': $uri .= 'musique/actualite'; + break; + } + $html = getSimpleHTMLDOM($uri) + or returnServerError('No results for this query.'); + $list = $html->find('ul.elpr-list', 0); - $this->extractDataFromList($list); - } - } - } + $this->extractDataFromList($list); + } + } + } - private function extractDataFromList($list) { - if ($list === null) { + private function extractDataFromList($list){ + if($list === null){ returnClientError('Cannot extract data from list'); } - foreach ($list->find('li') as $movie) { - $item = array(); - $item['author'] = htmlspecialchars_decode($movie->find('.elco-title a', 0)->plaintext, ENT_QUOTES) . ' ' . $movie->find('.elco-date', 0)->plaintext; - $item['title'] = $movie->find('.elco-title a', 0)->plaintext . ' ' . $movie->find('.elco-date', 0)->plaintext; - $item['content'] = '<em>' . $movie->find('.elco-original-title', 0)->plaintext . '</em><br><br>' . - $movie->find('.elco-baseline', 0)->plaintext . '<br>' . - $movie->find('.elco-baseline', 1)->plaintext . '<br><br>' . - $movie->find('.elco-description', 0)->plaintext . '<br><br>' . - trim($movie->find('.erra-ratings .erra-global', 0)->plaintext) . ' / 10'; - $item['id'] = $this->getURI() . $movie->find('.elco-title a', 0)->href; - $item['uri'] = $this->getURI() . $movie->find('.elco-title a', 0)->href; - $this->items[] = $item; + foreach($list->find('li') as $movie){ + $item = array(); + $item['author'] = htmlspecialchars_decode($movie->find('.elco-title a', 0)->plaintext, ENT_QUOTES) + . ' ' + . $movie->find('.elco-date', 0)->plaintext; + + $item['title'] = $movie->find('.elco-title a', 0)->plaintext + . ' ' + . $movie->find('.elco-date', 0)->plaintext; + + $item['content'] = '<em>' + . $movie->find('.elco-original-title', 0)->plaintext + . '</em><br><br>' + . $movie->find('.elco-baseline', 0)->plaintext + . '<br>' + . $movie->find('.elco-baseline', 1)->plaintext + . '<br><br>' + . $movie->find('.elco-description', 0)->plaintext + . '<br><br>' + . trim($movie->find('.erra-ratings .erra-global', 0)->plaintext) + . ' / 10'; + + $item['id'] = $this->getURI() . $movie->find('.elco-title a', 0)->href; + $item['uri'] = $this->getURI() . $movie->find('.elco-title a', 0)->href; + $this->items[] = $item; } } } diff --git a/bridges/SexactuBridge.php b/bridges/SexactuBridge.php index 4265d3a0..6dd04781 100644 --- a/bridges/SexactuBridge.php +++ b/bridges/SexactuBridge.php @@ -1,75 +1,99 @@ <?php -class SexactuBridge extends BridgeAbstract{ +class SexactuBridge extends BridgeAbstract { - const MAINTAINER = "Riduidel"; - const NAME = "Sexactu"; - const URI = "https://www.gqmagazine.fr"; + const MAINTAINER = 'Riduidel'; + const NAME = 'Sexactu'; + const URI = 'https://www.gqmagazine.fr'; const CACHE_TIMEOUT = 7200; // 2h - const DESCRIPTION = "Sexactu via rss-bridge"; + const DESCRIPTION = 'Sexactu via rss-bridge'; - public function collectData(){ -$find = array('janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'novembre', 'décembre'); -$replace = array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); + public function collectData(){ + $find = array( + 'janvier', + 'février', + 'mars', + 'avril', + 'mai', + 'juin', + 'juillet', + 'août', + 'septembre', + 'novembre', + 'décembre' + ); - $html = getSimpleHTMLDOM($this->getURI()) or returnServerError('Could not request '.$this->getURI()); + $replace = array( + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December' + ); - foreach($html->find('.content-holder') as $contentHolder) { - // only use first list as second one only contains pages numbers - $articles = $contentHolder->find('ul', 0); - foreach($articles->find('li') as $element) { - // if you ask about that method_exists, there seems to be a bug in simple html dom - // see stackoverflow for more details : http://stackoverflow.com/a/10828479/15619 - if(is_object($element)) { - $item = array(); - // various metadata - $titleBlock = $element->find('.title-holder', 0); - if(is_object($titleBlock)) { - $titleDetails = $titleBlock->find('.article-title',0); - $titleData = $titleDetails->find('h2', 0)->find('a',0); - $titleTimestamp =$titleDetails->find('h4',0); - $item['title'] = $this->correctCase(trim($titleData->innertext)); - $item['uri'] = self::URI.$titleData->href; + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Could not request ' . $this->getURI()); - // Fugly date parsing due to the fact my DNS-323 doesn't support php intl extension - $dateText = $titleTimestamp->innertext; - $dateText = substr($dateText, strpos($dateText,',')+1); - $dateText = str_replace($find, $replace, strtolower($dateText)); - $date = strtotime($dateText); - $item['timestamp'] = $date; + foreach($html->find('.content-holder') as $contentHolder){ + // only use first list as second one only contains pages numbers + $articles = $contentHolder->find('ul', 0); + foreach($articles->find('li') as $element){ + // if you ask about that method_exists, there seems to be a bug in simple html dom + // see stackoverflow for more details : http://stackoverflow.com/a/10828479/15619 + if(is_object($element)){ + $item = array(); + // various metadata + $titleBlock = $element->find('.title-holder', 0); + if(is_object($titleBlock)){ + $titleDetails = $titleBlock->find('.article-title', 0); + $titleData = $titleDetails->find('h2', 0)->find('a', 0); + $titleTimestamp = $titleDetails->find('h4', 0); + $item['title'] = $this->correctCase(trim($titleData->innertext)); + $item['uri'] = self::URI . $titleData->href; - $item['author'] = "Maïa Mazaurette"; - $elementText = $element->find('.text-container', 0); - // don't forget to replace images server url with gq one - foreach($elementText->find('img') as $image) { - $image->src = self::URI.$image->src; - } - $item['content'] = $elementText->innertext; - $this->items[] = $item; - } + // Fugly date parsing due to the fact my DNS-323 doesn't support php intl extension + $dateText = $titleTimestamp->innertext; + $dateText = substr($dateText, strpos($dateText, ',') + 1); + $dateText = str_replace($find, $replace, strtolower($dateText)); + $date = strtotime($dateText); + $item['timestamp'] = $date; - } + $item['author'] = 'Maïa Mazaurette'; + $elementText = $element->find('.text-container', 0); + // don't forget to replace images server url with gq one + foreach($elementText->find('img') as $image){ + $image->src = self::URI . $image->src; + } + $item['content'] = $elementText->innertext; + $this->items[] = $item; + } + } + } + } + } - } - } - } + public function getURI(){ + return self::URI . '/sexactu'; + } - public function getURI(){ - return self::URI.'/sexactu'; - } + private function correctCase($str){ + $sentences = explode('.', mb_strtolower($str, 'UTF-8')); + $str = ''; + $sep = ''; + foreach ($sentences as $sentence){ + //upper case first char + $sentence = ucfirst(trim($sentence)); - private function correctCase($str) { - $sentences=explode('.', mb_strtolower($str, "UTF-8")); - $str=""; - $sep=""; - foreach ($sentences as $sentence) - { - //upper case first char - $sentence=ucfirst(trim($sentence)); - - //append sentence to output - $str=$str.$sep.$sentence; - $sep=". "; - } - return $str; - } + //append sentence to output + $str = $str . $sep . $sentence; + $sep = '. '; + } + return $str; + } } diff --git a/bridges/ShanaprojectBridge.php b/bridges/ShanaprojectBridge.php index 7439d785..d5fda9f5 100644 --- a/bridges/ShanaprojectBridge.php +++ b/bridges/ShanaprojectBridge.php @@ -1,109 +1,123 @@ <?php class ShanaprojectBridge extends BridgeAbstract { - const MAINTAINER = 'logmanoriginal'; - const NAME = 'Shanaproject Bridge'; - const URI = 'http://www.shanaproject.com'; - const DESCRIPTION = 'Returns a list of anime from the current Season Anime List'; - - // Returns an html object for the Season Anime List (latest season) - private function LoadSeasonAnimeList(){ - // First we need to find the URI to the latest season from the 'seasons' page searching for 'Season Anime List' - $html = getSimpleHTMLDOM($this->getURI() . '/seasons'); - if(!$html) - returnServerError('Could not load \'seasons\' page!'); - - $season = $html->find('div.follows_menu/a', 1); - if(!$season) - returnServerError('Could not find \'Season Anime List\'!'); - - $html = getSimpleHTMLDOM($this->getURI() . $season->href); - if(!$html) - returnServerError('Could not load \'Season Anime List\' from \'' . $season->innertext . '\'!'); - - return $html; - } - - // Extracts the anime title - private function ExtractAnimeTitle($anime){ - $title = $anime->find('a', 0); - if(!$title) - returnServerError('Could not find anime title!'); - return trim($title->innertext); - } - - // Extracts the anime URI - private function ExtractAnimeURI($anime){ - $uri = $anime->find('a', 0); - if(!$uri) - returnServerError('Could not find anime URI!'); - return $this->getURI() . $uri->href; - } - - // Extracts the anime release date (timestamp) - private function ExtractAnimeTimestamp($anime){ - $timestamp = $anime->find('span.header_info_block', 1); - if(!$timestamp) - returnServerError('Could not find anime timestamp!'); - return strtotime($timestamp->innertext); - } - - // Extracts the anime studio name (author) - private function ExtractAnimeAuthor($anime){ - $author = $anime->find('span.header_info_block', 2); - if(!$author) - return; // Sometimes the studio is unknown, so leave empty - return trim($author->innertext); - } - - // Extracts the episode information (x of y released) - private function ExtractAnimeEpisodeInformation($anime){ - $episode = $anime->find('div.header_info_episode', 0); - if(!$episode) - returnServerError('Could not find anime episode information!'); - return preg_replace('/\r|\n/', ' ', $episode->plaintext); - } - - // Extracts the background image - private function ExtractAnimeBackgroundImage($anime){ - // Getting the picture is a little bit tricky as it is part of the style. - // Luckily the style is part of the parent div :) - - if(preg_match("/url\(\/\/([^\)]+)\)/i", $anime->parent->style, $matches)) - return $matches[1]; - - returnServerError('Could not extract background image!'); - } - - // Builds an URI to search for a specific anime (subber is left empty) - private function BuildAnimeSearchURI($anime){ - return $this->getURI() . '/search/?title=' . urlencode($this->ExtractAnimeTitle($anime)) . '&subber='; - } - - // Builds the content string for a given anime - private function BuildAnimeContent($anime){ - // We'll use a template string to place our contents - return '<a href="' . $this->ExtractAnimeURI($anime) . '"> - <img src="http://' . $this->ExtractAnimeBackgroundImage($anime) . '" alt="' . htmlspecialchars($this->ExtractAnimeTitle($anime)) . '" style="border: 1px solid black"> - </a><br> - <p>' . $this->ExtractAnimeEpisodeInformation($anime) . '</p><br> - <p><a href="' . $this->BuildAnimeSearchURI($anime) . '">Search episodes</a></p>'; - } - - public function collectData(){ - $html = $this->LoadSeasonAnimeList(); - - $animes = $html->find('div.header_display_box_info'); - if(!$animes) - returnServerError('Could not find anime headers!'); - - foreach($animes as $anime){ - $item = array(); - $item['title'] = $this->ExtractAnimeTitle($anime); - $item['author'] = $this->ExtractAnimeAuthor($anime); - $item['uri'] = $this->ExtractAnimeURI($anime); - $item['timestamp'] = $this->ExtractAnimeTimestamp($anime); - $item['content'] = $this->BuildAnimeContent($anime); - $this->items[] = $item; - } - } + const MAINTAINER = 'logmanoriginal'; + const NAME = 'Shanaproject Bridge'; + const URI = 'http://www.shanaproject.com'; + const DESCRIPTION = 'Returns a list of anime from the current Season Anime List'; + + // Returns an html object for the Season Anime List (latest season) + private function loadSeasonAnimeList(){ + // First we need to find the URI to the latest season from the + // 'seasons' page searching for 'Season Anime List' + $html = getSimpleHTMLDOM($this->getURI() . '/seasons'); + if(!$html) + returnServerError('Could not load \'seasons\' page!'); + + $season = $html->find('div.follows_menu/a', 1); + if(!$season) + returnServerError('Could not find \'Season Anime List\'!'); + + $html = getSimpleHTMLDOM($this->getURI() . $season->href); + if(!$html) + returnServerError( + 'Could not load \'Season Anime List\' from \'' + . $season->innertext + . '\'!' + ); + + return $html; + } + + // Extracts the anime title + private function extractAnimeTitle($anime){ + $title = $anime->find('a', 0); + if(!$title) + returnServerError('Could not find anime title!'); + return trim($title->innertext); + } + + // Extracts the anime URI + private function extractAnimeUri($anime){ + $uri = $anime->find('a', 0); + if(!$uri) + returnServerError('Could not find anime URI!'); + return $this->getURI() . $uri->href; + } + + // Extracts the anime release date (timestamp) + private function extractAnimeTimestamp($anime){ + $timestamp = $anime->find('span.header_info_block', 1); + if(!$timestamp) + returnServerError('Could not find anime timestamp!'); + return strtotime($timestamp->innertext); + } + + // Extracts the anime studio name (author) + private function extractAnimeAuthor($anime){ + $author = $anime->find('span.header_info_block', 2); + if(!$author) + return; // Sometimes the studio is unknown, so leave empty + return trim($author->innertext); + } + + // Extracts the episode information (x of y released) + private function extractAnimeEpisodeInformation($anime){ + $episode = $anime->find('div.header_info_episode', 0); + if(!$episode) + returnServerError('Could not find anime episode information!'); + return preg_replace('/\r|\n/', ' ', $episode->plaintext); + } + + // Extracts the background image + private function extractAnimeBackgroundImage($anime){ + // Getting the picture is a little bit tricky as it is part of the style. + // Luckily the style is part of the parent div :) + + if(preg_match("/url\(\/\/([^\)]+)\)/i", $anime->parent->style, $matches)) + return $matches[1]; + + returnServerError('Could not extract background image!'); + } + + // Builds an URI to search for a specific anime (subber is left empty) + private function buildAnimeSearchUri($anime){ + return $this->getURI() + . '/search/?title=' + . urlencode($this->extractAnimeTitle($anime)) + . '&subber='; + } + + // Builds the content string for a given anime + private function buildAnimeContent($anime){ + // We'll use a template string to place our contents + return '<a href="' + . $this->extractAnimeUri($anime) + . '"><img src="http://' + . $this->extractAnimeBackgroundImage($anime) + . '" alt="' + . htmlspecialchars($this->extractAnimeTitle($anime)) + . '" style="border: 1px solid black"></a><br><p>' + . $this->extractAnimeEpisodeInformation($anime) + . '</p><br><p><a href="' + . $this->buildAnimeSearchUri($anime) + . '">Search episodes</a></p>'; + } + + public function collectData(){ + $html = $this->loadSeasonAnimeList(); + + $animes = $html->find('div.header_display_box_info'); + if(!$animes) + returnServerError('Could not find anime headers!'); + + foreach($animes as $anime){ + $item = array(); + $item['title'] = $this->extractAnimeTitle($anime); + $item['author'] = $this->extractAnimeAuthor($anime); + $item['uri'] = $this->extractAnimeUri($anime); + $item['timestamp'] = $this->extractAnimeTimestamp($anime); + $item['content'] = $this->buildAnimeContent($anime); + $this->items[] = $item; + } + } } diff --git a/bridges/Shimmie2Bridge.php b/bridges/Shimmie2Bridge.php index 80a242ae..efbcd9b7 100644 --- a/bridges/Shimmie2Bridge.php +++ b/bridges/Shimmie2Bridge.php @@ -1,31 +1,39 @@ <?php require_once('DanbooruBridge.php'); -class Shimmie2Bridge extends DanbooruBridge{ +class Shimmie2Bridge extends DanbooruBridge { - const NAME = "Shimmie v2"; - const URI = "http://shimmie.shishnet.org/v2/"; - const DESCRIPTION = "Returns images from given page"; + const NAME = 'Shimmie v2'; + const URI = 'http://shimmie.shishnet.org/v2/'; + const DESCRIPTION = 'Returns images from given page'; - const PATHTODATA='.shm-thumb-link'; - const IDATTRIBUTE='data-post-id'; + const PATHTODATA = '.shm-thumb-link'; + const IDATTRIBUTE = 'data-post-id'; - protected function getFullURI(){ - return $this->getURI().'post/list/' - .$this->getInput('t').'/' - .$this->getInput('p'); - } + protected function getFullURI(){ + return $this->getURI() + . 'post/list/' + . $this->getInput('t') + . '/' + . $this->getInput('p'); + } - protected function getItemFromElement($element){ - $item = array(); - $item['uri'] = $this->getURI().$element->href; - $item['id'] = (int)preg_replace("/[^0-9]/",'', $element->getAttribute(static::IDATTRIBUTE)); - $item['timestamp'] = time(); - $thumbnailUri = $this->getURI().$element->find('img', 0)->src; - $item['tags'] = $element->getAttribute('data-tags'); - $item['title'] = $this->getName().' | '.$item['id']; - $item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $thumbnailUri . '" /></a><br>Tags: '.$item['tags']; - return $item; - } + protected function getItemFromElement($element){ + $item = array(); + $item['uri'] = $this->getURI() . $element->href; + $item['id'] = (int)preg_replace("/[^0-9]/", '', $element->getAttribute(static::IDATTRIBUTE)); + $item['timestamp'] = time(); + $thumbnailUri = $this->getURI() . $element->find('img', 0)->src; + $item['tags'] = $element->getAttribute('data-tags'); + $item['title'] = $this->getName() . ' | ' . $item['id']; + $item['content'] = '<a href="' + . $item['uri'] + . '"><img src="' + . $thumbnailUri + . '" /></a><br>Tags: ' + . $item['tags']; + + return $item; + } } diff --git a/bridges/SoundcloudBridge.php b/bridges/SoundcloudBridge.php index 7f7da37e..cb4ba915 100644 --- a/bridges/SoundcloudBridge.php +++ b/bridges/SoundcloudBridge.php @@ -1,50 +1,60 @@ <?php -class SoundCloudBridge extends BridgeAbstract{ +class SoundCloudBridge extends BridgeAbstract { - const MAINTAINER = "kranack"; - const NAME = "Soundcloud Bridge"; - const URI = "https://soundcloud.com/"; + const MAINTAINER = 'kranack'; + const NAME = 'Soundcloud Bridge'; + const URI = 'https://soundcloud.com/'; const CACHE_TIMEOUT = 600; // 10min - const DESCRIPTION = "Returns 10 newest music from user profile"; + const DESCRIPTION = 'Returns 10 newest music from user profile'; - const PARAMETERS = array( array( - 'u'=>array( - 'name'=>'username', - 'required'=>true - ) - )); + const PARAMETERS = array( array( + 'u' => array( + 'name' => 'username', + 'required' => true + ) + )); - const CLIENT_ID = '0aca19eae3843844e4053c6d8fdb7875'; + const CLIENT_ID = '0aca19eae3843844e4053c6d8fdb7875'; public function collectData(){ - $res = json_decode(getContents( - 'https://api.soundcloud.com/resolve?url=http://www.soundcloud.com/' - . urlencode($this->getInput('u')) - .'&client_id=' . self::CLIENT_ID - )) or returnServerError('No results for this query'); - $tracks = json_decode(getContents( - 'https://api.soundcloud.com/users/' - . urlencode($res->id) - .'/tracks?client_id=' . self::CLIENT_ID - )) or returnServerError('No results for this user'); - - for ($i=0; $i < 10; $i++) { - $item = array(); - $item['author'] = $tracks[$i]->user->username .' - '. $tracks[$i]->title; - $item['title'] = $tracks[$i]->user->username .' - '. $tracks[$i]->title; - $item['content'] = '<audio src="'. $tracks[$i]->uri .'/stream?client_id='. self::CLIENT_ID .'">'; - $item['id'] = self::URI - . urlencode($this->getInput('u')) .'/' - . urlencode($tracks[$i]->permalink); - $item['uri'] = self::URI - . urlencode($this->getInput('u')) .'/' - . urlencode($tracks[$i]->permalink); - $this->items[] = $item; + $res = json_decode(getContents( + 'https://api.soundcloud.com/resolve?url=http://www.soundcloud.com/' + . urlencode($this->getInput('u')) + . '&client_id=' + . self::CLIENT_ID + )) or returnServerError('No results for this query'); + + $tracks = json_decode(getContents( + 'https://api.soundcloud.com/users/' + . urlencode($res->id) + . '/tracks?client_id=' + . self::CLIENT_ID + )) or returnServerError('No results for this user'); + + for($i = 0; $i < 10; $i++){ + $item = array(); + $item['author'] = $tracks[$i]->user->username . ' - ' . $tracks[$i]->title; + $item['title'] = $tracks[$i]->user->username . ' - ' . $tracks[$i]->title; + $item['content'] = '<audio src="' + . $tracks[$i]->uri + . '/stream?client_id=' + . self::CLIENT_ID + . '">'; + + $item['id'] = self::URI + . urlencode($this->getInput('u')) + . '/' + . urlencode($tracks[$i]->permalink); + $item['uri'] = self::URI + . urlencode($this->getInput('u')) + . '/' + . urlencode($tracks[$i]->permalink); + $this->items[] = $item; } - } + } public function getName(){ - return self::NAME .' - '. $this->getInput('u'); + return self::NAME . ' - ' . $this->getInput('u'); } } diff --git a/bridges/StripeAPIChangeLogBridge.php b/bridges/StripeAPIChangeLogBridge.php index 330af9ff..721b46ad 100644 --- a/bridges/StripeAPIChangeLogBridge.php +++ b/bridges/StripeAPIChangeLogBridge.php @@ -1,24 +1,23 @@ <?php -class StripeAPIChangeLogBridge extends BridgeAbstract{ - const MAINTAINER = 'Pierre Mazière'; - const NAME = 'Stripe API Changelog'; - const URI = 'https://stripe.com/docs/upgrades'; - const CACHE_TIMEOUT = 86400; // 24h - const DESCRIPTION = 'Returns the changes made to the stripe.com API'; +class StripeAPIChangeLogBridge extends BridgeAbstract { + const MAINTAINER = 'Pierre Mazière'; + const NAME = 'Stripe API Changelog'; + const URI = 'https://stripe.com/docs/upgrades'; + const CACHE_TIMEOUT = 86400; // 24h + const DESCRIPTION = 'Returns the changes made to the stripe.com API'; - public function collectData(){ - $html = getSimpleHTMLDOM(self::URI) - or returnServerError('No results for Stripe API Changelog'); + public function collectData(){ + $html = getSimpleHTMLDOM(self::URI) + or returnServerError('No results for Stripe API Changelog'); - - foreach($html->find('h3') as $change){ - $item=array(); - $item['title']=trim($change->plaintext); - $item['uri']=self::URI.'#'.$item['title']; - $item['author']='stripe'; - $item['content']=$change->nextSibling()->outertext; - $item['timestamp']=strtotime($item['title']); - $this->items[]=$item; - } - } + foreach($html->find('h3') as $change){ + $item = array(); + $item['title'] = trim($change->plaintext); + $item['uri'] = self::URI . '#' . $item['title']; + $item['author'] = 'stripe'; + $item['content'] = $change->nextSibling()->outertext; + $item['timestamp'] = strtotime($item['title']); + $this->items[] = $item; + } + } } diff --git a/bridges/SuperbWallpapersBridge.php b/bridges/SuperbWallpapersBridge.php index 056eca8b..7f7195db 100644 --- a/bridges/SuperbWallpapersBridge.php +++ b/bridges/SuperbWallpapersBridge.php @@ -1,66 +1,66 @@ <?php class SuperbWallpapersBridge extends BridgeAbstract { - const MAINTAINER = "nel50n"; - const NAME = "Superb Wallpapers Bridge"; - const URI = "http://www.superbwallpapers.com/"; + const MAINTAINER = 'nel50n'; + const NAME = 'Superb Wallpapers Bridge'; + const URI = 'http://www.superbwallpapers.com/'; const CACHE_TIMEOUT = 43200; // 12h - const DESCRIPTION = "Returns the latests wallpapers from SuperbWallpapers"; + const DESCRIPTION = 'Returns the latests wallpapers from SuperbWallpapers'; - const PARAMETERS = array( array( - 'c'=>array( - 'name'=>'category', - 'required'=>true - ), - 'm'=>array( - 'name'=>'Max number of wallpapers', - 'type'=>'number' - ), - 'r'=>array( - 'name'=>'resolution', - 'exampleValue'=>'1920x1200, 1680x1050,…', - 'defaultValue'=>'1920x1200' - ) - )); + const PARAMETERS = array( array( + 'c' => array( + 'name' => 'category', + 'required' => true + ), + 'm' => array( + 'name' => 'Max number of wallpapers', + 'type' => 'number' + ), + 'r' => array( + 'name' => 'resolution', + 'exampleValue' => '1920x1200, 1680x1050,…', + 'defaultValue' => '1920x1200' + ) + )); - public function collectData(){ - $category = $this->getInput('c'); - $resolution = $this->getInput('r'); // Wide wallpaper default + public function collectData(){ + $category = $this->getInput('c'); + $resolution = $this->getInput('r'); // Wide wallpaper default - $num = 0; - $max = $this->getInput('m') ?: 36; - $lastpage = 1; + $num = 0; + $max = $this->getInput('m') ?: 36; + $lastpage = 1; - // Get last page number - $link = self::URI.'/'.$category.'/9999.html'; - $html = getSimpleHTMLDOM($link) - or returnServerError('Could not load '.$link); + // Get last page number + $link = self::URI . '/' . $category . '/9999.html'; + $html = getSimpleHTMLDOM($link) + or returnServerError('Could not load ' . $link); - $lastpage = min($html->find('.paging .cpage', 0)->innertext(), ceil($max/36)); + $lastpage = min($html->find('.paging .cpage', 0)->innertext(), ceil($max / 36)); - for ($page = 1; $page <= $lastpage; $page++) { - $link = self::URI.'/'.$category.'/'.$page.'.html'; - $html = getSimpleHTMLDOM($link) - or returnServerError('No results for this query.'); + for($page = 1; $page <= $lastpage; $page++){ + $link = self::URI . '/' . $category . '/' . $page . '.html'; + $html = getSimpleHTMLDOM($link) + or returnServerError('No results for this query.'); - foreach($html->find('.wpl .i a') as $element) { - $thumbnail = $element->find('img', 0); + foreach($html->find('.wpl .i a') as $element){ + $thumbnail = $element->find('img', 0); - $item = array(); - $item['uri'] = str_replace('200x125', $this->resolution, $thumbnail->src); - $item['timestamp'] = time(); - $item['title'] = $element->title; - $item['content'] = $item['title'].'<br><a href="'.$item['uri'].'">'.$thumbnail.'</a>'; - $this->items[] = $item; + $item = array(); + $item['uri'] = str_replace('200x125', $this->resolution, $thumbnail->src); + $item['timestamp'] = time(); + $item['title'] = $element->title; + $item['content'] = $item['title'] . '<br><a href="' . $item['uri'] . '">' . $thumbnail . '</a>'; + $this->items[] = $item; - $num++; - if ($num >= $max) - break 2; - } - } - } + $num++; + if ($num >= $max) + break 2; + } + } + } - public function getName(){ - return self::NAME .'- '.$this->getInput('c').' ['.$this->getInput('r').']'; - } + public function getName(){ + return self::NAME . '- ' . $this->getInput('c') . ' [' . $this->getInput('r') . ']'; + } } diff --git a/bridges/T411Bridge.php b/bridges/T411Bridge.php index 720beedd..bdf33c34 100644 --- a/bridges/T411Bridge.php +++ b/bridges/T411Bridge.php @@ -1,86 +1,96 @@ <?php class T411Bridge extends BridgeAbstract { - const MAINTAINER = 'ORelio'; - const NAME = 'T411 Bridge'; - const URI = 'https://www.t411.li/'; - const DESCRIPTION = 'Returns the 10 newest torrents with specified search terms <br /> Use url part after "?" mark when using their search engine.'; - - const PARAMETERS = array( array( - 'search'=>array( - 'name'=>'Search criteria', - 'required'=>true - ) - )); - - public function collectData(){ - - //Utility function for retrieving text based on start and end delimiters - function ExtractFromDelimiters($string, $start, $end) { - if (strpos($string, $start) !== false) { - $section_retrieved = substr($string, strpos($string, $start) + strlen($start)); - $section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end)); - return $section_retrieved; - } return false; - } - - //Retrieve torrent listing from search results, which does not contain torrent description - $url = self::URI.'torrents/search/?search='.urlencode($this->getInput('search')).'&order=added&type=desc'; - $html = getSimpleHTMLDOM($url) - or returnServerError('Could not request t411: '.$url); - - $results = $html->find('table.results', 0); - if (is_null($results)) - returnServerError('No results from t411: '.$url); - $limit = 0; - - //Process each item individually - foreach ($results->find('tr') as $element) { - - //Limit total amount of requests and ignore table header - if ($limit >= 10){ - break; - } - if(is_object($element->find('th', 0))){ - continue; - } - - //Requests are rate-limited - usleep(500000); //So we need to wait (500ms) - - //Retrieve data from RSS entry - $item_uri = self::URI.'torrents/details/?id='.ExtractFromDelimiters($element->find('a.nfo', 0)->outertext, '?id=', '"'); - $item_title = ExtractFromDelimiters($element->outertext, '" title="', '"'); - $item_date = strtotime($element->find('dd', 0)->plaintext); - - //Retrieve full description from torrent page - $item_html = getSimpleHTMLDOM($item_uri); - if (!$item_html) { - continue; - } - - //Retrieve data from page contents - $item_desc = $item_html->find('div.description', 0); - $item_author = $item_html->find('a.profile', 0)->innertext; - - //Cleanup advertisments - $divs = explode('<div class="align-center">', $item_desc->innertext); - $item_desc = ''; - foreach ($divs as $text) - if (strpos($text, 'adprovider.adlure.net') === false) - $item_desc = $item_desc.'<div class="align-center">'.$text; - $item_desc = preg_replace('/<h2 class="align-center">LIENS DE T..?L..?CHARGEMENT<\/h2>/i', '', $item_desc); - - //Build and add final item - $item = array(); - $item['uri'] = $item_uri; - $item['title'] = $item_title; - $item['author'] = $item_author; - $item['timestamp'] = $item_date; - $item['content'] = $item_desc; - $this->items[] = $item; - $limit++; - } - } -} + const MAINTAINER = 'ORelio'; + const NAME = 'T411 Bridge'; + const URI = 'https://www.t411.li/'; + const DESCRIPTION = 'Returns the 10 newest torrents with specified search + terms <br /> Use url part after "?" mark when using their search engine.'; + + const PARAMETERS = array( array( + 'search' => array( + 'name' => 'Search criteria', + 'required' => true + ) + )); + + public function collectData(){ + + //Utility function for retrieving text based on start and end delimiters + function extractFromDelimiters($string, $start, $end){ + if(strpos($string, $start) !== false){ + $section_retrieved = substr($string, strpos($string, $start) + strlen($start)); + $section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end)); + return $section_retrieved; + } + + return false; + } + + //Retrieve torrent listing from search results, which does not contain torrent description + $url = self::URI + . 'torrents/search/?search=' + . urlencode($this->getInput('search')) + . '&order=added&type=desc'; + + $html = getSimpleHTMLDOM($url) + or returnServerError('Could not request t411: ' . $url); + + $results = $html->find('table.results', 0); + if (is_null($results)) + returnServerError('No results from t411: ' . $url); + $limit = 0; + + //Process each item individually + foreach($results->find('tr') as $element){ + //Limit total amount of requests and ignore table header + if($limit >= 10){ + break; + } + if(is_object($element->find('th', 0))){ + continue; + } + + //Requests are rate-limited + usleep(500000); //So we need to wait (500ms) + + //Retrieve data from RSS entry + $item_uri = self::URI + . 'torrents/details/?id=' + . extractFromDelimiters($element->find('a.nfo', 0)->outertext, '?id=', '"'); + + $item_title = extractFromDelimiters($element->outertext, '" title="', '"'); + $item_date = strtotime($element->find('dd', 0)->plaintext); + + //Retrieve full description from torrent page + $item_html = getSimpleHTMLDOM($item_uri); + if(!$item_html){ + continue; + } + + //Retrieve data from page contents + $item_desc = $item_html->find('div.description', 0); + $item_author = $item_html->find('a.profile', 0)->innertext; + + //Cleanup advertisments + $divs = explode('<div class="align-center">', $item_desc->innertext); + $item_desc = ''; + foreach ($divs as $text) + if (strpos($text, 'adprovider.adlure.net') === false) + $item_desc = $item_desc . '<div class="align-center">' . $text; + + $item_desc = preg_replace('/<h2 class="align-center">LIENS DE T..?L..?CHARGEMENT<\/h2>/i', '', $item_desc); + + //Build and add final item + $item = array(); + $item['uri'] = $item_uri; + $item['title'] = $item_title; + $item['author'] = $item_author; + $item['timestamp'] = $item_date; + $item['content'] = $item_desc; + $this->items[] = $item; + $limit++; + } + } +} diff --git a/bridges/TagBoardBridge.php b/bridges/TagBoardBridge.php index b08b728b..1845d220 100644 --- a/bridges/TagBoardBridge.php +++ b/bridges/TagBoardBridge.php @@ -1,42 +1,45 @@ <?php -class TagBoardBridge extends BridgeAbstract{ +class TagBoardBridge extends BridgeAbstract { - const MAINTAINER = "Pitchoule"; - const NAME = "TagBoard"; - const URI = "http://www.TagBoard.com/"; + const MAINTAINER = 'Pitchoule'; + const NAME = 'TagBoard'; + const URI = 'http://www.TagBoard.com/'; const CACHE_TIMEOUT = 21600; // 6h - const DESCRIPTION = "Returns most recent results from TagBoard."; + const DESCRIPTION = 'Returns most recent results from TagBoard.'; - const PARAMETERS = array( array( - 'u'=>array( - 'name'=>'keyword', - 'required'=>true - ) - )); + const PARAMETERS = array( array( + 'u' => array( + 'name' => 'keyword', + 'required' => true + ) + )); - public function collectData(){ - $link = 'https://post-cache.tagboard.com/search/' .$this->getInput('u'); + public function collectData(){ + $link = 'https://post-cache.tagboard.com/search/' . $this->getInput('u'); - $html = getSimpleHTMLDOM($link) - or returnServerError('Could not request TagBoard for : ' . $link); - $parsed_json = json_decode($html); + $html = getSimpleHTMLDOM($link) + or returnServerError('Could not request TagBoard for : ' . $link); + $parsed_json = json_decode($html); - foreach($parsed_json->{'posts'} as $element) { - $item = array(); - $item['uri'] = $element->{'permalink'}; - $item['title'] = $element->{'text'}; - $thumbnailUri = $element->{'photos'}[0]->{'m'}; - if (isset($thumbnailUri)) { - $item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $thumbnailUri . '" /></a>'; - }else{ - $item['content'] = $element->{'html'}; - } - $this->items[] = $item; - } - } + foreach($parsed_json->{'posts'} as $element){ + $item = array(); + $item['uri'] = $element->{'permalink'}; + $item['title'] = $element->{'text'}; + $thumbnailUri = $element->{'photos'}[0]->{'m'}; + if(isset($thumbnailUri)){ + $item['content'] = '<a href="' + . $item['uri'] + . '"><img src="' + . $thumbnailUri + . '" /></a>'; + } else { + $item['content'] = $element->{'html'}; + } + $this->items[] = $item; + } + } - public function getName(){ - return 'tagboard - ' .$this->getInput('u'); - } + public function getName(){ + return 'tagboard - ' . $this->getInput('u'); + } } - diff --git a/bridges/TbibBridge.php b/bridges/TbibBridge.php index d9c2119c..edb761ee 100644 --- a/bridges/TbibBridge.php +++ b/bridges/TbibBridge.php @@ -1,12 +1,12 @@ <?php require_once('GelbooruBridge.php'); -class TbibBridge extends GelbooruBridge{ +class TbibBridge extends GelbooruBridge { - const MAINTAINER = "mitsukarenai"; - const NAME = "Tbib"; - const URI = "http://tbib.org/"; - const DESCRIPTION = "Returns images from given page"; + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Tbib'; + const URI = 'http://tbib.org/'; + const DESCRIPTION = 'Returns images from given page'; - const PIDBYPAGE=50; + const PIDBYPAGE = 50; } diff --git a/bridges/TheCodingLoveBridge.php b/bridges/TheCodingLoveBridge.php index 3d1d3614..13e34019 100644 --- a/bridges/TheCodingLoveBridge.php +++ b/bridges/TheCodingLoveBridge.php @@ -1,48 +1,46 @@ <?php -class TheCodingLoveBridge extends BridgeAbstract{ +class TheCodingLoveBridge extends BridgeAbstract { - const MAINTAINER = "superbaillot.net"; - const NAME = "The Coding Love"; - const URI = "http://thecodinglove.com/"; + const MAINTAINER = 'superbaillot.net'; + const NAME = 'The Coding Love'; + const URI = 'http://thecodinglove.com/'; const CACHE_TIMEOUT = 7200; // 2h - const DESCRIPTION = "The Coding Love"; + const DESCRIPTION = 'The Coding Love'; - public function collectData(){ - $html = getSimpleHTMLDOM(self::URI) - or returnServerError('Could not request The Coding Love.'); + public function collectData(){ + $html = getSimpleHTMLDOM(self::URI) + or returnServerError('Could not request The Coding Love.'); - foreach($html->find('div.post') as $element) { - $item = array(); - $temp = $element->find('h3 a', 0); + foreach($html->find('div.post') as $element){ + $item = array(); + $temp = $element->find('h3 a', 0); - $titre = $temp->innertext; - $url = $temp->href; + $titre = $temp->innertext; + $url = $temp->href; - $temp = $element->find('div.bodytype', 0); + $temp = $element->find('div.bodytype', 0); - // retrieve .gif instead of static .jpg - $images = $temp->find('p.e img'); - foreach($images as $image){ - $img_src = str_replace(".jpg",".gif",$image->src); - $image->src = $img_src; - } - $content = $temp->innertext; + // retrieve .gif instead of static .jpg + $images = $temp->find('p.e img'); + foreach($images as $image){ + $img_src = str_replace('.jpg', '.gif', $image->src); + $image->src = $img_src; + } + $content = $temp->innertext; - $auteur = $temp->find('i', 0); - $pos = strpos($auteur->innertext, "by"); + $auteur = $temp->find('i', 0); + $pos = strpos($auteur->innertext, 'by'); - if($pos > 0) - { - $auteur = trim(str_replace("*/", "", substr($auteur->innertext, ($pos + 2)))); - $item['author'] = $auteur; - } + if($pos > 0){ + $auteur = trim(str_replace('*/', '', substr($auteur->innertext, ($pos + 2)))); + $item['author'] = $auteur; + } + $item['content'] .= trim($content); + $item['uri'] = $url; + $item['title'] = trim($titre); - $item['content'] .= trim($content); - $item['uri'] = $url; - $item['title'] = trim($titre); - - $this->items[] = $item; - } - } + $this->items[] = $item; + } + } } diff --git a/bridges/TheHackerNewsBridge.php b/bridges/TheHackerNewsBridge.php index 58f8f916..c6163b1b 100644 --- a/bridges/TheHackerNewsBridge.php +++ b/bridges/TheHackerNewsBridge.php @@ -1,71 +1,80 @@ <?php class TheHackerNewsBridge extends BridgeAbstract { - const MAINTAINER = 'ORelio'; - const NAME = 'The Hacker News Bridge'; - const URI = 'https://thehackernews.com/'; - const DESCRIPTION = 'Cyber Security, Hacking, Technology News.'; + const MAINTAINER = 'ORelio'; + const NAME = 'The Hacker News Bridge'; + const URI = 'https://thehackernews.com/'; + const DESCRIPTION = 'Cyber Security, Hacking, Technology News.'; - public function collectData(){ + public function collectData(){ - function StripWithDelimiters($string, $start, $end) { - while (strpos($string, $start) !== false) { - $section_to_remove = substr($string, strpos($string, $start)); - $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end)); - $string = str_replace($section_to_remove, '', $string); - } return $string; - } + function stripWithDelimiters($string, $start, $end){ + while(strpos($string, $start) !== false){ + $section_to_remove = substr($string, strpos($string, $start)); + $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end)); + $string = str_replace($section_to_remove, '', $string); + } - function StripRecursiveHTMLSection($string, $tag_name, $tag_start) { - $open_tag = '<'.$tag_name; - $close_tag = '</'.$tag_name.'>'; - $close_tag_length = strlen($close_tag); - if (strpos($tag_start, $open_tag) === 0) { - while (strpos($string, $tag_start) !== false) { - $max_recursion = 100; - $section_to_remove = null; - $section_start = strpos($string, $tag_start); - $search_offset = $section_start; - do { - $max_recursion--; - $section_end = strpos($string, $close_tag, $search_offset); - $search_offset = $section_end + $close_tag_length; - $section_to_remove = substr($string, $section_start, $section_end - $section_start + $close_tag_length); - $open_tag_count = substr_count($section_to_remove, $open_tag); - $close_tag_count = substr_count($section_to_remove, $close_tag); - } while ($open_tag_count > $close_tag_count && $max_recursion > 0); - $string = str_replace($section_to_remove, '', $string); - } - } - return $string; - } + return $string; + } - $html = getSimpleHTMLDOM($this->getURI()) or returnServerError('Could not request TheHackerNews: '.$this->getURI()); - $limit = 0; + function stripRecursiveHtmlSection($string, $tag_name, $tag_start){ + $open_tag = '<' . $tag_name; + $close_tag = '</' . $tag_name . '>'; + $close_tag_length = strlen($close_tag); + if(strpos($tag_start, $open_tag) === 0){ + while(strpos($string, $tag_start) !== false){ + $max_recursion = 100; + $section_to_remove = null; + $section_start = strpos($string, $tag_start); + $search_offset = $section_start; + do { + $max_recursion--; + $section_end = strpos($string, $close_tag, $search_offset); + $search_offset = $section_end + $close_tag_length; + $section_to_remove = substr( + $string, + $section_start, + $section_end - $section_start + $close_tag_length + ); - foreach ($html->find('article') as $element) { - if ($limit < 5) { + $open_tag_count = substr_count($section_to_remove, $open_tag); + $close_tag_count = substr_count($section_to_remove, $close_tag); + } while($open_tag_count > $close_tag_count && $max_recursion > 0); + $string = str_replace($section_to_remove, '', $string); + } + } + return $string; + } - $article_url = $element->find('a.entry-title', 0)->href; - $article_author = trim($element->find('span.vcard', 0)->plaintext); - $article_title = $element->find('a.entry-title', 0)->plaintext; - $article_timestamp = strtotime($element->find('span.updated', 0)->plaintext); - $article = getSimpleHTMLDOM($article_url) or returnServerError('Could not request TheHackerNews: '.$article_url); + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Could not request TheHackerNews: ' . $this->getURI()); + $limit = 0; - $contents = $article->find('div.articlebodyonly', 0)->innertext; - $contents = StripRecursiveHTMLSection($contents, 'div', '<div class=\'clear\''); - $contents = StripWithDelimiters($contents, '<script', '</script>'); + foreach($html->find('article') as $element){ + if($limit < 5){ - $item = array(); - $item['uri'] = $article_url; - $item['title'] = $article_title; - $item['author'] = $article_author; - $item['timestamp'] = $article_timestamp; - $item['content'] = trim($contents); - $this->items[] = $item; - $limit++; - } - } + $article_url = $element->find('a.entry-title', 0)->href; + $article_author = trim($element->find('span.vcard', 0)->plaintext); + $article_title = $element->find('a.entry-title', 0)->plaintext; + $article_timestamp = strtotime($element->find('span.updated', 0)->plaintext); + $article = getSimpleHTMLDOM($article_url) + or returnServerError('Could not request TheHackerNews: ' . $article_url); - } + $contents = $article->find('div.articlebodyonly', 0)->innertext; + $contents = stripRecursiveHtmlSection($contents, 'div', '<div class=\'clear\''); + $contents = stripWithDelimiters($contents, '<script', '</script>'); + + $item = array(); + $item['uri'] = $article_url; + $item['title'] = $article_title; + $item['author'] = $article_author; + $item['timestamp'] = $article_timestamp; + $item['content'] = trim($contents); + $this->items[] = $item; + $limit++; + } + } + + } } diff --git a/bridges/ThePirateBayBridge.php b/bridges/ThePirateBayBridge.php index 4c606c97..f0e26852 100644 --- a/bridges/ThePirateBayBridge.php +++ b/bridges/ThePirateBayBridge.php @@ -1,129 +1,174 @@ <?php -class ThePirateBayBridge extends BridgeAbstract{ +class ThePirateBayBridge extends BridgeAbstract { - const MAINTAINER = "mitsukarenai"; - const NAME = "The Pirate Bay"; - const URI = "https://thepiratebay.org/"; - const DESCRIPTION = "Returns results for the keywords. You can put several list of keywords by separating them with a semicolon (e.g. \"one show;another show\"). Category based search needs the category number as input. User based search takes the Uploader name. Search can be done in a specified category"; + const MAINTAINER = 'mitsukarenai'; + const NAME = 'The Pirate Bay'; + const URI = 'https://thepiratebay.org/'; + const DESCRIPTION = 'Returns results for the keywords. You can put several + list of keywords by separating them with a semicolon (e.g. "one show;another + show"). Category based search needs the category number as input. User based + search takes the Uploader name. Search can be done in a specified category'; - const PARAMETERS = array( array( - 'q'=>array( - 'name'=>'keywords, separated by semicolons', - 'exampleValue'=>'first list;second list;…', - 'required'=>true - ), - 'crit'=>array( - 'type'=>'list', - 'name'=>'Search type', - 'values'=>array( - 'search'=>'search', - 'category'=>'cat', - 'user'=>'usr' - ) - ), - 'cat_check'=>array( - 'type'=>'checkbox', - 'name'=>'Specify category for normal search ?', - ), - 'cat'=>array( - 'name'=>'Category number', - 'exampleValue'=>'100, 200… See TPB for category number' - ), - 'trusted'=>array( - 'type'=>'checkbox', - 'name'=>'Only get results from Trusted or VIP users ?', - ), - )); + const PARAMETERS = array( array( + 'q' => array( + 'name' => 'keywords, separated by semicolons', + 'exampleValue' => 'first list;second list;…', + 'required' => true + ), + 'crit' => array( + 'type' => 'list', + 'name' => 'Search type', + 'values' => array( + 'search' => 'search', + 'category' => 'cat', + 'user' => 'usr' + ) + ), + 'cat_check' => array( + 'type' => 'checkbox', + 'name' => 'Specify category for normal search ?', + ), + 'cat' => array( + 'name' => 'Category number', + 'exampleValue' => '100, 200… See TPB for category number' + ), + 'trusted' => array( + 'type' => 'checkbox', + 'name' => 'Only get results from Trusted or VIP users ?', + ), + )); public function collectData(){ - function parseDateTimestamp($element){ - $guessedDate = $element->find('font',0)->plaintext; - $guessedDate = explode("Uploaded ",$guessedDate)[1]; - $guessedDate = explode(",",$guessedDate)[0]; - if (count(explode(":",$guessedDate)) == 1) - { - $guessedDate = strptime($guessedDate, '%m-%d %Y'); - $timestamp = mktime(0, 0, 0, - $guessedDate['tm_mon'] + 1, $guessedDate['tm_mday'], 1900+$guessedDate['tm_year']); - } - else if (explode(" ",$guessedDate)[0] == 'Today') - { - $guessedDate = strptime(explode(" ",$guessedDate)[1], '%H:%M'); - $timestamp = mktime($guessedDate['tm_hour'], $guessedDate['tm_min'], 0, - date('m'), date('d'), date('Y')); + function parseDateTimestamp($element){ + $guessedDate = $element->find('font',0)->plaintext; + $guessedDate = explode('Uploaded ', $guessedDate)[1]; + $guessedDate = explode(',', $guessedDate)[0]; - } - else if (explode(" ",$guessedDate)[0] == 'Y-day') - { - $guessedDate = strptime(explode(" ",$guessedDate)[1], '%H:%M'); - $timestamp = mktime($guessedDate['tm_hour'], $guessedDate['tm_min'], 0, - date('m',time()-24*60*60), date('d',time()-24*60*60), date('Y',time()-24*60*60)); + if(count(explode(':', $guessedDate)) == 1){ + $guessedDate = strptime($guessedDate, '%m-%d %Y'); + $timestamp = mktime( + 0, + 0, + 0, + $guessedDate['tm_mon'] + 1, + $guessedDate['tm_mday'], + 1900 + $guessedDate['tm_year'] + ); + } elseif(explode(' ', $guessedDate)[0] == 'Today'){ + $guessedDate = strptime( + explode(' ', $guessedDate)[1], '%H:%M' + ); - } - else - { - $guessedDate = strptime($guessedDate, '%m-%d %H:%M'); - $timestamp = mktime($guessedDate['tm_hour'], $guessedDate['tm_min'], 0, - $guessedDate['tm_mon'] + 1, $guessedDate['tm_mday'], date('Y')); - } - return $timestamp; - } + $timestamp = mktime( + $guessedDate['tm_hour'], + $guessedDate['tm_min'], + 0, + date('m'), + date('d'), + date('Y') + ); + } elseif(explode(' ', $guessedDate)[0] == 'Y-day'){ + $guessedDate = strptime( + explode(' ',$guessedDate)[1], '%H:%M' + ); + + $timestamp = mktime( + $guessedDate['tm_hour'], + $guessedDate['tm_min'], + 0, + date('m', time() - 24 * 60 * 60), + date('d', time() - 24 * 60 * 60), + date('Y', time() - 24 * 60 * 60) + ); + } else { + $guessedDate = strptime($guessedDate, '%m-%d %H:%M'); + $timestamp = mktime( + $guessedDate['tm_hour'], + $guessedDate['tm_min'], + 0, + $guessedDate['tm_mon'] + 1, + $guessedDate['tm_mday'], + date('Y')); + } + return $timestamp; + } $catBool = $this->getInput('cat_check'); - if ($catBool) - { + if($catBool){ $catNum = $this->getInput('cat'); } $critList = $this->getInput('crit'); - - $trustedBool = $this->getInput('trusted'); - $keywordsList = explode(";",$this->getInput('q')); - foreach($keywordsList as $keywords){ - switch ($critList) { - case "search": - if ($catBool == FALSE) - { - $html = getSimpleHTMLDOM(self::URI.'search/'.rawurlencode($keywords).'/0/3/0') - or returnServerError('Could not request TPB.'); - } - else - { - $html = getSimpleHTMLDOM(self::URI.'search/'.rawurlencode($keywords).'/0/3/'.rawurlencode($catNum)) - or returnServerError('Could not request TPB.'); + + $trustedBool = $this->getInput('trusted'); + $keywordsList = explode(';', $this->getInput('q')); + foreach($keywordsList as $keywords){ + switch($critList){ + case 'search': + if($catBool == false){ + $html = getSimpleHTMLDOM( + self::URI . + 'search/' . + rawurlencode($keywords) . + '/0/3/0' + ) or returnServerError('Could not request TPB.'); + } else { + $html = getSimpleHTMLDOM( + self::URI . + 'search/' . + rawurlencode($keywords) . + '/0/3/' . + rawurlencode($catNum) + ) or returnServerError('Could not request TPB.'); } - break; - case "cat": - $html = getSimpleHTMLDOM(self::URI.'browse/'.rawurlencode($keywords).'/0/3/0') - or returnServerError('Could not request TPB.'); - break; - case "usr": - $html = getSimpleHTMLDOM(self::URI.'user/'.rawurlencode($keywords).'/0/3/0') - or returnServerError('Could not request TPB.'); - break; - } + break; + case 'cat': + $html = getSimpleHTMLDOM( + self::URI . + 'browse/' . + rawurlencode($keywords) . + '/0/3/0' + ) or returnServerError('Could not request TPB.'); + break; + case 'usr': + $html = getSimpleHTMLDOM( + self::URI . + 'user/' . + rawurlencode($keywords) . + '/0/3/0' + ) or returnServerError('Could not request TPB.'); + break; + } + + if ($html->find('table#searchResult', 0) == false) + returnServerError('No result for query ' . $keywords); - if ($html->find('table#searchResult', 0) == FALSE) - returnServerError('No result for query '.$keywords); + foreach($html->find('tr') as $element){ + if(!$trustedBool + || !is_null($element->find('img[alt=VIP]', 0)) + || !is_null($element->find('img[alt=Trusted]', 0))){ + $item = array(); + $item['uri'] = $element->find('a', 3)->href; + $item['id'] = self::URI . $element->find('a.detLink', 0)->href; + $item['timestamp'] = parseDateTimestamp($element); + $item['author'] = $element->find('a.detDesc', 0)->plaintext; + $item['title'] = $element->find('a.detLink', 0)->plaintext; + $item['seeders'] = (int)$element->find('td', 2)->plaintext; + $item['leechers'] = (int)$element->find('td', 3)->plaintext; + $item['content'] = $element->find('font', 0)->plaintext + . '<br>seeders: ' + . $item['seeders'] + . ' | leechers: ' + . $item['leechers'] + . '<br><a href="' + . $item['id'] + . '">info page</a>'; - foreach($html->find('tr') as $element) { - - if ( !$trustedBool or !is_null($element->find('img[alt=VIP]', 0)) or !is_null($element->find('img[alt=Trusted]', 0)) ) - { - $item = array(); - $item['uri'] = $element->find('a',3)->href; - $item['id'] = self::URI.$element->find('a.detLink',0)->href; - $item['timestamp'] = parseDateTimestamp($element); - $item['author'] = $element->find('a.detDesc',0)->plaintext; - $item['title'] = $element->find('a.detLink',0)->plaintext; - $item['seeders'] = (int)$element->find('td',2)->plaintext; - $item['leechers'] = (int)$element->find('td',3)->plaintext; - $item['content'] = $element->find('font',0)->plaintext.'<br>seeders: '.$item['seeders'].' | leechers: '.$item['leechers'].'<br><a href="'.$item['id'].'">info page</a>'; - if(isset($item['title'])) - $this->items[] = $item; + if(isset($item['title'])) + $this->items[] = $item; + } + } } - } - } } } diff --git a/bridges/TheTVDBBridge.php b/bridges/TheTVDBBridge.php index 8af44032..551d0557 100644 --- a/bridges/TheTVDBBridge.php +++ b/bridges/TheTVDBBridge.php @@ -1,142 +1,205 @@ <?php -class TheTVDBBridge extends BridgeAbstract{ - - const MAINTAINER = "Astyan"; - const NAME = "TheTVDB"; - const URI = "http://thetvdb.com/"; - const APIURI = "https://api.thetvdb.com/"; - const CACHE_TIMEOUT = 43200; // 12h - const DESCRIPTION = "Returns latest episodes of a serie with theTVDB api. You can contribute to theTVDB."; - const PARAMETERS = array(array( - 'serie_id'=>array( - 'type'=>'number', - 'name'=>'ID', - 'required'=>true, - ), - 'nb_episode'=>array( - 'type'=>'number', - 'name'=>'Number of episodes', - 'defaultValue'=>10, - 'required'=>true, - ), - ) - ); - const APIACCOUNT = "RSSBridge"; - const APIKEY = "76DE1887EA401C9A"; - const APIUSERKEY = "B52869AC6005330F"; - - private function getAPIURI(){ - return self::APIURI; - } - - private function getToken(){ - //login and get token, don't use curlJob to do less adaptations - $login_array = array("apikey" => self::APIKEY, - "username" => self::APIACCOUNT, - "userkey" => self::APIUSERKEY); - $login_json = json_encode($login_array); - $ch = curl_init($this->getAPIURI().'login'); - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); - curl_setopt($ch, CURLOPT_POSTFIELDS, $login_json); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_HTTPHEADER, array( - 'Content-Type: application/json', - 'Accept: application/json') - ); - curl_setopt($ch, CURLOPT_TIMEOUT, 5); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); - $result = curl_exec($ch); - curl_close($ch); - $token_json = (array)json_decode($result); - if(isset($token_json["Error"])){ - throw new Exception($token_json["Error"]); - die; - } - $token = $token_json['token']; - return $token; - } - - private function curlJob($token, $url){ - $token_header = "Authorization: Bearer ".$token; - $ch = curl_init($url); - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_HTTPHEADER, array( - 'Accept: application/json', - $token_header) - ); - curl_setopt($ch, CURLOPT_TIMEOUT, 5); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); - $result = curl_exec($ch); - curl_close($ch); - $result_array = (array)json_decode($result); - if(isset($result_array["Error"])){ - throw new Exception($result_array["Error"]); - die; - } - return $result_array; - } - - private function getLatestSeasonNumber($token, $serie_id){ - // get the last season - $url = $this->getAPIURI().'series/'.$serie_id.'/episodes/summary'; - $summary = $this->curlJob($token, $url); - return max($summary['data']->airedSeasons); - } - - private function getSerieName($token, $serie_id){ - $url = $this->getAPIURI().'series/'.$serie_id; - $serie = $this->curlJob($token, $url); - return $serie['data']->seriesName; - } - - private function getSeasonEpisodes($token, $serie_id, $season, $seriename ,&$episodelist, $nbepisodemin, $page=1){ - $url = $this->getAPIURI().'series/'.$serie_id.'/episodes/query?airedSeason='.$season.'?page='.$page; - $episodes = $this->curlJob($token, $url); - // we don't check the number of page because we assume there is less than 100 episodes in every season - $episodes = (array)$episodes['data']; - $episodes = array_slice($episodes, -$nbepisodemin, $nbepisodemin); - foreach($episodes as $episode){ - $episodedata = array(); - $episodedata['uri'] = $this->getURI().'?tab=episode&seriesid='.$serie_id.'&seasonid='.$episode->airedSeasonID.'&id='.$episode->id; - // check if the absoluteNumber exist - if(isset($episode->absoluteNumber)){ - $episodedata['title'] = 'S'.$episode->airedSeason.'E'.$episode->airedEpisodeNumber.'('.$episode->absoluteNumber.') : '.$episode->episodeName; - }else{ - $episodedata['title'] = 'S'.$episode->airedSeason.'E'.$episode->airedEpisodeNumber.' : '.$episode->episodeName; - } - $episodedata['author'] = $seriename; - $date = DateTime::createFromFormat('Y-m-d H:i:s', $episode->firstAired.' 00:00:00'); - $episodedata['timestamp'] = $date->getTimestamp(); - $episodedata['content'] = $episode->overview; - $episodelist[] = $episodedata; - } - } +class TheTVDBBridge extends BridgeAbstract { - public function collectData(){ - $serie_id = $this->getInput('serie_id'); - $nbepisode = $this->getInput('nb_episode'); - $episodelist = array(); - $token = $this->getToken(); - $maxseason = $this->getLatestSeasonNumber($token, $serie_id); - $seriename = $this->getSerieName($token, $serie_id); - $season = $maxseason; - while(sizeof($episodelist) < $nbepisode and $season >= 1){ - $nbepisodetmp = $nbepisode - sizeof($episodelist); - $this->getSeasonEpisodes($token, $serie_id, $season, $seriename, $episodelist, $nbepisodetmp); - $season = $season - 1; - } - // add the 10 last specials episodes - try{ // catch to avoid error if empty - $this->getSeasonEpisodes($token, $serie_id, 0, $seriename, $episodelist, $nbepisode); - } catch (Exception $e) { } - // sort and keep the 10 last episodes, works bad with the netflix serie (all episode lauch at once) - usort($episodelist, function ($a, $b) { return $a['timestamp'] < $b['timestamp'];}); - $this->items = array_slice($episodelist, 0, $nbepisode); - } + const MAINTAINER = 'Astyan'; + const NAME = 'TheTVDB'; + const URI = 'http://thetvdb.com/'; + const APIURI = 'https://api.thetvdb.com/'; + const CACHE_TIMEOUT = 43200; // 12h + const DESCRIPTION = 'Returns latest episodes of a serie with theTVDB api. You can contribute to theTVDB.'; + const PARAMETERS = array( + array( + 'serie_id' => array( + 'type' => 'number', + 'name' => 'ID', + 'required' => true, + ), + 'nb_episode' => array( + 'type' => 'number', + 'name' => 'Number of episodes', + 'defaultValue' => 10, + 'required' => true, + ), + ) + ); + const APIACCOUNT = 'RSSBridge'; + const APIKEY = '76DE1887EA401C9A'; + const APIUSERKEY = 'B52869AC6005330F'; + + private function getApiUri(){ + return self::APIURI; + } + + private function getToken(){ + //login and get token, don't use curlJob to do less adaptations + $login_array = array( + 'apikey' => self::APIKEY, + 'username' => self::APIACCOUNT, + 'userkey' => self::APIUSERKEY + ); + + $login_json = json_encode($login_array); + $ch = curl_init($this->getApiUri() . 'login'); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); + curl_setopt($ch, CURLOPT_POSTFIELDS, $login_json); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, array( + 'Content-Type: application/json', + 'Accept: application/json' + ) + ); + + curl_setopt($ch, CURLOPT_TIMEOUT, 5); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); + $result = curl_exec($ch); + curl_close($ch); + $token_json = (array)json_decode($result); + if(isset($token_json['Error'])){ + throw new Exception($token_json['Error']); + die; + } + $token = $token_json['token']; + return $token; + } + + private function curlJob($token, $url){ + $token_header = 'Authorization: Bearer ' . $token; + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, array( + 'Accept: application/json', + $token_header + ) + ); + curl_setopt($ch, CURLOPT_TIMEOUT, 5); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); + $result = curl_exec($ch); + curl_close($ch); + $result_array = (array)json_decode($result); + if(isset($result_array['Error'])){ + throw new Exception($result_array['Error']); + die; + } + return $result_array; + } + + private function getLatestSeasonNumber($token, $serie_id){ + // get the last season + $url = $this->getApiUri() . 'series/' . $serie_id . '/episodes/summary'; + $summary = $this->curlJob($token, $url); + return max($summary['data']->airedSeasons); + } + + private function getSerieName($token, $serie_id){ + $url = $this->getApiUri() . 'series/' . $serie_id; + $serie = $this->curlJob($token, $url); + return $serie['data']->seriesName; + } + + private function getSeasonEpisodes($token + , $serie_id + , $season + , $seriename + , &$episodelist + , $nbepisodemin + , $page = 1){ + $url = $this->getApiUri() + . 'series/' + . $serie_id + . '/episodes/query?airedSeason=' + . $season + . '?page=' + . $page; + + $episodes = $this->curlJob($token, $url); + // we don't check the number of page because we assume there is less + //than 100 episodes in every season + $episodes = (array)$episodes['data']; + $episodes = array_slice($episodes, -$nbepisodemin, $nbepisodemin); + foreach($episodes as $episode){ + $episodedata = array(); + $episodedata['uri'] = $this->getURI() + . '?tab=episode&seriesid=' + . $serie_id + . '&seasonid=' + . $episode->airedSeasonID + . '&id=' + . $episode->id; + + // check if the absoluteNumber exist + if(isset($episode->absoluteNumber)){ + $episodedata['title'] = 'S' + . $episode->airedSeason + . 'E' + . $episode->airedEpisodeNumber + . '(' + . $episode->absoluteNumber + . ') : ' + . $episode->episodeName; + } else { + $episodedata['title'] = 'S' + . $episode->airedSeason + . 'E' + . $episode->airedEpisodeNumber + . ' : ' + . $episode->episodeName; + } + $episodedata['author'] = $seriename; + $date = DateTime::createFromFormat( + 'Y-m-d H:i:s', + $episode->firstAired . ' 00:00:00' + ); + + $episodedata['timestamp'] = $date->getTimestamp(); + $episodedata['content'] = $episode->overview; + $episodelist[] = $episodedata; + } + } + + public function collectData(){ + $serie_id = $this->getInput('serie_id'); + $nbepisode = $this->getInput('nb_episode'); + $episodelist = array(); + $token = $this->getToken(); + $maxseason = $this->getLatestSeasonNumber($token, $serie_id); + $seriename = $this->getSerieName($token, $serie_id); + $season = $maxseason; + while(sizeof($episodelist) < $nbepisode && $season >= 1){ + $nbepisodetmp = $nbepisode - sizeof($episodelist); + $this->getSeasonEpisodes( + $token, + $serie_id, + $season, + $seriename, + $episodelist, + $nbepisodetmp + ); + + $season = $season - 1; + } + // add the 10 last specials episodes + try { // catch to avoid error if empty + $this->getSeasonEpisodes( + $token, + $serie_id, + 0, + $seriename, + $episodelist, + $nbepisode + ); + } catch(Exception $e){ + unset($e); + } + // sort and keep the 10 last episodes, works bad with the netflix serie + // (all episode lauch at once) + usort( + $episodelist, + function ($a, $b){ + return $a['timestamp'] < $b['timestamp']; + } + ); + $this->items = array_slice($episodelist, 0, $nbepisode); + } } - - - - diff --git a/bridges/Torrent9Bridge.php b/bridges/Torrent9Bridge.php index 6dc6fc05..a360ae14 100644 --- a/bridges/Torrent9Bridge.php +++ b/bridges/Torrent9Bridge.php @@ -1,97 +1,98 @@ <?php class Torrent9Bridge extends BridgeAbstract { - const MAINTAINER = "lagaisse"; - const NAME = "Torrent9 Bridge"; - const URI = "http://www.torrent9.biz"; - const CACHE_TIMEOUT = 86400 ; // 24h = 86400s - const DESCRIPTION = "Returns latest torrents"; - - const PAGE_SERIES = "torrents_series"; - const PAGE_SERIES_VOSTFR = "torrents_series_vostfr"; - const PAGE_SERIES_FR = "torrents_series_french"; - - const PARAMETERS = array( - 'From search' => array( - 'q' => array( - 'name'=>'Search', - 'required'=>true, - 'title'=>'Type your search' - ) - ), - 'By page' => array( - 'page' => array( - 'name'=>'Page', - 'type'=>'list', - 'required'=>false, - 'values'=>array( - 'Series'=>self::PAGE_SERIES, - 'Series VOST'=>self::PAGE_SERIES_VOSTFR, - 'Series FR'=>self::PAGE_SERIES_FR, - ), - 'defaultValue'=>self::PAGE_SERIES - ) - )); - - public function collectData(){ - - if($this->queriedContext === 'From search'){ - - $request = str_replace(" ","-",trim($this->getInput('q'))); - $page = self::URI.'/search_torrent/'.urlencode($request).'.html'; - } else { - $request = $this->getInput('page'); - $page = self::URI.'/'.$request.'.html'; - } - - $html = getSimpleHTMLDOM($page) - or returnServerError('No results for this query.'); - - foreach ($html->find('table',0)->find('tr') as $episode) { - if ($episode->parent->tag == 'tbody') { - - - $urlepisode = self::URI . $episode->find('a', 0)->getAttribute('href'); - $htmlepisode = getSimpleHTMLDOMCached($urlepisode, 86400*366*30); //30 years = forever - - $item = array(); - $item['author'] = $episode->find('a', 0)->text(); - $item['title'] = $episode->find('a', 0)->text(); - $item['id'] = $episode->find('a', 0)->getAttribute('href'); - $item['pubdate'] = $this->getCachedDate($urlepisode); - - $textefiche=$htmlepisode->find('.movie-information', 0)->find('p',1); - if (isset($textefiche)) { - $item['content'] = $textefiche->text(); - } else { - $p=$htmlepisode->find('.movie-information',0)->find('p'); - if(!empty($p)){ - $item['content'] = $htmlepisode->find('.movie-information', 0)->find('p',0)->text(); - } - } - - $item['id'] = $episode->find('a', 0)->getAttribute('href'); - $item['uri'] = self::URI . $htmlepisode->find('.download',0)->getAttribute('href'); - - $this->items[] = $item; - } - } - } - - - public function getName(){ - return $this->getInput('q').' : '.self::NAME; - } - - private function getCachedDate($url){ - debugMessage('getting pubdate from url ' . $url . ''); - // Initialize cache - $cache = Cache::create('FileCache'); - $cache->setPath(CACHE_DIR . '/pages'); - $params = [$url]; - $cache->setParameters($params); - // Get cachefile timestamp - $time = $cache->getTime(); - return ($time!==false?$time:time()); - } + const MAINTAINER = 'lagaisse'; + const NAME = 'Torrent9 Bridge'; + const URI = 'http://www.torrent9.biz'; + const CACHE_TIMEOUT = 86400; // 24h = 86400s + const DESCRIPTION = 'Returns latest torrents'; + + const PAGE_SERIES = 'torrents_series'; + const PAGE_SERIES_VOSTFR = 'torrents_series_vostfr'; + const PAGE_SERIES_FR = 'torrents_series_french'; + + const PARAMETERS = array( + 'From search' => array( + 'q' => array( + 'name' => 'Search', + 'required' => true, + 'title' => 'Type your search' + ) + ), + 'By page' => array( + 'page' => array( + 'name' => 'Page', + 'type' => 'list', + 'required' => false, + 'values' => array( + 'Series' => self::PAGE_SERIES, + 'Series VOST' => self::PAGE_SERIES_VOSTFR, + 'Series FR' => self::PAGE_SERIES_FR, + ), + 'defaultValue' => self::PAGE_SERIES + ) + ) + ); + + public function collectData(){ + + if($this->queriedContext === 'From search'){ + $request = str_replace(' ', '-', trim($this->getInput('q'))); + $page = self::URI . '/search_torrent/' . urlencode($request) . '.html'; + } else { + $request = $this->getInput('page'); + $page = self::URI . '/' . $request . '.html'; + } + + $html = getSimpleHTMLDOM($page) + or returnServerError('No results for this query.'); + + foreach($html->find('table',0)->find('tr') as $episode){ + if($episode->parent->tag == 'tbody'){ + + $urlepisode = self::URI . $episode->find('a', 0)->getAttribute('href'); + + //30 years = forever + $htmlepisode = getSimpleHTMLDOMCached($urlepisode, 86400 * 366 * 30); + + $item = array(); + $item['author'] = $episode->find('a', 0)->text(); + $item['title'] = $episode->find('a', 0)->text(); + $item['id'] = $episode->find('a', 0)->getAttribute('href'); + $item['pubdate'] = $this->getCachedDate($urlepisode); + + $textefiche = $htmlepisode->find('.movie-information', 0)->find('p', 1); + if(isset($textefiche)){ + $item['content'] = $textefiche->text(); + } else { + $p = $htmlepisode->find('.movie-information', 0)->find('p'); + if(!empty($p)){ + $item['content'] = $htmlepisode->find('.movie-information', 0)->find('p', 0)->text(); + } + } + + $item['id'] = $episode->find('a', 0)->getAttribute('href'); + $item['uri'] = self::URI . $htmlepisode->find('.download',0)->getAttribute('href'); + + $this->items[] = $item; + } + } + } + + + public function getName(){ + return $this->getInput('q') . ' : ' . self::NAME; + } + + private function getCachedDate($url){ + debugMessage('getting pubdate from url ' . $url . ''); + // Initialize cache + $cache = Cache::create('FileCache'); + $cache->setPath(CACHE_DIR . '/pages'); + $params = [$url]; + $cache->setParameters($params); + // Get cachefile timestamp + $time = $cache->getTime(); + return ($time !== false ? $time : time()); + } } diff --git a/bridges/TwitterBridge.php b/bridges/TwitterBridge.php index 2feeff51..18de5d81 100644 --- a/bridges/TwitterBridge.php +++ b/bridges/TwitterBridge.php @@ -1,64 +1,68 @@ <?php -class TwitterBridge extends BridgeAbstract{ - const NAME='Twitter Bridge'; - const URI='https://twitter.com/'; - const CACHE_TIMEOUT = 300; // 5min - const DESCRIPTION='returns tweets'; +class TwitterBridge extends BridgeAbstract { + const NAME = 'Twitter Bridge'; + const URI = 'https://twitter.com/'; + const CACHE_TIMEOUT = 300; // 5min + const DESCRIPTION = 'returns tweets'; const MAINTAINER = 'pmaziere'; - const PARAMETERS=array( - 'global'=>array( - 'nopic'=>array( - 'name'=>'Hide profile pictures', - 'type'=>'checkbox', - 'title'=>'Activate to hide profile pictures in content' - ) - ), - 'By keyword or hashtag' => array( - 'q'=>array( - 'name'=>'Keyword or #hashtag', - 'required'=>true, - 'exampleValue'=>'rss-bridge, #rss-bridge', - 'title'=>'Insert a keyword or hashtag' - ) - ), - 'By username' => array( - 'u'=>array( - 'name'=>'username', - 'required'=>true, - 'exampleValue'=>'sebsauvage', - 'title'=>'Insert a user name' - ), - 'norep'=>array( - 'name'=>'Without replies', - 'type'=>'checkbox', - 'title'=>'Only return initial tweets' - ) - ) - ); + const PARAMETERS = array( + 'global' => array( + 'nopic' => array( + 'name' => 'Hide profile pictures', + 'type' => 'checkbox', + 'title' => 'Activate to hide profile pictures in content' + ) + ), + 'By keyword or hashtag' => array( + 'q' => array( + 'name' => 'Keyword or #hashtag', + 'required' => true, + 'exampleValue' => 'rss-bridge, #rss-bridge', + 'title' => 'Insert a keyword or hashtag' + ) + ), + 'By username' => array( + 'u' => array( + 'name' => 'username', + 'required' => true, + 'exampleValue' => 'sebsauvage', + 'title' => 'Insert a user name' + ), + 'norep' => array( + 'name' => 'Without replies', + 'type' => 'checkbox', + 'title' => 'Only return initial tweets' + ) + ) + ); - public function getName(){ - switch($this->queriedContext){ - case 'By keyword or hashtag': - $specific='search '; - $param='q'; - break; - case 'By username': - $specific='@'; - $param='u'; - break; - } - return 'Twitter '.$specific.$this->getInput($param); - } + public function getName(){ + switch($this->queriedContext){ + case 'By keyword or hashtag': + $specific = 'search '; + $param = 'q'; + break; + case 'By username': + $specific = '@'; + $param = 'u'; + break; + } + return 'Twitter ' . $specific . $this->getInput($param); + } - public function getURI(){ - switch($this->queriedContext){ - case 'By keyword or hashtag': - return self::URI.'search?q='.urlencode($this->getInput('q')).'&f=tweets'; - case 'By username': - return self::URI.urlencode($this->getInput('u')). - ($this->getInput('norep')?'':'/with_replies'); - } - } + public function getURI(){ + switch($this->queriedContext){ + case 'By keyword or hashtag': + return self::URI + . 'search?q=' + . urlencode($this->getInput('q')) + . '&f=tweets'; + case 'By username': + return self::URI + . urlencode($this->getInput('u')) + . ($this->getInput('norep') ? '' : '/with_replies'); + } + } public function collectData(){ $html = ''; @@ -75,7 +79,7 @@ class TwitterBridge extends BridgeAbstract{ $hidePictures = $this->getInput('nopic'); - foreach($html->find('div.js-stream-tweet') as $tweet) { + foreach($html->find('div.js-stream-tweet') as $tweet){ $item = array(); // extract username and sanitize $item['username'] = $tweet->getAttribute('data-screen-name'); @@ -88,15 +92,21 @@ class TwitterBridge extends BridgeAbstract{ // get TweetID $item['id'] = $tweet->getAttribute('data-tweet-id'); // get tweet link - $item['uri'] = self::URI.$tweet->find('a.js-permalink', 0)->getAttribute('href'); + $item['uri'] = self::URI . $tweet->find('a.js-permalink', 0)->getAttribute('href'); // extract tweet timestamp $item['timestamp'] = $tweet->find('span.js-short-timestamp', 0)->getAttribute('data-time'); // generate the title - $item['title'] = strip_tags(html_entity_decode($tweet->find('p.js-tweet-text', 0)->innertext,ENT_QUOTES,'UTF-8')); + $item['title'] = strip_tags( + html_entity_decode( + $tweet->find('p.js-tweet-text', 0)->innertext, + ENT_QUOTES, + 'UTF-8' + ) + ); // processing content links - foreach($tweet->find('a') as $link) { - if($link->hasAttribute('data-expanded-url') ) { + foreach($tweet->find('a') as $link){ + if($link->hasAttribute('data-expanded-url')){ $link->href = $link->getAttribute('data-expanded-url'); } $link->removeAttribute('data-expanded-url'); @@ -113,13 +123,23 @@ class TwitterBridge extends BridgeAbstract{ } // get tweet text - $cleanedTweet = str_replace('href="/', 'href="'.self::URI, $tweet->find('p.js-tweet-text', 0)->innertext); + $cleanedTweet = str_replace( + 'href="/', + 'href="' . self::URI, + $tweet->find('p.js-tweet-text', 0)->innertext + ); // Add picture to content $picture_html = ''; if(!$hidePictures){ $picture_html = <<<EOD -<a href="https://twitter.com/{$item['username']}"><img style="align: top; width:75 px; border: 1px solid black;" alt="{$item['username']}" src="{$item['avatar']}" title="{$item['fullname']}" /></a> +<a href="https://twitter.com/{$item['username']}"> +<img + style="align: top; width:75 px; border: 1px solid black;" + alt="{$item['username']}" + src="{$item['avatar']}" + title="{$item['fullname']}" /> +</a> EOD; } diff --git a/bridges/UnsplashBridge.php b/bridges/UnsplashBridge.php index 378d24e3..3a3514b1 100644 --- a/bridges/UnsplashBridge.php +++ b/bridges/UnsplashBridge.php @@ -1,64 +1,77 @@ <?php class UnsplashBridge extends BridgeAbstract { - const MAINTAINER = "nel50n"; - const NAME = "Unsplash Bridge"; - const URI = "http://unsplash.com/"; + const MAINTAINER = 'nel50n'; + const NAME = 'Unsplash Bridge'; + const URI = 'http://unsplash.com/'; const CACHE_TIMEOUT = 43200; // 12h - const DESCRIPTION = "Returns the latests photos from Unsplash"; + const DESCRIPTION = 'Returns the latests photos from Unsplash'; - const PARAMETERS = array( array( - 'm'=>array( - 'name'=>'Max number of photos', - 'type'=>'number', - 'defaultValue'=>20 - ), - 'w'=>array( - 'name'=>'Width', - 'exampleValue'=>'1920, 1680, …', - 'defaultValue'=>'1920' - ), - 'q'=>array( - 'name'=>'JPEG quality', - 'type'=>'number', - 'defaultValue'=>75 - ) - )); + const PARAMETERS = array( array( + 'm' => array( + 'name' => 'Max number of photos', + 'type' => 'number', + 'defaultValue' => 20 + ), + 'w' => array( + 'name' => 'Width', + 'exampleValue' => '1920, 1680, …', + 'defaultValue' => '1920' + ), + 'q' => array( + 'name' => 'JPEG quality', + 'type' => 'number', + 'defaultValue' => 75 + ) + )); - public function collectData(){ - $width = $this->getInput('w') ; - $num = 0; - $max = $this->getInput('m'); - $quality = $this->getInput('q'); - $lastpage = 1; + public function collectData(){ + $width = $this->getInput('w'); + $num = 0; + $max = $this->getInput('m'); + $quality = $this->getInput('q'); + $lastpage = 1; - for ($page = 1; $page <= $lastpage; $page++) { - $link = self::URI.'/grid?page='.$page; - $html = getSimpleHTMLDOM($link) - or returnServerError('No results for this query.'); + for($page = 1; $page <= $lastpage; $page++){ + $link = self::URI . '/grid?page=' . $page; + $html = getSimpleHTMLDOM($link) + or returnServerError('No results for this query.'); - if ($page === 1) { - preg_match('/=(\d+)$/', $html->find('.pagination > a[!class]', -1)->href, $matches); - $lastpage = min($matches[1], ceil($max/40)); - } + if($page === 1){ + preg_match( + '/=(\d+)$/', + $html->find('.pagination > a[!class]', -1)->href, + $matches + ); - foreach($html->find('.photo') as $element) { - $thumbnail = $element->find('img', 0); - $thumbnail->src = str_replace('https://', 'http://', $thumbnail->src); + $lastpage = min($matches[1], ceil($max / 40)); + } - $item = array(); - $item['uri'] = str_replace(array('q=75', 'w=400'), - array("q=$quality", "w=$width"), - $thumbnail->src).'.jpg'; // '.jpg' only for format hint - $item['timestamp'] = time(); - $item['title'] = $thumbnail->alt; - $item['content'] = $item['title'].'<br><a href="'.$item['uri'].'"><img src="'.$thumbnail->src.'" /></a>'; - $this->items[] = $item; + foreach($html->find('.photo') as $element){ + $thumbnail = $element->find('img', 0); + $thumbnail->src = str_replace('https://', 'http://', $thumbnail->src); - $num++; - if ($num >= $max) - break 2; - } - } - } + $item = array(); + $item['uri'] = str_replace( + array('q=75', 'w=400'), + array("q=$quality", "w=$width"), + $thumbnail->src).'.jpg'; // '.jpg' only for format hint + + $item['timestamp'] = time(); + $item['title'] = $thumbnail->alt; + $item['content'] = $item['title'] + . '<br><a href="' + . $item['uri'] + . '"><img src="' + . $thumbnail->src + . '" /></a>'; + + $this->items[] = $item; + + $num++; + if ($num >= $max) + break 2; + } + } + } } diff --git a/bridges/ViadeoCompanyBridge.php b/bridges/ViadeoCompanyBridge.php index 714094f2..425133db 100644 --- a/bridges/ViadeoCompanyBridge.php +++ b/bridges/ViadeoCompanyBridge.php @@ -1,36 +1,37 @@ <?php -class ViadeoCompanyBridge extends BridgeAbstract{ +class ViadeoCompanyBridge extends BridgeAbstract { - const MAINTAINER = "regisenguehard"; - const NAME = "Viadeo Company"; - const URI = "https://www.viadeo.com/"; + const MAINTAINER = 'regisenguehard'; + const NAME = 'Viadeo Company'; + const URI = 'https://www.viadeo.com/'; const CACHE_TIMEOUT = 21600; // 6h - const DESCRIPTION = "Returns most recent actus from Company on Viadeo. (http://www.viadeo.com/fr/company/<strong style=\"font-weight:bold;\">apple</strong>)"; + const DESCRIPTION = 'Returns most recent actus from Company on Viadeo. + (http://www.viadeo.com/fr/company/<strong style="font-weight:bold;">apple</strong>)'; - const PARAMETERS = array( array( - 'c'=>array( - 'name'=>'Company name', - 'required'=>true - ) - )); + const PARAMETERS = array( array( + 'c' => array( + 'name' => 'Company name', + 'required' => true + ) + )); - public function collectData(){ - $html = ''; - $link = self::URI.'fr/company/'.$this->getInput('c'); + public function collectData(){ + $html = ''; + $link = self::URI . 'fr/company/' . $this->getInput('c'); - $html = getSimpleHTMLDOM($link) - or returnServerError('Could not request Viadeo.'); + $html = getSimpleHTMLDOM($link) + or returnServerError('Could not request Viadeo.'); - foreach($html->find('//*[@id="company-newsfeed"]/ul/li') as $element) { - $title = $element->find('p', 0)->innertext; - if ($title) { - $item = array(); - $item['uri'] = $link; - $item['title'] = mb_substr($element->find('p', 0)->innertext, 0 ,100); - $item['content'] = $element->find('p', 0)->innertext;; - $this->items[] = $item; - $i++; - } - } - } + foreach($html->find('//*[@id="company-newsfeed"]/ul/li') as $element){ + $title = $element->find('p', 0)->innertext; + if($title){ + $item = array(); + $item['uri'] = $link; + $item['title'] = mb_substr($element->find('p', 0)->innertext, 0 , 100); + $item['content'] = $element->find('p', 0)->innertext;; + $this->items[] = $item; + $i++; + } + } + } } diff --git a/bridges/VineBridge.php b/bridges/VineBridge.php index a30590da..52e1240a 100644 --- a/bridges/VineBridge.php +++ b/bridges/VineBridge.php @@ -1,31 +1,31 @@ <?php class VineBridge extends BridgeAbstract { - const MAINTAINER = "ckiw"; - const NAME = "Vine bridge"; - const URI = "http://vine.co/"; - const DESCRIPTION = "Returns the latests vines from vine user page"; - - const PARAMETERS = array( array( - 'u'=>array( - 'name'=>'User id', - 'required'=>true - ) - )); + const MAINTAINER = 'ckiw'; + const NAME = 'Vine bridge'; + const URI = 'http://vine.co/'; + const DESCRIPTION = 'Returns the latests vines from vine user page'; + + const PARAMETERS = array( array( + 'u' => array( + 'name' => 'User id', + 'required' => true + ) + )); public function collectData(){ - $html = ''; - $uri = self::URI.'/u/'.$this->getInput('u').'?mode=list'; + $html = ''; + $uri = self::URI . '/u/' . $this->getInput('u') . '?mode=list'; - $html = getSimpleHTMLDOM($uri) - or returnServerError('No results for this query.'); + $html = getSimpleHTMLDOM($uri) + or returnServerError('No results for this query.'); - foreach($html->find('.post') as $element) { + foreach($html->find('.post') as $element){ $a = $element->find('a', 0); $a->href = str_replace('https://', 'http://', $a->href); - $time = strtotime(ltrim($element->find('p', 0)->plaintext, " Uploaded at ")); + $time = strtotime(ltrim($element->find('p', 0)->plaintext, ' Uploaded at ')); $video = $element->find('video', 0); - $video->controls = "true"; + $video->controls = 'true'; $element->find('h2', 0)->outertext = ''; $item = array(); @@ -36,6 +36,5 @@ class VineBridge extends BridgeAbstract { $this->items[] = $item; } - - } + } } diff --git a/bridges/VkBridge.php b/bridges/VkBridge.php index 7ec81c65..d32782c4 100644 --- a/bridges/VkBridge.php +++ b/bridges/VkBridge.php @@ -1,49 +1,57 @@ <?php - class VkBridge extends BridgeAbstract { - const MAINTAINER = "ahiles3005"; - const NAME = "VK.com"; - const URI = "http://vk.com/"; - const CACHE_TIMEOUT = 300; // 5min - const DESCRIPTION = "Working with open pages"; - const PARAMETERS=array( array( - 'u'=>array( - 'name'=>'Group or user name', - 'required'=>true - ) - ) - ); + const MAINTAINER = 'ahiles3005'; + const NAME = 'VK.com'; + const URI = 'http://vk.com/'; + const CACHE_TIMEOUT = 300; // 5min + const DESCRIPTION = 'Working with open pages'; + const PARAMETERS = array( + array( + 'u' => array( + 'name' => 'Group or user name', + 'required' => true + ) + ) + ); + + public function getURI(){ + return static::URI . urlencode($this->getInput('u')); + } + + public function collectData(){ + $text_html = getContents($this->getURI()) + or returnServerError('No results for group or user name "' . $this->getInput('u') . '".'); + + $text_html = iconv('windows-1251', 'utf-8', $text_html); + $html = str_get_html($text_html); + foreach($html->find('div.post_table') as $post){ + if(is_object($post->find('a.wall_post_more', 0))){ + //delete link "show full" in content + $post->find('a.wall_post_more', 0)->outertext = ''; + } + $item = array(); + $item['content'] = strip_tags($post->find('div.wall_post_text', 0)->innertext); + if(is_object($post->find('a.page_media_link_title', 0))){ + $link = $post->find('a.page_media_link_title', 0)->getAttribute('href'); + + //external link in the post + $item['content'] .= "\n\rExternal link: " + . str_replace('/away.php?to=', '', urldecode($link)); + } - public function getURI(){ - return static::URI.urlencode($this->getInput('u')); - } - public function collectData(){ - $text_html = getContents($this->getURI()) - or returnServerError('No results for group or user name "'.$this->getInput('u').'".'); + //get video on post + if(is_object($post->find('span.post_video_title_content', 0))){ + $titleVideo = $post->find('span.post_video_title_content', 0)->plaintext; + $linkToVideo = self::URI . $post->find('a.page_post_thumb_video', 0)->getAttribute('href'); + $item['content'] .= "\n\r {$titleVideo}: {$linkToVideo}"; + } - $text_html = iconv('windows-1251', 'utf-8', $text_html); - $html = str_get_html($text_html); - foreach ($html->find('div.post_table') as $post) { - if (is_object($post->find('a.wall_post_more', 0))) { - $post->find('a.wall_post_more', 0)->outertext = ''; //delete link "show full" in content - } - $item = array(); - $item['content'] = strip_tags($post->find('div.wall_post_text', 0)->innertext); - if (is_object($post->find('a.page_media_link_title', 0))) { - $link = $post->find('a.page_media_link_title', 0)->getAttribute('href'); - $item['content'] .= "\n\rExternal link: " . str_replace('/away.php?to=', '', urldecode($link)); //external link in the post - } - //get video on post - if (is_object($post->find('span.post_video_title_content', 0))) { - $titleVideo = $post->find('span.post_video_title_content', 0)->plaintext; - $linkToVideo = self::URI . $post->find('a.page_post_thumb_video', 0)->getAttribute('href'); - $item['content'] .= "\n\r {$titleVideo}: {$linkToVideo}"; - } - $item['uri'] = self::URI . $post->find('.reply_link_wrap', 0)->find('a', 0)->getAttribute('href'); // get post link - $item['date'] = $post->find('span.rel_date', 0)->plaintext; - $this->items[] = $item; - // var_dump($item['date']); - } - } + // get post link + $item['uri'] = self::URI . $post->find('.reply_link_wrap', 0)->find('a', 0)->getAttribute('href'); + $item['date'] = $post->find('span.rel_date', 0)->plaintext; + $this->items[] = $item; + // var_dump($item['date']); + } + } } diff --git a/bridges/WallpaperStopBridge.php b/bridges/WallpaperStopBridge.php index 9a44d03d..ce0cbb9a 100644 --- a/bridges/WallpaperStopBridge.php +++ b/bridges/WallpaperStopBridge.php @@ -1,70 +1,103 @@ <?php class WallpaperStopBridge extends BridgeAbstract { - const MAINTAINER = "nel50n"; - const NAME = "WallpaperStop Bridge"; - const URI = "http://www.wallpaperstop.com"; + const MAINTAINER = 'nel50n'; + const NAME = 'WallpaperStop Bridge'; + const URI = 'http://www.wallpaperstop.com'; const CACHE_TIMEOUT = 43200; // 12h - const DESCRIPTION = "Returns the latests wallpapers from WallpaperStop"; + const DESCRIPTION = 'Returns the latests wallpapers from WallpaperStop'; - const PARAMETERS = array( array( - 'c'=>array('name'=>'Category'), - 's'=>array('name'=>'subcategory'), - 'm'=>array( - 'name'=>'Max number of wallpapers', - 'type'=>'number', - 'defaultValue'=>20 - ), - 'r'=>array( - 'name'=>'resolution', - 'exampleValue'=>'1920x1200, 1680x1050,…', - 'defaultValue'=>'1920x1200' - ) - )); + const PARAMETERS = array( array( + 'c' => array( + 'name' => 'Category' + ), + 's' => array( + 'name' => 'subcategory' + ), + 'm' => array( + 'name' => 'Max number of wallpapers', + 'type' => 'number', + 'defaultValue' => 20 + ), + 'r' => array( + 'name' => 'resolution', + 'exampleValue' => '1920x1200, 1680x1050,…', + 'defaultValue' => '1920x1200' + ) + )); + public function collectData(){ + $category = $this->getInput('c'); + $subcategory = $this->getInput('s'); + $resolution = $this->getInput('r'); - public function collectData(){ - $category = $this->getInput('c'); - $subcategory = $this->getInput('s'); - $resolution = $this->getInput('r'); + $num = 0; + $max = $this->getInput('m'); + $lastpage = 1; - $num = 0; - $max = $this->getInput('m'); - $lastpage = 1; + for($page = 1; $page <= $lastpage; $page++){ + $link = self::URI + . '/' + . $category + . '-wallpaper/' + . (!empty($subcategory) ? $subcategory . '-wallpaper/' : '') + . 'desktop-wallpaper-' + . $page + . '.html'; - for ($page = 1; $page <= $lastpage; $page++) { - $link = self::URI.'/'.$category.'-wallpaper/'.(!empty($subcategory)?$subcategory.'-wallpaper/':'').'desktop-wallpaper-'.$page.'.html'; - $html = getSimpleHTMLDOM($link) - or returnServerError('No results for this query.'); + $html = getSimpleHTMLDOM($link) + or returnServerError('No results for this query.'); - if ($page === 1) { - preg_match('/-(\d+)\.html$/', $html->find('.pagination > .last', 0)->href, $matches); - $lastpage = min($matches[1], ceil($max/20)); - } + if($page === 1){ + preg_match('/-(\d+)\.html$/', $html->find('.pagination > .last', 0)->href, $matches); + $lastpage = min($matches[1], ceil($max / 20)); + } - foreach($html->find('article.item') as $element) { - $wplink = $element->getAttribute('data-permalink'); - if (preg_match('%^'.self::URI.'/(.+)/([^/]+)-(\d+)\.html$%', $wplink, $matches)) { - $thumbnail = $element->find('img', 0); + foreach($html->find('article.item') as $element){ + $wplink = $element->getAttribute('data-permalink'); + if(preg_match('%^' . self::URI . '/(.+)/([^/]+)-(\d+)\.html$%', $wplink, $matches)){ + $thumbnail = $element->find('img', 0); - $item = array(); - $item['uri'] = self::URI.'/wallpapers/'.str_replace('wallpaper', 'wallpapers', $matches[1]).'/'.$matches[2].'-'.$resolution.'-'.$matches[3].'.jpg'; - $item['id'] = $matches[3]; - $item['timestamp'] = time(); - $item['title'] = $thumbnail->title; - $item['content'] = $item['title'].'<br><a href="'.$wplink.'"><img src="'.self::URI.$thumbnail->src.'" /></a>'; - $this->items[] = $item; + $item = array(); + $item['uri'] = self::URI + . '/wallpapers/' + . str_replace('wallpaper', 'wallpapers', $matches[1]) + . '/' + . $matches[2] + . '-' + . $resolution + . '-' + . $matches[3] + . '.jpg'; - $num++; - if ($num >= $max) - break 2; - } - } - } - } + $item['id'] = $matches[3]; + $item['timestamp'] = time(); + $item['title'] = $thumbnail->title; + $item['content'] = $item['title'] + . '<br><a href="' + . $wplink + . '"><img src="' + . self::URI + . $thumbnail->src + . '" /></a>'; - public function getName(){ - $subcategory=$this->getInput('s'); - return 'WallpaperStop - '.$this->getInput('c').(!empty($subcategory) ? ' > '.$subcategory : '').' ['.$this->getInput('r').']'; - } + $this->items[] = $item; + + $num++; + if ($num >= $max) + break 2; + } + } + } + } + + public function getName(){ + $subcategory = $this->getInput('s'); + return 'WallpaperStop - ' + . $this->getInput('c') + . (!empty($subcategory) ? ' > ' . $subcategory : '') + . ' [' + . $this->getInput('r') + . ']'; + } } diff --git a/bridges/WeLiveSecurityBridge.php b/bridges/WeLiveSecurityBridge.php index b05f4732..c2e4308c 100644 --- a/bridges/WeLiveSecurityBridge.php +++ b/bridges/WeLiveSecurityBridge.php @@ -6,12 +6,14 @@ class WeLiveSecurityBridge extends FeedExpander { const URI = 'http://www.welivesecurity.com/'; const DESCRIPTION = 'Returns the newest articles.'; - private function StripWithDelimiters($string, $start, $end) { - while (strpos($string, $start) !== false) { + private function stripWithDelimiters($string, $start, $end){ + while(strpos($string, $start) !== false){ $section_to_remove = substr($string, strpos($string, $start)); $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end)); $string = str_replace($section_to_remove, '', $string); - } return $string; + } + + return $string; } @@ -20,14 +22,16 @@ class WeLiveSecurityBridge extends FeedExpander { $article_html = getSimpleHTMLDOMCached($item['uri']); if(!$article_html){ - $item['content'] .= '<p>Could not request '.$this->getName().': '.$item['uri'].'</p>'; + $item['content'] .= '<p>Could not request ' . $this->getName() . ': ' . $item['uri'] . '</p>'; return $item; } $article_content = $article_html->find('div.wlistingsingletext', 0)->innertext; - $article_content = $this->StripWithDelimiters($article_content, '<script', '</script>'); - $article_content = '<p><b>'.$item['content'].'</b></p>' - .trim($article_content); + $article_content = $this->stripWithDelimiters($article_content, '<script', '</script>'); + $article_content = '<p><b>' + . $item['content'] + . '</b></p>' + . trim($article_content); $item['content'] = $article_content; @@ -35,7 +39,7 @@ class WeLiveSecurityBridge extends FeedExpander { } public function collectData(){ - $feed = static::URI.'feed/'; + $feed = static::URI . 'feed/'; $this->collectExpandableDatas($feed); } } diff --git a/bridges/WebfailBridge.php b/bridges/WebfailBridge.php index e15f3ffc..eded93b2 100644 --- a/bridges/WebfailBridge.php +++ b/bridges/WebfailBridge.php @@ -49,18 +49,18 @@ class WebfailBridge extends BridgeAbstract { switch(strtolower($type)){ case 'facebook': case 'videos': - $this->ExtractNews($html, $type); + $this->extractNews($html, $type); break; case 'none': case 'images': case 'gifs': - $this->ExtractArticle($html); + $this->extractArticle($html); break; default: returnClientError('Unknown type: ' . $type); } } - private function ExtractNews($html, $type){ + private function extractNews($html, $type){ $news = $html->find('#main', 0)->find('a.wf-list-news'); foreach($news as $element){ $item = array(); @@ -93,7 +93,7 @@ class WebfailBridge extends BridgeAbstract { } } - private function ExtractArticle($html){ + private function extractArticle($html){ $articles = $html->find('article'); foreach($articles as $article){ $item = array(); diff --git a/bridges/WhydBridge.php b/bridges/WhydBridge.php index 2066a918..919ab387 100644 --- a/bridges/WhydBridge.php +++ b/bridges/WhydBridge.php @@ -1,58 +1,56 @@ <?php -class WhydBridge extends BridgeAbstract{ +class WhydBridge extends BridgeAbstract { - const MAINTAINER = "kranack"; - const NAME = "Whyd Bridge"; - const URI = "http://www.whyd.com/"; + const MAINTAINER = 'kranack'; + const NAME = 'Whyd Bridge'; + const URI = 'http://www.whyd.com/'; const CACHE_TIMEOUT = 600; // 10min - const DESCRIPTION = "Returns 10 newest music from user profile"; + const DESCRIPTION = 'Returns 10 newest music from user profile'; - const PARAMETERS = array( array( - 'u'=>array( - 'name'=>'username/id', - 'required'=>true - ) - )); + const PARAMETERS = array( array( + 'u' => array( + 'name' => 'username/id', + 'required' => true + ) + )); - private $userName=''; + private $userName = ''; public function collectData(){ $html = ''; - if (strlen(preg_replace("/[^0-9a-f]/",'', $this->getInput('u'))) == 24){ - // is input the userid ? - $html = getSimpleHTMLDOM( - self::URI.'u/'.preg_replace("/[^0-9a-f]/",'', $this->getInput('u')) - ) or returnServerError('No results for this query.'); - } else { // input may be the username - $html = getSimpleHTMLDOM( - self::URI.'search?q='.urlencode($this->getInput('u')) - ) or returnServerError('No results for this query.'); - - for ($j = 0; $j < 5; $j++) { - if (strtolower($html->find('div.user', $j)->find('a',0)->plaintext) == strtolower($this->getInput('u'))) { - $html = getSimpleHTMLDOM( - self::URI . $html->find('div.user', $j)->find('a', 0)->getAttribute('href') - ) or returnServerError('No results for this query'); - break; - } - } - } - $this->userName = $html->find('div#profileTop', 0)->find('h1', 0)->plaintext; - - for($i = 0; $i < 10; $i++) { + if(strlen(preg_replace("/[^0-9a-f]/", '', $this->getInput('u'))) == 24){ + // is input the userid ? + $html = getSimpleHTMLDOM( + self::URI . 'u/' . preg_replace("/[^0-9a-f]/", '', $this->getInput('u')) + ) or returnServerError('No results for this query.'); + } else { // input may be the username + $html = getSimpleHTMLDOM( + self::URI . 'search?q=' . urlencode($this->getInput('u')) + ) or returnServerError('No results for this query.'); + + for($j = 0; $j < 5; $j++){ + if(strtolower($html->find('div.user', $j)->find('a',0)->plaintext) == strtolower($this->getInput('u'))){ + $html = getSimpleHTMLDOM( + self::URI . $html->find('div.user', $j)->find('a', 0)->getAttribute('href') + ) or returnServerError('No results for this query'); + break; + } + } + } + $this->userName = $html->find('div#profileTop', 0)->find('h1', 0)->plaintext; + + for($i = 0; $i < 10; $i++){ $track = $html->find('div.post', $i); - $item = array(); - $item['author'] = $track->find('h2', 0)->plaintext; - $item['title'] = $track->find('h2', 0)->plaintext; - $item['content'] = $track->find('a.thumb',0) . '<br/>' . $track->find('h2', 0)->plaintext; - $item['id'] = self::URI . $track->find('a.no-ajaxy',0)->getAttribute('href'); - $item['uri'] = self::URI . $track->find('a.no-ajaxy',0)->getAttribute('href'); - $this->items[] = $item; - } - } + $item = array(); + $item['author'] = $track->find('h2', 0)->plaintext; + $item['title'] = $track->find('h2', 0)->plaintext; + $item['content'] = $track->find('a.thumb', 0) . '<br/>' . $track->find('h2', 0)->plaintext; + $item['id'] = self::URI . $track->find('a.no-ajaxy', 0)->getAttribute('href'); + $item['uri'] = self::URI . $track->find('a.no-ajaxy', 0)->getAttribute('href'); + $this->items[] = $item; + } + } public function getName(){ - return (!empty($this->userName) ? $this->userName .' - ' : '') .'Whyd Bridge'; + return (!empty($this->userName) ? $this->userName . ' - ' : '') . 'Whyd Bridge'; } } - - diff --git a/bridges/WikipediaBridge.php b/bridges/WikipediaBridge.php index c0f0fc02..a899184e 100644 --- a/bridges/WikipediaBridge.php +++ b/bridges/WikipediaBridge.php @@ -10,41 +10,43 @@ class WikipediaBridge extends BridgeAbstract { const DESCRIPTION = 'Returns articles for a language of your choice'; const PARAMETERS = array( array( - 'language'=>array( - 'name'=>'Language', - 'type'=>'list', - 'required'=>true, - 'title'=>'Select your language', - 'exampleValue'=>'English', - 'values'=>array( - 'English'=>'en', - 'Dutch'=>'nl', - 'Esperanto'=>'eo', - 'French'=>'fr', - 'German'=>'de', + 'language' => array( + 'name' => 'Language', + 'type' => 'list', + 'required' => true, + 'title' => 'Select your language', + 'exampleValue' => 'English', + 'values' => array( + 'English' => 'en', + 'Dutch' => 'nl', + 'Esperanto' => 'eo', + 'French' => 'fr', + 'German' => 'de', ) ), - 'subject'=>array( - 'name'=>'Subject', - 'type'=>'list', - 'required'=>true, - 'title'=>'What subject are you interested in?', - 'exampleValue'=>'Today\'s featured article', - 'values'=>array( - 'Today\'s featured article'=>'tfa', - 'Did you know…'=>'dyk' + 'subject' => array( + 'name' => 'Subject', + 'type' => 'list', + 'required' => true, + 'title' => 'What subject are you interested in?', + 'exampleValue' => 'Today\'s featured article', + 'values' => array( + 'Today\'s featured article' => 'tfa', + 'Did you know…' => 'dyk' ) ), - 'fullarticle'=>array( - 'name'=>'Load full article', - 'type'=>'checkbox', - 'title'=>'Activate to always load the full article' + 'fullarticle' => array( + 'name' => 'Load full article', + 'type' => 'checkbox', + 'title' => 'Activate to always load the full article' ) )); public function getURI(){ - return 'https://' . strtolower($this->getInput('language')) . '.wikipedia.org'; - } + return 'https://' + . strtolower($this->getInput('language')) + . '.wikipedia.org'; + } public function getName(){ switch($this->getInput('subject')){ @@ -61,17 +63,23 @@ class WikipediaBridge extends BridgeAbstract { switch($subject){ case WIKIPEDIA_SUBJECT_TFA: - $name = 'Today\'s featured article from ' . strtolower($this->getInput('language')) . '.wikipedia.org'; + $name = 'Today\'s featured article from ' + . strtolower($this->getInput('language')) + . '.wikipedia.org'; break; case WIKIPEDIA_SUBJECT_DYK: - $name = 'Did you know? - articles from ' . strtolower($this->getInput('language')) . '.wikipedia.org'; + $name = 'Did you know? - articles from ' + . strtolower($this->getInput('language')) + . '.wikipedia.org'; break; default: - $name = 'Articles from ' . strtolower($this->getInput('language')) . '.wikipedia.org'; + $name = 'Articles from ' + . strtolower($this->getInput('language')) + . '.wikipedia.org'; break; } - return $name; - } + return $name; + } public function collectData(){ @@ -98,9 +106,9 @@ class WikipediaBridge extends BridgeAbstract { /* * Now read content depending on the language (make sure to create one function per language!) * We build the function name automatically, just make sure you create a private function ending - * with your desired language code, where the language code is upper case! (en -> GetContentsEN). + * with your desired language code, where the language code is upper case! (en -> getContentsEN). */ - $function = 'GetContents' . strtoupper($this->getInput('language')); + $function = 'getContents' . ucfirst(strtolower($this->getInput('language'))); if(!method_exists($this, $function)) returnServerError('A function to get the contents for your language is missing (\'' . $function . '\')!'); @@ -116,21 +124,27 @@ class WikipediaBridge extends BridgeAbstract { * @param $element A simplehtmldom element * @return The $element->innertext with all URIs replaced */ - private function ReplaceURIInHTMLElement($element){ + private function replaceUriInHtmlElement($element){ return str_replace('href="/', 'href="' . $this->getURI() . '/', $element->innertext); } /* - * Adds a new item to $items using a generic operation (should work for most (all?) wikis) - * $anchorText can be specified if the wiki in question doesn't use '...' (like Dutch, French and Italian) - * $anchorFallbackIndex can be used to specify a different fallback link than the first (e.g., -1 for the last) + * Adds a new item to $items using a generic operation (should work for most + * (all?) wikis) $anchorText can be specified if the wiki in question doesn't + * use '...' (like Dutch, French and Italian) $anchorFallbackIndex can be + * used to specify a different fallback link than the first + * (e.g., -1 for the last) */ - private function AddTodaysFeaturedArticleGeneric($element, $fullArticle, $anchorText = '...', $anchorFallbackIndex = 0){ + private function addTodaysFeaturedArticleGeneric($element + , $fullArticle + , $anchorText = '...' + , $anchorFallbackIndex = 0){ // Clean the bottom of the featured article if ($element->find('div', -1)) $element->find('div', -1)->outertext = ''; - // The title and URI of the article can be found in an anchor containing the string '...' in most wikis ('full article ...') + // The title and URI of the article can be found in an anchor containing + // the string '...' in most wikis ('full article ...') $target = $element->find('p/a', $anchorFallbackIndex); foreach($element->find('//a') as $anchor){ if(strpos($anchor->innertext, $anchorText) !== false){ @@ -144,9 +158,9 @@ class WikipediaBridge extends BridgeAbstract { $item['title'] = $target->title; if(!$fullArticle) - $item['content'] = strip_tags($this->ReplaceURIInHTMLElement($element), '<a><p><br><img>'); + $item['content'] = strip_tags($this->replaceUriInHtmlElement($element), '<a><p><br><img>'); else - $item['content'] = $this->LoadFullArticle($item['uri']); + $item['content'] = $this->loadFullArticle($item['uri']); $this->items[] = $item; } @@ -154,7 +168,7 @@ class WikipediaBridge extends BridgeAbstract { /* * Adds a new item to $items using a generic operation (should work for most (all?) wikis) */ - private function AddDidYouKnowGeneric($element, $fullArticle){ + private function addDidYouKnowGeneric($element, $fullArticle){ foreach($element->find('ul', 0)->find('li') as $entry){ $item = array(); @@ -163,9 +177,9 @@ class WikipediaBridge extends BridgeAbstract { $item['title'] = strip_tags($entry->innertext); if(!$fullArticle) - $item['content'] = $this->ReplaceURIInHTMLElement($entry); + $item['content'] = $this->replaceUriInHtmlElement($entry); else - $item['content'] = $this->LoadFullArticle($item['uri']); + $item['content'] = $this->loadFullArticle($item['uri']); $this->items[] = $item; } @@ -174,7 +188,7 @@ class WikipediaBridge extends BridgeAbstract { /** * Loads the full article from a given URI */ - private function LoadFullArticle($uri){ + private function loadFullArticle($uri){ $content_html = getSimpleHTMLDOMCached($uri); if(!$content_html) @@ -199,15 +213,15 @@ class WikipediaBridge extends BridgeAbstract { /** * Implementation for de.wikipedia.org */ - private function GetContentsDE($html, $subject, $fullArticle){ + private function getContentsDe($html, $subject, $fullArticle){ switch($subject){ case WIKIPEDIA_SUBJECT_TFA: $element = $html->find('div[id=mf-tfa]', 0); - $this->AddTodaysFeaturedArticleGeneric($element, $fullArticle); + $this->addTodaysFeaturedArticleGeneric($element, $fullArticle); break; case WIKIPEDIA_SUBJECT_DYK: $element = $html->find('div[id=mf-dyk]', 0); - $this->AddDidYouKnowGeneric($element, $fullArticle); + $this->addDidYouKnowGeneric($element, $fullArticle); break; default: break; @@ -217,15 +231,15 @@ class WikipediaBridge extends BridgeAbstract { /** * Implementation for fr.wikipedia.org */ - private function GetContentsFR($html, $subject, $fullArticle){ + private function getContentsFr($html, $subject, $fullArticle){ switch($subject){ case WIKIPEDIA_SUBJECT_TFA: $element = $html->find('div[id=accueil-lumieresur]', 0); - $this->AddTodaysFeaturedArticleGeneric($element, $fullArticle, 'Lire la suite'); + $this->addTodaysFeaturedArticleGeneric($element, $fullArticle, 'Lire la suite'); break; case WIKIPEDIA_SUBJECT_DYK: $element = $html->find('div[id=SaviezVous]', 0); - $this->AddDidYouKnowGeneric($element, $fullArticle); + $this->addDidYouKnowGeneric($element, $fullArticle); break; default: break; @@ -235,15 +249,15 @@ class WikipediaBridge extends BridgeAbstract { /** * Implementation for en.wikipedia.org */ - private function GetContentsEN($html, $subject, $fullArticle){ + private function getContentsEn($html, $subject, $fullArticle){ switch($subject){ case WIKIPEDIA_SUBJECT_TFA: $element = $html->find('div[id=mp-tfa]', 0); - $this->AddTodaysFeaturedArticleGeneric($element, $fullArticle); + $this->addTodaysFeaturedArticleGeneric($element, $fullArticle); break; case WIKIPEDIA_SUBJECT_DYK: $element = $html->find('div[id=mp-dyk]', 0); - $this->AddDidYouKnowGeneric($element, $fullArticle); + $this->addDidYouKnowGeneric($element, $fullArticle); break; default: break; @@ -253,15 +267,15 @@ class WikipediaBridge extends BridgeAbstract { /** * Implementation for eo.wikipedia.org */ - private function GetContentsEO($html, $subject, $fullArticle){ + private function getContentsEo($html, $subject, $fullArticle){ switch($subject){ case WIKIPEDIA_SUBJECT_TFA: $element = $html->find('div[id=mf-artikolo-de-la-semajno]', 0); - $this->AddTodaysFeaturedArticleGeneric($element, $fullArticle); + $this->addTodaysFeaturedArticleGeneric($element, $fullArticle); break; case WIKIPEDIA_SUBJECT_DYK: $element = $html->find('div[id=mw-content-text]', 0)->find('table', 4)->find('td', 4); - $this->AddDidYouKnowGeneric($element, $fullArticle); + $this->addDidYouKnowGeneric($element, $fullArticle); break; default: break; @@ -271,15 +285,15 @@ class WikipediaBridge extends BridgeAbstract { /** * Implementation for nl.wikipedia.org */ - private function GetContentsNL($html, $subject, $fullArticle){ + private function getContentsNl($html, $subject, $fullArticle){ switch($subject){ case WIKIPEDIA_SUBJECT_TFA: $element = $html->find('div[id=mf-uitgelicht]', 0); - $this->AddTodaysFeaturedArticleGeneric($element, $fullArticle, 'Lees meer'); + $this->addTodaysFeaturedArticleGeneric($element, $fullArticle, 'Lees meer'); break; case WIKIPEDIA_SUBJECT_DYK: $element = $html->find('div[id=mw-content-text]', 0)->find('table', 4)->find('td', 2); - $this->AddDidYouKnowGeneric($element, $fullArticle); + $this->addDidYouKnowGeneric($element, $fullArticle); break; default: break; diff --git a/bridges/WordPressBridge.php b/bridges/WordPressBridge.php index ce2bda41..40e29e7f 100644 --- a/bridges/WordPressBridge.php +++ b/bridges/WordPressBridge.php @@ -1,19 +1,19 @@ <?php class WordPressBridge extends FeedExpander { - const MAINTAINER = "aledeg"; - const NAME = "Wordpress Bridge"; - const URI = "https://wordpress.org/"; + const MAINTAINER = 'aledeg'; + const NAME = 'Wordpress Bridge'; + const URI = 'https://wordpress.org/'; const CACHE_TIMEOUT = 10800; // 3h - const DESCRIPTION = "Returns the newest full posts of a Wordpress powered website"; + const DESCRIPTION = 'Returns the newest full posts of a Wordpress powered website'; const PARAMETERS = array( array( - 'url'=>array( - 'name'=>'Blog URL', - 'required'=>true + 'url' => array( + 'name' => 'Blog URL', + 'required' => true ) )); - private function clearContent($content) { + private function clearContent($content){ $content = preg_replace('/<script[^>]*>[^<]*<\/script>/', '', $content); $content = preg_replace('/<div class="wpa".*/', '', $content); $content = preg_replace('/<form.*\/form>/', '', $content); @@ -21,26 +21,26 @@ class WordPressBridge extends FeedExpander { } protected function parseItem($newItem){ - $item=parent::parseItem($newItem); + $item = parent::parseItem($newItem); $article_html = getSimpleHTMLDOMCached($item['uri']); - $article=null; + $article = null; switch(true){ - case !is_null($article_html->find('article',0)): + case !is_null($article_html->find('article', 0)): // most common content div $article = $article_html->find('article', 0); break; - case !is_null($article_html->find('.single-content',0)): + case !is_null($article_html->find('.single-content', 0)): // another common content div $article = $article_html->find('.single-content', 0); break; - case !is_null($article_html->find('.post-content',0)): + case !is_null($article_html->find('.post-content', 0)): // another common content div $article = $article_html->find('.post-content', 0); break; - case !is_null($article_html->find('.post',0)): + case !is_null($article_html->find('.post', 0)): // for old WordPress themes without HTML5 $article = $article_html->find('.post', 0); break; @@ -62,14 +62,14 @@ class WordPressBridge extends FeedExpander { } public function collectData(){ - if($this->getInput('url') && substr($this->getInput('url'),0,strlen('http'))!=='http'){ + if($this->getInput('url') && substr($this->getInput('url'), 0, strlen('http')) !== 'http'){ // just in case someone find a way to access local files by playing with the url returnClientError('The url parameter must either refer to http or https protocol.'); } try{ - $this->collectExpandableDatas($this->getURI().'/feed/atom/'); + $this->collectExpandableDatas($this->getURI() . '/feed/atom/'); }catch (HttpException $e){ - $this->collectExpandableDatas($this->getURI().'/?feed=atom'); + $this->collectExpandableDatas($this->getURI() . '/?feed=atom'); } } diff --git a/bridges/WorldOfTanksBridge.php b/bridges/WorldOfTanksBridge.php index 2cd86c4a..c59cdaa9 100644 --- a/bridges/WorldOfTanksBridge.php +++ b/bridges/WorldOfTanksBridge.php @@ -1,68 +1,68 @@ <?php class WorldOfTanksBridge extends BridgeAbstract { - const MAINTAINER = "mitsukarenai"; - const NAME = "World of Tanks"; - const URI = "http://worldoftanks.eu/"; - const DESCRIPTION = "News about the tank slaughter game."; + const MAINTAINER = 'mitsukarenai'; + const NAME = 'World of Tanks'; + const URI = 'http://worldoftanks.eu/'; + const DESCRIPTION = 'News about the tank slaughter game.'; - const PARAMETERS = array( array( - 'category'=>array( - // TODO: should be a list - 'name'=>'nom de la catégorie' - ), - 'lang'=>array( - 'name'=>'Langue', - 'type'=>'list', - 'values'=>array( - 'Français'=>'fr', - 'English'=>'en', - 'Español'=>'es', - 'Deutsch'=>'de', - 'Čeština'=>'cs', - 'Polski'=>'pl', - 'Türkçe'=>'tr' - ) - ) - )); + const PARAMETERS = array( array( + 'category' => array( + // TODO: should be a list + 'name' => 'nom de la catégorie' + ), + 'lang' => array( + 'name' => 'Langue', + 'type' => 'list', + 'values' => array( + 'Français' => 'fr', + 'English' => 'en', + 'Español' => 'es', + 'Deutsch' => 'de', + 'Čeština' => 'cs', + 'Polski' => 'pl', + 'Türkçe' => 'tr' + ) + ) + )); - private $title=''; + private $title = ''; - function getURI(){ - $lang = $this->getInput('lang'); - $uri = self::URI.$lang.'/news/'; - if(!empty($this->getInput('category'))) { - $uri .= 'pc-browser/'.$this->getInput('category')."/"; - } - return $uri; - } + function getURI(){ + $lang = $this->getInput('lang'); + $uri = self::URI . $lang . '/news/'; + if(!empty($this->getInput('category'))) { + $uri .= 'pc-browser/' . $this->getInput('category') . '/'; + } + return $uri; + } - public function getName(){ - return $this->title?:self::NAME; - } + public function getName(){ + return $this->title ?: self::NAME; + } - public function collectData(){ - $html = getSimpleHTMLDOM($this->getURI()) - or returnServerError('Could not request '.$this->getURI()); - debugMessage("loaded HTML from ".$this->getURI()); - // customize name - $this->title = $html->find('title', 0)->innertext; - foreach($html->find('.b-imgblock_ico') as $infoLink) { - $this->parseLine($infoLink); - } - } + public function collectData(){ + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Could not request ' . $this->getURI()); + debugMessage("loaded HTML from " . $this->getURI()); + // customize name + $this->title = $html->find('title', 0)->innertext; + foreach($html->find('.b-imgblock_ico') as $infoLink){ + $this->parseLine($infoLink); + } + } - private function parseLine($infoLink) { - $item = array(); - $item['uri'] = self::URI.$infoLink->href; - // now load that uri from cache - debugMessage("loading page ".$item['uri']); - $articlePage = getSimpleHTMLDOMCached($item['uri']); - $content = $articlePage->find('.l-content', 0); - defaultImageSrcTo($content, self::URI); - $item['title'] = $content->find('h1', 0)->innertext; - $item['content'] = $content->find('.b-content', 0)->innertext; - $item['timestamp'] = $content->find('.b-statistic_time', 0)->getAttribute("data-timestamp"); - $this->items[] = $item; - } + private function parseLine($infoLink){ + $item = array(); + $item['uri'] = self::URI . $infoLink->href; + // now load that uri from cache + debugMessage('loading page ' . $item['uri']); + $articlePage = getSimpleHTMLDOMCached($item['uri']); + $content = $articlePage->find('.l-content', 0); + defaultImageSrcTo($content, self::URI); + $item['title'] = $content->find('h1', 0)->innertext; + $item['content'] = $content->find('.b-content', 0)->innertext; + $item['timestamp'] = $content->find('.b-statistic_time', 0)->getAttribute("data-timestamp"); + $this->items[] = $item; + } } diff --git a/bridges/XbooruBridge.php b/bridges/XbooruBridge.php index e0bd4e18..d3605bec 100644 --- a/bridges/XbooruBridge.php +++ b/bridges/XbooruBridge.php @@ -1,12 +1,12 @@ <?php require_once('GelbooruBridge.php'); -class XbooruBridge extends GelbooruBridge{ +class XbooruBridge extends GelbooruBridge { - const MAINTAINER = "mitsukarenai"; - const NAME = "Xbooru"; - const URI = "http://xbooru.com/"; - const DESCRIPTION = "Returns images from given page"; + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Xbooru'; + const URI = 'http://xbooru.com/'; + const DESCRIPTION = 'Returns images from given page'; - const PIDBYPAGE=50; + const PIDBYPAGE = 50; } diff --git a/bridges/YandereBridge.php b/bridges/YandereBridge.php index 61b59620..df8b30eb 100644 --- a/bridges/YandereBridge.php +++ b/bridges/YandereBridge.php @@ -1,11 +1,11 @@ <?php require_once('MoebooruBridge.php'); -class YandereBridge extends MoebooruBridge{ +class YandereBridge extends MoebooruBridge { - const MAINTAINER = "mitsukarenai"; - const NAME = "Yande.re"; - const URI = "https://yande.re/"; - const DESCRIPTION = "Returns images from given page and tags"; + const MAINTAINER = 'mitsukarenai'; + const NAME = 'Yande.re'; + const URI = 'https://yande.re/'; + const DESCRIPTION = 'Returns images from given page and tags'; } diff --git a/bridges/YoutubeBridge.php b/bridges/YoutubeBridge.php index 4aa54e1e..1155a13d 100644 --- a/bridges/YoutubeBridge.php +++ b/bridges/YoutubeBridge.php @@ -14,42 +14,42 @@ class YoutubeBridge extends BridgeAbstract { const DESCRIPTION = 'Returns the 10 newest videos by username/channel/playlist or search'; const MAINTAINER = 'mitsukarenai'; - const PARAMETERS = array( - 'By username' => array( - 'u'=>array( - 'name'=>'username', - 'exampleValue'=>'test', - 'required'=>true - ) - ), - 'By channel id' => array( - 'c'=>array( - 'name'=>'channel id', - 'exampleValue'=>"15", - 'required'=>true - ) - ), - 'By playlist Id' => array( - 'p'=>array( - 'name'=>'playlist id', - 'exampleValue'=>"15" - ) - ), - 'Search result' => array( - 's'=>array( - 'name'=>'search keyword', - 'exampleValue'=>'test' - ), - 'pa'=>array( - 'name'=>'page', - 'type'=>'number', - 'exampleValue'=>1 - ) - ) - ); + const PARAMETERS = array( + 'By username' => array( + 'u' => array( + 'name' => 'username', + 'exampleValue' => 'test', + 'required' => true + ) + ), + 'By channel id' => array( + 'c' => array( + 'name' => 'channel id', + 'exampleValue' => "15", + 'required' => true + ) + ), + 'By playlist Id' => array( + 'p' => array( + 'name' => 'playlist id', + 'exampleValue' => "15" + ) + ), + 'Search result' => array( + 's' => array( + 'name' => 'search keyword', + 'exampleValue' => 'test' + ), + 'pa' => array( + 'name' => 'page', + 'type' => 'number', + 'exampleValue' => 1 + ) + ) + ); - private function ytBridgeQueryVideoInfo($vid, &$author, &$desc, &$time) { - $html = getSimpleHTMLDOM(self::URI."watch?v=$vid"); + private function ytBridgeQueryVideoInfo($vid, &$author, &$desc, &$time){ + $html = getSimpleHTMLDOM(self::URI . "watch?v=$vid"); $author = $html->innertext; $author = substr($author, strpos($author, '"author=') + 8); $author = substr($author, 0, strpos($author, '\u0026')); @@ -57,21 +57,21 @@ class YoutubeBridge extends BridgeAbstract { $time = strtotime($html->find('meta[itemprop=datePublished]', 0)->getAttribute('content')); } - private function ytBridgeAddItem($vid, $title, $author, $desc, $time) { + private function ytBridgeAddItem($vid, $title, $author, $desc, $time){ $item = array(); $item['id'] = $vid; $item['title'] = $title; $item['author'] = $author; $item['timestamp'] = $time; - $item['uri'] = self::URI.'watch?v='.$vid; - $thumbnailUri = str_replace('/www.', '/img.', self::URI).'vi/'.$vid.'/0.jpg'; - $item['content'] = '<a href="'.$item['uri'].'"><img src="'.$thumbnailUri.'" /></a><br />'.$desc; + $item['uri'] = self::URI . 'watch?v=' . $vid; + $thumbnailUri = str_replace('/www.', '/img.', self::URI) . 'vi/' . $vid . '/0.jpg'; + $item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $thumbnailUri . '" /></a><br />' . $desc; $this->items[] = $item; } private function ytBridgeParseXmlFeed($xml) { - foreach ($xml->find('entry') as $element) { - $title = $this->ytBridgeFixTitle($element->find('title',0)->plaintext); + foreach($xml->find('entry') as $element){ + $title = $this->ytBridgeFixTitle($element->find('title', 0)->plaintext); $author = $element->find('name', 0)->plaintext; $desc = $element->find('media:description', 0)->innertext; $vid = str_replace('yt:video:', '', $element->find('id', 0)->plaintext); @@ -81,14 +81,17 @@ class YoutubeBridge extends BridgeAbstract { $this->request = $this->ytBridgeFixTitle($xml->find('feed > title', 0)->plaintext); } - private function ytBridgeParseHtmlListing($html, $element_selector, $title_selector) { - $limit = 10; $count = 0; - foreach ($html->find($element_selector) as $element) { - if ($count < $limit) { - $author = ''; $desc = ''; $time = 0; + private function ytBridgeParseHtmlListing($html, $element_selector, $title_selector){ + $limit = 10; + $count = 0; + foreach($html->find($element_selector) as $element){ + if($count < $limit){ + $author = ''; + $desc = ''; + $time = 0; $vid = str_replace('/watch?v=', '', $element->find('a', 0)->href); $title = $this->ytBridgeFixTitle($element->find($title_selector, 0)->plaintext); - if ($title != '[Private Video]') { + if($title != '[Private Video]'){ $this->ytBridgeQueryVideoInfo($vid, $author, $desc, $time); $this->ytBridgeAddItem($vid, $title, $author, $desc, $time); $count++; @@ -99,7 +102,7 @@ class YoutubeBridge extends BridgeAbstract { private function ytBridgeFixTitle($title) { // convert both Ӓ and " to UTF-8 - return html_entity_decode($title,ENT_QUOTES,'UTF-8'); + return html_entity_decode($title, ENT_QUOTES, 'UTF-8'); } public function collectData(){ @@ -109,45 +112,56 @@ class YoutubeBridge extends BridgeAbstract { $url_feed = ''; $url_listing = ''; - if ($this->getInput('u')) { /* User and Channel modes */ + if($this->getInput('u')){ /* User and Channel modes */ $this->request = $this->getInput('u'); - $url_feed = self::URI.'feeds/videos.xml?user='.urlencode($this->request); - $url_listing = self::URI.'user/'.urlencode($this->request).'/videos'; - } else if ($this->getInput('c')) { + $url_feed = self::URI . 'feeds/videos.xml?user=' . urlencode($this->request); + $url_listing = self::URI . 'user/' . urlencode($this->request) . '/videos'; + } elseif($this->getInput('c')){ $this->request = $this->getInput('c'); - $url_feed = self::URI.'feeds/videos.xml?channel_id='.urlencode($this->request); - $url_listing = self::URI.'channel/'.urlencode($this->request).'/videos'; + $url_feed = self::URI . 'feeds/videos.xml?channel_id=' . urlencode($this->request); + $url_listing = self::URI . 'channel/' . urlencode($this->request) . '/videos'; } - if (!empty($url_feed) && !empty($url_listing)) { - if ($xml = getSimpleHTMLDOM($url_feed)) { + + if(!empty($url_feed) && !empty($url_listing)){ + if($xml = getSimpleHTMLDOM($url_feed)){ $this->ytBridgeParseXmlFeed($xml); - } else if ($html = getSimpleHTMLDOM($url_listing)) { + } elseif($html = getSimpleHTMLDOM($url_listing)){ $this->ytBridgeParseHtmlListing($html, 'li.channels-content-item', 'h3'); - } else returnServerError("Could not request YouTube. Tried:\n - $url_feed\n - $url_listing"); - } - - else if ($this->getInput('p')) { /* playlist mode */ + } else { + returnServerError("Could not request YouTube. Tried:\n - $url_feed\n - $url_listing"); + } + } elseif($this->getInput('p')){ /* playlist mode */ $this->request = $this->getInput('p'); - $url_listing = self::URI.'playlist?list='.urlencode($this->request); - $html = getSimpleHTMLDOM($url_listing) or returnServerError("Could not request YouTube. Tried:\n - $url_listing"); + $url_listing = self::URI . 'playlist?list=' . urlencode($this->request); + $html = getSimpleHTMLDOM($url_listing) + or returnServerError("Could not request YouTube. Tried:\n - $url_listing"); $this->ytBridgeParseHtmlListing($html, 'tr.pl-video', '.pl-video-title a'); - $this->request = 'Playlist: '.str_replace(' - YouTube', '', $html->find('title', 0)->plaintext); - } + $this->request = 'Playlist: ' . str_replace(' - YouTube', '', $html->find('title', 0)->plaintext); + } elseif($this->getInput('s')){ /* search mode */ + $this->request = $this->getInput('s'); + $page = 1; + if($this->getInput('pa')) + $page = (int)preg_replace("/[^0-9]/", '', $this->getInput('pa')); - else if ($this->getInput('s')) { /* search mode */ - $this->request = $this->getInput('s'); $page = 1; if ($this->getInput('pa')) $page = (int)preg_replace("/[^0-9]/",'', $this->getInput('pa')); - $url_listing = self::URI.'results?search_query='.urlencode($this->request).'&page='.$page.'&filters=video&search_sort=video_date_uploaded'; - $html = getSimpleHTMLDOM($url_listing) or returnServerError("Could not request YouTube. Tried:\n - $url_listing"); - $this->ytBridgeParseHtmlListing($html, 'div.yt-lockup', 'h3'); - $this->request = 'Search: '.str_replace(' - YouTube', '', $html->find('title', 0)->plaintext); - } + $url_listing = self::URI + . 'results?search_query=' + . urlencode($this->request) + . '&page=' + . $page + . '&filters=video&search_sort=video_date_uploaded'; - else { /* no valid mode */ - returnClientError("You must either specify either:\n - YouTube username (?u=...)\n - Channel id (?c=...)\n - Playlist id (?p=...)\n - Search (?s=...)"); + $html = getSimpleHTMLDOM($url_listing) + or returnServerError("Could not request YouTube. Tried:\n - $url_listing"); + + $this->ytBridgeParseHtmlListing($html, 'div.yt-lockup', 'h3'); + $this->request = 'Search: ' . str_replace(' - YouTube', '', $html->find('title', 0)->plaintext); + } else { /* no valid mode */ + returnClientError("You must either specify either:\n - YouTube + username (?u=...)\n - Channel id (?c=...)\n - Playlist id (?p=...)\n - Search (?s=...)"); } } public function getName(){ - return (!empty($this->request) ? $this->request .' - ' : '') .'YouTube Bridge'; + return (!empty($this->request) ? $this->request . ' - ' : '') . 'YouTube Bridge'; } } diff --git a/bridges/ZDNetBridge.php b/bridges/ZDNetBridge.php index aad006f1..fa81d8e1 100644 --- a/bridges/ZDNetBridge.php +++ b/bridges/ZDNetBridge.php @@ -1,278 +1,302 @@ <?php class ZDNetBridge extends BridgeAbstract { - const MAINTAINER = 'ORelio'; - const NAME = 'ZDNet Bridge'; - const URI = 'http://www.zdnet.com/'; - const DESCRIPTION = 'Technology News, Analysis, Comments and Product Reviews for IT Professionals.'; + const MAINTAINER = 'ORelio'; + const NAME = 'ZDNet Bridge'; + const URI = 'http://www.zdnet.com/'; + const DESCRIPTION = 'Technology News, Analysis, Comments and Product Reviews for IT Professionals.'; - //http://www.zdnet.com/zdnet.opml - const PARAMETERS = array( array( - 'feed'=>array( - 'name'=>'Feed', - 'type'=>'list', - 'values'=>array( - 'Subscribe to ZDNet RSS Feeds'=>array( - 'All Blogs'=>'blog', - 'Just News'=>'news', - 'All Reviews'=>'topic/reviews', - 'Latest Downloads'=>'downloads!recent', - 'Latest Articles'=>'/', - 'Latest Australia Articles'=>'au', - 'Latest UK Articles'=>'uk', - 'Latest US Articles'=>'us', - 'Latest Asia Articles'=>'as' - ), - 'Keep up with ZDNet Blogs RSS:'=>array( - 'Transforming the Datacenter'=>'blog/transforming-datacenter', - 'SMB India'=>'blog/smb-india', - 'Indonesia BizTech'=>'blog/indonesia-biztech', - 'Hong Kong Techie'=>'blog/hong-kong-techie', - 'Tech Taiwan'=>'blog/tech-taiwan', - 'Startup India'=>'blog/startup-india', - 'Starting Up Asia'=>'blog/starting-up-asia', - 'Next-Gen Partner'=>'blog/partner', - 'Post-PC Developments'=>'blog/post-pc', - 'Benelux'=>'blog/benelux', - 'Heat Sink'=>'blog/heat-sink', - 'Italy\'s got tech'=>'blog/italy', - 'African Enterprise'=>'blog/african-enterprise', - 'New Tech for Old India'=>'blog/new-india', - 'Estonia Uncovered'=>'blog/estonia', - 'IT Iberia'=>'blog/iberia', - 'Brazil Tech'=>'blog/brazil', - '500 words into the future'=>'blog/500-words-into-the-future', - 'ÜberTech'=>'blog/ubertech', - 'All About Microsoft'=>'blog/microsoft', - 'Back office'=>'blog/back-office', - 'Barker Bites Back'=>'blog/barker-bites-back', - 'Between the Lines'=>'blog/btl', - 'Big on Data'=>'blog/big-data', - 'bootstrappr'=>'blog/bootstrappr', - 'By The Way'=>'blog/by-the-way', - 'Central European Processing'=>'blog/central-europe', - 'Cloud Builders'=>'blog/cloud-builders', - 'Communication Breakdown'=>'blog/communication-breakdown', - 'Collaboration 2.0'=>'blog/collaboration', - 'Constellation Research'=>'blog/constellation', - 'Consumerization: BYOD'=>'blog/consumerization', - 'DIY-IT'=>'blog/diy-it', - 'Enterprise Web 2.0'=>'blog/hinchcliffe', - 'Five Nines: The Next Gen Datacenter'=>'blog/datacenter', - 'Forrester Research'=>'blog/forrester', - 'Full Duplex'=>'blog/full-duplex', - 'Gen Why?'=>'blog/gen-why', - 'Hardware 2.0'=>'blog/hardware', - 'Identity Matters'=>'blog/identity', - 'iGeneration'=>'blog/igeneration', - 'Internet of Everything'=>'blog/cisco', - 'Beyond IT Failure'=>'blog/projectfailures', - 'Jamie\'s Mostly Linux Stuff'=>'blog/jamies-mostly-linux-stuff', - 'Jack\'s Blog'=>'blog/jacks-blog', - 'Laptops & Desktops'=>'blog/computers', - 'Linux and Open Source'=>'blog/open-source', - 'London Calling'=>'blog/london', - 'Mapping Babel'=>'blog/mapping-babel', - 'Mixed Signals'=>'blog/mixed-signals', - 'Mobile India'=>'blog/mobile-india', - 'Mobile News'=>'blog/mobile-news', - 'Networking'=>'blog/networking', - 'Norse Code'=>'blog/norse-code', - 'Null Pointer'=>'blog/null-pointer', - 'The Full Tilt'=>'blog/the-full-tilt', - 'Pinoy Post'=>'blog/pinoy-post', - 'Practically Tech'=>'blog/practically-tech', - 'Product Central'=>'blog/product-central', - 'Pulp Tech'=>'blog/violetblue', - 'Qubits and Pieces'=>'blog/qubits-and-pieces', - 'Securify This!'=>'blog/securify-this', - 'Service Oriented'=>'blog/service-oriented', - 'Small Talk'=>'blog/small-talk', - 'Small Business Matters'=>'blog/small-business-matters', - 'Smartphones and Cell Phones'=>'blog/cell-phones', - 'Social Business'=>'blog/feeds', - 'Social CRM: The Conversation'=>'blog/crm', - 'Software & Services Safari'=>'blog/sommer', - 'Storage Bits'=>'blog/storage', - 'Stacking up Open Clouds'=>'blog/apac-redhat', - 'Techie Isles'=>'blog/techie-isles', - 'Technolatte'=>'blog/technolatte', - 'Tech Podium'=>'blog/tech-podium', - 'Tel Aviv Tech'=>'blog/tel-aviv', - 'Tech Broiler'=>'blog/perlow', - 'The SANMAN'=>'blog/the-sanman', - 'The open source revolution'=>'blog/the-open-source-revolution', - 'The German View'=>'blog/german', - 'The Ed Bott Report'=>'blog/bott', - 'The Mobile Gadgeteer'=>'blog/mobile-gadgeteer', - 'The Apple Core'=>'blog/apple', - 'Tom Foremski: IMHO'=>'blog/foremski', - 'Twisted Wire'=>'blog/twisted-wire', - 'Vive la tech'=>'blog/france', - 'Virtually Speaking'=>'blog/virtualization', - 'View from China'=>'blog/china', - 'Web design & Free Software'=>'blog/web-design-and-free-software', - 'ZDNet Government'=>'blog/government', - 'ZDNet UK Book Reviews'=>'blog/zdnet-uk-book-reviews', - 'ZDNet UK First Take'=>'blog/zdnet-uk-first-take', - 'Zero Day'=>'blog/security' - ), - 'ZDNet Hot Topics RSS:'=>array( - 'Apple'=>'topic/apple', - 'Collaboration'=>'topic/collaboration', - 'Enterprise Software'=>'topic/enterprise-software', - 'Google'=>'topic/google', - 'Great debate'=>'topic/great-debate', - 'Hardware'=>'topic/hardware', - 'IBM'=>'topic/ibm', - 'iOS'=>'topic/ios', - 'iPhone'=>'topic/iphone', - 'iPad'=>'topic/ipad', - 'IT Priorities'=>'topic/it-priorities', - 'Laptops'=>'topic/laptops', - 'Legal'=>'topic/legal', - 'Linux'=>'topic/linux', - 'Microsoft'=>'topic/microsoft', - 'Mobile OS'=>'topic/mobile-os', - 'Mobility'=>'topic/mobility', - 'Networking'=>'topic/networking', - 'Oracle'=>'topic/oracle', - 'Processors'=>'topic/processors', - 'Samsung'=>'topic/samsung', - 'Security'=>'topic/security', - 'Small business: going big on mobility'=>'topic/small-business-going-big-on-mobility' - ), - 'Product Blogs:'=>array( - 'Digital Cameras & Camcorders'=>'blog/digitalcameras', - 'Home Theater'=>'blog/home-theater', - 'Laptops and Desktops'=>'blog/computers', - 'The Mobile Gadgeteer'=>'blog/mobile-gadgeteer', - 'Smartphones and Cell Phones'=>'blog/cell-phones', - 'The ToyBox'=>'blog/gadgetreviews' - ), - 'Vertical Blogs:'=>array( - 'ZDNet Education'=>'blog/education', - 'ZDNet Healthcare'=>'blog/healthcare', - 'ZDNet Government'=>'blog/government' - ) - ) - ) - )); + //http://www.zdnet.com/zdnet.opml + const PARAMETERS = array( array( + 'feed' => array( + 'name' => 'Feed', + 'type' => 'list', + 'values' => array( + 'Subscribe to ZDNet RSS Feeds' => array( + 'All Blogs' => 'blog', + 'Just News' => 'news', + 'All Reviews' => 'topic/reviews', + 'Latest Downloads' => 'downloads!recent', + 'Latest Articles' => '/', + 'Latest Australia Articles' => 'au', + 'Latest UK Articles' => 'uk', + 'Latest US Articles' => 'us', + 'Latest Asia Articles' => 'as' + ), + 'Keep up with ZDNet Blogs RSS:' => array( + 'Transforming the Datacenter' => 'blog/transforming-datacenter', + 'SMB India' => 'blog/smb-india', + 'Indonesia BizTech' => 'blog/indonesia-biztech', + 'Hong Kong Techie' => 'blog/hong-kong-techie', + 'Tech Taiwan' => 'blog/tech-taiwan', + 'Startup India' => 'blog/startup-india', + 'Starting Up Asia' => 'blog/starting-up-asia', + 'Next-Gen Partner' => 'blog/partner', + 'Post-PC Developments' => 'blog/post-pc', + 'Benelux' => 'blog/benelux', + 'Heat Sink' => 'blog/heat-sink', + 'Italy\'s got tech' => 'blog/italy', + 'African Enterprise' => 'blog/african-enterprise', + 'New Tech for Old India' => 'blog/new-india', + 'Estonia Uncovered' => 'blog/estonia', + 'IT Iberia' => 'blog/iberia', + 'Brazil Tech' => 'blog/brazil', + '500 words into the future' => 'blog/500-words-into-the-future', + 'ÜberTech' => 'blog/ubertech', + 'All About Microsoft' => 'blog/microsoft', + 'Back office' => 'blog/back-office', + 'Barker Bites Back' => 'blog/barker-bites-back', + 'Between the Lines' => 'blog/btl', + 'Big on Data' => 'blog/big-data', + 'bootstrappr' => 'blog/bootstrappr', + 'By The Way' => 'blog/by-the-way', + 'Central European Processing' => 'blog/central-europe', + 'Cloud Builders' => 'blog/cloud-builders', + 'Communication Breakdown' => 'blog/communication-breakdown', + 'Collaboration 2.0' => 'blog/collaboration', + 'Constellation Research' => 'blog/constellation', + 'Consumerization: BYOD' => 'blog/consumerization', + 'DIY-IT' => 'blog/diy-it', + 'Enterprise Web 2.0' => 'blog/hinchcliffe', + 'Five Nines: The Next Gen Datacenter' => 'blog/datacenter', + 'Forrester Research' => 'blog/forrester', + 'Full Duplex' => 'blog/full-duplex', + 'Gen Why?' => 'blog/gen-why', + 'Hardware 2.0' => 'blog/hardware', + 'Identity Matters' => 'blog/identity', + 'iGeneration' => 'blog/igeneration', + 'Internet of Everything' => 'blog/cisco', + 'Beyond IT Failure' => 'blog/projectfailures', + 'Jamie\'s Mostly Linux Stuff' => 'blog/jamies-mostly-linux-stuff', + 'Jack\'s Blog' => 'blog/jacks-blog', + 'Laptops & Desktops' => 'blog/computers', + 'Linux and Open Source' => 'blog/open-source', + 'London Calling' => 'blog/london', + 'Mapping Babel' => 'blog/mapping-babel', + 'Mixed Signals' => 'blog/mixed-signals', + 'Mobile India' => 'blog/mobile-india', + 'Mobile News' => 'blog/mobile-news', + 'Networking' => 'blog/networking', + 'Norse Code' => 'blog/norse-code', + 'Null Pointer' => 'blog/null-pointer', + 'The Full Tilt' => 'blog/the-full-tilt', + 'Pinoy Post' => 'blog/pinoy-post', + 'Practically Tech' => 'blog/practically-tech', + 'Product Central' => 'blog/product-central', + 'Pulp Tech' => 'blog/violetblue', + 'Qubits and Pieces' => 'blog/qubits-and-pieces', + 'Securify This!' => 'blog/securify-this', + 'Service Oriented' => 'blog/service-oriented', + 'Small Talk' => 'blog/small-talk', + 'Small Business Matters' => 'blog/small-business-matters', + 'Smartphones and Cell Phones' => 'blog/cell-phones', + 'Social Business' => 'blog/feeds', + 'Social CRM: The Conversation' => 'blog/crm', + 'Software & Services Safari' => 'blog/sommer', + 'Storage Bits' => 'blog/storage', + 'Stacking up Open Clouds' => 'blog/apac-redhat', + 'Techie Isles' => 'blog/techie-isles', + 'Technolatte' => 'blog/technolatte', + 'Tech Podium' => 'blog/tech-podium', + 'Tel Aviv Tech' => 'blog/tel-aviv', + 'Tech Broiler' => 'blog/perlow', + 'The SANMAN' => 'blog/the-sanman', + 'The open source revolution' => 'blog/the-open-source-revolution', + 'The German View' => 'blog/german', + 'The Ed Bott Report' => 'blog/bott', + 'The Mobile Gadgeteer' => 'blog/mobile-gadgeteer', + 'The Apple Core' => 'blog/apple', + 'Tom Foremski: IMHO' => 'blog/foremski', + 'Twisted Wire' => 'blog/twisted-wire', + 'Vive la tech' => 'blog/france', + 'Virtually Speaking' => 'blog/virtualization', + 'View from China' => 'blog/china', + 'Web design & Free Software' => 'blog/web-design-and-free-software', + 'ZDNet Government' => 'blog/government', + 'ZDNet UK Book Reviews' => 'blog/zdnet-uk-book-reviews', + 'ZDNet UK First Take' => 'blog/zdnet-uk-first-take', + 'Zero Day' => 'blog/security' + ), + 'ZDNet Hot Topics RSS:' => array( + 'Apple' => 'topic/apple', + 'Collaboration' => 'topic/collaboration', + 'Enterprise Software' => 'topic/enterprise-software', + 'Google' => 'topic/google', + 'Great debate' => 'topic/great-debate', + 'Hardware' => 'topic/hardware', + 'IBM' => 'topic/ibm', + 'iOS' => 'topic/ios', + 'iPhone' => 'topic/iphone', + 'iPad' => 'topic/ipad', + 'IT Priorities' => 'topic/it-priorities', + 'Laptops' => 'topic/laptops', + 'Legal' => 'topic/legal', + 'Linux' => 'topic/linux', + 'Microsoft' => 'topic/microsoft', + 'Mobile OS' => 'topic/mobile-os', + 'Mobility' => 'topic/mobility', + 'Networking' => 'topic/networking', + 'Oracle' => 'topic/oracle', + 'Processors' => 'topic/processors', + 'Samsung' => 'topic/samsung', + 'Security' => 'topic/security', + 'Small business: going big on mobility' => 'topic/small-business-going-big-on-mobility' + ), + 'Product Blogs:' => array( + 'Digital Cameras & Camcorders' => 'blog/digitalcameras', + 'Home Theater' => 'blog/home-theater', + 'Laptops and Desktops' => 'blog/computers', + 'The Mobile Gadgeteer' => 'blog/mobile-gadgeteer', + 'Smartphones and Cell Phones' => 'blog/cell-phones', + 'The ToyBox' => 'blog/gadgetreviews' + ), + 'Vertical Blogs:' => array( + 'ZDNet Education' => 'blog/education', + 'ZDNet Healthcare' => 'blog/healthcare', + 'ZDNet Government' => 'blog/government' + ) + ) + ) + )); - public function collectData(){ + public function collectData(){ - function StripCDATA($string) { - $string = str_replace('<![CDATA[', '', $string); - $string = str_replace(']]>', '', $string); - return trim($string); - } + function stripCdata($string){ + $string = str_replace('<![CDATA[', '', $string); + $string = str_replace(']]>', '', $string); + return trim($string); + } - function ExtractFromDelimiters($string, $start, $end) { - if (strpos($string, $start) !== false) { - $section_retrieved = substr($string, strpos($string, $start) + strlen($start)); - $section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end)); - return $section_retrieved; - } return false; - } + function extractFromDelimiters($string, $start, $end){ + if(strpos($string, $start) !== false){ + $section_retrieved = substr($string, strpos($string, $start) + strlen($start)); + $section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end)); + return $section_retrieved; + } - function StripWithDelimiters($string, $start, $end) { - while (strpos($string, $start) !== false) { - $section_to_remove = substr($string, strpos($string, $start)); - $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end)); - $string = str_replace($section_to_remove, '', $string); - } return $string; - } + return false; + } - function StripRecursiveHTMLSection($string, $tag_name, $tag_start) { - $open_tag = '<'.$tag_name; - $close_tag = '</'.$tag_name.'>'; - $close_tag_length = strlen($close_tag); - if (strpos($tag_start, $open_tag) === 0) { - while (strpos($string, $tag_start) !== false) { - $max_recursion = 100; - $section_to_remove = null; - $section_start = strpos($string, $tag_start); - $search_offset = $section_start; - do { - $max_recursion--; - $section_end = strpos($string, $close_tag, $search_offset); - $search_offset = $section_end + $close_tag_length; - $section_to_remove = substr($string, $section_start, $section_end - $section_start + $close_tag_length); - $open_tag_count = substr_count($section_to_remove, $open_tag); - $close_tag_count = substr_count($section_to_remove, $close_tag); - } while ($open_tag_count > $close_tag_count && $max_recursion > 0); - $string = str_replace($section_to_remove, '', $string); - } - } - return $string; - } + function stripWithDelimiters($string, $start, $end){ + while(strpos($string, $start) !== false){ + $section_to_remove = substr($string, strpos($string, $start)); + $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end)); + $string = str_replace($section_to_remove, '', $string); + } - $baseUri = self::URI; - $feed = $this->getInput('feed'); - if (strpos($feed, 'downloads!') !== false) { - $feed = str_replace('downloads!', '', $feed); - $baseUri = str_replace('www.', 'downloads.', $baseUri); - } - $url = $baseUri.trim($feed, '/').'/rss.xml'; - $html = getSimpleHTMLDOM($url) or returnServerError('Could not request ZDNet: '.$url); - $limit = 0; + return $string; + } - foreach ($html->find('item') as $element) { - if ($limit < 10) { - $article_url = preg_replace('/([^#]+)#ftag=.*/', '$1', StripCDATA(ExtractFromDelimiters($element->innertext, '<link>', '</link>'))); - $article_author = StripCDATA(ExtractFromDelimiters($element->innertext, 'role="author">', '<')); - $article_title = StripCDATA($element->find('title', 0)->plaintext); - $article_subtitle = StripCDATA($element->find('description', 0)->plaintext); - $article_timestamp = strtotime(StripCDATA($element->find('pubDate', 0)->plaintext)); - $article = getSimpleHTMLDOM($article_url) or returnServerError('Could not request ZDNet: '.$article_url); + function stripRecursiveHtmlSection($string, $tag_name, $tag_start){ + $open_tag = '<' . $tag_name; + $close_tag = '</' . $tag_name . '>'; + $close_tag_length = strlen($close_tag); + if(strpos($tag_start, $open_tag) === 0){ + while(strpos($string, $tag_start) !== false){ + $max_recursion = 100; + $section_to_remove = null; + $section_start = strpos($string, $tag_start); + $search_offset = $section_start; + do { + $max_recursion--; + $section_end = strpos($string, $close_tag, $search_offset); + $search_offset = $section_end + $close_tag_length; + $section_to_remove = substr( + $string, + $section_start, + $section_end - $section_start + $close_tag_length + ); - if (!empty($article_author)) - $author = $article_author; - else { - $author = $article->find('meta[name=author]', 0); - if (is_object($author)) - $author = $author->content; - else $author = 'ZDNet'; - } + $open_tag_count = substr_count($section_to_remove, $open_tag); + $close_tag_count = substr_count($section_to_remove, $close_tag); + } while ($open_tag_count > $close_tag_count && $max_recursion > 0); + $string = str_replace($section_to_remove, '', $string); + } + } + return $string; + } - $thumbnail = $article->find('meta[itemprop=image]', 0); - if (is_object($thumbnail)) - $thumbnail = $thumbnail->content; - else $thumbnail = ''; + $baseUri = self::URI; + $feed = $this->getInput('feed'); + if(strpos($feed, 'downloads!') !== false){ + $feed = str_replace('downloads!', '', $feed); + $baseUri = str_replace('www.', 'downloads.', $baseUri); + } + $url = $baseUri . trim($feed, '/') . '/rss.xml'; + $html = getSimpleHTMLDOM($url) + or returnServerError('Could not request ZDNet: ' . $url); + $limit = 0; - $contents = $article->find('article', 0)->innertext; - foreach (array( - '<div class="shareBar"', - '<div class="shortcodeGalleryWrapper"', - '<div class="relatedContent', - '<div class="downloadNow', - '<div data-shortcode', - '<div id="sharethrough', - '<div id="inpage-video' - ) as $div_start) { - $contents = StripRecursiveHTMLSection($contents , 'div', $div_start); - } - $contents = StripWithDelimiters($contents, '<script', '</script>'); - $contents = StripWithDelimiters($contents, '<meta itemprop="image"', '>'); - $contents = trim(StripWithDelimiters($contents, '<section class="sharethrough-top', '</section>')); - $content_img = strpos($contents, '<img'); //Look for first image - if (($content_img !== false && $content_img < 512) || $thumbnail == '') - $content_img = ''; //Image already present on article beginning or no thumbnail - else $content_img = '<p><img src="'.$thumbnail.'" /></p>'; //Include thumbnail - $contents = $content_img - .'<p><b>'.$article_subtitle.'</b></p>' - .$contents; + foreach($html->find('item') as $element){ + if($limit < 10){ + $article_url = preg_replace( + '/([^#]+)#ftag=.*/', + '$1', + stripCdata(extractFromDelimiters($element->innertext, '<link>', '</link>')) + ); - $item = array(); - $item['author'] = $author; - $item['uri'] = $article_url; - $item['title'] = $article_title; - $item['timestamp'] = $article_timestamp; - $item['content'] = $contents; - $this->items[] = $item; - $limit++; - } - } + $article_author = stripCdata(extractFromDelimiters($element->innertext, 'role="author">', '<')); + $article_title = stripCdata($element->find('title', 0)->plaintext); + $article_subtitle = stripCdata($element->find('description', 0)->plaintext); + $article_timestamp = strtotime(stripCdata($element->find('pubDate', 0)->plaintext)); + $article = getSimpleHTMLDOM($article_url) + or returnServerError('Could not request ZDNet: ' . $article_url); - } + if(!empty($article_author)){ + $author = $article_author; + } else { + $author = $article->find('meta[name=author]', 0); + if(is_object($author)){ + $author = $author->content; + } else { + $author = 'ZDNet'; + } + } + + $thumbnail = $article->find('meta[itemprop=image]', 0); + if(is_object($thumbnail)){ + $thumbnail = $thumbnail->content; + } else { + $thumbnail = ''; + } + + $contents = $article->find('article', 0)->innertext; + foreach(array( + '<div class="shareBar"', + '<div class="shortcodeGalleryWrapper"', + '<div class="relatedContent', + '<div class="downloadNow', + '<div data-shortcode', + '<div id="sharethrough', + '<div id="inpage-video' + ) as $div_start){ + $contents = stripRecursiveHtmlSection($contents , 'div', $div_start); + } + $contents = stripWithDelimiters($contents, '<script', '</script>'); + $contents = stripWithDelimiters($contents, '<meta itemprop="image"', '>'); + $contents = trim(stripWithDelimiters($contents, '<section class="sharethrough-top', '</section>')); + $content_img = strpos($contents, '<img'); //Look for first image + if (($content_img !== false && $content_img < 512) || $thumbnail == ''){ + $content_img = ''; //Image already present on article beginning or no thumbnail + } else { + $content_img = '<p><img src="'.$thumbnail.'" /></p>'; //Include thumbnail + } + $contents = $content_img + . '<p><b>' + . $article_subtitle + . '</b></p>' + . $contents; + + $item = array(); + $item['author'] = $author; + $item['uri'] = $article_url; + $item['title'] = $article_title; + $item['timestamp'] = $article_timestamp; + $item['content'] = $contents; + $this->items[] = $item; + $limit++; + } + } + + } } |