|
| Un lecteur RSS/Atom/Podcasts pour remplacer celui de Violet | |
| | Auteur | Message |
---|
Harfangdesneiges Special Nabz
Age : 28 Localisation : Quelque part sur la côte d'Azur Nbr de messages : 1383 Carottes : 6525
| Sujet: Un lecteur RSS/Atom/Podcasts pour remplacer celui de Violet Sam 16 Juil 2011 - 21:25 | |
| Bonsoir à tous ! J'ai codé en PHP un lecteur de flux RSS/Atom en remplacement de celui de Violet. Il existe deux versions : une où le lecteur se contente de lire un flux en ayant son URL et une où le lecteur lit uniquement les éléments non-lus. Cette dernière version sauvegarde sa configuration dans un fichier XML. Le code est long mais facilement compréhensible. Il nécessite un serveur avec PHP > 5.1, SimpleXML et allow_url_fopen = On. Il ne tournera donc pas sur un hébergement chez Free. Pour l'instant il utilise l'API Violet pour tester, mais dès que Pixel du Rezo aura mis en ligne une API pour OJN dans le même style que celle de Violet, je le mettrais à jour. À noter que je n'ai pas pu le tester avec de vrais flux ou un nabaztag, mais il marche parfaitement sur les exemples des documentations RSS ou Atom. rss.php : - Spoiler:
- Code:
-
<?php /************* Lecteur de flux RSS pour Nabaztag (version URL unique, sans abonnement) CC-BY-SA Harfangdesneiges *************/ header('Content-type:text/plain;charset=UTF-8');
function array_func($callback, $array, $recursive = true) { /* Applique récursivement une fonction sur un array */ if(function_exists($callback)) { foreach($array as $key => $element) { if(is_array($array[$key]) && $recursive) { $array[$key] = array_func($callback, $element); } else { $array[$key] = $callback($element); } } } else { exit('E:'.$callback.'() n\'existe pas.'); } return $array; }
function get_int_month($month) { /* Retourne date("M") avec date("n") en argument. Utile pour passer du format RSS à mktime. */ switch($month) { case 'Jan': return 1; break; case 'Feb': return 2; break; case 'Mar': return 3; break; case 'Apr': return 4; break; case 'May': return 5; break; case 'Jun': return 6; break; case 'Jul': return 7; break; case 'Aug': return 8; break; case 'Sep': return 9; break; case 'Oct': return 10; break; case 'Nov': return 11; break; case 'Dec': return 12; break; default: echo 'Valeur non gérée.'; return -1; break; } }
function get_rss_time($rss_date_format) { /* Avec le format RSS en argument, retourne le timestamp associé. Exemple : get_rss_time('Sat, 07 Sep 2002 00:00:01 GMT') = 1031356801 */ $date = explode(' ', $rss_date_format); $date['hour'] = explode(':', $date[4]); $date['hour'] = array_func('intval', $date['hour']); return mktime($date['hour'][0], $date['hour'][1], $date['hour'][2], get_int_month($date[2]), intval($date[1]), intval($date[3])); }
function get_atom_time($atom_date_format) { /* Même usage que précédement mais avec le format utilisé par Atom ce coup-ci. */ $date = explode('-', $atom_date_format); $time = array(); $time['year'] = $date[0]; $time['month'] = $date[1]; $time['day'] = $date[2][0].$date[2][1]; $time['time'] = explode(':', $date[2]); $time['hour'] = explode('T', $time['time'][0]); $time['hour'] = $time['hour'][1]; $time['minutes'] = $time['time'][1]; $time['seconds'] = explode('Z', $time['time'][2]); $time['seconds'] = $time['seconds'][0]; $time = array_func('intval', $time); return mktime($time['hour'], $time['minutes'], $time['seconds'], $time['month'], $time['day'], $time['year']); }
function tts($msg, $lng, $serial, $token) { /* Fontion d'envoi du TTS à un lapin. Pour le moment, se contente d'afficher le texte et d'utiliser l'API Violet A DES FINS DE TEST. A voir avec l'API OJN ou Humanbomb pour y intégrer sa fonction qui utilise l'API Google Translate. */ if($lng == 'fr-fr') $voice = 'FR-Archibald'; else if($lng == 'en-us') $voice = 'US-Billie'; // C'est bien ça le nom de la voix US non ? if(is_array($msg)) { echo file_get_contents('http://api.nabaztag.com/vl/FR/api.jsp?sn='.$serial.'&token='.$token.'&tts='.urlencode($msg['title']).'&voice='.$voice); echo 'http://api.nabaztag.com/vl/FR/api.jsp?sn='.$serial.'&token='.$token.'&tts='.urlencode($msg['title']).'&voice='.$voice; echo "\n".$msg['title']."\nLang=".$lng; foreach($msg['items'] as $item) { echo "\n----------------------\n"; echo file_get_contents('http://api.nabaztag.com/vl/FR/api.jsp?sn='.$serial.'&token='.$token.'&tts='.urlencode($item['text']).'&voice='.$voice); echo $item['text']."\n"; echo 'http://api.nabaztag.com/vl/FR/api.jsp?sn='.$serial.'&token='.$token.'&tts='.urlencode($item['text']).'&voice='.$voice; if(isset($item['audio'])) { echo file_get_contents('http://api.nabaztag.com/vl/FR/api_stream.jsp?sn='.$serial.'&token='.$token.'&urlList='.urlencode($item['audio'])); echo "\n".$item['audio']."\n"; echo 'http://api.nabaztag.com/vl/FR/api_stream.jsp?sn='.$serial.'&token='.$token.'&urlList='.urlencode($item['audio']); } } } else { echo file_get_contents('http://api.nabaztag.com/vl/FR/api.jsp?sn='.$serial.'&token='.$token.'&tts='.urlencode($msg).'&voice='.$voice); echo 'http://api.nabaztag.com/vl/FR/api.jsp?sn='.$serial.'&token='.$token.'&tts='.urlencode($msg).'&voice='.$voice; echo "\n\n\n".$msg."\nLang=".$lng; } }
function read_rss(&$xml_feed, $items_to_read) { /* Fonction de lecture de flux RSS. */ $data = array(); $data['title'] = (string) $xml_feed->channel->title; $i = 0; foreach($xml_feed->channel->item as $item) { if($i <= $items_to_read - 1) { $data['items'][$i]['text'] = $item->title.' '; if(isset($item->pubDate)) // On ne sait jamais, la date de publication est facultative dans la DTD RSS 2.0. { $data['items'][$i]['text'] .= 'publié le '.date('j/n/Y à H:i', get_rss_time($item->pubDate)).' '; } if(isset($item->enclosure)) // Gestion des podcasts { $attrs = $item->enclosure->attributes(); if(isset($attrs['url']) && $attrs['type'] == 'audio/mpeg') { $data['items'][$i]['audio'] = (string) $item->enclosure['url']; } } $data['items'][$i]['text'] .= $item->description.' '; } ++$i; } return $data; }
function read_atom(&$xml_feed, $items_to_read) { /* Fonction de lecture de flux Atom. */ $data = $xml_feed->title.' '; $i = 0; foreach($xml_feed->entry as $entry) { if($i <= $items_to_read - 1) { $data .= $entry->title.' '; if(isset($entry->updated)) { $data .= 'publié le '.date('j/n/Y à H:i', get_atom_time($entry->updated)).' '; } $data .= $entry->summary.' '; } ++$i; } return $data; }
if(!ini_get('allow_url_fopen')) { exit('E:allow_url_fopen = Off. Impossible de continuer.'); } else { if(!empty($_GET['sn']) && !empty($_GET['token']) && !empty($_GET['url'])) // A voir avec l'API OJN : sn/token { if(preg_match('#http://([a-z0-9._-]{2,}\.[a-z]{2,4})|(localhost)|([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/?.+#', urldecode($_GET['url'])) == 1) { $feed = file_get_contents(urldecode($_GET['url'])); if($feed) { echo $feed; $xml_feed = simplexml_load_string($feed); $tts = ''; $lng = ''; if(isset($_GET['nb_items']) && is_numeric($_GET['nb_items'])) { $nb_items = intval($_GET['nb_items']); } else { $nb_items = 4; } if(isset($xml_feed->channel) && preg_match('#<rss ?(version="[0-9]\.[0-9]")?>#i', $feed) == 1) // Flux au format RSS { $lng = ''; $tts = read_rss($xml_feed, $nb_items); if(isset($xml_feed->channel->language)) { $lng = $xml_feed->channel->language; } else if(!empty($_GET['lng'])) { $lng = $_GET['lng']; } else { $lng = 'fr-fr'; } tts($tts, $lng, $_GET['sn'], $_GET['token']); } else if(isset($xml_feed->entry) && preg_match('#<feed ?(xmlns="http://www.w3.org/2005/Atom")?>#i', $feed) == 1) // Flux au format Atom { $lng = ''; $tts = read_atom($xml_feed, $nb_items); if(isset($xml_feed->language)) { $lng = $xml_feed->language; } else if(!empty($_GET['lng'])) { $lng = $_GET['lng']; } else { $lng = 'fr-fr'; } tts($tts, $lng, $_GET['sn'], $_GET['token']); } else { exit('E:le flux n\'est ni RSS ni Atom.'); } } else // erreur HTTP { exit('E:impossible de telecharger le fichier.'); } } else { exit('E:URL invalide ('.urldecode($_GET['url']).').'); } } }
rss_abo.php : - Spoiler:
- Code:
-
<?php
/*************
Lecteur de flux RSS pour Nabaztag (version avec abonnement)
CC-BY-SA Harfangdesneiges
*************/
header('Content-type:text/plain;charset=UTF-8');
define('USERDATA_FILE', './rss_abo.userdata.xml');
function array_func($callback, $array, $recursive = true)
{
/*
Applique récursivement une fonction sur un array
*/
if(function_exists($callback))
{
foreach($array as $key => $element)
{
if(is_array($array[$key]) && $recursive)
{
$array[$key] = array_func($callback, $element);
}
else
{
$array[$key] = $callback($element);
}
}
}
else
{
exit('E:'.$callback.'() n\'existe pas.');
}
return $array;
}
function get_int_month($month)
{
/*
Retourne date("M") avec date("n") en argument. Utile pour passer du format RSS à mktime.
*/
switch($month)
{
case 'Jan':
return 1;
break;
case 'Feb':
return 2;
break;
case 'Mar':
return 3;
break;
case 'Apr':
return 4;
break;
case 'May':
return 5;
break;
case 'Jun':
return 6;
break;
case 'Jul':
return 7;
break;
case 'Aug':
return 8;
break;
case 'Sep':
return 9;
break;
case 'Oct':
return 10;
break;
case 'Nov':
return 11;
break;
case 'Dec':
return 12;
break;
default:
echo 'Valeur non gérée.';
return -1;
break;
}
}
function get_rss_time($rss_date_format)
{
/*
Avec le format RSS en argument, retourne le timestamp associé.
Exemple :
get_rss_time('Sat, 07 Sep 2002 00:00:01 GMT') = 1031356801
*/
$date = explode(' ', $rss_date_format);
$date['hour'] = explode(':', $date[4]);
$date['hour'] = array_func('intval', $date['hour']);
return mktime($date['hour'][0], $date['hour'][1], $date['hour'][2], get_int_month($date[2]), intval($date[1]), intval($date[3]));
}
function get_atom_time($atom_date_format)
{
/*
Même usage que précédement mais avec le format utilisé par Atom ce coup-ci.
*/
$date = explode('-', $atom_date_format);
$time = array();
$time['year'] = $date[0];
$time['month'] = $date[1];
$time['day'] = $date[2][0].$date[2][1];
$time['time'] = explode(':', $date[2]);
$time['hour'] = explode('T', $time['time'][0]);
$time['hour'] = $time['hour'][1];
$time['minutes'] = $time['time'][1];
$time['seconds'] = explode('Z', $time['time'][2]);
$time['seconds'] = $time['seconds'][0];
$time = array_func('intval', $time);
return mktime($time['hour'], $time['minutes'], $time['seconds'], $time['month'], $time['day'], $time['year']);
}
function tts($msg, $lng, $serial, $token) { /* Fontion d'envoi du TTS à un lapin. Pour le moment, se contente d'afficher le texte et d'utiliser l'API Violet A DES FINS DE TEST. A voir avec l'API OJN ou Humanbomb pour y intégrer sa fonction qui utilise l'API Google Translate. */ if($lng == 'fr-fr') $voice = 'FR-Archibald'; else if($lng == 'en-us') $voice = 'US-Billie'; // C'est bien ça le nom de la voix US non ? if(is_array($msg)) { echo file_get_contents('http://api.nabaztag.com/vl/FR/api.jsp?sn='.$serial.'&token='.$token.'&tts='.urlencode($msg['title']).'&voice='.$voice); echo 'http://api.nabaztag.com/vl/FR/api.jsp?sn='.$serial.'&token='.$token.'&tts='.urlencode($msg['title']).'&voice='.$voice; echo "\n".$msg['title']."\nLang=".$lng; foreach($msg['items'] as $item) { echo "\n----------------------\n"; echo file_get_contents('http://api.nabaztag.com/vl/FR/api.jsp?sn='.$serial.'&token='.$token.'&tts='.urlencode($item['text']).'&voice='.$voice); echo $item['text']."\n"; echo 'http://api.nabaztag.com/vl/FR/api.jsp?sn='.$serial.'&token='.$token.'&tts='.urlencode($item['text']).'&voice='.$voice; if(isset($item['audio'])) { echo file_get_contents('http://api.nabaztag.com/vl/FR/api_stream.jsp?sn='.$serial.'&token='.$token.'&urlList='.urlencode($item['audio'])); echo "\n".$item['audio']."\n"; echo 'http://api.nabaztag.com/vl/FR/api_stream.jsp?sn='.$serial.'&token='.$token.'&urlList='.urlencode($item['audio']); } } } else { echo file_get_contents('http://api.nabaztag.com/vl/FR/api.jsp?sn='.$serial.'&token='.$token.'&tts='.urlencode($msg).'&voice='.$voice); echo 'http://api.nabaztag.com/vl/FR/api.jsp?sn='.$serial.'&token='.$token.'&tts='.urlencode($msg).'&voice='.$voice; echo "\n\n\n".$msg."\nLang=".$lng; } }
function read_rss(&$xml_feed, $last_read, &$feed_data)
{
/*
Fonction de lecture de flux RSS.
*/
$data = array(); $data['title'] = (string) $xml_feed->channel->title; $i = 0;
foreach($xml_feed->channel->item as $item)
{
if(isset($item->guid) && $item->guid == $last_read) // Vérifie si la dernière actualité lue n'est pas celle-ci
{
break;
}
else if(sha1($item->title.$item->description) == $last_read) // S'il n'y a pas de guid, on fait un mix entre la description et le titre
{
break;
}
else
{
$data['items'][$i]['text'] = $item->title.' ';
if(isset($item->pubDate)) // On ne sait jamais, la date de publication est facultative dans la DTD RSS 2.0.
{
$data['items'][$i]['text'] .= 'publié le '.date('j/n/Y à H:i', get_rss_time($item->pubDate)).' ';
}
if(isset($item->enclosure)) // Gestion des podcasts { $attrs = $item->enclosure->attributes(); if(isset($attrs['url']) && $attrs['type'] == 'audio/mpeg') { $data['items'][$i]['audio'] = (string) $item->enclosure['url']; } } $data['items'][$i]['text'] .= $item->description.' ';
if(isset($item->guid)) // On met cette actualité comme la dernière étant lue
{
$feed_data->last_read = $item->guid;
}
else
{
$feed_data->last_read = sha1($item->title.$item->description);
}
}
++$i;
}
if(empty($data['items'][$i]['text'])) // Si on n'a rien écrit dedans
{
$data['items'][$i]['text'] = 'pas de nouveaux éléments à lire.';
}
return $data;
}
function read_atom(&$xml_feed, $last_read, &$feed_data)
{
/*
Fonction de lecture de flux Atom.
*/
$data = $xml_feed->title.' ';
$i = 0;
foreach($xml_feed->entry as $entry)
{
if(isset($entry->id) && $entry->id == $last_read) // Vérifie si la dernière actualité lue n'est pas celle-ci
{
break;
}
else if(sha1($entry->title.$entry->summary) == $last_read) // S'il n'y a pas d'id (normalement obligatoire selon la RFC 4287), on fait un mix entre la description et le titre
{
break;
}
else
{
$data .= $entry->title.' ';
if(isset($entry->updated))
{
$data .= 'publié le '.date('j/n/Y à H:i', get_atom_time($entry->updated)).' ';
}
$data .= $entry->summary.' ';
if(isset($entry->id)) // On met cette actualité comme la dernière étant lue
{
$feed_data->last_read = $entry->id;
}
else
{
$feed_data->last_read = sha1($entry->title.$entry->summary);
}
}
++$i;
}
if(trim($data) == trim($xml_feed->title)) // Si on n'a rien écrit dedans
{
$data .= ' pas de nouveaux éléments à lire.';
}
return $data;
}
if(!ini_get('allow_url_fopen'))
{
exit('E:allow_url_fopen = Off. Impossible de continuer.');
}
else
{
if(!empty($_GET['user']) && !empty($_GET['pwd']) && !empty($_GET['mode']))
{
if($_GET['mode'] == 'read_new')
{
$userdata = file_get_contents(USERDATA_FILE);
if($userdata)
{
$userdata = simplexml_load_string($userdata);
$auth = false;
$user = $userdata->xpath('users/user[name="'.strip_tags($_GET['user']).'"]');
if(isset($user[0]->name))
{
if($user[0]->password == sha1($_GET['pwd']))
{
$auth = true;
}
else
{
$auth = false;
}
}
if($auth)
{
foreach($user[0]->feeds->feed as $feed_data)
{
$feed = file_get_contents($feed_data->url);
if($feed)
{
$xml_feed = simplexml_load_string($feed);
$tts = '';
$lng = '';
if(isset($xml_feed->channel) && preg_match('#<rss ?(version="[0-9]\.[0-9]")?>#i', $feed) == 1) // Flux au format RSS
{
$lng = '';
$tts = read_rss($xml_feed, (string) $feed_data->last_read, $feed_data);
if(isset($xml_feed->channel->language))
{
$lng = (string) $xml_feed->channel->language;
}
else if(!empty($feed_data->default_lng))
{
$lng = (string) $feed_data->default_lng;
}
else
{
$lng = 'fr-fr';
}
if(!file_put_contents(USERDATA_FILE, $userdata->asXml()))
{
exit('E:impossible de modifier le dernier élément non-lu.');
}
tts($tts, $lng, $user[0]->serial, $user[0]->token);
}
else if(isset($xml_feed->entry) && preg_match('#<feed ?(xmlns="http://www.w3.org/2005/Atom")?>#i', $feed) == 1) // Flux au format Atom
{
$lng = '';
$tts = read_atom($xml_feed, (string) $feed_data->last_read, $feed_data);
if(isset($xml_feed->language))
{
$lng = (string) $xml_feed->language;
}
else if(!empty($feed_data->default_lng))
{
$lng = (string) $feed_data->default_lng;
}
else
{
$lng = 'fr-fr';
}
if(!file_put_contents(USERDATA_FILE, $userdata->asXml()))
{
exit('E:impossible de modifier le dernier élément non-lu.');
}
tts($tts, $lng, $user[0]->serial, $user[0]->token);
}
else
{
exit('E:le flux n\'est ni RSS ni Atom.');
}
}
else // erreur HTTP
{
exit('E:impossible de telecharger le fichier.');
}
}
}
else
{
exit('E:mauvais utilisateur/mot de passe.');
}
}
else
{
exit('E:impossible d\'ouvrir le fichier de configuration. Vérifiez la valeur de USERDATA_FILE (USERDATA_FILE = '.USERDATA_FILE.')');
}
}
else if($_GET['mode'] == 'subscribe' && !empty($_GET['url']))
{
if(preg_match('#http://([a-z0-9._-]{2,}\.[a-z]{2,4})|(localhost)|([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/?.+#', urldecode($_GET['url'])) == 1)
{
$userdata = file_get_contents(USERDATA_FILE);
if($userdata)
{
$userdata = simplexml_load_string($userdata);
$auth = false;
$user = $userdata->xpath('users/user[name="'.strip_tags($_GET['user']).'"]');
if(isset($user[0]->name))
{
if($user[0]->password == sha1($_GET['pwd']))
{
$auth = true;
}
else
{
$auth = false;
}
}
if($auth)
{
$user[0]->feeds->addChild('feed')->addChild('url', htmlentities($_GET['url']));
$user[0]->feeds->feed[intval($user[0]->feeds->feed->count() - 1)]->addChild('last_read');
if(!empty($_GET['lng']))
{
$user[0]->feeds->feed[intval($user[0]->feeds->feed->count() - 1)]->addChild('default_lng', strip_tags($_GET['lng']));
}
else
{
$user[0]->feeds->feed[intval($user[0]->feeds->feed->count() - 1)]->addChild('default_lng', 'fr-fr');
}
if(!file_put_contents(USERDATA_FILE, $userdata->asXml()))
{
exit('E:impossible d\'ajouter un flux.');
}
}
else
{
exit('E:mauvais utilisateur/mot de passe.');
}
}
else
{
exit('E:impossible d\'ouvrir le fichier de configuration. Vérifiez la valeur de USERDATA_FILE (USERDATA_FILE = '.USERDATA_FILE.') et le chmod du dossier.');
}
}
else
{
exit('E:URL invalide ('.urldecode($_GET['url']).').');
}
}
else if($_GET['mode'] == 'register' && !empty($_GET['sn']) && !empty($_GET['token']))
{
$userdata = file_get_contents(USERDATA_FILE);
if($userdata)
{
$userdata = simplexml_load_string($userdata);
$user = $userdata->xpath('users/user[name="'.strip_tags($_GET['user']).'"]');
if(!isset($user[0]->name))
{
$userdata->users->addChild('user')->addChild('name', strip_tags($_GET['user']));
$userdata->users->user[intval($userdata->users->user->count() - 1)]->addChild('password', sha1($_GET['pwd']));
$userdata->users->user[intval($userdata->users->user->count() - 1)]->addChild('serial', $_GET['sn']);
$userdata->users->user[intval($userdata->users->user->count() - 1)]->addChild('token', $_GET['token']);
$userdata->users->user[intval($userdata->users->user->count() - 1)]->addChild('feeds');
if(!file_put_contents(USERDATA_FILE, $userdata->asXml()))
{
exit('E:impossible d\'ajouter un flux.');
}
}
else
{
exit('E:le nom d\'utilisateur est déjà pris.');
}
}
else
{
exit('E:impossible d\'ouvrir le fichier de configuration. Vérifiez la valeur de USERDATA_FILE (USERDATA_FILE = '.USERDATA_FILE.') et le chmod du dossier.');
}
}
}
}
rss_abo.userdata.xml : - Spoiler:
- Code:
-
<?xml version="1.0" encoding="UTF-8"?> <userdata> <users> <user> <name>harfangdesneiges</name> <password>48c00c4dd91abfe0c1ed16f23983fd0f90978160</password> <serial>12345</serial> <token>1234568</token> <feeds> <feed> <url>http://localhost/tests_nabz/feed_atom.xml</url> <last_read>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</last_read> <default_lng>fr-fr</default_lng> </feed> <feed> <url>http://localhost/tests_nabz/feed_rss.xml</url> <last_read>8ca0851596460113bd7696f9c54246be983a5901</last_read> <default_lng>fr-fr</default_lng> </feed> </feeds> </user> </users> </userdata>
Voilà ! N'hésitez pas à poser vos questions et à tout modifier pour l'améliorer ! Je ferais certainement un lecteur de podcasts sur la même base. EDIT : j'ai fait une petite mise à jour de sécurité sur rss_abo.php et j'en profite pour documenter le tout : Pour se servir de la version sans abonnement : appelez l'URL suivante : http://votredomaine.com/un/répertoire/rss.php?sn=VOTRE-SN&token=VOTRE-TOKEN&url=http://une-url.com/de/flux/rss-ou-atom.xml Pour se servir de la version avec enregistrement : Pour s'enregistrer : appelez l'URL suivante : http://votredomaine.com/un/répertoire/rss_abo.php?user=VOTRE-USERNAME&pwd=VOTRE-MDP&mode=register&sn=VOTRE-SN&token=VOTRE-TOKEN Pour ajouter un flux : appelez l'URL suivante : http://votredomaine.com/un/répertoire/rss_abo.php?user=VOTRE-USERNAME&pwd=VOTRE-MDP&mode=subscribe&url=http://une-url.com/de/flux/rss-ou-atom.xml&lng=UNE-LANGUE-COMME-fr-fr-SI-LE-FLUX-N'EN-PRECISE-PAS Pour lire les nouveaux messages : appelez l'URL suivante : http://votredomaine.com/un/répertoire/rss_abo.php?user=VOTRE-USERNAME&pwd=VOTRE-MDP&mode=read_new J'allais oublier ! N'oubliez pas de configurer votre serveur web pour éviter qu'on puisse récupérer le fichier de configuration des utilisateurs ! EDIT 2 : voilà, j'ai ajouté le support des podcasts pour le format RSS 2.0 (donc tous les podcasts iTunes marchent). Je n'ai toujours pas de lapin, donc aucun moyen de savoir si ça fonctionne. Si ça ne marche pas chez vous, signalez-le moi. EDIT 3 : je viens de me rendre compte que j'avais commenté les lignes qui appelaient l'API et laissé du debug et comme un gros cochon.
Dernière édition par Harfangdesneiges le Ven 22 Juil 2011 - 17:48, édité 2 fois | |
| | | Harfangdesneiges Special Nabz
Age : 28 Localisation : Quelque part sur la côte d'Azur Nbr de messages : 1383 Carottes : 6525
| Sujet: Re: Un lecteur RSS/Atom/Podcasts pour remplacer celui de Violet Ven 22 Juil 2011 - 17:34 | |
| Un petit up pour dire que j'ai ajouté le support des podcasts pour le format RSS 2.0 (donc tous les podcasts iTunes marchent). Je n'ai toujours pas de lapin, donc aucun moyen de savoir si ça fonctionne. Si ça ne marche pas chez vous, signalez-le moi. | |
| | | KENI Kryptonite Nabz
Localisation : Bretagne Nabaztag : KENSHIN (OpenNag) & SARIA UMA (OpenKz) Nbr de messages : 7508 Carottes : 6933
| Sujet: Re: Un lecteur RSS/Atom/Podcasts pour remplacer celui de Violet Dim 11 Sep 2011 - 10:19 | |
| Harfangdesneiges : Est-ce que tu as des infos si tes formules fonctionnent ou pas ? Ce matin, j'ai copié/collé ta formule RSS sur une page HTML. Si je comprends bien, il faut que je rentre les codes à Kenshin (sn et token). Mais mon soucis, où je dois indiquer l'adresse du serveur Opennag ? En début de formule, je suppose. D'avance merci de tes réponses | |
| | | Phabbrrysse Nabazteur Voyageur
Age : 38 Localisation : Sassenage Nabaztag : PhormiBBrrysse et Pharramyneu (V2) Nbr de messages : 14389 Carottes : 13328
| Sujet: Re: Un lecteur RSS/Atom/Podcasts pour remplacer celui de Violet Dim 11 Sep 2011 - 17:48 | |
| Les scripts écrits ici sont fait pour fonctionner avec les serveurs de feu Violet/Mindscape ...
Il faut donc les adapter pour les faires fonctionner sur les serveur alernatifs ! _____________________________ Connexion du lapin difficile : ICI -- PAS D'AIDE PAR MP NI PAR MAIL | |
| | | KENI Kryptonite Nabz
Localisation : Bretagne Nabaztag : KENSHIN (OpenNag) & SARIA UMA (OpenKz) Nbr de messages : 7508 Carottes : 6933
| Sujet: Re: Un lecteur RSS/Atom/Podcasts pour remplacer celui de Violet Dim 11 Sep 2011 - 21:08 | |
| ok merci de ta réponse.
Mais je vais poser une question stupide (désolé) comment fonctionne les flux rss exactement ? | |
| | | Harfangdesneiges Special Nabz
Age : 28 Localisation : Quelque part sur la côte d'Azur Nbr de messages : 1383 Carottes : 6525
| Sujet: Re: Un lecteur RSS/Atom/Podcasts pour remplacer celui de Violet Dim 25 Sep 2011 - 20:15 | |
| - KENI a écrit:
- Harfangdesneiges : Est-ce que tu as des infos si tes formules fonctionnent ou pas ?
Là ça marche pas, il faut que je mette ça à jour, par contre je suis paumé, ça fait vraiment longtemps que je ne suis pas passé ici. Une âme charitable pour des explications sur qui marche/marche pas/code source libéré ou non ? | |
| | | Contenu sponsorisé
| Sujet: Re: Un lecteur RSS/Atom/Podcasts pour remplacer celui de Violet | |
| |
| | | | Un lecteur RSS/Atom/Podcasts pour remplacer celui de Violet | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |