aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar logmanoriginal <logmanoriginal@users.noreply.github.com> 2017-02-11 16:16:56 +0100
committerGravatar logmanoriginal <logmanoriginal@users.noreply.github.com> 2017-02-12 15:34:08 +0100
commit6f24858124c700a8f83f9c2d8fc8ce354f4b4e28 (patch)
treee24343c80e9c77397c783d42ed9fb83ebde02c8f
parent22a7666d2b593ac531f9006ac39ee9257611c485 (diff)
downloadrss-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
-rw-r--r--bridges/ABCTabsBridge.php46
-rw-r--r--bridges/AcrimedBridge.php32
-rw-r--r--bridges/AllocineFRBridge.php173
-rw-r--r--bridges/AnimeUltimeBridge.php248
-rw-r--r--bridges/Arte7Bridge.php173
-rw-r--r--bridges/AskfmBridge.php114
-rw-r--r--bridges/BandcampBridge.php94
-rw-r--r--bridges/BastaBridge.php30
-rw-r--r--bridges/BlaguesDeMerdeBridge.php52
-rw-r--r--bridges/BooruprojectBridge.php57
-rw-r--r--bridges/CADBridge.php19
-rw-r--r--bridges/CNETBridge.php133
-rw-r--r--bridges/CastorusBridge.php89
-rw-r--r--bridges/CollegeDeFranceBridge.php74
-rw-r--r--bridges/CommonDreamsBridge.php12
-rw-r--r--bridges/CopieDoubleBridge.php60
-rw-r--r--bridges/CourrierInternationalBridge.php84
-rw-r--r--bridges/CpasbienBridge.php109
-rw-r--r--bridges/CryptomeBridge.php70
-rw-r--r--bridges/DailymotionBridge.php209
-rw-r--r--bridges/DanbooruBridge.php106
-rw-r--r--bridges/DansTonChatBridge.php32
-rw-r--r--bridges/DauphineLibereBridge.php93
-rw-r--r--bridges/DemoBridge.php91
-rw-r--r--bridges/DeveloppezDotComBridge.php34
-rw-r--r--bridges/DilbertBridge.php54
-rw-r--r--bridges/DollbooruBridge.php12
-rw-r--r--bridges/DuckDuckGoBridge.php63
-rw-r--r--bridges/EZTVBridge.php99
-rw-r--r--bridges/EliteDangerousGalnetBridge.php28
-rw-r--r--bridges/ElsevierBridge.php39
-rw-r--r--bridges/EstCeQuonMetEnProdBridge.php53
-rw-r--r--bridges/FB2Bridge.php163
-rw-r--r--bridges/FacebookBridge.php186
-rw-r--r--bridges/FeedExpanderExampleBridge.php110
-rw-r--r--bridges/FierPandaBridge.php35
-rw-r--r--bridges/FlickrBridge.php225
-rw-r--r--bridges/FootitoBridge.php93
-rw-r--r--bridges/FourchanBridge.php114
-rw-r--r--bridges/FuturaSciencesBridge.php318
-rw-r--r--bridges/GBAtempBridge.php253
-rw-r--r--bridges/GelbooruBridge.php27
-rw-r--r--bridges/GiphyBridge.php115
-rw-r--r--bridges/GithubIssueBridge.php373
-rw-r--r--bridges/GizmodoBridge.php20
-rw-r--r--bridges/GoComicsBridge.php82
-rw-r--r--bridges/GooglePlusPostBridge.php78
-rw-r--r--bridges/GoogleSearchBridge.php34
-rw-r--r--bridges/HDWallpapersBridge.php133
-rw-r--r--bridges/HentaiHavenBridge.php50
-rw-r--r--bridges/IdenticaBridge.php74
-rw-r--r--bridges/InstagramBridge.php129
-rw-r--r--bridges/IsoHuntBridge.php877
-rw-r--r--bridges/JapanExpoBridge.php163
-rw-r--r--bridges/KonachanBridge.php8
-rw-r--r--bridges/KoreusBridge.php10
-rw-r--r--bridges/KununuBridge.php104
-rw-r--r--bridges/LWNprevBridge.php283
-rwxr-xr-xbridges/LeBonCoinBridge.php298
-rw-r--r--bridges/LeMondeInformatiqueBridge.php68
-rw-r--r--bridges/LegifranceJOBridge.php116
-rw-r--r--bridges/LesJoiesDuCodeBridge.php84
-rw-r--r--bridges/LichessBridge.php42
-rw-r--r--bridges/LinkedInCompanyBridge.php57
-rw-r--r--bridges/LolibooruBridge.php10
-rw-r--r--bridges/MangareaderBridge.php485
-rw-r--r--bridges/MilbooruBridge.php10
-rw-r--r--bridges/MixCloudBridge.php60
-rw-r--r--bridges/MoebooruBridge.php85
-rw-r--r--bridges/MondeDiploBridge.php17
-rw-r--r--bridges/MsnMondeBridge.php24
-rw-r--r--bridges/MspabooruBridge.php12
-rw-r--r--bridges/NasaApodBridge.php63
-rw-r--r--bridges/NeuviemeArtBridge.php32
-rw-r--r--bridges/NextInpactBridge.php25
-rw-r--r--bridges/NextgovBridge.php118
-rw-r--r--bridges/NiceMatinBridge.php12
-rw-r--r--bridges/NovelUpdatesBridge.php93
-rw-r--r--bridges/OpenClassroomsBridge.php75
-rw-r--r--bridges/ParuVenduImmoBridge.php188
-rw-r--r--bridges/PickyWallpapersBridge.php136
-rw-r--r--bridges/PinterestBridge.php11
-rw-r--r--bridges/PlanetLibreBridge.php31
-rw-r--r--bridges/RTBFBridge.php54
-rw-r--r--bridges/ReadComicsBridge.php67
-rw-r--r--bridges/Releases3DSBridge.php246
-rw-r--r--bridges/ReporterreBridge.php29
-rw-r--r--bridges/Rue89Bridge.php17
-rw-r--r--bridges/Rule34Bridge.php12
-rw-r--r--bridges/Rule34pahealBridge.php10
-rw-r--r--bridges/SafebooruBridge.php12
-rw-r--r--bridges/SakugabooruBridge.php10
-rw-r--r--bridges/ScmbBridge.php42
-rw-r--r--bridges/ScoopItBridge.php59
-rw-r--r--bridges/SensCritiqueBridge.php145
-rw-r--r--bridges/SexactuBridge.php148
-rw-r--r--bridges/ShanaprojectBridge.php226
-rw-r--r--bridges/Shimmie2Bridge.php52
-rw-r--r--bridges/SoundcloudBridge.php84
-rw-r--r--bridges/StripeAPIChangeLogBridge.php39
-rw-r--r--bridges/SuperbWallpapersBridge.php102
-rw-r--r--bridges/T411Bridge.php174
-rw-r--r--bridges/TagBoardBridge.php69
-rw-r--r--bridges/TbibBridge.php12
-rw-r--r--bridges/TheCodingLoveBridge.php68
-rw-r--r--bridges/TheHackerNewsBridge.php125
-rw-r--r--bridges/ThePirateBayBridge.php263
-rw-r--r--bridges/TheTVDBBridge.php339
-rw-r--r--bridges/Torrent9Bridge.php187
-rw-r--r--bridges/TwitterBridge.php148
-rw-r--r--bridges/UnsplashBridge.php117
-rw-r--r--bridges/ViadeoCompanyBridge.php57
-rw-r--r--bridges/VineBridge.php39
-rw-r--r--bridges/VkBridge.php94
-rw-r--r--bridges/WallpaperStopBridge.php143
-rw-r--r--bridges/WeLiveSecurityBridge.php20
-rw-r--r--bridges/WebfailBridge.php8
-rw-r--r--bridges/WhydBridge.php90
-rw-r--r--bridges/WikipediaBridge.php136
-rw-r--r--bridges/WordPressBridge.php34
-rw-r--r--bridges/WorldOfTanksBridge.php116
-rw-r--r--bridges/XbooruBridge.php12
-rw-r--r--bridges/YandereBridge.php10
-rw-r--r--bridges/YoutubeBridge.php164
-rw-r--r--bridges/ZDNetBridge.php546
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 == '&gt;1 week') continue;
+ // Filter entries that are older than 1 week
+ if($released->plaintext == '&gt;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&amp;height=200';
+ $profilePic = 'https://graph.facebook.com/'
+ . $this->getInput('u')
+ . '/picture?width=200&amp;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:', '&#x27a4;', $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:', '&#x27a4;', $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&nbsp;%Y');
- $timestamp = mktime(0, 0, 0,
- $guessedDate['tm_mon'] + 1, $guessedDate['tm_mday'], 1900+$guessedDate['tm_year']);
- }
- else if (explode("&nbsp;",$guessedDate)[0] == 'Today')
- {
- $guessedDate = strptime(explode("&nbsp;",$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("&nbsp;",$guessedDate)[0] == 'Y-day')
- {
- $guessedDate = strptime(explode("&nbsp;",$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&nbsp;%Y');
+ $timestamp = mktime(
+ 0,
+ 0,
+ 0,
+ $guessedDate['tm_mon'] + 1,
+ $guessedDate['tm_mday'],
+ 1900 + $guessedDate['tm_year']
+ );
+ } elseif(explode('&nbsp;', $guessedDate)[0] == 'Today'){
+ $guessedDate = strptime(
+ explode('&nbsp;', $guessedDate)[1], '%H:%M'
+ );
- }
- else
- {
- $guessedDate = strptime($guessedDate, '%m-%d&nbsp;%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('&nbsp;', $guessedDate)[0] == 'Y-day'){
+ $guessedDate = strptime(
+ explode('&nbsp;',$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&nbsp;%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 &#1234; and &quot; 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++;
+ }
+ }
+
+ }
}