Browse Source

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
logmanoriginal 7 years ago
parent
commit
6f24858124
100 changed files with 5257 additions and 4786 deletions
  1. 32 14
      bridges/ABCTabsBridge.php
  2. 16 16
      bridges/AcrimedBridge.php
  3. 85 88
      bridges/AllocineFRBridge.php
  4. 130 118
      bridges/AnimeUltimeBridge.php
  5. 92 81
      bridges/Arte7Bridge.php
  6. 64 50
      bridges/AskfmBridge.php
  7. 53 41
      bridges/BandcampBridge.php
  8. 16 14
      bridges/BastaBridge.php
  9. 25 27
      bridges/BlaguesDeMerdeBridge.php
  10. 29 28
      bridges/BooruprojectBridge.php
  11. 9 10
      bridges/CADBridge.php
  12. 73 60
      bridges/CNETBridge.php
  13. 48 41
      bridges/CastorusBridge.php
  14. 44 30
      bridges/CollegeDeFranceBridge.php
  15. 6 6
      bridges/CommonDreamsBridge.php
  16. 28 32
      bridges/CopieDoubleBridge.php
  17. 39 45
      bridges/CourrierInternationalBridge.php
  18. 54 55
      bridges/CpasbienBridge.php
  19. 38 32
      bridges/CryptomeBridge.php
  20. 108 101
      bridges/DailymotionBridge.php
  21. 57 49
      bridges/DanbooruBridge.php
  22. 16 16
      bridges/DansTonChatBridge.php
  23. 46 47
      bridges/DauphineLibereBridge.php
  24. 44 47
      bridges/DemoBridge.php
  25. 15 19
      bridges/DeveloppezDotComBridge.php
  26. 27 27
      bridges/DilbertBridge.php
  27. 5 7
      bridges/DollbooruBridge.php
  28. 32 31
      bridges/DuckDuckGoBridge.php
  29. 50 49
      bridges/EZTVBridge.php
  30. 14 14
      bridges/EliteDangerousGalnetBridge.php
  31. 20 19
      bridges/ElsevierBridge.php
  32. 30 23
      bridges/EstCeQuonMetEnProdBridge.php
  33. 89 74
      bridges/FB2Bridge.php
  34. 118 68
      bridges/FacebookBridge.php
  35. 55 55
      bridges/FeedExpanderExampleBridge.php
  36. 18 17
      bridges/FierPandaBridge.php
  37. 112 113
      bridges/FlickrBridge.php
  38. 64 29
      bridges/FootitoBridge.php
  39. 60 54
      bridges/FourchanBridge.php
  40. 159 159
      bridges/FuturaSciencesBridge.php
  41. 141 112
      bridges/GBAtempBridge.php
  42. 14 13
      bridges/GelbooruBridge.php
  43. 60 55
      bridges/GiphyBridge.php
  44. 185 188
      bridges/GithubIssueBridge.php
  45. 12 8
      bridges/GizmodoBridge.php
  46. 41 41
      bridges/GoComicsBridge.php
  47. 41 37
      bridges/GooglePlusPostBridge.php
  48. 17 17
      bridges/GoogleSearchBridge.php
  49. 75 58
      bridges/HDWallpapersBridge.php
  50. 32 18
      bridges/HentaiHavenBridge.php
  51. 40 34
      bridges/IdenticaBridge.php
  52. 60 69
      bridges/InstagramBridge.php
  53. 435 442
      bridges/IsoHuntBridge.php
  54. 87 76
      bridges/JapanExpoBridge.php
  55. 4 4
      bridges/KonachanBridge.php
  56. 5 5
      bridges/KoreusBridge.php
  57. 53 51
      bridges/KununuBridge.php
  58. 142 141
      bridges/LWNprevBridge.php
  59. 151 147
      bridges/LeBonCoinBridge.php
  60. 35 33
      bridges/LeMondeInformatiqueBridge.php
  61. 57 59
      bridges/LegifranceJOBridge.php
  62. 41 43
      bridges/LesJoiesDuCodeBridge.php
  63. 21 21
      bridges/LichessBridge.php
  64. 29 28
      bridges/LinkedInCompanyBridge.php
  65. 5 5
      bridges/LolibooruBridge.php
  66. 241 244
      bridges/MangareaderBridge.php
  67. 5 5
      bridges/MilbooruBridge.php
  68. 31 29
      bridges/MixCloudBridge.php
  69. 47 38
      bridges/MoebooruBridge.php
  70. 10 7
      bridges/MondeDiploBridge.php
  71. 13 11
      bridges/MsnMondeBridge.php
  72. 6 6
      bridges/MspabooruBridge.php
  73. 32 31
      bridges/NasaApodBridge.php
  74. 17 15
      bridges/NeuviemeArtBridge.php
  75. 15 10
      bridges/NextInpactBridge.php
  76. 61 57
      bridges/NextgovBridge.php
  77. 6 6
      bridges/NiceMatinBridge.php
  78. 51 42
      bridges/NovelUpdatesBridge.php
  79. 37 38
      bridges/OpenClassroomsBridge.php
  80. 95 93
      bridges/ParuVenduImmoBridge.php
  81. 78 58
      bridges/PickyWallpapersBridge.php
  82. 5 6
      bridges/PinterestBridge.php
  83. 19 12
      bridges/PlanetLibreBridge.php
  84. 31 23
      bridges/RTBFBridge.php
  85. 34 33
      bridges/ReadComicsBridge.php
  86. 131 115
      bridges/Releases3DSBridge.php
  87. 17 12
      bridges/ReporterreBridge.php
  88. 10 7
      bridges/Rue89Bridge.php
  89. 6 6
      bridges/Rule34Bridge.php
  90. 5 5
      bridges/Rule34pahealBridge.php
  91. 6 6
      bridges/SafebooruBridge.php
  92. 5 5
      bridges/SakugabooruBridge.php
  93. 22 20
      bridges/ScmbBridge.php
  94. 34 25
      bridges/ScoopItBridge.php
  95. 82 63
      bridges/SensCritiqueBridge.php
  96. 86 62
      bridges/SexactuBridge.php
  97. 120 106
      bridges/ShanaprojectBridge.php
  98. 30 22
      bridges/Shimmie2Bridge.php
  99. 47 37
      bridges/SoundcloudBridge.php
  100. 19 20
      bridges/StripeAPIChangeLogBridge.php

+ 32 - 14
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;
 		}
-    }
+	}
 }

+ 16 - 16
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;
+	}
 
 }

+ 85 - 88
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;
+			}
+		}
+	}
 
 }

+ 130 - 118
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();
+	}
 
 }

+ 92 - 81
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;
+		}
+	}
 
 }

+ 64 - 50
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';
+	}
 }

+ 53 - 41
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';
+	}
 }

+ 16 - 14
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++;
 			}
 		}
 	}
 }
-?>

+ 25 - 27
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;
+			}
+		}
+	}
 }
-?>

+ 29 - 28
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');
+	}
 }

+ 9 - 10
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 . '"/>';
 	}
 }
-?>

+ 73 - 60
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);
+	}
 }

+ 48 - 41
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
 			}
 

+ 44 - 30
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;
 		}

+ 6 - 6
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();

+ 28 - 32
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;
+			}
+		}
+	}
 }

+ 39 - 45
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;
+		}
+	}
 }
-
-?>

+ 54 - 55
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());
+	}
 }

+ 38 - 32
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;
+		}
+	}
 }

+ 108 - 101
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;
+	}
 }

+ 57 - 49
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);
+		}
+	}
 }

+ 16 - 16
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;
+		}
+	}
 }

+ 46 - 47
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;
+	}
 }
-?>

+ 44 - 47
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;
+	}
 }

+ 15 - 19
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);
 	}

+ 27 - 27
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;
+		}
+	}
 }
-?>

+ 5 - 7
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';
 }

+ 32 - 31
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;
+		}
+	}
 }

+ 50 - 49
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;
+			}
+		}
 	}
 }

+ 14 - 14
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;

+ 20 - 19
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;
 		}
 	}
 }
-?>

+ 30 - 23
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;
+	}
 }
-?>

+ 89 - 74
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
 	}
 }

+ 118 - 68
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';
 	}
 }

+ 55 - 55
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') . '!');
+		}
+	}
 }

+ 18 - 17
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;
+		}
+	}
 }

+ 112 - 113
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;
+				}
+			}
+		}
+	}
 }

+ 64 - 29
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;
+		}
+	}
 }

+ 60 - 54
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);
-  }
 }

+ 159 - 159
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 '';
+	}
 }

+ 141 - 112
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();
+	}
 }

+ 14 - 13
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'));
+	}
 }

+ 60 - 55
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++;
+			}
+		}
 	}
 }

+ 185 - 188
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']);
+		});
+	}
 }

+ 12 - 8
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>');

+ 41 - 41
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';
+	}
 }
-?>

+ 41 - 37
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;
 	}
 }

+ 17 - 17
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';
 	}
 }

+ 75 - 58
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')
+		. ']';
+	}
 }

+ 32 - 18
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;
+		}
+	}
 }

+ 40 - 34
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'));
+	}
 }

+ 60 - 69
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'));
+	}
 }
-

+ 435 - 442
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
 }

+ 87 - 76
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++;
+		}
+	}
 }

+ 4 - 4
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';
 
 }

+ 5 - 5
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']);

+ 53 - 51
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);
 	}
 }

+ 142 - 141
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;
+		}
+	}
 }

+ 151 - 147
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;

+ 35 - 33
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;
+	}
 }

+ 57 - 59
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);
+		}
+	}
 }
-
-

+ 41 - 43
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;
+		}
+	}
 }

+ 21 - 21
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;
+	}
 }

+ 29 - 28
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++;
+			}
+		}
+	}
 }

+ 5 - 5
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';
 
 }

+ 241 - 244
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';
+	}
 }
-?>

+ 5 - 5
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';
 
 }

+ 31 - 29
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;
+		}
+	}
 }

+ 47 - 38
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;
+		}
+	}
 }

+ 10 - 7
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;
 		}
 	}

+ 13 - 11
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++;
 			}

+ 6 - 6
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;
 }

+ 32 - 31
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;
+		}
+	}
 }

+ 17 - 15
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);
 	}
 }

+ 15 - 10
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;
 	}
 }

+ 61 - 57
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);
+	}
 }

+ 6 - 6
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 . '!';

+ 51 - 42
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;
+		}
 }

+ 37 - 38
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;
+		}
+	}
 }

+ 95 - 93
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;
+	}
 }

+ 78 - 58
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')
+		. ']';
+	}
 }

+ 5 - 6
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');

+ 19 - 12
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++;
 			}

+ 31 - 23
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';

+ 34 - 33
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;
+			}
+		}
 	}
 }

+ 131 - 115
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++;
+		}
+	}
 }

+ 17 - 12
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++;
 			}

+ 10 - 7
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');
-    }
+	}
 }

+ 6 - 6
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;
 }

+ 5 - 5
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';
 }

+ 6 - 6
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;
 }

+ 5 - 5
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';
 
 }

+ 22 - 20
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;
 		}
-    }
+	}
 }

+ 34 - 25
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;
+		}
+	}
+}

+ 82 - 63
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;
 		}
 	}
 }

+ 86 - 62
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;
+	}
 }

+ 120 - 106
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;
+		}
+	}
 }

+ 30 - 22
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;
+	}
 
 }

+ 47 - 37
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');
 	}
 }

+ 19 - 20
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;
+		}
+	}
 }

Some files were not shown because too many files changed in this diff