Rss-Bridge est un script développé par Sebsauvage qui permet de générer un flux RSS à partir d'une page HTML.
Il faut ajouter un "pont" par site dont vous voulez le flux RSS.
Voici les "ponts" que j'ai développé.
Ils sont disponible ici.
Mon serveur n'étant pas un monstre, je risque de fermer cet accès si ça le surcharge de trop. C'est pourquoi je met à disposition les sources de mes ponts, pour que vous puissiez les utiliser sur votre propre serveur.
<?php
/**
* Créé le 30/04/2016
* Update 07/05/2018 : mise à jour de RSS-Bridge
*/
class AlestormBridge extends BridgeAbstract
{
const MAINTAINER = 'superbaillot.net';
const NAME = 'alestorm.net';
const URI = 'https://alestorm.net/';
const CACHE_TIMEOUT = 43200; // 12h hours
const DESCRIPTION = 'alestorm.net via Rss-bridge';
public function collectData()
{
$html = file_get_html($this->getURI()) or $this->returnError('Could not request alestorm.', 404);
$element = $html->find('section .inner', 0);
$titre = $element->find('h1', 0);
$item = array();
$item['title'] = 'Alestorm - ' . $titre->innertext;
$item['uri'] = $this->getURI() . "#" . md5($item['title']);
$item['content'] = $element->innertext;
$this->items[] = $item;
}
}
?>
<?php
require_once("AllocineEmissionsBridge.php");
/**
* Créé le 08/09/2018
*/
class AllocineEmissionsActusBridge extends AllocineEmissionsBridge
{
const NAME = "Allo Cine : Emissions Actus";
const DESCRIPTION = "Allo Cine : Actus Bonus via rss-bridge";
const URI = "https://www.allocine.fr/video/cat-158004/date-ajout/";
}
?>
<?php
require_once("AllocineEmissionsBridge.php");
/**
* Créé le 08/09/2018
*/
class AllocineEmissionsBonusBridge extends AllocineEmissionsBridge
{
const NAME = "Allo Cine : Emissions Bonus";
const DESCRIPTION = "Allo Cine : Emissions Bonus via rss-bridge";
const URI = "https://www.allocine.fr/video/cat-158005/date-ajout/";
}
?>
<?php
/**
* Classe abstraite pour gérer les émissions d'Allo-Ciné.
* La classe principale doit juste définir les constantes NOM et URI
*
* Créé le 29/10/2018
*/
abstract class AllocineEmissionsBridge extends BridgeAbstract
{
const MAINTAINER = 'Superbaillot';
const CACHE_TIMEOUT = 25200; // 7 hours
const URI = "";
public function collectData()
{
$html = file_get_html($this->getURI()) or $this->returnError('Could not request Allo cine.', 404);
foreach ($html->find('article') as $element)
{
$item = array();
$img = $element->find(".thumbs img", 0);
$time = $element->find("time", 0);
$aTitre = $element->find("h2.title a", 0);
$p = $element->find("p", 0);
$content = ($img->outertext);
if($time != null)
{
$content .= $time->innertext;
}
if($p != null)
{
$content .= trim($p->outertext);
}
$content = str_replace('src="/', 'src="http://www.allocine.fr/', $content);
$content = str_replace('href="/', 'href="http://www.allocine.fr/', $content);
$content = str_replace('src=\'/', 'src=\'http://www.allocine.fr/', $content);
$content = str_replace('href=\'/', 'href=\'http://www.allocine.fr/', $content);
$item['content'] = $content;
if($aTitre != null)
{
$item['title'] = trim($aTitre->innertext);
$item['uri'] = "http://www.allocine.fr" . $aTitre->href;
$this->items[] = $item;
}
}
}
}
?>
<?php
/**
* Créé le 06/02/2014
* Update 24/04/2016 : mise à jour de RSS-Bridge
* 13/08/2016 : changement du site allociné
* 31/08/2016 : changement de la classe du div d'un film
* 11/01/2017 : Correction pour afficher à nouveau les affiches des films
* 07/05/2018 : mise à jour de RSS-Bridge
* 19/01/2019 : mise à jour le l'url, des classes utilisées et du contenu
*/
class AllocineSortieBridge extends BridgeAbstract
{
const MAINTAINER = 'Superbaillot';
const NAME = "Allo Cine : sorties de la semaine";
const URI = "https://www.allocine.fr/film/sorties-semaine/";
const CACHE_TIMEOUT = 3*3600;
const DESCRIPTION = "Allo Cine : sorties de la semaine via rss-bridge";
public function collectData()
{
$html = file_get_html($this->getURI()) or $this->returnError('Could not request Allo cine.', 404);
$pageAAnalyser = true;
$cpt = 59; // pour les classer comme sur le site qui est un ordre, certe
// subjectif, mais qui est à peu près correct en fonction de
// l'attente des films (basé sur le nombre de salle qui diffuse
// le film
foreach ($html->find('div.entity-card-list') as $element)
{
$aTitre = $element->find("h2.meta-title a", 0);
$dateContainer = $element->find(".meta-body-info span", 0);
$list = explode(" ", trim($dateContainer->innertext));
if(is_array($list) && sizeof($list)>=3)
{
$jour = $list[0];
$mois = 1;
$annee = $list[2];
switch (strtolower($list[1]))
{
case "janvier":
$mois = 1;
break;
case "février":
case "fevrier":
$mois = 2;
break;
case "mars":
$mois = 3;
break;
case "avril":
$mois = 4;
break;
case "mai":
$mois = 5;
break;
case "juin":
$mois = 6;
break;
case "juillet":
$mois = 7;
break;
case "aout":
case "août":
$mois = 8;
break;
case "septembre":
$mois = 9;
break;
case "octobre":
$mois = 10;
break;
case "novembre":
$mois = 11;
break;
case "decembre":
case "décembre":
$mois = 12;
break;
}
$content = trim($element->find('figure', 0)->outertext);
$contTemp = $element->find('div.meta', 0);
if($contTemp != null)
{
$content .= trim($contTemp->outertext);
}
$contTemp = $element->find('div.synopsis', 0);
if($contTemp != null)
{
$content .= trim($contTemp->outertext);
}
$content = str_replace('src="/', 'src="http://www.allocine.fr/', $content);
$content = str_replace('href="/', 'href="http://www.allocine.fr/', $content);
$content = str_replace('src=\'/', 'src=\'http://www.allocine.fr/', $content);
$content = str_replace('href=\'/', 'href=\'http://www.allocine.fr/', $content);
$content = str_replace('data-src=', 'src=', $content);
$content = str_replace('src="data', 'srcData="data', $content);
$item = array();
$item['content'] = $content;
$item['timestamp'] = mktime(0, 0, $cpt, $mois, $jour, $annee);
$item['title'] = $aTitre->innertext;
$item['uri'] = "http://www.allocine.fr" . $aTitre->href;
$this->items[] = $item;
$cpt --;
}
}
}
}
?>
<?php
/**
* Créé le 01/12/2018
*/
class BeastInBlackBridge extends BridgeAbstract
{
const MAINTAINER = 'Superbaillot';
const NAME = "Beast In Black";
const URI = "https://beastinblack.com/index.php/";
const CACHE_TIMEOUT = 7*3600;
const DESCRIPTION = "Beast In Black Rss-bridge";
public function collectData()
{
$str = file_get_contents($this->getURI()) or $this->returnError('Could not request Beast In Black.', 404);
// $str = str_replace('</iframe>', '</iframe></div>', $str);
$html = str_get_html($str);
$cpt = 1;
foreach ($html->find('#content-container div.hir') as $element)
{
$dateStr = $element->find('div.bgcsik', 0)->innertext;
$title = trim($dateStr);
$title = substr($title, 0, strpos($title, '<a'));
$item = array();
$item['timestamp'] = $this->getDate($dateStr);
$item['title'] = 'Beast In Black - ' . $title;
$item['content'] = $this->getContent($element);
$item['uri'] = $this->getUri() . '#' . $cpt++;
$this->items[] = $item;
}
}
/**
* Récupère le contenu d'une news
*/
private function getContent($element) {
$content = '';
$textElm = $element->find('div.newsleft', 0);
if($textElm)
{
$content .= '<div>' . $textElm->innertext . '</div>';
}
$textElm2 = $element->find('div.newstext', 0);
if($textElm2)
{
$content .= '<div>' . $textElm2->innertext . '</div>';
}
return $content;
}
/**
* Retourne le timestamp d'une date en toute lettre
*/
private function getDate($dateStr) {
list($jour, $mois, $annee) = explode(' ', trim($dateStr));
switch(strtolower($mois))
{
case "january" : $mois = 1;
break;
case "february" : $mois = 2;
break;
case "march" : $mois = 3;
break;
case "april" : $mois = 4;
break;
case "may" : $mois = 5;
break;
case "june" : $mois = 6;
break;
case "july" : $mois = 7;
break;
case "august" : $mois = 8;
break;
case "september" : $mois = 9;
break;
case "october" : $mois = 10;
break;
case "november" : $mois = 11;
break;
case "december" : $mois = 12;
break;
}
return mktime(0, 0, 0, $mois, intval($jour), intval($annee));
}
}
<?php
/**
* Créé le 04/09/2019
*/
class CommitstripBridge extends BridgeAbstract
{
const MAINTAINER = 'Superbaillot';
const NAME = "commitstrip";
const URI = "https://www.commitstrip.com/fr/?";
const CACHE_TIMEOUT = 3500 * 3; // < 1 heures
const DESCRIPTION = "commitstrip séries via Rss-bridge";
public function collectData()
{
$html = file_get_html($this->getURI());
foreach ($html->find('.excerpt') as $element)
{
$a = $element->find("a", 0);
$content = "<div>" . $a->innertext . "</div>";
$item = array();
$content = str_replace('src="/wp-content/', 'src="https://www.commitstrip.com/wp-content/', $content);
$item['content'] = $content;
$item['title'] = $a->find('strong', 0)->innertext;
$item['uri'] = $a->href;
$this->items[] = $item;
}
}
}
?>
<?php
class DansTonChatBridge extends BridgeAbstract {
const MAINTAINER = 'Astalaseven';
const NAME = 'DansTonChat Bridge';
const URI = 'https://danstonchat.com/';
const CACHE_TIMEOUT = 3600*2;
const DESCRIPTION = 'Returns latest quotes from DansTonChat.';
public function collectData(){
$html = getSimpleHTMLDOM(self::URI . 'latest.html')
or returnServerError('Could not request DansTonChat.');
foreach($html->find('div.item') as $element) {
$item = array();
$item['uri'] = $element->find('a', 0)->href;
$titleContent = $element->find('h3 a', 0);
if($titleContent) {
$item['title'] = html_entity_decode($titleContent->plaintext, ENT_QUOTES);
} else {
$item['title'] = 'DansTonChat';
}
$item['content'] = $element->find('div.item-content a', 0)->innertext;
$this->items[] = $item;
}
}
}
?>
<?php
/**
* Créé le 22/06/2015
* Update 24/04/2016 : mise à jour de RSS-Bridge
* Update 09/11/2017
* Update 07/05/2018 : mise à jour de RSS-Bridge
* Update 29/10/2018
*/
class DragonarteBridge extends BridgeAbstract
{
const MAINTAINER = 'Superbaillot';
const NAME = "Dragonarte";
const URI = "http://dragonarte.com.br/";
const CACHE_TIMEOUT = 12*3600;
const DESCRIPTION = "Dragonarte Rss-bridge";
public function collectData()
{
$html = file_get_html($this->getURI()) or $this->returnError('Could not request Dragonarte.', 404);
$trTable = $html->find("table table", 2);
foreach ($trTable->find('table') as $element)
{
$trTitre = $element->find('tr', 0)->find("strong", 0);
if($trTitre != null)
{
$titre = $trTitre->innertext;
$trImg = $element->find('tr', 2);
$item = array();
$item['uri'] = $this->getURI() . "#" . urlencode($titre); // pour un id unique
$item['title'] = $trTitre->innertext;
$content = $trImg->find("td", 0)->innertext;
$content = str_replace('src="', 'src="' . $this->getURI(), $content);
$item['content'] = $content;
$this->items[] = $item;
}
}
}
}
?>
<?php
/**
* Créé le 20/08/2015
* Update 24/04/2016 : mise à jour de RSS-Bridge
* Update 07/05/2018 : mise à jour de RSS-Bridge
*/
class FcMetzBridge extends BridgeAbstract
{
const MAINTAINER = 'Superbaillot';
const NAME = "FC Metz";
const URI = "https://www.fcmetz.com/actualites/news";
const CACHE_TIMEOUT = 7*3600;
const DESCRIPTION = "FC Metz Rss-bridge";
public function collectData()
{
$html = file_get_html($this->getURI()) or $this->returnError('Could not request FC Metz.', 404);
$cpt = 0;
foreach ($html->find('div.row-wrapper') as $element)
{
$h3Titre = $element->find("h3", 0);
$jour = $h3Titre->find(".jour-actu", 0)->innertext;
$mois = $h3Titre->find(".mois-actu", 0)->innertext;
$annee = $h3Titre->find(".annee-actu", 0)->innertext;
switch(strtolower($mois))
{
case "jan" : $mois = 1;
break;
case "fév" : $mois = 2;
break;
case "mar" : $mois = 3;
break;
case "avr" : $mois = 4;
break;
case "mai" : $mois = 5;
break;
case "juin" : $mois = 6;
break;
case "juil" : $mois = 7;
break;
case "aoû" : $mois = 8;
break;
case "sep" : $mois = 9;
break;
case "oct" : $mois = 10;
break;
case "nov" : $mois = 11;
break;
case "déc" : $mois = 12;
break;
}
foreach ($element->find('div.row-content>div.views-row') as $sselement)
{
$item = array();
$content = $sselement->innertext;
$content = str_replace('src="/', 'src="http://fcmetz.com/', $content);
$content = str_replace('href="/', 'href="http://fcmetz.com/', $content);
$content = str_replace('src=\'/', 'src=\'http://fcmetz.com/', $content);
$content = str_replace('href=\'/', 'href=\'http://fcmetz.com/', $content);
$item['content'] = $content;
$titre = $sselement->find("div.title span a", 0);
$item['timestamp'] = mktime(0, 0, 0, intval($mois), intval($jour), intval($annee));
$item['title'] = trim($titre->innertext);
$item['uri'] = "http://fcmetz.com" . $titre->href;
$this->items[] = $item;
}
}
}
}
<?php
/**
* Créé le 01/01/2020
* Update 13/02/2020 : update si plusieurs images
*/
class HopBridge extends BridgeAbstract
{
const MAINTAINER = 'Superbaillot';
const NAME = "HOP";
const URI = "https://www.luc-damas.fr/hop/";
const CACHE_TIMEOUT = 14600; // 4 hours
const DESCRIPTION = "HOP via Rss-bridge";
public function collectData()
{
$html = file_get_html($this->getURI()) or $this->returnError('Could not request Tuxboard.', 404);
foreach ($html->find('article') as $element)
{
$titre = $element->find("h2 a", 0);
$date = $element->find(".postdate", 0);
$img = $element->find("img", 0);
$tags = $element->find('.tags', 0);
$content = str_replace('src="./', 'src="https://www.luc-damas.fr/hop/', $element->innertext);
$content = str_replace('src=\'./', 'src=\'https://www.luc-damas.fr/hop/', $content);
$item = array();
$item['uri'] = "https://www.luc-damas.fr/hop/" . $titre->href;
$item['title'] = $titre->innertext;
$item['content'] = trim($content);
$this->items[] = $item;
}
}
}
?>
<?php
/**
* Créé le 18/11/2018
*/
class IndoBridge extends BridgeAbstract
{
const MAINTAINER = 'Superbaillot';
const NAME = "Indo.fr";
const URI = "https://indo.fr/indonews/";
const CACHE_TIMEOUT = 12*3600;
const DESCRIPTION = "Indo.fr via Rss-bridge";
public function collectData()
{
$html = file_get_html($this->getURI()) or $this->returnError('Could not request Indo.fr', 404);
foreach ($html->find('div.item-has-details') as $element)
{
$item = array();
$title = "";
$detail = $element->find('.details', 0);
$titleElementCompl = $detail->find('.header .title', 0);
if($titleElementCompl != null) {
$title .= $titleElementCompl->innertext;
}
$titleElementCompl = $detail->find('.sub-title', 0);
if($titleElementCompl != null) {
$title .= ($title == '' ? '' : ' - ') . $titleElementCompl->innertext;
}
$dateStr = $detail->find('.date', 0)->innertext;
list($jour, $mois, $annee) = explode('.', $dateStr, 3);
$content = '';
$iframe = $detail->find('.iframe-wrapper', 0);
if($iframe != null) {
$content .= $iframe->innertext;
}
$content .= $detail->find('.txt', 0)->innertext;
$content = str_replace('365x365.jpg\');', '365x365.jpg\'); height: 365px;width:365px', $content);
$item['title'] = $title;
$item['timestamp'] = mktime(0, 0, 0, $mois, $jour, $annee);
$item['uri'] = $this->getURI() . "#" . md5($title);
$item['content'] = $content;
$this->items[] = $item;
}
}
}
?>
<?php
/**
* Créé le 18/06/2018
*/
class kanaBridge extends BridgeAbstract
{
const MAINTAINER = 'Superbaillot';
const NAME = "Kana - Sorties du mois";
const URI = "https://www.kana.fr/planning/";
const CACHE_TIMEOUT = 3600 * 12*0;
const DESCRIPTION = "Kana via Rss-bridge";
public function collectData()
{
$html = file_get_html($this->getURI()) or $this->returnError('Could not request ' . $this->getName(), 404);
foreach ($html->find('.cc-block-date') as $element)
{
$jour = $element->find(".day", 0)->innertext;
$moisStr = $element->find(".month", 0)->innertext;
$mois = 1;
$annee = date("Y");
switch (strtolower($moisStr))
{
case "janvier":
$mois = 1;
break;
case "février":
case "fevrier":
$mois = 2;
break;
case "mars":
$mois = 3;
break;
case "avril":
$mois = 4;
break;
case "mai":
$mois = 5;
break;
case "juin":
$mois = 6;
break;
case "juillet":
$mois = 7;
break;
case "aout":
case "août":
$mois = 8;
break;
case "septembre":
$mois = 9;
break;
case "octobre":
$mois = 10;
break;
case "novembre":
$mois = 11;
break;
case "decembre":
case "décembre":
$mois = 12;
break;
}
$timeItem = mktime(0, 0, 0, $mois, $jour, $annee);
if($timeItem < time())
{
foreach ($element->find('li') as $li)
{
$title = $li-> find('.loop__name__inner span', 0);
$titleStr = '';
if ($title != null) {
$titleStr = $title->innertext;
$titleStr = str_replace('<br />', ' - ', $titleStr);
}
$a = $li-> find('a', 0);
$url = '';
if ($a != null) {
$url = $a->href;
}
$item = array();
$item['title'] = $titleStr;
$item['timestamp'] = $timeItem;
$item['uri'] = $url;
$item['content'] = $li->innertext;
$this->items[] = $item;
}
}
}
}
}
?>
<?php
/**
* Créé le 30/01/2014
* Update 03/01/2015 : transformation des jpg en gif
* 04/06/2015 : nouvelle version du site
* 03/12/2015 : il n'y avait plus qu'une gif d'affichée
* 24/04/2016 : mise à jour de RSS-Bridge
* 07/05/2018 : mise à jour de RSS-Bridge
* 21/09/2021 : Correction des src des imag
* 14/05/2022 : Correction suite à la refont html
*/
class LesJoiesDuCodeBridge extends BridgeAbstract
{
const MAINTAINER = 'Superbaillot';
const NAME = "Les Joies Du Code";
const URI = "https://lesjoiesducode.fr";
const CACHE_TIMEOUT = 1*3600;
const DESCRIPTION = "Les Joies Du Codevia Rss-bridge";
public function collectData()
{
$str = file_get_contents($this->getURI()) or $this->returnError('Could not request Beast In Black.', 404);
// La non fermeture de la balise empĉhe le reste d'être analysé correctement
$str = str_replace('</script
</div>', '</script>
</div>', $str);
$html = str_get_html($str);
foreach ($html->find('article') as $element)
{
$item = array();
$temp = $element->find('h1 a', 0);
$titre = trim($temp->innertext);
$url = $temp->href;
$auteur = $element->find('span.post-author', 0)->innertext;
$infoStr = $element->find('.post-meta-info', 0)->innertext;
$pos = strpos($infoStr, "commit du ");
$dateStr = substr($infoStr, $pos + 10);
$temp = $element->find('div.blog-post-content', 0);
$content = $temp->innertext;
if ($temp->find('img', 0)) {
$content = str_replace('src-bouhh', 'src', $content);
}
$item['content'] = trim($content);
$item['uri'] = $url;
$item['title'] = trim($titre);
$item['author'] = $auteur;
$item['timestamp'] = $this->dateToStr($dateStr);
$this->items[] = $item;
}
}
private function dateToStr($dateStr) {
$list = explode(' ', $dateStr, 3);
$jour = $list[0];
$mois = $list[1];
$annee = $list[2];
switch (strtolower($mois))
{
case "janvier":
$mois = 1;
break;
case "février":
case "fevrier":
$mois = 2;
break;
case "mars":
$mois = 3;
break;
case "avril":
$mois = 4;
break;
case "mai":
$mois = 5;
break;
case "juin":
$mois = 6;
break;
case "juillet":
$mois = 7;
break;
case "aout":
case "août":
$mois = 8;
break;
case "septembre":
$mois = 9;
break;
case "octobre":
$mois = 10;
break;
case "novembre":
$mois = 11;
break;
case "decembre":
case "décembre":
$mois = 12;
break;
}
return mktime(0, 0, 0, $mois, (int)$jour, (int)$annee);
}
}
?>
<?php
/**
* Créé le 17/10/2013
* Update 24/04/2016 : mise à jour de RSS-Bridge
* Update 07/05/2018 : mise à jour de RSS-Bridge
*/
class MmmLaBdBridge extends BridgeAbstract
{
const MAINTAINER = 'Superbaillot';
const NAME = "Mmm La Bd";
const URI = "https://hmm-la-bd.eu";
const CACHE_TIMEOUT = 12*3600;
const DESCRIPTION = "Mmm La Bd via Rss-bridge";
public function collectData()
{
$nbItem = 10; // nombre d'item dans le flux. ATTENTION, hormis la dernière
// image, toutes les requêtes sont simultanées! Vérifiez donc
// que votre serveur supporte ce nombre de requête simultanées
$html = file_get_html($this->getURI()) or $this->returnError('Could not request mmm la bd.', 404);
$nb = 0;
foreach ($html->find('div#main_page') as $element)
{
$a = $element->find('a', 5);
$img = $a->find('img', 0);
$item = array();
$item['content'] = $img->title . "<br>\n" . $a->innertext;
$item['uri'] = $a->href;
$item['title'] = $img->alt;
$nb = intval($img->alt); // l'attibut alt contient quelque chose du
// genre "240 - Ascenseur" et je ne veut que le
// "240".
$this->items[] = $item;
}
if ($nb > $nbItem)
{
// Création du gestionnaire multiple
$mh = curl_multi_init();
$timeoutCurl = 30;
// servira pour les traitements qui seront fait une fois que tous
// les sites auront répondus
$listeCurl = array();
for ($i = ($nb - 1); $i > ($nb - ($nbItem + 1)); $i --)
{
$uri = 'http://hmm-la-bd.eu/' . $i;
$ch = curl_init($uri);
// curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeoutCurl);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeoutCurl);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$listeCurl[] = array(
"ch" => $ch,
"uri" => $uri
);
curl_multi_add_handle($mh, $ch);
}
$running = null;
do
{
curl_multi_exec($mh, $running);
} while ($running > 0);
// traitement des résultats
foreach ($listeCurl as $lc)
{
$xmlStr = curl_multi_getcontent($lc["ch"]);
$html = str_get_html($xmlStr) or $this->returnError('Could not request mmm la bd.', 404);
$nb = 0;
foreach ($html->find('div#main_page') as $element)
{
$a = $element->find('a', 5);
$img = $a->find('img', 0);
$item = array();
$item['content'] = $img->title . "<br>\n" . $a->innertext;
$item['uri'] = $lc["uri"];
$item['title'] = $img->alt;
$this->items[] = $item;
}
curl_multi_remove_handle($mh, $lc["ch"]);
}
curl_multi_close($mh);
}
}
}
?>
<?php
/**
* Créé le 17/09/2021
*/
class NintendoBridge extends BridgeAbstract
{
const MAINTAINER = 'Superbaillot';
const NAME = "My Nintendo";
const URI = "https://my.nintendo.com/news?lang=fr";
const CACHE_TIMEOUT = 12*3600;
const DESCRIPTION = "My Nintendo via Rss-bridge";
public function collectData()
{
$html = file_get_html($this->getURI()) or $this->returnError('Could not request My Nintendo.', 404);
$htmlStr = $html->innertext;
// Récupération du JSON
$needle = 'embeddedResponses: JSON.parse("';
$posStart = strpos($htmlStr, $needle) + strlen($needle);
$posEnd = strpos($htmlStr, 'context: JSON.parse("');
$str = substr($htmlStr, $posStart, $posEnd - $posStart);
$str = substr($str, 0, strrpos($str, '"'));
$str = str_replace('\"', '"', $str);
$str = str_replace('\\\\', '\\', $str);
$json = json_decode($str);
// on parcours les items du JSON
foreach ($json->{'api_news_list'}->{'data'}->{'items'} as $element) {
// var_dump($element);
$item = array();
$item['content'] = $element->{'content'};
$item['title'] = $element->{'title'};
$item['timestamp'] = $element->{'publishedAt'};
$this->items[] = $item;
}
}
}
?>
<?php
/**
* Créé le 20/09/2020
*/
class RigolotesBridge extends BridgeAbstract
{
const MAINTAINER = 'Superbaillot';
const NAME = "Images Rigolotes";
const URI = "https://rigolotes.fr";
const CACHE_TIMEOUT = 3600;
const DESCRIPTION = "Images Rigolotes Rss-bridge";
public function collectData()
{
$str = file_get_contents($this->getURI()) or $this->returnError('Could not request Beast In Black.', 404);
$html = str_get_html($str);
foreach ($html->find('.articles-container >div.article-box') as $element)
{
$aTitle = $element->find('h2 a', 0);
$img = $element->find('div', 1);
$content = $img->outertext;
$content = str_replace('src="/', 'src="'. $this->getURI() . '/', $content);
$content = str_replace('poster="/', 'controls poster="'. $this->getURI() . '/', $content);
$content = str_replace(' loop ', ' ', $content);
$video = $img->find('video', 0);
// if ($video != null) {
// $src = $video->src;
// $content = "video : " . htmlentities;
// }
$divDate = $element->find('.info-row .is-new-span', 0);
$item = array();
$item['timestamp'] = $this->getDate($divDate);
$item['title'] = $aTitle->innertext;
$item['content'] = $content;
$item['uri'] = $this->getUri() . $aTitle->href;
$this->items[] = $item;
}
}
/**
* Retourne le timestamp du div date
*/
private function getDate($date) {
if ($date) {
$dateFormat = $date->getAttribute('data-published');
if ($dateFormat) {
$annee = substr($dateFormat, 0, 4);
$mois = substr($dateFormat, 4, 2);
$jour = substr($dateFormat, 6, 2);
$heure = substr($dateFormat, 8, 2);
$min = substr($dateFormat, 10, 2);
return mktime($heure-2, $min, 0, $mois, $jour, $annee);
}
}
return null;
}
}
<?php
/**
* Auteur initial supitalp
* Update 24/04/2016 : mise à jour de RSS-Bridge
* Update 07/05/2018 : mise à jour de RSS-Bridge
*/
class ScmbBridge extends BridgeAbstract
{
const MAINTAINER = 'Superbaillot';
const NAME = "Se Coucher Moins Bête";
const URI = "https://secouchermoinsbete.fr";
const CACHE_TIMEOUT = 6*3600;
const DESCRIPTION = "Se Coucher Moins Bête via Rss-bridge";
public function collectData()
{
$html = '';
$html = file_get_html($this->getURI()) or $this->returnError('Could not request Se Coucher Moins Bete.', 404);
$cpt = 0;
$cptMax = 7;
foreach ($html->find('article') as $article)
{
$item = array();
// get publication date
$str_date = $article->find('time', 0)->datetime;
// les news ne seront plus prise en compte. Le test n'est pas super
// explicite, mais ça marche
if (strlen($str_date) >= 16)
{
$item['uri'] = 'http://secouchermoinsbete.fr' . $article->find('p.summary a', 0)->href;
$item['title'] = $article->find('header h1 a', 0)->innertext;
list ($date, $time) = explode(' ', $str_date);
list ($y, $m, $d) = explode('-', $date);
list ($h, $i) = explode(':', $time);
$timestamp = mktime($h, $i, 0, $m, $d, $y);
$item['timestamp'] = $timestamp;
$adresse = $article->find('address span', 0);
$temp = $adresse->find("a", 0);
if (! is_null($temp))
{
$adresse = $temp;
}
$item['author'] = $adresse->innertext;
// TODO: this should be optional since it is highly time and
// broadband consuming
// check if the anecdote has more content to offer (text
// details, picture, video) and follow link to retrieve it if
// that is the case
$optcontent = $article->find('div.metadata-list a');
$hasPic = (preg_match("#pas#", $optcontent[0]->innertext)) ? false : true;
$hasVid = (preg_match("#pas#", $optcontent[1]->innertext)) ? false : true;
$hasDetails = (preg_match("#pas#", $optcontent[2]->innertext)) ? false : true;
$temp = $article->find('span.read-more', 0);
if ($temp) {
$temp->outertext = ''; // remove text "En
// savoir plus" from
// anecdote content
}
$content = $article->find('p.summary a', 0)->innertext;
$content = substr($content, 0, strlen($content) - 17); // remove
// superfluous spaces at
// the end
if ($hasDetails || $hasPic || $hasVid)
{
$cpt ++;
if ($cpt < $cptMax)
{
$opt_html = file_get_html($item['uri']);
}
}
if ($hasDetails && $cpt < $cptMax)
{
$details = $opt_html->find('p.details', 0);
if($details != null)
{
$content = $content . '<br />' . $details->innertext;
}
}
if ($hasPic && $cpt < $cptMax)
{
$picUri = $opt_html->find('div#sources-image-wrapper a', 0);
if($picUri != null)
{
$content = $content . '<br /><img src="' . $picUri->href . '" />';
}
}
if ($hasVid && $cpt < $cptMax)
{
$vidUri = $opt_html->find('div#sources-video-wrapper iframe', 0);
if ($vidUri != null)
{
$vidUri = explode('?', $vidUri->src); // remove "?autoplay=0"
$content = $content . '<br /><a href="' . $vidUri[0] . '">Vidéo</a>';
}
}
$item['content'] = $content;
$this->items[] = $item;
}
}
}
}
?>
<?php
/**
* Créé le 30/01/2014
* Update 24/04/2016 : mise à jour de RSS-Bridge
* Update 07/05/2018 : mise à jour de RSS-Bridge
* 21/09/2021 : Correction des src des imag
*/
class TheCodingLoveBridge extends BridgeAbstract
{
const MAINTAINER = 'Superbaillot';
const NAME = "The Coding Love";
const URI = "https://thecodinglove.com/";
const CACHE_TIMEOUT = 3600;
const DESCRIPTION = "The Coding Love via Rss-bridge";
public function collectData()
{
$html = file_get_html($this->getURI()) or $this->returnError('Could not request LesJoiesDuCode.', 404);
foreach ($html->find('article.blog-post') as $element)
{
$temp = $element->find('h1 a', 0);
$titre = trim($temp->innertext);
$url = $temp->href;
$temp = $element->find('div.blog-post-content', 0);
$auteur = $temp->find('p.post-author', 0);
if($auteur != null)
{
$pos = strpos($auteur->innertext, "par");
$item = array();
if ($pos > 0)
{
$auteur = trim(substr($auteur->innertext, ($pos + 4)));
$item['author'] = $auteur;
}
}
$content = $temp->innertext;
if ($temp->find('img', 0)) {
$content = str_replace('src', 'src-bouhh', $content);
$content = str_replace('data-src-bouhh', 'src', $content);
}
$item['content'] = trim($content);
$item['uri'] = $url;
$item['title'] = trim($titre);
$this->items[] = $item;
}
}
}
?>
Ah, sebsauvage qui parle d'ici !

http://sebsauvage.net/links/?wVLb1g



Ça va faire un bon coup de pub, pour sûr.
Pourquoi tu en as un pour Dilbert ? Ils ont un RSS de base : http://dilbert.com/rss/
Arf, merci pour les joies du code, j'ai cru que les gifs étaient bloqués par AB Plus ;)
@Anabis le flux RSS de Dilbert ne contient plus depuis un sacré moment les images, ce qui le rend à peu près inutile.
Même question qu'Anabis mais pour se coucher moins bête ?

(https://www.blogger.com/feeds/1879199009612029553/posts/default).

Sinon merci pour top 5 et faux raccord, ça faisait un momnet que je pestais contre allociné.

Merci aussi pour les joies du code ça fait du bien de revoir les gif dans ses flux ;).
Bonjour,

ce ne doit pas être l'endroit pour, mais j'ai une question technique pour RSS-Bridge. Je l'ai installé, mais quand je clique un bouton, ça me propose de télécharger le fichier (et pas d'ajouter le lien dans tt-rss). J'ai vérifié les headers, etc. Rien.

Une idée ?



P.S : merci beaucoup pour ces Bridges, j'suis heureux d'en voir un pour Allociné/Faux-Raccord :)
Salut !

Merci pour tous ces nouveaux Bridges o/



J'ai mis en place une instance ici : https://wtf.roflcopter.fr/rss-bridge/



Si jamais ça peut aider à décharger ton serveur :)
Mince, j'ai trouvé tout seul !

En recopiant les scripts, j'ai laissé un espace au début du fichier de bridge. Du coup, mon Firefox n'interprétait plus comme un flux ATOM/XML.

Pfff…
Un petit effet sebsauvage, en effet :)



Ça me fait plaisir que ce que j'ai fait sert à d'autre.





@Epsilon : tu confonds "Se coucher moins bête" et "Tu mourras moins bête" :)



Et oui, il y a un RSS de "Se coucher moins bête", mais certains articles ne sont pas complet.
@Superbaillot : my bad j'ai lu un peu vite ;)

sinon encore merci pour les flux allociné et joie du code.


Merci bien, vraiment génial ce petit rss-bridge, perso j'ai juste un peu modifier pour LesJoiesDuCode une petite duplication pour rajouter la page2 :D .
C'est vrai qu'il en a que 4 sur la première page.

Mais il n'y en pas de nouveau tous les quarts d'heure :)

Et comme chez moi, les flux sont rafraichis toutes les heures, j'ai pas jugé utile de prendre en compte la page 2.

Mais je comprends que ça peut être utile pour d'autre.
Petit problème avec celui des joies du code où ils utilisent un .jpg à la place du .gif, ce dernier est remplacé lors du onload en js sur leur site avec en commentaire en prévision de la version 2 de ljdc.

Une correction est elle prévue ?
J'ai vu ça pour il y a quelques jours.

Je viens de faire la correction pour Les joies du code et pour The coding love, car si c'est comme pour la disparition des images dans le flux RSS d'origine, ça ne va pas tarder :)
BOnjour,



J'aimerai installer cette petite perle sur mon mutualiser, mais je ne trouve pas d'infos !



J'ai téléchargé le script sur github, décompresser sur mon espace mais ca m'affiche une page blanche !



Quelqu'un sait ? svp
Normalement, il suffit de décompresser et de lancer le index.php

Si tu as une page blanche, tu dois avoir une erreur quelque part. Pour afficher un message d'erreur, décommente la ligne :



ini_set('display_errors','1'); error_reporting(E_ALL); // For debugging only.




Ou ce trouve la ligne pour le debug ?



J'ai re fait le test, je télécharge, décompresse et envoi le dossier complet, toujours pareil... Page blanche !
Elle se trouve dans le fichier index.php.
Re ! Pardon pour le retard.



Alors j'ai ca :



date_default_timezone_set('UTC');

error_reporting(0);

//ini_set('display_errors','1'); error_reporting(E_ALL); // For debugging only.
Pour afficher le message d'erreur, il faut que tu supprimes les // avant ini_set('display_errors','1')…
On va y arriver !



Fatal error: Cannot redeclare class HttpException in /home/clients/992dcef983fca4ab050e7ed1a163189e/web/rssbridge/lib/Exceptions.php on line 2
Heu… la, comme ça, je vois pas pourquoi tu as cette erreur.

Je ne sais pas si ça peut venir de là, mais ton hébergeur est bien en php 5.3 ou supérieur?

Moi, je viens de mettre à jour ma version de Rss-Bridge, et comme mon hébergeur est en 5.2, j'ai eu quelques soucis, mais pas le tien.
Je suis en php 5.5



C'est bizarre, mais j'ai cru lire je sais plus trop ou par contre !



Je suis en httpS, c'est peut etre ca non ?!
Je vois pas le rapport avec l'erreur en question.

Désolé de pas pouvoir t'aider.
Je ne vous demande pas grand chose, mais je me réserve le droit de supprimer une partie ou l'intégralité des messages qui ne respectes pas ces règles.
Je me réserve le droit de supprimer une partie ou l'intégralité des messages pour d'autres raisons que je préciserais le cas échéant.
Ces règles sont donc susceptibles d'évoluer, n'hésitez pas à revenir y jeter un oeil plus tard.