This commit is contained in:
logmanoriginal 2016-08-29 18:38:02 +02:00
commit 3c1706aa47
45 changed files with 795 additions and 909 deletions

View file

@ -7,9 +7,7 @@ class FierPandaBridge extends BridgeAbstract {
public $description = "Returns latest articles from Fier Panda."; public $description = "Returns latest articles from Fier Panda.";
public function collectData(){ public function collectData(){
$link = 'http://www.fier-panda.fr/'; $html = $this->getSimpleHTMLDOM($this->uri) or $this->returnServerError('Could not request Fier Panda.');
$html = $this->getSimpleHTMLDOM($link) or $this->returnServerError('Could not request Fier Panda.');
foreach($html->find('div.container-content article') as $element) { foreach($html->find('div.container-content article') as $element) {
$item = array(); $item = array();

View file

@ -3,11 +3,12 @@ class FlickrExploreBridge extends BridgeAbstract{
public $maintainer = "sebsauvage"; public $maintainer = "sebsauvage";
public $name = "Flickr Explore"; public $name = "Flickr Explore";
public $uri = "https://www.flickr.com/explore"; public $uri = "https://www.flickr.com/";
public $description = "Returns the latest interesting images from Flickr"; public $description = "Returns the latest interesting images from Flickr";
public function collectData(){ public function collectData(){
$html = $this->getSimpleHTMLDOM('https://www.flickr.com/explore') or $this->returnServerError('Could not request Flickr.'); $html = $this->getSimpleHTMLDOM($this->uri.'explore')
or $this->returnServerError('Could not request Flickr.');
foreach($html->find('.photo-list-photo-view') as $element) { foreach($html->find('.photo-list-photo-view') as $element) {
// Get the styles // Get the styles
@ -21,10 +22,17 @@ class FlickrExploreBridge extends BridgeAbstract{
$imageID = reset($imageURIs); $imageID = reset($imageURIs);
// Get the image JSON via Flickr API // Get the image JSON via Flickr API
$imageJSON = json_decode($this->getContents('https://api.flickr.com/services/rest/?method=flickr.photos.getInfo&api_key=103b574d49bd51f0e18bfe907da44a0f&photo_id='.$imageID.'&format=json&nojsoncallback=1')) or $this->returnServerError('Could not request Flickr.'); // FIXME: Request time too long... $imageJSON = json_decode($this->getContents(
'https://api.flickr.com/services/rest/?'
.'method=flickr.photos.getInfo&'
.'api_key=103b574d49bd51f0e18bfe907da44a0f&'
.'photo_id='.$imageID.'&'
.'format=json&'
.'nojsoncallback=1'
)) or $this->returnServerError('Could not request Flickr.'); // FIXME: Request time too long...
$item = array(); $item = array();
$item['uri'] = 'https://flickr.com/photo.gne?id='.$imageID; $item['uri'] = $this->uri.'photo.gne?id='.$imageID;
$item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $imageURI . '" /></a>'; // FIXME: Filter javascript ? $item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $imageURI . '" /></a>'; // FIXME: Filter javascript ?
$item['title'] = $imageJSON->photo->title->_content; $item['title'] = $imageJSON->photo->title->_content;
$this->items[] = $item; $this->items[] = $item;

View file

@ -8,32 +8,35 @@ class FlickrTagBridge extends BridgeAbstract{
public $parameters = array( public $parameters = array(
'By keyword' => array( 'By keyword' => array(
'q'=>array('name'=>'keyword') 'q'=>array(
'name'=>'keyword',
'required'=>true
)
), ),
'By username' => array( 'By username' => array(
'u'=>array('name'=>'Username') 'u'=>array(
'name'=>'Username',
'required'=>true
)
), ),
); );
public function collectData(){ public function collectData(){
$html = $this->getSimpleHTMLDOM('http://www.flickr.com/search/?q=vendee&s=rec') or $this->returnServerError('Could not request Flickr.'); switch($this->queriedContext){
if ($this->getInput('q')) { /* keyword search mode */ case 'By keyword':
$this->request = $this->getInput('q'); $html = $this->getSimpleHTMLDOM($this->uri.'search/?q='.urlencode($this->getInput('q')).'&s=rec')
$html = $this->getSimpleHTMLDOM('http://www.flickr.com/search/?q='.urlencode($this->request).'&s=rec') or $this->returnServerError('No results for this query.'); or $this->returnServerError('No results for this query.');
} break;
elseif ($this->getInput('u')) { /* user timeline mode */ case 'by username':
$this->request = $this->getInput('u'); $html = $this->getSimpleHTMLDOM($this->uri.'photos/'.urlencode($this->getInput('u')).'/')
$html = $this->getSimpleHTMLDOM('http://www.flickr.com/photos/'.urlencode($this->request).'/') or $this->returnServerError('Requested username can\'t be found.'); or $this->returnServerError('Requested username can\'t be found.');
} break;
else {
$this->returnClientError('You must specify a keyword or a Flickr username.');
} }
foreach($html->find('span.photo_container') as $element) { foreach($html->find('span.photo_container') as $element) {
$item = array(); $item = array();
$item['uri'] = 'http://flickr.com'.$element->find('a',0)->href; $item['uri'] = $this->uri.$element->find('a',0)->href;
$thumbnailUri = $element->find('img',0)->getAttribute('data-defer-src'); $thumbnailUri = $element->find('img',0)->getAttribute('data-defer-src');
$item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $thumbnailUri . '" /></a>'; // FIXME: Filter javascript ? $item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $thumbnailUri . '" /></a>'; // FIXME: Filter javascript ?
$item['title'] = $element->find('a',0)->title; $item['title'] = $element->find('a',0)->title;

View file

@ -7,7 +7,8 @@ class FootitoBridge extends BridgeAbstract{
public $description = "Footito"; public $description = "Footito";
public function collectData(){ public function collectData(){
$html = $this->getSimpleHTMLDOM('http://www.footito.fr/') or $this->returnServerError('Could not request Footito.'); $html = $this->getSimpleHTMLDOM($this->uri)
or $this->returnServerError('Could not request Footito.');
foreach($html->find('div.post') as $element) { foreach($html->find('div.post') as $element) {
$item = array(); $item = array();

View file

@ -7,23 +7,26 @@ class FourchanBridge extends BridgeAbstract{
public $description = "Returns posts from the specified thread"; public $description = "Returns posts from the specified thread";
public $parameters = array( array( public $parameters = array( array(
't'=>array('name'=>'Thread URL') 't'=>array(
'name'=>'Thread URL',
'pattern'=>'(https:\/\/)?boards\.4chan\.org\/.*thread\/.*',
'required'=>true
)
)); ));
public function collectData(){ public function collectData(){
if (!$this->getInput('t')) $thread = parse_url($this->getInput('t'))
$this->returnClientError('You must specify the thread URL (?t=...)'); or $this->returnClientError('This URL seems malformed, please check it.');
$thread = parse_url($this->getInput('t')) or $this->returnClientError('This URL seems malformed, please check it.');
if($thread['host'] !== 'boards.4chan.org') if($thread['host'] !== 'boards.4chan.org')
$this->returnClientError('4chan thread URL only.'); $this->returnClientError('4chan thread URL only.');
if(strpos($thread['path'], 'thread/') === FALSE) if(strpos($thread['path'], 'thread/') === FALSE)
$this->returnClientError('You must specify the thread URL.'); $this->returnClientError('You must specify the thread URL.');
$url = 'https://boards.4chan.org'.$thread['path'].''; $url = 'https://boards.4chan.org'.$thread['path'];
$html = $this->getSimpleHTMLDOM($url) or $this->returnServerError("Could not request 4chan, thread not found"); $html = $this->getSimpleHTMLDOM($url)
or $this->returnServerError("Could not request 4chan, thread not found");
foreach($html->find('div.postContainer') as $element) { foreach($html->find('div.postContainer') as $element) {
$item = array(); $item = array();

View file

@ -136,12 +136,9 @@ class FuturaSciencesBridge extends BridgeAbstract {
} }
$url = $this->getURI().'rss/'.$this->getInput('feed').'.xml'; $url = $this->getURI().'rss/'.$this->getInput('feed').'.xml';
if (empty($this->getInput('feed')))
$this->returnClientError('Please select a feed to display.'.$url);
if ($this->getInput('feed') !== preg_replace('/[^a-zA-Z-\/]+/', '', $this->getInput('feed')) || substr_count($this->getInput('feed'), '/') > 1 || strlen($this->getInput('feed') > 64))
$this->returnClientError('Invalid "feed" parameter.'.$url);
$html = $this->getSimpleHTMLDOM($url) or $this->returnServerError('Could not request Futura-Sciences: '.$url); $html = $this->getSimpleHTMLDOM($url)
or $this->returnServerError('Could not request Futura-Sciences: '.$url);
$limit = 0; $limit = 0;
foreach($html->find('item') as $element) { foreach($html->find('item') as $element) {

View file

@ -54,14 +54,19 @@ class GBAtempBridge extends BridgeAbstract {
} }
private function fetch_post_content($uri, $site_url) { private function fetch_post_content($uri, $site_url) {
$html = $this->getSimpleHTMLDOM($uri) or $this->returnServerError('Could not request GBAtemp: '.$uri); $html = $this->getSimpleHTMLDOM($uri);
if(!$html){
return 'Could not request GBAtemp '.$uri;
}
$content = $html->find('div.messageContent', 0)->innertext; $content = $html->find('div.messageContent', 0)->innertext;
return $this->cleanup_post_content($content, $site_url); return $this->cleanup_post_content($content, $site_url);
} }
public function collectData(){ public function collectData(){
$html = $this->getSimpleHTMLDOM($this->uri) or $this->returnServerError('Could not request GBAtemp.'); $html = $this->getSimpleHTMLDOM($this->uri)
or $this->returnServerError('Could not request GBAtemp.');
switch($this->getInput('type')){ switch($this->getInput('type')){
case 'N': case 'N':
@ -110,7 +115,10 @@ class GBAtempBridge extends BridgeAbstract {
} }
public function getName() { public function getName() {
$type=array_search($this->getInput('type'),$param['type']['values']); $type=array_search(
$this->getInput('type'),
$this->parameters[$this->queriedContext]['type']['values']
);
return 'GBAtemp '.$type.' Bridge'; return 'GBAtemp '.$type.' Bridge';
} }

View file

@ -1,68 +0,0 @@
<?php
define("RSS_PREFIX", "http://feeds.gawker.com/");
define("RSS_SUFFIX", "/full");
class GawkerBridge extends RssExpander{
public $maintainer = "mitsukarenai";
public $name = "Gawker media";
public $uri = "http://feeds.gawker.com/";
public $description = "A bridge allowing access to any of the numerous Gawker media blogs (Lifehacker, deadspin, Kotaku, Jezebel, and so on. Notice you have to give its id to find the RSS stream in gawker maze";
public $parameters = array( array(
'site'=>array(
'name'=>'site id to put in uri between feeds.gawker.com and /full .. which is obviously not full AT ALL',
'required'=>true
)
));
private function toURI($name) {
return RSS_PREFIX.$name.RSS_SUFFIX;
}
public function collectData(){
if (empty($this->getInput('site'))) {
trigger_error("If no site is provided, nothing is gonna happen", E_USER_ERROR);
} else {
$this->name = $this->getInput('site');
$url = $this->toURI(strtolower($this->getInput('site')));
}
$this->debugMessage("loading feed from ".$this->getURI());
parent::collectExpandableDatas($url);
}
protected function parseRSSItem($newsItem) {
$item = array();
$item['uri'] = trim($newsItem->link);
$item['title'] = trim($newsItem->title);
$item['timestamp'] = $this->RSS_2_0_time_to_timestamp($newsItem);
$this->debugMessage("///////////////////////////////////////////////////////////////////////////////////////\nprocessing item ".var_export($item, true)."\n\n\nbuilt from\n\n\n".var_export($newsItem, true));
try {
// now load that uri from cache
$this->debugMessage("loading page ".$item['uri']);
$articlePage = $this->get_cached($item['uri']);
if(is_object($articlePage)) {
$content = $articlePage->find('.post-content', 0);
HTMLSanitizer::defaultImageSrcTo($content, $this->getURI());
$vcard = $articlePage->find('.vcard', 0);
if(is_object($vcard)) {
$authorLink = $vcard->find('a', 0);
$item['author'] = $authorLink->innertext;
// TODO use author link href to fill the feed info
}
$this->debugMessage("item quite loaded : ".var_export($item, true));
// I set item content as last element, for easier var_export reading
$item['content'] = $content->innertext;
} else {
throw new Exception("cache content for ".$item['uri']." is NOT a Simple DOM parser object !");
}
} catch(Exception $e) {
$this->debugMessage("obtaining ".$item['uri']." resulted in exception ".$e->getMessage().". Deleting cached page ...");
// maybe file is incorrect. it should be discarded from cache
$this->remove_from_cache($item['url']);
$item['content'] = $e->getMessage();
}
return $item;
}
}

View file

@ -15,21 +15,15 @@ class GelbooruBridge extends BridgeAbstract{
)); ));
public function collectData(){ public function collectData(){
$page = 0; $html = $this->getSimpleHTMLDOM(
if ($this->getInput('p')) { $this->uri.'index.php?page=post&s=list&'
$page = (int)preg_replace("/[^0-9]/",'', $this->getInput('p')); .'&pid='.($this->getInput('p')?($this->getInput('p') -1)*63:'')
$page = $page - 1; .'&tags='.urlencode($this->getInput('t'))
$page = $page * 63; ) or $this->returnServerError('Could not request Gelbooru.');
}
if ($this->getInput('t')) {
$tags = urlencode($this->getInput('t'));
}
$html = $this->getSimpleHTMLDOM("http://gelbooru.com/index.php?page=post&s=list&tags=$tags&pid=$page") or $this->returnServerError('Could not request Gelbooru.');
foreach($html->find('div[class=content] span') as $element) { foreach($html->find('div[class=content] span') as $element) {
$item = array(); $item = array();
$item['uri'] = 'http://gelbooru.com/'.$element->find('a', 0)->href; $item['uri'] = $this->uri.$element->find('a', 0)->href;
$item['postid'] = (int)preg_replace("/[^0-9]/",'', $element->getAttribute('id')); $item['postid'] = (int)preg_replace("/[^0-9]/",'', $element->getAttribute('id'));
$item['timestamp'] = time(); $item['timestamp'] = time();
$thumbnailUri = $element->find('img', 0)->src; $thumbnailUri = $element->find('img', 0)->src;

View file

@ -9,7 +9,10 @@ class GiphyBridge extends BridgeAbstract{
public $description = "Bridge for giphy.com"; public $description = "Bridge for giphy.com";
public $parameters = array( array( public $parameters = array( array(
's'=>array('name'=>'search tag'), 's'=>array(
'name'=>'search tag',
'required'=>true
),
'n'=>array( 'n'=>array(
'name'=>'max number of returned items', 'name'=>'max number of returned items',
'type'=>'number' 'type'=>'number'
@ -19,16 +22,12 @@ class GiphyBridge extends BridgeAbstract{
public function collectData(){ public function collectData(){
$html = ''; $html = '';
$base_url = 'http://giphy.com'; $base_url = 'http://giphy.com';
if ($this->getInput('s')) { /* keyword search mode */ $html = $this->getSimpleHTMLDOM($this->uri.'/search/'.urlencode($this->getInput('s').'/'))
$html = $this->getSimpleHTMLDOM($base_url.'/search/'.urlencode($this->getInput('s').'/')) or $this->returnServerError('No results for this query.'); or $this->returnServerError('No results for this query.');
}
else {
$this->returnClientError('You must specify a search worf (?s=...).');
}
$max = GIPHY_LIMIT; $max = GIPHY_LIMIT;
if ($this->getInput('n')) { if ($this->getInput('n')) {
$max = (integer) $this->getInput('n'); $max = $this->getInput('n');
} }
$limit = 0; $limit = 0;
@ -38,7 +37,8 @@ class GiphyBridge extends BridgeAbstract{
$node = $entry->first_child(); $node = $entry->first_child();
$href = $node->getAttribute('href'); $href = $node->getAttribute('href');
$html2 = $this->getSimpleHTMLDOM($base_url . $href) or $this->returnServerError('No results for this query.'); $html2 = $this->getSimpleHTMLDOM($this->uri . $href)
or $this->returnServerError('No results for this query.');
$figure = $html2->getElementByTagName('figure'); $figure = $html2->getElementByTagName('figure');
$img = $figure->firstChild(); $img = $figure->firstChild();
$caption = $figure->lastChild(); $caption = $figure->lastChild();

View file

@ -3,7 +3,7 @@ class GithubIssueBridge extends BridgeAbstract{
public $maintainer = 'Pierre Mazière'; public $maintainer = 'Pierre Mazière';
public $name = 'Github Issue'; public $name = 'Github Issue';
public $uri = ''; public $uri = 'https://github.com/';
public $description = 'Returns the issues or comments of an issue of a github project'; public $description = 'Returns the issues or comments of an issue of a github project';
public $parameters=array( public $parameters=array(
@ -29,11 +29,13 @@ class GithubIssueBridge extends BridgeAbstract{
); );
public function collectData(){ public function collectData(){
$uri = 'https://github.com/'.$this->getInput('u').'/'.$this->getInput('p').'/issues/'.($this->getInput('i')?$this->getInput('i'):''); $uri = $this->uri.$this->getInput('u').'/'.$this->getInput('p')
.'/issues/'.$this->getInput('i');
$html = $this->getSimpleHTMLDOM($uri) $html = $this->getSimpleHTMLDOM($uri)
or $this->returnServerError('No results for Github Issue '.$this->getInput('i').' in project '.$this->getInput('u').'/'.$this->getInput('p')); or $this->returnServerError('No results for Github Issue '.$this->getInput('i').' in project '.$this->getInput('u').'/'.$this->getInput('p'));
if($this->getInput('i')){ switch($this->queriedContext){
case 'Issue Comments':
foreach($html->find('.js-comment-container') as $comment){ foreach($html->find('.js-comment-container') as $comment){
$item = array(); $item = array();
@ -48,19 +50,20 @@ class GithubIssueBridge extends BridgeAbstract{
$this->items[]=$item; $this->items[]=$item;
} }
}else{ break;
case 'Project Issues':
foreach($html->find('.js-active-navigation-container .js-navigation-item') as $issue){ foreach($html->find('.js-active-navigation-container .js-navigation-item') as $issue){
$item=array(); $item=array();
$info=$issue->find('.opened-by',0); $info=$issue->find('.opened-by',0);
$item['author']=$info->find('a',0)->plaintext; $item['author']=$info->find('a',0)->plaintext;
$item['timestamp']=strtotime($info->find('relative-time',0)->getAttribute('datetime')); $item['timestamp']=strtotime($info->find('relative-time',0)->getAttribute('datetime'));
$item['title']=$issue->find('.js-navigation-open',0)->plaintext; $item['title']=$issue->find('.js-navigation-open',0)->plaintext;
$comments=$issue->firstChild()->firstChild() $comments=$issue->find('.col-5',0)->plaintext;
->nextSibling()->nextSibling()->nextSibling()->plaintext;
$item['content']='Comments: '.($comments?$comments:'0'); $item['content']='Comments: '.($comments?$comments:'0');
$item['uri']='https://github.com'.$issue->find('.js-navigation-open',0)->getAttribute('href'); $item['uri']=$this->uri.$issue->find('.js-navigation-open',0)->getAttribute('href');
$this->items[]=$item; $this->items[]=$item;
} }
break;
} }
} }

View file

@ -26,16 +26,11 @@ class GitlabCommitsBridge extends BridgeAbstract{
)); ));
public function collectData(){ public function collectData(){
$uri = $this->getInput('uri').'/'.$this->getInput('u').'/'.$this->getInput('p').'/commits/'; $uri = $this->getInput('uri').'/'.$this->getInput('u').'/'
if($this->getInput('b')){ .$this->getInput('p').'/commits/'.$this->getInput('b');
$uri.=$this->getInput('b');
}else{
$uri.='master';
}
$html = $this->getSimpleHTMLDOM($uri) $html = $this->getSimpleHTMLDOM($uri)
or $this->returnServerError('No results for Gitlab Commits of project '.$this->getInput('uri').'/'.$this->getInput('u').'/'.$this->getInput('p')); or $this->returnServerError('No results for Gitlab Commits of project '.$uri);
foreach($html->find('li.commit') as $commit){ foreach($html->find('li.commit') as $commit){

View file

@ -10,6 +10,9 @@ class GizmodoFRBridge extends BridgeAbstract{
function GizmodoFRExtractContent($url) { function GizmodoFRExtractContent($url) {
$articleHTMLContent = $this->getSimpleHTMLDOM($url); $articleHTMLContent = $this->getSimpleHTMLDOM($url);
if(!$articleHTMLContent){
return 'Could not load '.$url;
}
$text = $articleHTMLContent->find('div.entry-thumbnail', 0)->innertext; $text = $articleHTMLContent->find('div.entry-thumbnail', 0)->innertext;
$text = $text.$articleHTMLContent->find('div.entry-excerpt', 0)->innertext; $text = $text.$articleHTMLContent->find('div.entry-excerpt', 0)->innertext;
$text = $text.$articleHTMLContent->find('div.entry-content', 0)->innertext; $text = $text.$articleHTMLContent->find('div.entry-content', 0)->innertext;
@ -21,7 +24,8 @@ class GizmodoFRBridge extends BridgeAbstract{
return $text; return $text;
} }
$rssFeed = $this->getSimpleHTMLDOM('http://www.gizmodo.fr/feed') or $this->returnServerError('Could not request http://www.gizmodo.fr/feed'); $rssFeed = $this->getSimpleHTMLDOM($this->uri.'/feed')
or $this->returnServerError('Could not request '.$this->uri.'/feed');
$limit = 0; $limit = 0;
foreach($rssFeed->find('item') as $element) { foreach($rssFeed->find('item') as $element) {

View file

@ -6,7 +6,7 @@ class GooglePlusPostBridge extends BridgeAbstract
public $maintainer = "Grummfy"; public $maintainer = "Grummfy";
public $name = "Google Plus Post Bridge"; public $name = "Google Plus Post Bridge";
public $uri = "http://plus.google.com/"; public $uri = "https://plus.google.com/";
public $description = "Returns user public post (without API)."; public $description = "Returns user public post (without API).";
public $parameters = array( array( public $parameters = array( array(
@ -16,20 +16,11 @@ class GooglePlusPostBridge extends BridgeAbstract
) )
)); ));
const GOOGLE_PLUS_BASE_URL = 'https://plus.google.com/';
public function collectData() public function collectData()
{ {
$param=$this->parameters[$queriedContext];
if (!$this->getInput('username'))
{
$this->returnClientError('You must specify a username (?username=...).');
}
$this->request = $this->getInput('username');
// get content parsed // get content parsed
// $html = $this->getSimpleHTMLDOM(__DIR__ . '/../posts2.html' // $html = $this->getSimpleHTMLDOM(__DIR__ . '/../posts2.html'
$html = $this->getSimpleHTMLDOM(self::GOOGLE_PLUS_BASE_URL . urlencode($this->request) . '/posts' $html = $this->getSimpleHTMLDOM($this->uri . urlencode($this->getInput('username')) . '/posts'
// force language // force language
, false, stream_context_create(array('http'=> array( , 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" 'header' => 'Accept-Language: fr,fr-be,fr-fr;q=0.8,en;q=0.4,en-us;q=0.2;*' . "\r\n"
@ -57,7 +48,7 @@ class GooglePlusPostBridge extends BridgeAbstract
// $item['title'] = $item['fullname'] = $post->find('header.lea', 0)->plaintext; // $item['title'] = $item['fullname'] = $post->find('header.lea', 0)->plaintext;
$item['avatar'] = $post->find('div.ys img', 0)->src; $item['avatar'] = $post->find('div.ys img', 0)->src;
// var_dump((($post->find('a.o-U-s', 0)->getAllAttributes()))); // var_dump((($post->find('a.o-U-s', 0)->getAllAttributes())));
$item['uri'] = self::GOOGLE_PLUS_BASE_URL . $post->find('a.o-U-s', 0)->href; $item['uri'] = $this->uri . $post->find('a.o-U-s', 0)->href;
$item['timestamp'] = strtotime($post->find('a.o-U-s', 0)->plaintext); $item['timestamp'] = strtotime($post->find('a.o-U-s', 0)->plaintext);
$this->items[] = $item; $this->items[] = $item;
@ -65,21 +56,21 @@ class GooglePlusPostBridge extends BridgeAbstract
$hashtags = array(); $hashtags = array();
foreach($post->find('a.d-s') as $hashtag) foreach($post->find('a.d-s') as $hashtag)
{ {
$hashtags[ trim($hashtag->plaintext) ] = self::GOOGLE_PLUS_BASE_URL . $hashtag->href; $hashtags[ trim($hashtag->plaintext) ] = $this->uri . $hashtag->href;
} }
$item['content'] = ''; $item['content'] = '';
// avatar display // avatar display
$item['content'] .= '<div style="float:left; margin: 0 0.5em 0.5em 0;"><a href="' . self::GOOGLE_PLUS_BASE_URL . urlencode($this->request); $item['content'] .= '<div style="float:left; margin: 0 0.5em 0.5em 0;"><a href="' . $this->uri . urlencode($this->getInput('username'));
$item['content'] .= '"><img align="top" alt="avatar" src="' . $item['avatar'].'" />' . $item['username'] . '</a></div>'; $item['content'] .= '"><img align="top" alt="avatar" src="' . $item['avatar'].'" />' . $item['username'] . '</a></div>';
$content = $post->find('div.Al', 0); $content = $post->find('div.Al', 0);
// alter link // alter link
// $content = $content->innertext; // $content = $content->innertext;
// $content = str_replace('href="./', 'href="' . self::GOOGLE_PLUS_BASE_URL, $content); // $content = str_replace('href="./', 'href="' . $this->uri, $content);
// $content = str_replace('href="photos', 'href="' . self::GOOGLE_PLUS_BASE_URL . 'photos', $content); // $content = str_replace('href="photos', 'href="' . $this->uri . 'photos', $content);
// 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 // 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) foreach($content->find('a') as $link)
{ {
@ -95,7 +86,7 @@ class GooglePlusPostBridge extends BridgeAbstract
{ {
$link->href = substr($link->href, 1); $link->href = substr($link->href, 1);
} }
$link->href = self::GOOGLE_PLUS_BASE_URL . $link->href; $link->href = $this->uri . $link->href;
} }
} }
$content = $content->innertext; $content = $content->innertext;
@ -116,7 +107,7 @@ class GooglePlusPostBridge extends BridgeAbstract
public function getURI() public function getURI()
{ {
return $this->_url ?: 'http://plus.google.com/'; return $this->_url ?: $this->uri;
} }
public function getCacheDuration() public function getCacheDuration()

View file

@ -9,7 +9,6 @@
*/ */
class GoogleSearchBridge extends BridgeAbstract{ class GoogleSearchBridge extends BridgeAbstract{
public $maintainer = "sebsauvage"; public $maintainer = "sebsauvage";
public $name = "Google search"; public $name = "Google search";
public $uri = "https://www.google.com/"; public $uri = "https://www.google.com/";
@ -26,7 +25,10 @@ class GoogleSearchBridge extends BridgeAbstract{
public function collectData(){ public function collectData(){
$html = ''; $html = '';
$html = $this->getSimpleHTMLDOM('https://www.google.com/search?q=' . urlencode($this->getInput('q')) . '&num=100&complete=0&tbs=qdr:y,sbd:1') or $this->returnServerError('No results for this query.'); $html = $this->getSimpleHTMLDOM($this->uri
.'search?q=' . urlencode($this->getInput('q'))
.'&num=100&complete=0&tbs=qdr:y,sbd:1')
or $this->returnServerError('No results for this query.');
$emIsRes = $html->find('div[id=ires]',0); $emIsRes = $html->find('div[id=ires]',0);
if( !is_null($emIsRes) ){ if( !is_null($emIsRes) ){

View file

@ -13,7 +13,8 @@ class GuruMedBridge extends BridgeAbstract{
} }
public function collectData(){ public function collectData(){
$html = $this->getSimpleHTMLDOM('http://gurumed.org/feed') or $this->returnServerError('Could not request Gurumed.'); $html = $this->getSimpleHTMLDOM($this->uri.'feed')
or $this->returnServerError('Could not request Gurumed.');
$limit = 0; $limit = 0;
foreach($html->find('item') as $element) { foreach($html->find('item') as $element) {

View file

@ -1,31 +1,24 @@
<?php <?php
class HDWallpapersBridge extends BridgeAbstract { class HDWallpapersBridge extends BridgeAbstract {
private $category;
private $resolution;
public $maintainer = "nel50n"; public $maintainer = "nel50n";
public $name = "HD Wallpapers Bridge"; public $name = "HD Wallpapers Bridge";
public $uri = "http://www.hdwallpapers.in/"; public $uri = "http://www.hdwallpapers.in/";
public $description = "Returns the latests wallpapers from HDWallpapers"; public $description = "Returns the latests wallpapers from HDWallpapers";
public $parameters = array( array( public $parameters = array( array(
'c'=>array('name'=>'category'), 'c'=>array(
'name'=>'category',
'defaultValue'=>'latest_wallpapers'
),
'm'=>array('name'=>'max number of wallpapers'), 'm'=>array('name'=>'max number of wallpapers'),
'r'=>array( 'r'=>array(
'name'=>'resolution', 'name'=>'resolution',
'defaultValue'=>'1920x1200',
'exampleValue'=>'1920x1200, 1680x1050,…' 'exampleValue'=>'1920x1200, 1680x1050,…'
) )
)); ));
public function collectData(){ public function collectData(){
$html = '';
$baseUri = 'http://www.hdwallpapers.in';
$this->category = $this->getInput('c') ?: 'latest_wallpapers'; // Latest default
$this->resolution = $this->getInput('r') ?: '1920x1200'; // Wide wallpaper default
$category = $this->category; $category = $this->category;
if (strrpos($category, 'wallpapers') !== strlen($category)-strlen('wallpapers')) { if (strrpos($category, 'wallpapers') !== strlen($category)-strlen('wallpapers')) {
$category .= '-desktop-wallpapers'; $category .= '-desktop-wallpapers';
@ -36,7 +29,7 @@ class HDWallpapersBridge extends BridgeAbstract {
$lastpage = 1; $lastpage = 1;
for ($page = 1; $page <= $lastpage; $page++) { for ($page = 1; $page <= $lastpage; $page++) {
$link = $baseUri.'/'.$category.'/page/'.$page; $link = $this->uri.'/'.$category.'/page/'.$page;
$html = $this->getSimpleHTMLDOM($link) or $this->returnServerError('No results for this query.'); $html = $this->getSimpleHTMLDOM($link) or $this->returnServerError('No results for this query.');
if ($page === 1) { if ($page === 1) {
@ -49,10 +42,10 @@ class HDWallpapersBridge extends BridgeAbstract {
$item = array(); $item = array();
// http://www.hdwallpapers.in/download/yosemite_reflections-1680x1050.jpg // http://www.hdwallpapers.in/download/yosemite_reflections-1680x1050.jpg
$item['uri'] = $baseUri.'/download'.str_replace('wallpapers.html', $this->resolution.'.jpg', $element->href); $item['uri'] = $this->uri.'/download'.str_replace('wallpapers.html', $this->getInput('r').'.jpg', $element->href);
$item['timestamp'] = time(); $item['timestamp'] = time();
$item['title'] = $element->find('p', 0)->text(); $item['title'] = $element->find('p', 0)->text();
$item['content'] = $item['title'].'<br><a href="'.$item['uri'].'"><img src="'.$baseUri.$thumbnail->src.'" /></a>'; $item['content'] = $item['title'].'<br><a href="'.$item['uri'].'"><img src="'.$this->uri.$thumbnail->src.'" /></a>';
$this->items[] = $item; $this->items[] = $item;
$num++; $num++;
@ -63,7 +56,7 @@ class HDWallpapersBridge extends BridgeAbstract {
} }
public function getName(){ public function getName(){
return 'HDWallpapers - '.str_replace(['__', '_'], [' & ', ' '], $this->category).' ['.$this->resolution.']'; return 'HDWallpapers - '.str_replace(['__', '_'], [' & ', ' '], $this->getInput('c')).' ['.$this->getInput('r').']';
} }
public function getCacheDuration(){ public function getCacheDuration(){

View file

@ -7,7 +7,8 @@ class HentaiHavenBridge extends BridgeAbstract{
public $description = "Returns releases from Hentai Haven"; public $description = "Returns releases from Hentai Haven";
public function collectData(){ public function collectData(){
$html = $this->getSimpleHTMLDOM('http://hentaihaven.org/') or $this->returnServerError('Could not request Hentai Haven.'); $html = $this->getSimpleHTMLDOM($this->uri)
or $this->returnServerError('Could not request Hentai Haven.');
foreach($html->find('div.zoe-grid') as $element) { foreach($html->find('div.zoe-grid') as $element) {
$item = array(); $item = array();
$item['uri'] = $element->find('div.brick-content h3 a', 0)->href; $item['uri'] = $element->find('div.brick-content h3 a', 0)->href;

View file

@ -14,7 +14,6 @@ class IdenticaBridge extends BridgeAbstract{
)); ));
public function collectData(){ public function collectData(){
$html = '';
$html = $this->getSimpleHTMLDOM($this->getURI()) $html = $this->getSimpleHTMLDOM($this->getURI())
or $this->returnServerError('Requested username can\'t be found.'); or $this->returnServerError('Requested username can\'t be found.');

View file

@ -46,7 +46,7 @@ class InstagramBridge extends BridgeAbstract{
{ {
$item = array(); $item = array();
$item['uri'] = "https://instagram.com/p/".$media->code."/"; $item['uri'] = $this->uri.'/p/'.$media->code.'/';
$item['content'] = '<img src="' . htmlentities($media->display_src) . '" />'; $item['content'] = '<img src="' . htmlentities($media->display_src) . '" />';
if (isset($media->caption)) if (isset($media->caption))
{ {
@ -61,7 +61,7 @@ class InstagramBridge extends BridgeAbstract{
} }
public function getName(){ public function getName(){
return $this->param['u']['value'] .' - Instagram Bridge'; return $this->getInput('u') .' - Instagram Bridge';
} }
public function getURI(){ public function getURI(){

View file

@ -1,483 +1,471 @@
<?php <?php
class IsoHuntBridge extends BridgeAbstract{ class IsoHuntBridge extends BridgeAbstract{
public $maintainer = 'logmanoriginal'; public $maintainer = 'logmanoriginal';
public $name = 'isoHunt Bridge'; // Is replaced later! public $name = 'isoHunt Bridge';
public $uri = 'https://isohunt.to'; // Is replaced later! public $uri = 'https://isohunt.to/';
public $description = 'Returns the latest results by category or search result'; public $description = 'Returns the latest results by category or search result';
public $parameters = array( public $parameters = array(
/* /*
* Get feeds for one of the "latest" categories * Get feeds for one of the "latest" categories
* Notice: The categories "News" and "Top Searches" are received from the main page * Notice: The categories "News" and "Top Searches" are received from the main page
* Elements are sorted by name ascending! * Elements are sorted by name ascending!
*/ */
'By "Latest" category' => array( 'By "Latest" category' => array(
'latest_category'=>array( 'latest_category'=>array(
'name'=>'Latest category', 'name'=>'Latest category',
'type'=>'list', 'type'=>'list',
'required'=>true, 'required'=>true,
'title'=>'Select your category', 'title'=>'Select your category',
'defaultValue'=>'News', 'defaultValue'=>'news',
'values'=>array( 'values'=>array(
'Hot Torrents'=>'hot_torrents', 'Hot Torrents'=>'hot_torrents',
'News'=>'news', 'News'=>'news',
'Releases'=>'releases', 'Releases'=>'releases',
'Torrents'=>'torrents' '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 collectData(){ /*
$request_path = '/'; // We'll request the main page by default * 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'
)
),
if($this->getInput('latest_category')){ // Requesting one of the latest categories /*
$this->request_latest_category($this->getInput('latest_category')); * Get feeds for a specific search request
} elseif($this->getInput('torrent_category')){ // Requesting one of the torrent categories */
$order_popularity = false; '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'
)
)
)
);
if($this->getInput('torrent_popularity')) public function getURI(){
$order_popularity = $this->getInput('torrent_popularity'); $uri=$this->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;
$this->request_torrent_category($this->getInput('torrent_category'), $order_popularity); case 'By "Torrent" category':
} else if($this->getInput('search_name')){ // Requesting search $uri .= $this->build_category_uri(
if($this->getInput('search_category')) $this->getInput('torrent_category'),
$this->request_search($this->getInput('search_name'), $this->getInput('search_category')); $this->getInput('torrent_popularity')
else );
$this->request_search($this->getInput('search_name')); break;
} else {
$this->returnClientError('Unknown request!'); 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;
} }
public function getCacheDuration(){ return $uri;
return 300; // 5 minutes }
public function getName(){
switch($this->queriedContext){
case 'By "Latest" category':
$categoryName =
array_search(
$this->getInput('latest_category'),
$this->parameters['By "Latest" category']['latest_category']['values']
);
$name = 'Latest '.$categoryName.' - ' . $this->name;
break;
case 'By "Torrent" category':
$categoryName =
array_search(
$this->getInput('torrent_category'),
$this->parameters['By "Torrent" category']['torrent_category']['values']
);
$name = 'Category: ' . $categoryName . ' - ' . $this->name;
break;
case 'Search torrent by name':
$categoryName =
array_search(
$this->getInput('search_category'),
$this->parameters['Search torrent by name']['search_category']['values']
);
$name = 'Search: "' . $this->getInput('search_name') . '" in category: ' . $categoryName . ' - ' . $this->name;
break;
} }
#region Helper functions for "By "Torrent" category" return $name;
}
private function request_torrent_category($category, $order_popularity){
$category_name = $this->get_torrent_category_name($category);
$category_index = $this->get_torrent_category_index($category);
$this->name = 'Category: ' . $category_name . ' - ' . $this->name; public function collectData(){
$this->uri .= $this->build_category_uri($category_index, $order_popularity); $html = $this->load_html($this->getURI());
$html = $this->load_html($this->uri); switch($this->queriedContext){
case 'By "Latest" category':
if(strtolower(trim($category)) === 'movies') // This one is special (content wise) switch($this->getInput('latest_category')){
$this->get_movie_torrents($html); case 'hot_torrents':
else $this->get_latest_hot_torrents($html);
$this->get_latest_torrents($html); break;
} case 'news':
$this->get_latest_news($html);
private function get_torrent_category_name($category){ break;
$parameter = $this->parameters['By "Torrent" category']; case 'releases':
$languages = $parameter['torrent_category']['values']; case 'torrents':
foreach($languages as $name=>$value)
if(strtolower(trim($value)) === strtolower(trim($category)))
return $name;
return 'Unknown category';
}
private function get_torrent_category_index($category){
switch(strtolower(trim($category))){
case 'anime': return 1;
case 'software' : return 2;
case 'games' : return 3;
case 'adult' : return 4;
case 'movies' : return 5;
case 'music' : return 6;
case 'other' : return 7;
case 'series_tv' : return 8;
case 'books': return 9;
default: return 0;
}
}
#endregion
private function request_latest_category($category){
switch($category){
case 'hot_torrents': // This is a special case! (that's why return)
$this->name = 'Latest hot torrents - ' . $this->name;
$this->uri .= '/statistic/hot/torrents';
$html = $this->load_html($this->uri);
$this->get_latest_hot_torrents($html);
return;
case 'news': // This is a special case! (that's why return)
$this->name = 'Latest news - ' . $this->name;
$this->uri .= '/';
$html = $this->load_html($this->uri);
$this->get_latest_news($html);
return;
case 'releases':
$this->name = 'Latest releases - ' . $this->name;
$this->uri .= '/releases.php';
break;
case 'torrents':
$this->name = 'Latest torrents - ' . $this->name;
$this->uri .= '/latest.php';
break;
default: // No category applies
$this->returnClientError('Undefined category: ' . $category . '!');
}
$html = $this->load_html($this->uri);
$this->get_latest_torrents($html); $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;
}
}
public function getCacheDuration(){
return 300; // 5 minutes
}
#region Helper functions for "Movie Torrents"
private function get_movie_torrents($html){
$container = $html->find('div#w0', 0);
if(!$container)
$this->returnServerError('Unable to find torrent container!');
$torrents = $container->find('article');
if(!$torrents)
$this->returnServerError('Unable to find torrents!');
foreach($torrents as $torrent){
$anchor = $torrent->find('a', 0);
if(!$anchor)
$this->returnServerError('Unable to find anchor!');
$date = $torrent->find('small', 0);
if(!$date)
$this->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)
$this->returnServerError('Unable to find torrent container!');
$torrents = $container->find('tr');
if(!$torrents)
$this->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)
$this->returnServerError('Unable to find cell!');
$element = $cell->find('a', 0);
if(!$element)
$this->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 get_latest_news($html){
$container = $html->find('div#postcontainer', 0);
if(!$container)
$this->returnServerError('Unable to find post container!');
$posts = $container->find('div.index-post');
if(!$posts)
$this->returnServerError('Unable to find posts!');
foreach($posts as $post){
$item = array();
$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);
$this->items[] = $item;
}
}
private function latest_news_extract_author($post){
$author = $post->find('small', 0);
if(!$author)
$this->returnServerError('Unable to find author!');
// The author is hidden within a string like: 'Posted by {author} on {date}'
preg_match('/Posted\sby\s(.*)\son/i', $author->innertext, $matches);
return $matches[1];
}
private function latest_news_extract_timestamp($post){
$date = $post->find('small', 0);
if(!$date)
$this->returnServerError('Unable to find date!');
// The date is hidden within a string like: 'Posted by {author} on {date}'
preg_match('/Posted\sby\s.*\son\s(.*)/i', $date->innertext, $matches);
$timestamp = strtotime($matches[1]);
// Make sure date is not in the future (dates are given like 'Nov. 20' without year)
if($timestamp > time()){
$timestamp = strtotime('-1 year', $timestamp);
} }
#region Helper functions for "Search torrent by name" return $timestamp;
}
private function request_search($name, $category = 'all'){ private function latest_news_extract_title($post){
$category_name = $this->get_search_category_name($category); $title = $post->find('a', 0);
$category_index = $this->get_search_category_index($category); if(!$title)
$this->returnServerError('Unable to find title!');
$this->name = 'Search: "' . $name . '" in category: ' . $category_name . ' - ' . $this->name; return $title->plaintext;
$this->uri .= $this->build_category_uri($category_index); }
if(strtolower(trim($category)) === 'movies'){ // This one is special (content wise) private function latest_news_extract_uri($post){
$html = $this->load_html($this->uri); $uri = $post->find('a', 0);
$this->get_movie_torrents($html); if(!$uri)
} else { $this->returnServerError('Unable to find uri!');
$this->uri .= '&ihq=' . urlencode($name);
$html = $this->load_html($this->uri); return $uri->href;
$this->get_latest_torrents($html); }
}
private function latest_news_extract_content($post){
$content = $post->find('div', 0);
if(!$content)
$this->returnServerError('Unable to find content!');
// Remove <h2>...</h2> (title)
foreach($content->find('h2') as $element){
$element->outertext = '';
} }
private function get_search_category_name($category){ // Remove <small>...</small> (author)
$parameter = $this->parameters['Search torrent by name']; foreach($content->find('small') as $element){
$languages = $parameter['search_category']['values']; $element->outertext = '';
foreach($languages as $name=>$value)
if(strtolower(trim($value)) === strtolower(trim($category)))
return $name;
return 'Unknown category';
} }
private function get_search_category_index($category){ return $content->innertext;
switch(strtolower(trim($category))){ }
case 'all': return 0;
default: return $this->get_torrent_category_index($category); // Uses the same index #endregion
}
#region Helper functions for "Latest Torrents", "Latest Releases" and "Torrent Category"
private function get_latest_torrents($html){
$container = $html->find('div#serps', 0);
if(!$container)
$this->returnServerError('Unable to find torrent container!');
$torrents = $container->find('tr[data-key]');
if(!$torrents)
$this->returnServerError('Unable to find torrents!');
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)
$this->returnServerError('Unable to find title cell!');
$title = $cell->find('span', 0);
if(!$title)
$this->returnServerError('Unable to find title!');
return $title->plaintext;
}
private function latest_torrents_extract_uri($torrent){
$cell = $torrent->find('td.title-row', 0);
if(!$cell)
$this->returnServerError('Unable to find title cell!');
$uri = $cell->find('a', 0);
if(!$uri)
$this->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)
$this->returnServerError('Unable to find user!');
return $user->plaintext;
}
private function latest_torrents_extract_timestamp($torrent){
$cell = $torrent->find('td.date-row', 0);
if(!$cell)
$this->returnServerError('Unable to find date cell!');
return strtotime('-' . $cell->plaintext, time());
}
#endregion
#region Generic helper functions
private function load_html($uri){
$html = $this->getSimpleHTMLDOM($uri);
if(!$html)
$this->returnServerError('Unable to load ' . $uri . '!');
return $html;
}
private function fix_relative_uri($uri){
return preg_replace('/\//i', $this->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;
} }
#endregion return 'torrents/?iht=' . $index . '&ihs=' . ($order_popularity ? 1 : 0) . '&age=0';
}
#region Helper functions for "Movie Torrents" #endregion
private function get_movie_torrents($html){
$container = $html->find('div#w0', 0);
if(!$container)
$this->returnServerError('Unable to find torrent container!');
$torrents = $container->find('article');
if(!$torrents)
$this->returnServerError('Unable to find torrents!');
foreach($torrents as $torrent){
$anchor = $torrent->find('a', 0);
if(!$anchor)
$this->returnServerError('Unable to find anchor!');
$date = $torrent->find('small', 0);
if(!$date)
$this->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)
$this->returnServerError('Unable to find torrent container!');
$torrents = $container->find('tr');
if(!$torrents)
$this->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)
$this->returnServerError('Unable to find cell!');
$element = $cell->find('a', 0);
if(!$element)
$this->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 get_latest_news($html){
$container = $html->find('div#postcontainer', 0);
if(!$container)
$this->returnServerError('Unable to find post container!');
$posts = $container->find('div.index-post');
if(!$posts)
$this->returnServerError('Unable to find posts!');
foreach($posts as $post){
$item = array();
$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);
$this->items[] = $item;
}
}
private function latest_news_extract_author($post){
$author = $post->find('small', 0);
if(!$author)
$this->returnServerError('Unable to find author!');
// The author is hidden within a string like: 'Posted by {author} on {date}'
preg_match('/Posted\sby\s(.*)\son/i', $author->innertext, $matches);
return $matches[1];
}
private function latest_news_extract_timestamp($post){
$date = $post->find('small', 0);
if(!$date)
$this->returnServerError('Unable to find date!');
// The date is hidden within a string like: 'Posted by {author} on {date}'
preg_match('/Posted\sby\s.*\son\s(.*)/i', $date->innertext, $matches);
$timestamp = strtotime($matches[1]);
// 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 $timestamp;
}
private function latest_news_extract_title($post){
$title = $post->find('a', 0);
if(!$title)
$this->returnServerError('Unable to find title!');
return $title->plaintext;
}
private function latest_news_extract_uri($post){
$uri = $post->find('a', 0);
if(!$uri)
$this->returnServerError('Unable to find uri!');
return $uri->href;
}
private function latest_news_extract_content($post){
$content = $post->find('div', 0);
if(!$content)
$this->returnServerError('Unable to find content!');
// Remove <h2>...</h2> (title)
foreach($content->find('h2') as $element){
$element->outertext = '';
}
// Remove <small>...</small> (author)
foreach($content->find('small') as $element){
$element->outertext = '';
}
return $content->innertext;
}
#endregion
#region Helper functions for "Latest Torrents", "Latest Releases" and "Torrent Category"
private function get_latest_torrents($html){
$container = $html->find('div#serps', 0);
if(!$container)
$this->returnServerError('Unable to find torrent container!');
$torrents = $container->find('tr[data-key]');
if(!$torrents)
$this->returnServerError('Unable to find torrents!');
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)
$this->returnServerError('Unable to find title cell!');
$title = $cell->find('span', 0);
if(!$title)
$this->returnServerError('Unable to find title!');
return $title->plaintext;
}
private function latest_torrents_extract_uri($torrent){
$cell = $torrent->find('td.title-row', 0);
if(!$cell)
$this->returnServerError('Unable to find title cell!');
$uri = $cell->find('a', 0);
if(!$uri)
$this->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)
$this->returnServerError('Unable to find user!');
return $user->plaintext;
}
private function latest_torrents_extract_timestamp($torrent){
$cell = $torrent->find('td.date-row', 0);
if(!$cell)
$this->returnServerError('Unable to find date cell!');
return strtotime('-' . $cell->plaintext, time());
}
#endregion
#region Generic helper functions
private function load_html($uri){
$html = $this->getSimpleHTMLDOM($uri);
if(!$html)
$this->returnServerError('Unable to load ' . $uri . '!');
return $html;
}
private function fix_relative_uri($uri){
return preg_replace('/\//i', 'https://isohunt.to/', $uri, 1);
}
private function build_category_uri($index, $order_popularity = false){
return '/torrents/?iht=' . $index . '&ihs=' . ($order_popularity ? 1 : 0) . '&age=0';
}
#endregion
} }

View file

@ -7,12 +7,8 @@ class JapanExpoBridge extends HttpCachingBridgeAbstract {
public $description = 'Returns most recent entries from Japan Expo actualités.'; public $description = 'Returns most recent entries from Japan Expo actualités.';
public $parameters = array( array( public $parameters = array( array(
'mode'=>array( 'mode'=>array(
'name'=>'Mode', 'name'=>'Show full contents',
'type'=>'list', 'type'=>'checkbox',
'values'=>array(
'Titles only'=>'light',
'Full Contents'=>'full'
)
) )
)); ));
@ -46,9 +42,9 @@ class JapanExpoBridge extends HttpCachingBridgeAbstract {
} }
}; };
$link = 'http://www.japan-expo-paris.com/fr/actualites'; $html = $this->getSimpleHTMLDOM($this->uri)
$html = $this->getSimpleHTMLDOM($link) or $this->returnServerError('Could not request JapanExpo: '.$link); or $this->returnServerError('Could not request JapanExpo: '.$this->uri);
$fullcontent = (!empty($this->getInput('mode')) && $this->getInput('mode') == 'full'); $fullcontent = $this->getInput('mode');
$count = 0; $count = 0;
foreach ($html->find('a._tile2') as $element) { foreach ($html->find('a._tile2') as $element) {
@ -60,22 +56,21 @@ class JapanExpoBridge extends HttpCachingBridgeAbstract {
$thumbnail = trim($img_search_result[1], "'"); $thumbnail = trim($img_search_result[1], "'");
if ($fullcontent) { if ($fullcontent) {
if ($count < 5) { if ($count >= 5) {
if($this->get_cached_time($url) <= strtotime('-24 hours')) break;
$this->remove_from_cache($url);
$article_html = $this->get_cached($url) or $this->returnServerError('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 {
break;
} }
if($this->get_cached_time($url) <= strtotime('-24 hours'))
$this->remove_from_cache($url);
$article_html = $this->get_cached($url) or $this->returnServerError('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 { } else {
$date_text = $element->find('span.date', 0)->plaintext; $date_text = $element->find('span.date', 0)->plaintext;
$timestamp = french_pubdate_to_timestamp($date_text); $timestamp = french_pubdate_to_timestamp($date_text);

View file

@ -9,20 +9,19 @@ class KonachanBridge extends BridgeAbstract{
public $parameters = array( array( public $parameters = array( array(
'p'=>array( 'p'=>array(
'name'=>'page', 'name'=>'page',
'defaultValue'=>1,
'type'=>'number' 'type'=>'number'
), ),
't'=>array('name'=>'tags') 't'=>array('name'=>'tags')
)); ));
public function collectData(){ public function collectData(){
$page = 1;$tags=''; $html = $this->getSimpleHTMLDOM(
if ($this->getInput('p')) { $this->uri.'/post?'
$page = (int)preg_replace("/[^0-9]/",'', $this->getInput('p')); .'&page='.$this->getInput('p')
} .'&tags='.urlencode($this->getInput('t'))
if ($this->getInput('t')) { ) or $this->returnServerError('Could not request Konachan.');
$tags = urlencode($this->getInput('t'));
}
$html = $this->getSimpleHTMLDOM("http://konachan.com/post?page=$page&tags=$tags") or $this->returnServerError('Could not request Konachan.');
$input_json = explode('Post.register(', $html); $input_json = explode('Post.register(', $html);
foreach($input_json as $element) foreach($input_json as $element)
$data[] = preg_replace('/}\)(.*)/', '}', $element); $data[] = preg_replace('/}\)(.*)/', '}', $element);
@ -31,7 +30,7 @@ class KonachanBridge extends BridgeAbstract{
foreach($data as $datai) { foreach($data as $datai) {
$json = json_decode($datai, TRUE); $json = json_decode($datai, TRUE);
$item = array(); $item = array();
$item['uri'] = 'http://konachan.com/post/show/'.$json['id']; $item['uri'] = $this->uri.'/post/show/'.$json['id'];
$item['postid'] = $json['id']; $item['postid'] = $json['id'];
$item['timestamp'] = $json['created_at']; $item['timestamp'] = $json['created_at'];
$item['imageUri'] = $json['file_url']; $item['imageUri'] = $json['file_url'];

View file

@ -1,8 +1,8 @@
<?php <?php
class KununuBridge extends HttpCachingBridgeAbstract { class KununuBridge extends HttpCachingBridgeAbstract {
public $maintainer = "logmanoriginal"; public $maintainer = "logmanoriginal";
public $name = "Kununu Bridge"; /* This will be replaced later! */ public $name = "Kununu Bridge";
public $uri = "https://www.kununu.com"; /* This will be replaced later! */ public $uri = "https://www.kununu.com/";
public $description = "Returns the latest reviews for a company and site of your choice."; public $description = "Returns the latest reviews for a company and site of your choice.";
public $parameters = array( public $parameters = array(
@ -11,7 +11,6 @@ class KununuBridge extends HttpCachingBridgeAbstract {
'name'=>'Site', 'name'=>'Site',
'type'=>'list', 'type'=>'list',
'required'=>true, 'required'=>true,
'exampleValue'=>'United States',
'title'=>'Select your site', 'title'=>'Select your site',
'values'=>array( 'values'=>array(
'Austria'=>'at', 'Austria'=>'at',
@ -39,47 +38,40 @@ class KununuBridge extends HttpCachingBridgeAbstract {
) )
); );
private $companyName='';
public function getURI(){
$company = $this->encode_umlauts(strtolower(str_replace(' ', '-', trim($this->getInput('company')))));
$site=$this->getInput('site');
$section = '';
switch($site){
case 'at':
case 'de':
case 'ch':
$section = 'kommentare';
break;
case 'us':
$section = 'reviews';
break;
}
return $this->uri.$site.'/'.$company.'/'.$section;
}
function getName(){
$company = $this->encode_umlauts(strtolower(str_replace(' ', '-', trim($this->getInput('company')))));
return ($this->companyName?:$company).' - '.$this->name;
}
public function collectData(){ public function collectData(){
$full = $this->getInput('full');
// Get Site
$site = strtolower(trim($this->getInput('site')));
if(!isset($site) || empty($site) || !$this->site_is_valid($site))
$this->returnClientError('You must specify a valid site (&site=...)!');
// Get Company (fixing whitespace and umlauts)
$company = $this->encode_umlauts(strtolower(str_replace(' ', '-', trim($this->getInput('company')))));
if(!isset($company) || empty($company))
$this->returnClientError('You must specify a company (&company=...)!');
$full = false; // By default we'll load only short article
if($this->getInput('full'))
$full = strtolower(trim($this->getInput('full')));
// Get reviews section name (depends on site)
$section = '';
switch($site){
case 'at':
case 'de':
case 'ch':
$section = 'kommentare';
break;
case 'us':
$section = 'reviews';
break;
default:
$this->returnServerError('The reviews section is not defined for you selection!');
}
// Update URI for the content
$this->uri .= "/{$site}/{$company}/{$section}";
// Load page // Load page
$html = $this->getSimpleHTMLDOM($this->uri); $html = $this->getSimpleHTMLDOM($this->getURI());
if($html === false) if(!$html)
$this->returnServerError('Unable to receive data from ' . $this->uri . '!'); $this->returnServerError('Unable to receive data from ' . $this->getURI() . '!');
// Update name for this request // Update name for this request
$this->name = $this->extract_company_name($html) . ' - ' . $this->name; $this->companyName = $this->extract_company_name($html);
// Find the section with all the panels (reviews) // Find the section with all the panels (reviews)
$section = $html->find('section.kununu-scroll-element', 0); $section = $html->find('section.kununu-scroll-element', 0);
@ -113,26 +105,11 @@ class KununuBridge extends HttpCachingBridgeAbstract {
return 86400; // 1 day return 86400; // 1 day
} }
/**
* Returns true if the given site is part of the parameters list
*/
private function site_is_valid($site){
$parameter = $this->parameters['global'];
$sites = $parameter['site']['values'];
$site_names = array();
foreach($sites as $name=>$value)
$site_names[] = $value;
return in_array($site, $site_names);
}
/** /**
* Fixes relative URLs in the given text * Fixes relative URLs in the given text
*/ */
private function fix_url($text){ private function fix_url($text){
return preg_replace('/href=(\'|\")\//i', 'href="https://www.kununu.com/', $text); return preg_replace('/href=(\'|\")\//i', 'href="'.$this->uri, $text);
} }
/** /**
@ -207,7 +184,7 @@ class KununuBridge extends HttpCachingBridgeAbstract {
if($anchor === false) if($anchor === false)
$this->returnServerError('Cannot find article URI!'); $this->returnServerError('Cannot find article URI!');
return 'https://www.kununu.com' . $anchor->href; return $this->uri . $anchor->href;
} }
/** /**

View file

@ -1,9 +1,13 @@
<?php <?php
class LWNprevBridge extends BridgeAbstract{ class LWNprevBridge extends BridgeAbstract{
public $maintainer = 'Pierre Mazière'; public $maintainer = 'Pierre Mazière';
public $name = 'LWN Free Weekly Edition'; public $name = 'LWN Free Weekly Edition';
public $uri = 'https://lwn.net/free/bigpage'; public $uri = 'https://lwn.net/';
public $description = 'LWN Free Weekly Edition available one week late'; public $description = 'LWN Free Weekly Edition available one week late';
function getURI(){
return $this->uri.'free/bigpage';
}
private function jumpToNextTag(&$node){ private function jumpToNextTag(&$node){
while($node && $node->nodeType===XML_TEXT_NODE){ while($node && $node->nodeType===XML_TEXT_NODE){
@ -28,20 +32,7 @@ class LWNprevBridge extends BridgeAbstract{
public function collectData(){ public function collectData(){
// Because the LWN page is written in loose HTML and not XHTML, // Because the LWN page is written in loose HTML and not XHTML,
// Simple HTML Dom is not accurate enough for the job // Simple HTML Dom is not accurate enough for the job
$content=$this->getContents($this->getURI())
$uri='https://lwn.net/free/bigpage';
$context=null;
if(defined('PROXY_URL')) {
$context = array(
'http' => array(
'proxy' => PROXY_URL,
'request_fulluri' => true,
),
);
$context = stream_context_create($context);
}
$content=file_get_contents($uri, false, $context)
or $this->returnServerError('No results for LWNprev'); or $this->returnServerError('No results for LWNprev');
libxml_use_internal_errors(true); libxml_use_internal_errors(true);
@ -52,13 +43,12 @@ class LWNprevBridge extends BridgeAbstract{
$cat1=''; $cat1='';
$cat2=''; $cat2='';
$realURI='https://lwn.net';
foreach($html->getElementsByTagName('a') as $a){ foreach($html->getElementsByTagName('a') as $a){
if($a->textContent==='Multi-page format'){ if($a->textContent==='Multi-page format'){
break; break;
} }
} }
$realURI.=$a->getAttribute('href'); $realURI=$this->uri.$a->getAttribute('href');
$URICounter=0; $URICounter=0;
$edition=$html->getElementsByTagName('h1')->item(0)->textContent; $edition=$html->getElementsByTagName('h1')->item(0)->textContent;
@ -92,7 +82,7 @@ class LWNprevBridge extends BridgeAbstract{
$h2FirstChild=$h2->firstChild; $h2FirstChild=$h2->firstChild;
$this->jumpToNextTag($h2FirstChild); $this->jumpToNextTag($h2FirstChild);
if($h2FirstChild->nodeName==='a'){ if($h2FirstChild->nodeName==='a'){
$item['uri']='https://lwn.net'.$h2FirstChild->getAttribute('href'); $item['uri']=$this->uri.$h2FirstChild->getAttribute('href');
}else{ }else{
$item['uri']=$realURI.'#'.$URICounter; $item['uri']=$realURI.'#'.$URICounter;
} }

View file

@ -3,7 +3,7 @@ class LeBonCoinBridge extends BridgeAbstract{
public $maintainer = "16mhz"; public $maintainer = "16mhz";
public $name = "LeBonCoin"; public $name = "LeBonCoin";
public $uri = "http://www.leboncoin.fr"; public $uri = "http://www.leboncoin.fr/";
public $description = "Returns most recent results from LeBonCoin for a region, and optionally a category and a keyword ."; public $description = "Returns most recent results from LeBonCoin for a region, and optionally a category and a keyword .";
public $parameters = array( array( public $parameters = array( array(
@ -44,6 +44,7 @@ class LeBonCoinBridge extends BridgeAbstract{
'name'=>'Catégorie', 'name'=>'Catégorie',
'type'=>'list', 'type'=>'list',
'values'=>array( 'values'=>array(
'TOUS'=>'',
'EMPLOI'=>'_emploi_', 'EMPLOI'=>'_emploi_',
'VEHICULES'=>array( 'VEHICULES'=>array(
'Tous'=>'_vehicules_', 'Tous'=>'_vehicules_',
@ -136,14 +137,16 @@ class LeBonCoinBridge extends BridgeAbstract{
public function collectData(){ public function collectData(){
$html = ''; $category=$this->getInput('c');
if (empty($this->getInput('c'))) { if (empty($category)){
$link = 'http://www.leboncoin.fr/annonces/offres/' . $this->getInput('r') . '/?f=a&th=1&q=' . urlencode($this->getInput('k')); $category='annonces';
} }
else {
$link = 'http://www.leboncoin.fr/' . $this->getInput('c') . '/offres/' . $this->getInput('r') . '/?f=a&th=1&q=' . urlencode($this->getInput('k')); $html = $this->getSimpleHTMLDOM(
} $this->uri.$category.'/offres/' . $this->getInput('r') . '/?'
$html = $this->getSimpleHTMLDOM($link) or $this->returnServerError('Could not request LeBonCoin.'); .'f=a&th=1&'
.'q=' . urlencode($this->getInput('k'))
) or $this->returnServerError('Could not request LeBonCoin.');
$list = $html->find('.tabsContent', 0); $list = $html->find('.tabsContent', 0);
if($list === NULL) { if($list === NULL) {

View file

@ -35,7 +35,8 @@ class LeJournalDuGeekBridge extends BridgeAbstract{
} }
public function collectData(){ public function collectData(){
$rssFeed = $this->getSimpleHTMLDOM('http://www.journaldugeek.com/rss') or $this->returnServerError('Could not request http://www.journaldugeek.com/rss'); $rssFeed = $this->getSimpleHTMLDOM($this->uri.'rss')
or $this->returnServerError('Could not request '.$this->uri.'/rss');
$limit = 0; $limit = 0;
foreach($rssFeed->find('item') as $element) { foreach($rssFeed->find('item') as $element) {

View file

@ -28,8 +28,9 @@ class LeMondeInformatiqueBridge extends BridgeAbstract {
return $article_html; return $article_html;
} }
$feedUrl = 'http://www.lemondeinformatique.fr/rss/rss.xml'; $html = $this->getSimpleHTMLDOM($this->uri.'rss/rss.xml')
$html = $this->getSimpleHTMLDOM($feedUrl) or $this->returnServerError('Could not request LeMondeInformatique: '.$feedUrl); or $this->returnServerError('Could not request LeMondeInformatique: '
.$this->uri.'rss/rss.xml');
$limit = 0; $limit = 0;
foreach($html->find('item') as $element) { foreach($html->find('item') as $element) {

View file

@ -1,17 +1,14 @@
<?php <?php
define("SEXE", "http://sexes.blogs.liberation.fr");
define("SEXE_FEED", "http://sexes.blogs.liberation.fr/feeds/");
class Les400CulsBridge extends RssExpander{ class Les400CulsBridge extends RssExpander{
public $maintainer = "unknown"; public $maintainer = "unknown";
public $name = "Les 400 Culs"; public $name = "Les 400 Culs";
public $uri = "http://sexes.blogs.liberation.fr"; public $uri = "http://sexes.blogs.liberation.fr/";
public $description = "La planete sexe vue par Agnes Girard via rss-bridge"; public $description = "La planete sexe vue par Agnes Girard via rss-bridge";
public function collectData(){ public function collectData(){
parent::collectExpandableDatas(SEXE_FEED); $this->collectExpandableDatas($this->uri.'feeds/');
} }
protected function parseRSSItem($newsItem) { protected function parseRSSItem($newsItem) {

View file

@ -7,7 +7,8 @@ class LesJoiesDuCodeBridge extends BridgeAbstract{
public $description = "LesJoiesDuCode"; public $description = "LesJoiesDuCode";
public function collectData(){ public function collectData(){
$html = $this->getSimpleHTMLDOM('http://lesjoiesducode.fr/') or $this->returnServerError('Could not request LesJoiesDuCode.'); $html = $this->getSimpleHTMLDOM($this->uri)
or $this->returnServerError('Could not request LesJoiesDuCode.');
foreach($html->find('div.blog-post') as $element) { foreach($html->find('div.blog-post') as $element) {
$item = array(); $item = array();

View file

@ -4,12 +4,13 @@ class LichessBridge extends HttpCachingBridgeAbstract
{ {
public $maintainer = 'AmauryCarrade'; public $maintainer = 'AmauryCarrade';
public $name = 'Lichess Blog'; public $name = 'Lichess Blog';
public $uri = 'http://lichess.org/blog'; public $uri = 'http://fr.lichess.org/blog';
public $description = 'Returns the 5 newest posts from the Lichess blog (full text)'; public $description = 'Returns the 5 newest posts from the Lichess blog (full text)';
public function collectData() public function collectData()
{ {
$xml_feed = $this->getSimpleHTMLDOM('http://fr.lichess.org/blog.atom') or $this->returnServerError('Could not retrieve Lichess blog feed.'); $xml_feed = $this->getSimpleHTMLDOM($this->uri.'.atom')
or $this->returnServerError('Could not retrieve Lichess blog feed.');
$posts_loaded = 0; $posts_loaded = 0;
foreach($xml_feed->find('entry') as $entry) foreach($xml_feed->find('entry') as $entry)

View file

@ -1,5 +1,5 @@
<?php <?php
class LinkedInCompany extends BridgeAbstract{ class LinkedInCompanyBridge extends BridgeAbstract{
public $maintainer = "regisenguehard"; public $maintainer = "regisenguehard";
public $name = "LinkedIn Company"; public $name = "LinkedIn Company";
@ -15,9 +15,10 @@ class LinkedInCompany extends BridgeAbstract{
public function collectData(){ public function collectData(){
$html = ''; $html = '';
$link = 'https://www.linkedin.com/company/'.$this->getInput('c'); $link = $this->uri.'company/'.$this->getInput('c');
$html = $this->getSimpleHTMLDOM($link) or $this->returnServerError('Could not request LinkedIn.'); $html = $this->getSimpleHTMLDOM($link)
or $this->returnServerError('Could not request LinkedIn.');
foreach($html->find('//*[@id="my-feed-post"]/li') as $element) { foreach($html->find('//*[@id="my-feed-post"]/li') as $element) {
$title = $element->find('span.share-body', 0)->innertext; $title = $element->find('span.share-body', 0)->innertext;

View file

@ -9,20 +9,19 @@ class LolibooruBridge extends BridgeAbstract{
public $parameters = array( array( public $parameters = array( array(
'p'=>array( 'p'=>array(
'name'=>'page', 'name'=>'page',
'defaultValue'=>1,
'type'=>'number' 'type'=>'number'
), ),
't'=>array('name'=>'tags') 't'=>array('name'=>'tags')
)); ));
public function collectData(){ public function collectData(){
$page = 1; $tags = ''; $html = $this->getSimpleHTMLDOM(
if ($this->getInput('p')) { $this->uri.'post?'
$page = (int)preg_replace("/[^0-9]/",'', $this->getInput('p')); .'&page='.$this->getInput('p')
} .'&tags='.urlencode($this->getInput('t'))
if ($this->getInput('t')) { ) or $this->returnServerError('Could not request Lolibooru.');
$tags = urlencode($this->getInput('t'));
}
$html = $this->getSimpleHTMLDOM("http://lolibooru.moe/post?page=$page&tags=$tags") or $this->returnServerError('Could not request Lolibooru.');
$input_json = explode('Post.register(', $html); $input_json = explode('Post.register(', $html);
foreach($input_json as $element) foreach($input_json as $element)
$data[] = preg_replace('/}\)(.*)/', '}', $element); $data[] = preg_replace('/}\)(.*)/', '}', $element);
@ -31,7 +30,7 @@ class LolibooruBridge extends BridgeAbstract{
foreach($data as $datai) { foreach($data as $datai) {
$json = json_decode($datai, TRUE); $json = json_decode($datai, TRUE);
$item = array(); $item = array();
$item['uri'] = 'http://lolibooru.moe/post/show/'.$json['id']; $item['uri'] = $this->uri.'post/show/'.$json['id'];
$item['postid'] = $json['id']; $item['postid'] = $json['id'];
$item['timestamp'] = $json['created_at']; $item['timestamp'] = $json['created_at'];
$item['imageUri'] = $json['file_url']; $item['imageUri'] = $json['file_url'];

View file

@ -4,7 +4,7 @@ class MangareaderBridge extends BridgeAbstract{
public $maintainer = "logmanoriginal"; public $maintainer = "logmanoriginal";
public $name = "Mangareader Bridge"; public $name = "Mangareader Bridge";
public $uri = "http://www.mangareader.net"; public $uri = "http://www.mangareader.net/";
public $description = "Returns the latest updates, popular mangas or manga updates (new chapters)"; public $description = "Returns the latest updates, popular mangas or manga updates (new chapters)";
public $parameters = array( public $parameters = array(
@ -75,45 +75,25 @@ class MangareaderBridge extends BridgeAbstract{
) )
); );
private $request='';
public function collectData(){ public function collectData(){
$this->request = '';
$type = "latest"; // can be "latest", "popular" or "path". Default is "latest"!
$path = "latest";
$limit = MANGAREADER_LIMIT;
if($this->getInput('category')){ // Get popular updates
$type = "popular";
$path = "popular";
if($this->getInput('category') !== "all"){
$path .= "/" . $this->getInput('category');
}
}
if($this->getInput('path')){ // Get manga updates
$type = "path";
$path = $this->getInput('path');
}
if($this->getInput('limit') && $this->getInput('limit') !== ""){ // Get manga updates (optional parameter)
$limit = $this->getInput('limit');
}
// We'll use the DOM parser for this as it makes navigation easier // We'll use the DOM parser for this as it makes navigation easier
$html = $this->getContents("http://www.mangareader.net/" . $path); $html = $this->getContents($this->getURI());
if(!$html){ if(!$html){
$this->returnClientError('Could not receive data for ' . $path . '!'); $this->returnClientError('Could not receive data for ' . $path . '!');
} }
libxml_use_internal_errors(true);
$doc = new DomDocument; $doc = new DomDocument;
@$doc->loadHTML($html); @$doc->loadHTML($html);
libxml_clear_errors();
// Navigate via XPath // Navigate via XPath
$xpath = new DomXPath($doc); $xpath = new DomXPath($doc);
// Build feed based on the context (site updates or manga updates) $this->request = '';
if($type === "latest"){ switch($this->queriedContext){
case 'Get latest updates':
$this->request = 'Latest updates'; $this->request = 'Latest updates';
// Query each item (consists of Manga + chapters) // Query each item (consists of Manga + chapters)
@ -128,7 +108,7 @@ class MangareaderBridge extends BridgeAbstract{
if (isset($manga) && $chapters->length >= 1){ if (isset($manga) && $chapters->length >= 1){
$item = array(); $item = array();
$item['uri'] = 'http://www.mangareader.net' . htmlspecialchars($manga->getAttribute('href')); $item['uri'] = $this->uri. htmlspecialchars($manga->getAttribute('href'));
$item['title'] = htmlspecialchars($manga->nodeValue); $item['title'] = htmlspecialchars($manga->nodeValue);
// Add each chapter to the feed // Add each chapter to the feed
@ -138,16 +118,15 @@ class MangareaderBridge extends BridgeAbstract{
if($item['content'] <> ""){ if($item['content'] <> ""){
$item['content'] .= "<br>"; $item['content'] .= "<br>";
} }
$item['content'] .= "<a href='http://www.mangareader.net" . htmlspecialchars($chapter->getAttribute('href')) . "'>" . htmlspecialchars($chapter->nodeValue) . "</a>"; $item['content'] .= "<a href='" .$this->uri. htmlspecialchars($chapter->getAttribute('href')) . "'>" . htmlspecialchars($chapter->nodeValue) . "</a>";
} }
$this->items[] = $item; $this->items[] = $item;
} }
} }
} break;
if($type === "popular"){
case 'Get popular mangas':
$pagetitle = $xpath->query(".//*[@id='bodyalt']/h1")->item(0)->nodeValue; $pagetitle = $xpath->query(".//*[@id='bodyalt']/h1")->item(0)->nodeValue;
$this->request = substr($pagetitle, 0, strrpos($pagetitle, " -")); // "Popular mangas for ..." $this->request = substr($pagetitle, 0, strrpos($pagetitle, " -")); // "Popular mangas for ..."
@ -163,16 +142,20 @@ class MangareaderBridge extends BridgeAbstract{
$item = array(); $item = array();
$item['title'] = htmlspecialchars($xpath->query(".//*[@class='manga_name']//a", $manga)->item(0)->nodeValue); $item['title'] = htmlspecialchars($xpath->query(".//*[@class='manga_name']//a", $manga)->item(0)->nodeValue);
$item['uri'] = 'http://www.mangareader.net' . $xpath->query(".//*[@class='manga_name']//a", $manga)->item(0)->getAttribute('href'); $item['uri'] = $this->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['author'] = htmlspecialchars($xpath->query("//*[@class='author_name']", $manga)->item(0)->nodeValue);
$item['chaptercount'] = $xpath->query(".//*[@class='chapter_count']", $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['genre'] = htmlspecialchars($xpath->query(".//*[@class='manga_genre']", $manga)->item(0)->nodeValue);
$item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $thumbnail . '" alt="' . $item['title'] . '" /></a><p>' . $item['genre'] . '</p><p>' . $item['chaptercount'] . '</p>'; $item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $thumbnail . '" alt="' . $item['title'] . '" /></a><p>' . $item['genre'] . '</p><p>' . $item['chaptercount'] . '</p>';
$this->items[] = $item; $this->items[] = $item;
} }
} break;
if($type === "path") { case 'Get manga updates':
$limit = $this->getInput('limit');
if(empty($limit)){
$limit = MANGAREADER_LIMIT;
}
$this->request = $xpath->query(".//*[@id='mangaproperties']//*[@class='aname']")->item(0)->nodeValue; $this->request = $xpath->query(".//*[@id='mangaproperties']//*[@class='aname']")->item(0)->nodeValue;
@ -187,14 +170,15 @@ class MangareaderBridge extends BridgeAbstract{
foreach ($chapters as $chapter){ foreach ($chapters as $chapter){
$item = array(); $item = array();
$item['title'] = htmlspecialchars($xpath->query("td[1]", $chapter)->item(0)->nodeValue); $item['title'] = htmlspecialchars($xpath->query("td[1]", $chapter)->item(0)->nodeValue);
$item['uri'] = 'http://www.mangareader.net' . $xpath->query("td[1]/a", $chapter)->item(0)->getAttribute('href'); $item['uri'] = $this->uri . $xpath->query("td[1]/a", $chapter)->item(0)->getAttribute('href');
$item['timestamp'] = strtotime($xpath->query("td[2]", $chapter)->item(0)->nodeValue); $item['timestamp'] = strtotime($xpath->query("td[2]", $chapter)->item(0)->nodeValue);
array_unshift($this->items, $item); array_unshift($this->items, $item);
} }
break;
} }
// Return some dummy-data if no content available // Return some dummy-data if no content available
if(count($this->items) == 0){ if(empty($this->items)){
$item = array(); $item = array();
$item['content'] = "<p>No updates available</p>"; $item['content'] = "<p>No updates available</p>";
@ -202,6 +186,25 @@ class MangareaderBridge extends BridgeAbstract{
} }
} }
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;
}
return $this->uri . $path;
}
public function getName(){ public function getName(){
return (!empty($this->request) ? $this->request . ' - ' : '') . 'Mangareader Bridge'; return (!empty($this->request) ? $this->request . ' - ' : '') . 'Mangareader Bridge';
} }

View file

@ -16,22 +16,16 @@ class MilbooruBridge extends BridgeAbstract{
)); ));
public function collectData(){ public function collectData(){
$page = 0;$tags=''; $html = $this->getSimpleHTMLDOM(
if ($this->getInput('p')) { $this->uri.'?q=/post/list/'.urlencode($this->getInput('t')).'/'.$this->getInput('p')
$page = (int)preg_replace("/[^0-9]/",'', $this->getInput('p')); )or $this->returnServerError('Could not request Milbooru.');
}
if ($this->getInput('t')) {
$tags = urlencode($this->getInput('t'));
}
$html = $this->getSimpleHTMLDOM("http://sheslostcontrol.net/moe/shimmie/index.php?q=/post/list/$tags/$page") or $this->returnServerError('Could not request Milbooru.');
foreach($html->find('div[class=shm-image-list] span[class=thumb]') as $element) { foreach($html->find('div[class=shm-image-list] span[class=thumb]') as $element) {
$item = array(); $item = array();
$item['uri'] = 'http://sheslostcontrol.net/moe/shimmie/'.$element->find('a', 0)->href; $item['uri'] = $this->uri.$element->find('a', 0)->href;
$item['postid'] = (int)preg_replace("/[^0-9]/",'', $element->find('a', 0)->getAttribute('data-post-id')); $item['postid'] = (int)preg_replace("/[^0-9]/",'', $element->find('a', 0)->getAttribute('data-post-id'));
$item['timestamp'] = time(); $item['timestamp'] = time();
$thumbnailUri = 'http://sheslostcontrol.net/moe/shimmie/'.$element->find('img', 0)->src; $thumbnailUri = $this->uri.$element->find('img', 0)->src;
$item['tags'] = $element->find('a', 0)->getAttribute('data-tags'); $item['tags'] = $element->find('a', 0)->getAttribute('data-tags');
$item['title'] = 'Milbooru | '.$item['postid']; $item['title'] = 'Milbooru | '.$item['postid'];
$item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $thumbnailUri . '" /></a><br>Tags: '.$item['tags']; $item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $thumbnailUri . '" /></a><br>Tags: '.$item['tags'];

View file

@ -3,11 +3,12 @@ class MondeDiploBridge extends BridgeAbstract{
public $maintainer = "Pitchoule"; public $maintainer = "Pitchoule";
public $name = 'Monde Diplomatique'; public $name = 'Monde Diplomatique';
public $uri = 'http://www.monde-diplomatique.fr'; public $uri = 'http://www.monde-diplomatique.fr/';
public $description = "Returns most recent results from MondeDiplo."; public $description = "Returns most recent results from MondeDiplo.";
public function collectData(){ public function collectData(){
$html = $this->getSimpleHTMLDOM($this->uri) or $this->returnServerError('Could not request MondeDiplo. for : ' . $link); $html = $this->getSimpleHTMLDOM($this->uri)
or $this->returnServerError('Could not request MondeDiplo. for : ' . $this->uri);
foreach($html->find('div.unarticle') as $article) { foreach($html->find('div.unarticle') as $article) {
$element = $article->parent(); $element = $article->parent();

View file

@ -3,9 +3,13 @@ class MsnMondeBridge extends BridgeAbstract{
public $maintainer = "kranack"; public $maintainer = "kranack";
public $name = 'MSN Actu Monde'; public $name = 'MSN Actu Monde';
public $uri = 'http://www.msn.com/fr-fr/actualite/monde'; public $uri = 'http://www.msn.com/';
public $description = "Returns the 10 newest posts from MSN Actualités (full text)"; public $description = "Returns the 10 newest posts from MSN Actualités (full text)";
public function getURI(){
return $this->uri.'fr-fr/actualite/monde';
}
private function MsnMondeExtractContent($url, &$item) { private function MsnMondeExtractContent($url, &$item) {
$html2 = $this->getSimpleHTMLDOM($url); $html2 = $this->getSimpleHTMLDOM($url);
$item['content'] = $html2->find('#content', 0)->find('article', 0)->find('section', 0)->plaintext; $item['content'] = $html2->find('#content', 0)->find('article', 0)->find('section', 0)->plaintext;
@ -13,13 +17,13 @@ class MsnMondeBridge extends BridgeAbstract{
} }
public function collectData(){ public function collectData(){
$html = $this->getSimpleHTMLDOM($this->uri) or $this->returnServerError('Could not request MsnMonde.'); $html = $this->getSimpleHTMLDOM($this->getURI()) or $this->returnServerError('Could not request MsnMonde.');
$limit = 0; $limit = 0;
foreach($html->find('.smalla') as $article) { foreach($html->find('.smalla') as $article) {
if($limit < 10) { if($limit < 10) {
$item = array(); $item = array();
$item['title'] = utf8_decode($article->find('h4', 0)->innertext); $item['title'] = utf8_decode($article->find('h4', 0)->innertext);
$item['uri'] = "http://www.msn.com" . utf8_decode($article->find('a', 0)->href); $item['uri'] = $this->uri . utf8_decode($article->find('a', 0)->href);
$this->MsnMondeExtractContent($item['uri'], $item); $this->MsnMondeExtractContent($item['uri'], $item);
$this->items[] = $item; $this->items[] = $item;
$limit++; $limit++;

View file

@ -16,21 +16,16 @@ class MspabooruBridge extends BridgeAbstract{
)); ));
public function collectData(){ public function collectData(){
$page = 0;$tags=''; $html = $this->getSimpleHTMLDOM(
if ($this->getInput('p')) { $this->uri.'index.php?page=post&s=list&'
$page = (int)preg_replace("/[^0-9]/",'', $this->getInput('p')); .'&pid='.($this->getInput('p')?($this->getInput('p') -1)*50:'')
$page = $page - 1; .'&tags='.urlencode($this->getInput('t'))
$page = $page * 50; ) or $this->returnServerError('Could not request Mspabooru.');
}
if ($this->getInput('t')) {
$tags = urlencode($this->getInput('t'));
}
$html = $this->getSimpleHTMLDOM("http://mspabooru.com/index.php?page=post&s=list&tags=$tags&pid=$page") or $this->returnServerError('Could not request Mspabooru.');
foreach($html->find('div[class=content] span') as $element) { foreach($html->find('div[class=content] span') as $element) {
$item = array(); $item = array();
$item['uri'] = 'http://mspabooru.com/'.$element->find('a', 0)->href; $item['uri'] = $this->uri.$element->find('a', 0)->href;
$item['postid'] = (int)preg_replace("/[^0-9]/",'', $element->getAttribute('id')); $item['postid'] = (int)preg_replace("/[^0-9]/",'', $element->getAttribute('id'));
$item['timestamp'] = time(); $item['timestamp'] = time();
$thumbnailUri = $element->find('img', 0)->src; $thumbnailUri = $element->find('img', 0)->src;

View file

@ -3,12 +3,12 @@ class NasaApodBridge extends BridgeAbstract{
public $maintainer = "corenting"; public $maintainer = "corenting";
public $name = "NASA APOD Bridge"; public $name = "NASA APOD Bridge";
public $uri = "http://apod.nasa.gov/apod/astropix.html"; public $uri = "http://apod.nasa.gov/apod/";
public $description = "Returns the 3 latest NASA APOD pictures and explanations"; public $description = "Returns the 3 latest NASA APOD pictures and explanations";
public function collectData(){ public function collectData(){
$html = $this->getSimpleHTMLDOM('http://apod.nasa.gov/apod/archivepix.html') or $this->returnServerError('Error while downloading the website content'); $html = $this->getSimpleHTMLDOM($this->uri.'archivepix.html') or $this->returnServerError('Error while downloading the website content');
$list = explode("<br>", $html->find('b', 0)->innertext); $list = explode("<br>", $html->find('b', 0)->innertext);
for($i = 0; $i < 3;$i++) for($i = 0; $i < 3;$i++)
@ -17,7 +17,7 @@ class NasaApodBridge extends BridgeAbstract{
$item = array(); $item = array();
$uri_page = $html->find('a',$i + 3)->href; $uri_page = $html->find('a',$i + 3)->href;
$uri = 'http://apod.nasa.gov/apod/'.$uri_page; $uri = $this->uri.$uri_page;
$item['uri'] = $uri; $item['uri'] = $uri;
$picture_html = $this->getSimpleHTMLDOM($uri); $picture_html = $this->getSimpleHTMLDOM($uri);

View file

@ -16,7 +16,7 @@ class NeuviemeArtBridge extends BridgeAbstract {
} return $string; } return $string;
} }
$feedUrl = 'http://www.9emeart.fr/9emeart.rss'; $feedUrl = $this->uri.'9emeart.rss';
$html = $this->getSimpleHTMLDOM($feedUrl) or $this->returnServerError('Could not request 9eme Art: '.$feedUrl); $html = $this->getSimpleHTMLDOM($feedUrl) or $this->returnServerError('Could not request 9eme Art: '.$feedUrl);
$limit = 0; $limit = 0;
@ -32,9 +32,9 @@ class NeuviemeArtBridge extends BridgeAbstract {
$article_image = $element->find('enclosure', 0)->url; $article_image = $element->find('enclosure', 0)->url;
foreach ($article_html->find('img.img_full') as $img) foreach ($article_html->find('img.img_full') as $img)
if ($img->alt == $article_title) if ($img->alt == $article_title)
$article_image = 'http://www.9emeart.fr'.$img->src; $article_image = $this->uri.$img->src;
$article_content = '<p><img src="'.$article_image.'" /></p>' $article_content = '<p><img src="'.$article_image.'" /></p>'
.str_replace('src="/', 'src="http://www.9emeart.fr/', $article_html->find('div.newsGenerique_con', 0)->innertext); .str_replace('src="/', 'src="'.$this->uri, $article_html->find('div.newsGenerique_con', 0)->innertext);
$article_content = StripWithDelimiters($article_content, '<script', '</script>'); $article_content = StripWithDelimiters($article_content, '<script', '</script>');
$article_content = StripWithDelimiters($article_content, '<style', '</style>'); $article_content = StripWithDelimiters($article_content, '<style', '</style>');
$article_content = StripWithDelimiters($article_content, '<link', '>'); $article_content = StripWithDelimiters($article_content, '<link', '>');

View file

@ -24,7 +24,7 @@ class NextInpactBridge extends BridgeAbstract {
} }
public function collectData(){ public function collectData(){
$html = $this->getSimpleHTMLDOM('http://www.nextinpact.com/rss/news.xml') or $this->returnServerError('Could not request NextInpact.'); $html = $this->getSimpleHTMLDOM($this->uri.'rss/news.xml') or $this->returnServerError('Could not request NextInpact.');
$limit = 0; $limit = 0;
foreach($html->find('item') as $element) { foreach($html->find('item') as $element) {

View file

@ -44,43 +44,39 @@ class NextgovBridge extends BridgeAbstract {
} }
$category = $this->getInput('category'); $category = $this->getInput('category');
if (empty($category))
$category = 'all';
if ($category !== preg_replace('/[^a-z-]+/', '', $category) || strlen($category > 32))
$this->returnClientError('Invalid "category" parameter.');
$url = $this->getURI().'rss/'.$category.'/'; $url = $this->getURI().'rss/'.$category.'/';
$html = $this->getSimpleHTMLDOM($url) or $this->returnServerError('Could not request Nextgov: '.$url); $html = $this->getSimpleHTMLDOM($url) or $this->returnServerError('Could not request Nextgov: '.$url);
$limit = 0; $limit = 0;
foreach ($html->find('item') as $element) { foreach ($html->find('item') as $element) {
if ($limit < 10) { if ($limit >= 10) {
break;
$article_url = ExtractFromDelimiters($element->innertext, '<link>', '</link>');
$article_author = ExtractFromDelimiters($element->innertext, 'dc/elements/1.1/">', '</dc:creator>');
$article_title = $element->find('title', 0)->plaintext;
$article_subtitle = $element->find('description', 0)->plaintext;
$article_timestamp = strtotime($element->find('pubDate', 0)->plaintext);
$article_thumbnail = ExtractFromDelimiters($element->innertext, '<media:content url="', '"');
$article = $this->getSimpleHTMLDOM($article_url) or $this->returnServerError('Could not request Nextgov: '.$article_url);
$contents = $article->find('div.wysiwyg', 0)->innertext;
$contents = StripWithDelimiters($contents, '<div class="ad-container">', '</div>');
$contents = StripWithDelimiters($contents, '<div', '</div>'); //ad outer div
$contents = StripWithDelimiters($contents, '<script', '</script>');
$contents = ($article_thumbnail == '' ? '' : '<p><img src="'.$article_thumbnail.'" /></p>')
.'<p><b>'.$article_subtitle.'</b></p>'
.trim($contents);
$item = array();
$item['uri'] = $article_url;
$item['title'] = $article_title;
$item['author'] = $article_author;
$item['timestamp'] = $article_timestamp;
$item['content'] = $contents;
$this->items[] = $item;
$limit++;
} }
}
$article_url = ExtractFromDelimiters($element->innertext, '<link>', '</link>');
$article_author = ExtractFromDelimiters($element->innertext, 'dc/elements/1.1/">', '</dc:creator>');
$article_title = $element->find('title', 0)->plaintext;
$article_subtitle = $element->find('description', 0)->plaintext;
$article_timestamp = strtotime($element->find('pubDate', 0)->plaintext);
$article_thumbnail = ExtractFromDelimiters($element->innertext, '<media:content url="', '"');
$article = $this->getSimpleHTMLDOM($article_url) or $this->returnServerError('Could not request Nextgov: '.$article_url);
$contents = $article->find('div.wysiwyg', 0)->innertext;
$contents = StripWithDelimiters($contents, '<div class="ad-container">', '</div>');
$contents = StripWithDelimiters($contents, '<div', '</div>'); //ad outer div
$contents = StripWithDelimiters($contents, '<script', '</script>');
$contents = ($article_thumbnail == '' ? '' : '<p><img src="'.$article_thumbnail.'" /></p>')
.'<p><b>'.$article_subtitle.'</b></p>'
.trim($contents);
$item = array();
$item['uri'] = $article_url;
$item['title'] = $article_title;
$item['author'] = $article_author;
$item['timestamp'] = $article_timestamp;
$item['content'] = $contents;
$this->items[] = $item;
$limit++;
}
} }
} }

View file

@ -9,11 +9,11 @@ class NiceMatinBridge extends BridgeAbstract{
private function NiceMatinExtractContent($url) { private function NiceMatinExtractContent($url) {
$html = $this->getSimpleHTMLDOM($url); $html = $this->getSimpleHTMLDOM($url);
if(!$html) if(!$html)
$this->returnServerError('Could not acquire content from url: ' . $url . '!'); return 'Could not acquire content from url: ' . $url . '!';
$content = $html->find('article', 0); $content = $html->find('article', 0);
if(!$content) if(!$content)
$this->returnServerError('Could not find \'section\'!'); return 'Could not find \'section\'!';
$text = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $content->innertext); $text = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $content->innertext);
$text = strip_tags($text, '<p><a><img>'); $text = strip_tags($text, '<p><a><img>');
@ -21,25 +21,27 @@ class NiceMatinBridge extends BridgeAbstract{
} }
public function collectData(){ public function collectData(){
$html = $this->getSimpleHTMLDOM('http://www.nicematin.com/derniere-minute/rss') or $this->returnServerError('Could not request NiceMatin.'); $html = $this->getSimpleHTMLDOM($this->uri.'derniere-minute/rss')
or $this->returnServerError('Could not request NiceMatin.');
$limit = 0; $limit = 0;
foreach($html->find('item') as $element) { foreach($html->find('item') as $element) {
if($limit < 10) { if($limit >= 10) {
// We need to fix the 'link' tag as simplehtmldom cannot parse it (just rename it and load back as dom) break;
$element_text = $element->outertext; }
$element_text = str_replace('<link>', '<url>', $element_text); // We need to fix the 'link' tag as simplehtmldom cannot parse it (just rename it and load back as dom)
$element_text = str_replace('</link>', '</url>', $element_text); $element_text = $element->outertext;
$element = str_get_html($element_text); $element_text = str_replace('<link>', '<url>', $element_text);
$element_text = str_replace('</link>', '</url>', $element_text);
$element = str_get_html($element_text);
$item = array(); $item = array();
$item['title'] = $element->find('title', 0)->innertext; $item['title'] = $element->find('title', 0)->innertext;
$item['uri'] = $element->find('url', 0)->innertext; $item['uri'] = $element->find('url', 0)->innertext;
$item['timestamp'] = strtotime($element->find('pubDate', 0)->plaintext); $item['timestamp'] = strtotime($element->find('pubDate', 0)->plaintext);
$item['content'] = $this->NiceMatinExtractContent($item['uri']); $item['content'] = $this->NiceMatinExtractContent($item['uri']);
$this->items[] = $item; $this->items[] = $item;
$limit++; $limit++;
}
} }
} }
} }

View file

@ -8,21 +8,23 @@ class NovelUpdatesBridge extends BridgeAbstract{
public $parameters = array( array( public $parameters = array( array(
'n'=>array( 'n'=>array(
'name'=>'Novel URL', 'name'=>'Novel URL',
'patterns'=>'http:\/\/www.novelupdates.com\/.*',
'required'=>true 'required'=>true
) )
)); ));
private $seriesTitle='';
public function collectData(){ public function collectData(){
if (!$this->getInput('n')) $thread = parse_url($this->getInput('n'))
$this->returnClientError('You must specify the novel URL (/series/...)'); or $this->returnClientError('This URL seems malformed, please check it.');
$thread = parse_url($this->getInput('n')) or $this->returnClientError('This URL seems malformed, please check it.');
if($thread['host'] !== 'www.novelupdates.com') if($thread['host'] !== 'www.novelupdates.com')
$this->returnClientError('NovelUpdates URL only.'); $this->returnClientError('NovelUpdates URL only.');
if(strpos($thread['path'], 'series/') === FALSE) if(strpos($thread['path'], 'series/') === FALSE)
$this->returnClientError('You must specify the novel URL.'); $this->returnClientError('You must specify the novel URL.');
$url = 'http://www.novelupdates.com'.$thread['path'].''; $url = $this->uri.$thread['path'].'';
$fullhtml = $this->getSimpleHTMLDOM($url) or $this->returnServerError("Could not request NovelUpdates, novel not found"); $fullhtml = $this->getSimpleHTMLDOM($url) or $this->returnServerError("Could not request NovelUpdates, novel not found");
$this->request = $fullhtml->find('h4.seriestitle', 0)->plaintext; $this->seriesTitle = $fullhtml->find('h4.seriestitle', 0)->plaintext;
// dirty fix for nasty simpledom bug: https://github.com/sebsauvage/rss-bridge/issues/259 // dirty fix for nasty simpledom bug: https://github.com/sebsauvage/rss-bridge/issues/259
// forcefully removes tbody // forcefully removes tbody
$html = $fullhtml->find('table#myTable', 0)->innertext; $html = $fullhtml->find('table#myTable', 0)->innertext;
@ -35,13 +37,13 @@ class NovelUpdatesBridge extends BridgeAbstract{
$item['title'] = $element->find('td', 2)->find('a', 0)->plaintext; $item['title'] = $element->find('td', 2)->find('a', 0)->plaintext;
$item['team'] = $element->find('td', 1)->innertext; $item['team'] = $element->find('td', 1)->innertext;
$item['timestamp'] = strtotime($element->find('td', 0)->plaintext); $item['timestamp'] = strtotime($element->find('td', 0)->plaintext);
$item['content'] = '<a href="'.$item['uri'].'">'.$this->request.' - '.$item['title'].'</a> by '.$item['team'].'<br><a href="'.$item['uri'].'">'.$fullhtml->find('div.seriesimg', 0)->innertext.'</a>'; $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->items[] = $item;
} }
} }
public function getName(){ public function getName(){
return (!empty($this->request) ? $this->request.' - ' : '') .'Novel Updates'; return (!empty($this->seriesTitle) ? $this->seriesTitle.' - ' : '') .'Novel Updates';
} }
public function getCacheDuration(){ public function getCacheDuration(){

View file

@ -352,6 +352,9 @@ abstract class BridgeAbstract implements BridgeInterface {
} }
// Only keep guessed context parameters values // Only keep guessed context parameters values
if(!isset($this->inputs[$this->queriedContext])){
$this->inputs[$this->queriedContext]=array();
}
$this->inputs=array($this->queriedContext=>$this->inputs[$this->queriedContext]); $this->inputs=array($this->queriedContext=>$this->inputs[$this->queriedContext]);
$this->collectData(); $this->collectData();