2013-04-22 12:00:26 +02:00
< ? php
/**
* DO NOT EDIT THESE LINES
* You can override these options by setting them in config . php
**/
if ( ! defined ( 'ROOT_DIR' ))
{
define ( 'ROOT_DIR' , dirname ( $_SERVER [ 'SCRIPT_FILENAME' ]));
}
define ( 'LOCAL_URI' , '' );
if ( ! defined ( 'AUTOBLOGS_FOLDER' )) define ( 'AUTOBLOGS_FOLDER' , './autoblogs/' );
if ( ! defined ( 'DOC_FOLDER' )) define ( 'DOC_FOLDER' , './docs/' );
if ( ! defined ( 'RESOURCES_FOLDER' )) define ( 'RESOURCES_FOLDER' , './resources/' );
2013-04-29 22:06:31 +02:00
if ( ! defined ( 'FOLDER_MAX_LENGTH' )) define ( 'FOLDER_MAX_LENGTH' , 80 );
2013-04-22 12:00:26 +02:00
date_default_timezone_set ( 'Europe/Paris' );
setlocale ( LC_TIME , 'fr_FR.UTF-8' , 'fr_FR' , 'fr' );
if ( ! defined ( 'ALLOW_FULL_UPDATE' )) define ( 'ALLOW_FULL_UPDATE' , TRUE );
if ( ! defined ( 'ALLOW_CHECK_UPDATE' )) define ( 'ALLOW_CHECK_UPDATE' , TRUE );
// If you set ALLOW_NEW_AUTOBLOGS to FALSE, the following options do not matter.
if ( ! defined ( 'ALLOW_NEW_AUTOBLOGS' )) define ( 'ALLOW_NEW_AUTOBLOGS' , TRUE );
if ( ! defined ( 'ALLOW_NEW_AUTOBLOGS_BY_LINKS' )) define ( 'ALLOW_NEW_AUTOBLOGS_BY_LINKS' , TRUE );
if ( ! defined ( 'ALLOW_NEW_AUTOBLOGS_BY_SOCIAL' )) define ( 'ALLOW_NEW_AUTOBLOGS_BY_SOCIAL' , TRUE );
if ( ! defined ( 'ALLOW_NEW_AUTOBLOGS_BY_BUTTON' )) define ( 'ALLOW_NEW_AUTOBLOGS_BY_BUTTON' , TRUE );
if ( ! defined ( 'ALLOW_NEW_AUTOBLOGS_BY_OPML_FILE' )) define ( 'ALLOW_NEW_AUTOBLOGS_BY_OPML_FILE' , TRUE );
if ( ! defined ( 'ALLOW_NEW_AUTOBLOGS_BY_OPML_LINK' )) define ( 'ALLOW_NEW_AUTOBLOGS_BY_OPML_LINK' , TRUE );
if ( ! defined ( 'ALLOW_NEW_AUTOBLOGS_BY_XSAF' )) define ( 'ALLOW_NEW_AUTOBLOGS_BY_XSAF' , TRUE );
// More about TwitterBridge : https://github.com/mitsukarenai/twitterbridge
2013-07-01 19:44:29 +02:00
if ( ! defined ( 'API_TWITTER' )) define ( 'API_TWITTER' , 'LOCAL' );
2013-04-22 12:00:26 +02:00
if ( ! defined ( 'LOGO' )) define ( 'LOGO' , 'icon-logo.svg' );
if ( ! defined ( 'HEAD_TITLE' )) define ( 'HEAD_TITLE' , '' );
if ( ! defined ( 'FOOTER' )) define ( 'FOOTER' , 'D\'après les premières versions de <a href="http://sebsauvage.net">SebSauvage</a> et <a href="http://bohwaz.net/">Bohwaz</a>.' );
2013-04-22 15:57:24 +02:00
/**
* Functions
**/
2013-04-22 12:00:26 +02:00
function NoProtocolSiteURL ( $url ) {
2013-06-30 15:07:26 +02:00
$protocols = array ( " http:// " , " https:// " );
2013-04-22 12:00:26 +02:00
$siteurlnoproto = str_replace ( $protocols , " " , $url );
// Remove the / at the end of string
if ( $siteurlnoproto [ strlen ( $siteurlnoproto ) - 1 ] == '/' )
$siteurlnoproto = substr ( $siteurlnoproto , 0 , - 1 );
// Remove index.php/html at the end of string
if ( strpos ( $url , 'index.php' ) || strpos ( $url , 'index.html' ) ) {
$siteurlnoproto = preg_replace ( '#(.*)/index\.(html|php)$#' , '$1' , $siteurlnoproto );
}
return $siteurlnoproto ;
}
function DetectRedirect ( $url )
{
if ( parse_url ( $url , PHP_URL_HOST ) == FALSE ) {
throw new Exception ( 'Not a URL: ' . escape ( $url ) );
}
2013-04-22 15:57:24 +02:00
try { $response = get_headers ( $url , 1 ); }
catch ( Exception $e ) { throw new Exception ( 'RSS URL unreachable: ' . escape ( $url ) ); }
2013-04-22 12:00:26 +02:00
if ( ! empty ( $response [ 'Location' ])) {
2013-04-22 15:57:24 +02:00
try { $response2 = get_headers ( $response [ 'Location' ], 1 ); }
catch ( Exception $e ) { throw new Exception ( 'RSS URL unreachable: ' . escape ( $url ) ); }
2013-04-22 12:00:26 +02:00
if ( ! empty ( $response2 [ 'Location' ])) {
2013-04-22 15:57:24 +02:00
throw new Exception ( 'Too much redirection: ' . escape ( $url ) );
2013-04-22 12:00:26 +02:00
}
else { return $response [ 'Location' ]; }
}
else {
return $url ;
}
}
2013-04-29 22:06:31 +02:00
function urlHash ( $rssurl ) {
return sha1 ( NoProtocolSiteURL ( $rssurl ));
2013-04-22 12:00:26 +02:00
}
2013-04-29 22:06:31 +02:00
function urlToFolder ( $siteurl , $rssurl ) {
return AUTOBLOGS_FOLDER . substr ( preg_replace ( " /[^a-z0-9]/ " , '' , strtolower ( NoProtocolSiteURL ( $siteurl ))), 0 , FOLDER_MAX_LENGTH ) . '_' . urlHash ( $rssurl ) . '/' ;
2013-04-22 12:00:26 +02:00
}
2013-04-29 22:06:31 +02:00
function folderExists ( $siteurl , $rssurl ) {
return file_exists ( urlToFolder ( $siteurl , $rssurl ));
2013-04-22 12:00:26 +02:00
}
function escape ( $str ) {
return htmlspecialchars ( $str , ENT_COMPAT , 'UTF-8' , false );
}
2013-04-22 15:57:24 +02:00
function createAutoblog ( $type , $sitename , $siteurl , $rssurl ) {
2013-04-22 12:00:26 +02:00
if ( $type == 'generic' || empty ( $type )) {
$var = updateType ( $siteurl );
$type = $var [ 'type' ];
if ( ! empty ( $var [ 'name' ]) ) {
if ( ! stripos ( $siteurl , $var [ 'name' ] === false ) )
$sitename = ucfirst ( $var [ 'name' ]) . ' - ' . $sitename ;
}
}
2013-04-29 22:06:31 +02:00
if ( folderExists ( $siteurl , $rssurl )) {
2013-04-22 15:57:24 +02:00
throw new Exception ( 'Erreur : l\'autoblog ' . $sitename . ' existe déjà.' );
2013-04-22 12:00:26 +02:00
}
2013-04-29 22:06:31 +02:00
$foldername = urlToFolder ( $siteurl , $rssurl );
2013-04-22 12:00:26 +02:00
if ( mkdir ( $foldername , 0755 , false ) ) {
$fp = fopen ( $foldername . '/index.php' , 'w+' );
if ( ! fwrite ( $fp , " <?php require_once '../autoblog.php'; ?> " ) )
2013-04-22 15:57:24 +02:00
throw new Exception ( 'Impossible d\'écrire le fichier index.php' );
2013-04-22 12:00:26 +02:00
fclose ( $fp );
$fp = fopen ( $foldername . '/vvb.ini' , 'w+' );
if ( ! fwrite ( $fp , ' [ VroumVroumBlogConfig ]
SITE_TYPE = " '. $type .' "
SITE_TITLE = " '. $sitename .' "
SITE_DESCRIPTION = " Site original : <a href= \ ''. $siteurl .' \ '>'. $sitename .'</a> "
SITE_URL = " '. $siteurl .' "
FEED_URL = " '. $rssurl .' "
ARTICLES_PER_PAGE = " '. getArticlesPerPage( $type ) .' "
UPDATE_INTERVAL = " '. getInterval( $type ) .' "
UPDATE_TIMEOUT = " '. getTimeout( $type ) .' " ' ) )
2013-04-22 15:57:24 +02:00
throw new Exception ( 'Impossible d\'écrire le fichier vvb.ini' );
2013-04-22 12:00:26 +02:00
fclose ( $fp );
}
else
2013-04-22 15:57:24 +02:00
throw new Exception ( 'Impossible de créer le répertoire.' );
2013-04-29 22:06:31 +02:00
updateXML ( 'new_autoblog_added' , 'new' , $foldername , $sitename , $siteurl , $rssurl );
2013-04-22 12:00:26 +02:00
}
function getArticlesPerPage ( $type ) {
switch ( $type ) {
case 'microblog' :
return 20 ;
2013-04-30 10:36:19 +02:00
case 'twitter' :
return 20 ;
2013-04-22 12:00:26 +02:00
case 'shaarli' :
return 20 ;
2013-06-30 16:04:54 +02:00
case 'youtube' :
return 10 ;
2013-04-22 12:00:26 +02:00
default :
return 5 ;
}
}
function getInterval ( $type ) {
switch ( $type ) {
case 'microblog' :
return 300 ;
2013-04-30 10:36:19 +02:00
case 'twitter' :
return 300 ;
2013-04-22 12:00:26 +02:00
case 'shaarli' :
return 1800 ;
default :
return 3600 ;
}
}
function getTimeout ( $type ) {
switch ( $type ) {
default :
return 30 ;
}
}
function updateType ( $siteurl ) {
if ( strpos ( $siteurl , 'twitter.com' ) !== FALSE ) {
return array ( 'type' => 'twitter' , 'name' => 'twitter' );
}
elseif ( strpos ( $siteurl , 'shaarli' ) !== FALSE ) {
return array ( 'type' => 'shaarli' , 'name' => 'shaarli' );
}
2013-06-30 16:40:02 +02:00
elseif ( strpos ( $siteurl , 'youtube.com' ) !== FALSE ) {
return array ( 'type' => 'youtube' , 'name' => '' );
}
2013-04-22 12:00:26 +02:00
else
return array ( 'type' => 'generic' , 'name' => '' );
}
function debug ( $data )
{
echo '<pre>' ;
var_dump ( $data );
echo '</pre>' ;
}
function __ ( $str )
{
switch ( $str )
{
case 'Search' :
return 'Recherche' ;
case 'Update' :
return 'Mise à jour' ;
case 'Updating database... Please wait.' :
return 'Mise à jour de la base de données, veuillez patienter...' ;
case '<b>%d</b> results for <i>%s</i>' :
return '<b>%d</b> résultats pour la recherche <i>%s</i>' ;
case 'Not Found' :
return 'Introuvable' ;
case 'Article not found.' :
return 'Cet article n\'a pas été trouvé.' ;
case 'Older' :
return 'Plus anciens' ;
case 'Newer' :
return 'Plus récents' ;
case 'ATOM Feed' :
return 'Flux ATOM' ;
case 'Update complete!' :
return 'Mise à jour terminée !' ;
case 'Click here to reload this webpage.' :
return 'Cliquez ici pour recharger cette page.' ;
case 'Source:' :
return 'Source :' ;
case '_date_format' :
return '%A %e %B %Y à %H:%M' ;
case 'Media export' :
return 'Export fichiers media' ;
2013-07-05 21:13:45 +02:00
case 'Import running: ' :
return 'Import en cours : ' ;
case ' files remaining' :
return ' fichiers restants' ;
case 'The page should refresh every second. If not, <a href="javascript:window.location.reload()">refresh manually</a>.' :
return 'La page devrait se rafraîchir toutes les secondes. Si non, <a href="javascript:window.location.reload()">rafraîchissez là manuellement.</a>.' ;
2013-04-22 12:00:26 +02:00
default :
return $str ;
}
}
function updateXML ( $status , $response_code , $autoblog_url , $autoblog_title , $autoblog_sourceurl , $autoblog_sourcefeed )
{
$json = json_decode ( file_get_contents ( RESOURCES_FOLDER . 'rss.json' ), true );
$json [] = array (
'timestamp' => time (),
'autoblog_url' => $autoblog_url ,
'autoblog_title' => $autoblog_title ,
'autoblog_sourceurl' => $autoblog_sourceurl ,
'autoblog_sourcefeed' => $autoblog_sourcefeed ,
'status' => $status ,
'response_code' => $response_code
);
2013-07-19 15:38:27 +02:00
$json = array_slice ( $json , - 50 , 50 );
2013-04-25 11:34:34 +02:00
if ( file_put_contents ( RESOURCES_FOLDER . 'rss.json' , json_encode ( $json ), LOCK_EX ) === FALSE )
{ return FALSE ; }
else { return TRUE ; }
2013-04-22 12:00:26 +02:00
}
2013-04-29 22:32:03 +02:00
function displayXMLstatus ( $status , $response_code , $autoblog_url , $autoblog_title , $autoblog_sourceurl , $autoblog_sourcefeed ) {
2013-04-22 12:00:26 +02:00
switch ( $status )
{
case 'unavailable' :
2013-06-30 15:07:26 +02:00
return 'Autoblog "' . $autoblog_title . '" : site distant inaccessible (code ' . $response_code . ')<br>Autoblog : <a href="' . serverUrl ( true ) . $autoblog_url . '">' . $autoblog_title . '</a><br>Site : <a href="' . $autoblog_sourceurl . '">' . $autoblog_sourceurl . '</a><br>RSS : <a href="' . $autoblog_sourcefeed . '">' . $autoblog_sourcefeed . '</a>' ;
2013-04-22 12:00:26 +02:00
case 'moved' :
2013-06-30 15:07:26 +02:00
return 'Autoblog "' . $autoblog_title . '" : site distant redirigé (code ' . $response_code . ')<br>Autoblog : <a href="' . serverUrl ( true ) . $autoblog_url . '">' . $autoblog_title . '</a><br>Site : <a href="' . $autoblog_sourceurl . '">' . $autoblog_sourceurl . '</a><br>RSS : <a href="' . $autoblog_sourcefeed . '">' . $autoblog_sourcefeed . '</a>' ;
2013-04-22 12:00:26 +02:00
case 'not_found' :
2013-06-30 15:07:26 +02:00
return 'Autoblog "' . $autoblog_title . '" : site distant introuvable (code ' . $response_code . ')<br>Autoblog : <a href="' . serverUrl ( true ) . $autoblog_url . '">' . $autoblog_title . '</a><br>Site : <a href="' . $autoblog_sourceurl . '">' . $autoblog_sourceurl . '</a><br>RSS : <a href="' . $autoblog_sourcefeed . '">' . $autoblog_sourcefeed . '</a>' ;
2013-04-22 12:00:26 +02:00
case 'remote_error' :
2013-06-30 15:07:26 +02:00
return 'Autoblog "' . $autoblog_title . '" : site distant a problème serveur (code ' . $response_code . ')<br>Autoblog : <a href="' . serverUrl ( true ) . $autoblog_url . '">' . $autoblog_title . '</a><br>Site : <a href="' . $autoblog_sourceurl . '">' . $autoblog_sourceurl . '</a><br>RSS : <a href="' . $autoblog_sourcefeed . '">' . $autoblog_sourcefeed . '</a>' ;
2013-04-22 12:00:26 +02:00
case 'available' :
2013-07-19 15:48:10 +02:00
return 'Autoblog "' . $autoblog_title . '" : site distant à nouveau accessible (code ' . $response_code . ')<br>Autoblog : <a href="' . serverUrl ( true ) . $autoblog_url . '">' . $autoblog_title . '</a><br>Site : <a href="' . $autoblog_sourceurl . '">' . $autoblog_sourceurl . '</a><br>RSS : <a href="' . $autoblog_sourcefeed . '">' . $autoblog_sourcefeed . '</a>' ;
2013-04-22 12:00:26 +02:00
case 'new_autoblog_added' :
2013-06-30 15:07:26 +02:00
return 'Autoblog "' . $autoblog_title . '" ajouté.<br>Autoblog : <a href="' . serverUrl ( true ) . $autoblog_url . '">' . $autoblog_title . '</a><br>Site : <a href="' . $autoblog_sourceurl . '">' . $autoblog_sourceurl . '</a><br>RSS : <a href="' . $autoblog_sourcefeed . '">' . $autoblog_sourcefeed . '</a>' ;
2013-04-22 12:00:26 +02:00
}
}
2013-04-29 22:32:03 +02:00
function displayXML () {
2013-06-30 15:07:26 +02:00
header ( 'Content-type: application/rss+xml; charset=utf-8' );
echo ' < ? xml version = " 1.0 " encoding = " UTF-8 " ?>
2013-07-06 08:38:30 +02:00
< rss version = " 2.0 " xmlns : atom = " http://www.w3.org/2005/Atom " xmlns : dc = " http://purl.org/dc/elements/1.1/ " >< channel >< link > '.serverUrl(true).' </ link > ' ;
2013-06-30 15:07:26 +02:00
echo '<atom:link href="' . serverUrl ( true ) . '/?rss" rel="self" type="application/rss+xml"/><title>Projet Autoblog' . (( strlen ( HEAD_TITLE ) > 0 ) ? ' | ' . HEAD_TITLE : '' ) . '</title><description>Projet Autoblog - RSS : Ajouts et changements de disponibilité.</description>' ;
if ( file_exists ( RESOURCES_FOLDER . 'rss.json' ))
2013-04-22 12:00:26 +02:00
{
2013-06-30 15:07:26 +02:00
$json = json_decode ( file_get_contents ( RESOURCES_FOLDER . 'rss.json' ), true );
rsort ( $json );
foreach ( $json as $uitem )
{
$item = array ();
foreach ( $uitem AS $Key => $Value ) {
$item [ $Key ] = escape ( $Value );
}
$description = displayXMLstatus ( $item [ 'status' ], $item [ 'response_code' ], $item [ 'autoblog_url' ], $item [ 'autoblog_title' ], $item [ 'autoblog_sourceurl' ], $item [ 'autoblog_sourcefeed' ]);
$link = serverUrl ( true ) . $item [ 'autoblog_url' ];
2013-07-06 08:38:30 +02:00
$date = date ( DATE_RSS , $item [ 'timestamp' ]);
2013-06-30 15:07:26 +02:00
print <<< EOT
2013-04-22 12:00:26 +02:00
< item >
< title > { $item [ 'autoblog_title' ]} </ title >
< description ><! [ CDATA [{ $description }]] ></ description >
< link > { $link } </ link >
< guid isPermaLink = " false " > { $item [ 'timestamp' ]} </ guid >
2013-07-06 08:18:37 +02:00
< dc : creator > Autoblog </ dc : creator >
2013-04-22 12:00:26 +02:00
< pubDate > { $date } </ pubDate >
</ item >
EOT ;
2013-06-30 15:07:26 +02:00
}
2013-04-22 12:00:26 +02:00
}
2013-06-30 15:07:26 +02:00
echo '</channel></rss>' ;
2013-04-22 12:00:26 +02:00
}
?>