PageRenderTime 51ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/spip/ecrire/genie/syndic.php

https://github.com/eyeswebcrea/espace-couture-sittler.fr
PHP | 261 lines | 146 code | 40 blank | 75 comment | 31 complexity | dd2cf7940cb142835f0e6e8b63bc2501 MD5 | raw file
Possible License(s): LGPL-2.1, GPL-3.0
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2011 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined('_ECRIRE_INC_VERSION')) return;
  12. include_spip('inc/syndic');
  13. // http://doc.spip.org/@genie_syndic_dist
  14. function genie_syndic_dist($t) {
  15. define('_GENIE_SYNDIC', 1); // pour message de compatibilite ci-dessous
  16. return executer_une_syndication();
  17. }
  18. //
  19. // Effectuer la syndication d'un unique site,
  20. // retourne 0 si aucun a faire ou echec lors de la tentative
  21. //
  22. // http://doc.spip.org/@executer_une_syndication
  23. function executer_une_syndication() {
  24. ## valeurs modifiables dans mes_options
  25. ## attention il est tres mal vu de prendre une periode < 20 minutes
  26. define('_PERIODE_SYNDICATION', 2*60);
  27. define('_PERIODE_SYNDICATION_SUSPENDUE', 24*60);
  28. // On va tenter un site 'sus' ou 'off' de plus de 24h, et le passer en 'off'
  29. // s'il echoue
  30. $where = sql_in("syndication", array('sus','off')) . "
  31. AND date_syndic < DATE_SUB(".sql_quote(date('Y-m-d H:i:s')).", INTERVAL
  32. "._PERIODE_SYNDICATION_SUSPENDUE." MINUTE)";
  33. $id_syndic = sql_getfetsel("id_syndic", "spip_syndic", $where, '', "date_syndic", "1");
  34. if ($id_syndic) {
  35. $res1 = syndic_a_jour($id_syndic, 'off');
  36. } else $res1 = true;
  37. // Et un site 'oui' de plus de 2 heures, qui passe en 'sus' s'il echoue
  38. $where = "syndication='oui'
  39. AND date_syndic < DATE_SUB(".sql_quote(date('Y-m-d H:i:s')).", INTERVAL "._PERIODE_SYNDICATION." MINUTE)";
  40. $id_syndic = sql_getfetsel("id_syndic", "spip_syndic", $where, '', "date_syndic", "1");
  41. if ($id_syndic) {
  42. $res2 = syndic_a_jour($id_syndic, 'sus');
  43. } else $res2 = true;
  44. return ($res1 OR $res2) ? 0 : $id_syndic;
  45. }
  46. //
  47. // Mettre a jour le site
  48. //
  49. // Attention, cette fonction ne doit pas etre appellee simultanement
  50. // sur un meme site: un verrouillage a du etre pose en amont.
  51. //
  52. // http://doc.spip.org/@syndic_a_jour
  53. function syndic_a_jour($now_id_syndic, $statut = 'off') {
  54. include_spip('inc/texte');
  55. if (!defined('_GENIE_SYNDIC'))
  56. spip_log("syndic_a_jour doit etre appelee par Cron. Cf. " .
  57. "http://trac.rezo.net/trac/spip/changeset/10294",
  58. 'vieilles_defs');
  59. $row = sql_fetsel("*", "spip_syndic", "id_syndic=$now_id_syndic");
  60. if (!$row) return;
  61. $url_syndic = $row['url_syndic'];
  62. $url_site = $row['url_site'];
  63. if ($row['moderation'] == 'oui')
  64. $moderation = 'dispo'; // a valider
  65. else
  66. $moderation = 'publie'; // en ligne sans validation
  67. sql_updateq('spip_syndic', array('syndication'=>$statut, 'date_syndic'=>date('Y-m-d H:i:s')), "id_syndic=$now_id_syndic");
  68. // Aller chercher les donnees du RSS et les analyser
  69. include_spip('inc/distant');
  70. $rss = recuperer_page($url_syndic, true);
  71. if (!$rss)
  72. $articles = _T('avis_echec_syndication_02');
  73. else
  74. $articles = analyser_backend($rss, $url_syndic);
  75. // Renvoyer l'erreur le cas echeant
  76. if (!is_array($articles)) return $articles;
  77. // Les enregistrer dans la base
  78. $faits = array();
  79. foreach ($articles as $data) {
  80. inserer_article_syndique ($data, $now_id_syndic, $moderation, $url_site, $url_syndic, $row['resume'], $row['documents'], $faits);
  81. }
  82. // moderation automatique des liens qui sont sortis du feed
  83. if (count($faits) > 0) {
  84. $faits = sql_in("id_syndic_article", $faits, 'NOT');
  85. if ($row['miroir'] == 'oui') {
  86. sql_update('spip_syndic_articles', array('statut'=>"'off'", 'maj'=>'maj'), "id_syndic=$now_id_syndic AND $faits");
  87. }
  88. // suppression apres 2 mois des liens qui sont sortis du feed
  89. if ($row['oubli'] == 'oui') {
  90. sql_delete('spip_syndic_articles', "id_syndic=$now_id_syndic AND maj < DATE_SUB(NOW(), INTERVAL 2 MONTH) AND date < DATE_SUB(NOW(), INTERVAL 2 MONTH) AND $faits");
  91. }
  92. }
  93. // Noter que la syndication est OK
  94. sql_updateq("spip_syndic", array("syndication" => 'oui'), "id_syndic=$now_id_syndic");
  95. return false; # c'est bon
  96. }
  97. //
  98. // Insere un article syndique (renvoie true si l'article est nouveau)
  99. // en verifiant qu'on ne vient pas de l'ecrire avec
  100. // un autre item du meme feed qui aurait le meme link
  101. //
  102. // http://doc.spip.org/@inserer_article_syndique
  103. function inserer_article_syndique ($data, $now_id_syndic, $statut, $url_site, $url_syndic, $resume, $documents, &$faits) {
  104. // Creer le lien s'il est nouveau - cle=(id_syndic,url)
  105. // On coupe a 255 caracteres pour eviter tout doublon
  106. // sur une URL de plus de 255 qui exloserait la base de donnees
  107. $le_lien = substr($data['url'], 0,255);
  108. // si true, un lien deja syndique arrivant par une autre source est ignore
  109. // par defaut [false], chaque source a sa liste de liens, eventuellement
  110. // les memes
  111. define('_SYNDICATION_URL_UNIQUE', false);
  112. // Si false, on ne met pas a jour un lien deja syndique avec ses nouvelles
  113. // donnees ; par defaut [true] : on met a jour si le contenu a change
  114. // Attention si on modifie a la main un article syndique, les modifs sont
  115. // ecrasees lors de la syndication suivante
  116. define('_SYNDICATION_CORRECTION', true);
  117. // Chercher les liens de meme cle
  118. // S'il y a plusieurs liens qui repondent, il faut choisir le plus proche
  119. // (ie meme titre et pas deja fait), le mettre a jour et ignorer les autres
  120. $n = 0;
  121. $s = sql_select("id_syndic_article,titre,id_syndic,statut", "spip_syndic_articles",
  122. "url=" . sql_quote($le_lien)
  123. . (_SYNDICATION_URL_UNIQUE
  124. ? ''
  125. : " AND id_syndic=$now_id_syndic")
  126. ." AND " . sql_in('id_syndic_article', $faits, 'NOT'), "", "maj DESC");
  127. while ($a = sql_fetch($s)) {
  128. $id = $a['id_syndic_article'];
  129. $id_syndic = $a['id_syndic'];
  130. if ($a['titre'] == $data['titre']) {
  131. $id_syndic_article = $id;
  132. break;
  133. }
  134. $n++;
  135. }
  136. // S'il y en avait qu'un, le prendre quel que soit le titre
  137. if ($n == 1)
  138. $id_syndic_article = $id;
  139. // Si l'article n'existe pas, on le cree
  140. elseif (!isset($id_syndic_article)) {
  141. $ajout = $id_syndic_article = sql_insertq('spip_syndic_articles',
  142. array('id_syndic' => $now_id_syndic,
  143. 'url' => $le_lien,
  144. 'date' => date("Y-m-d H:i:s", $data['date'] ? $data['date'] : $data['lastbuilddate']),
  145. 'statut' => $statut));
  146. if (!$ajout) return;
  147. }
  148. $faits[] = $id_syndic_article;
  149. // Si le lien n'est pas nouveau, plusieurs options :
  150. if (!$ajout) {
  151. // 1. Lien existant : on corrige ou pas ?
  152. if (!_SYNDICATION_CORRECTION) {
  153. return;
  154. }
  155. // 2. Le lien existait deja, lie a un autre spip_syndic
  156. if (_SYNDICATION_URL_UNIQUE AND $id_syndic != $now_id_syndic)
  157. return;
  158. }
  159. // Descriptif, en mode resume ou mode 'full text'
  160. // on prend en priorite data['descriptif'] si on est en mode resume,
  161. // et data['content'] si on est en mode "full syndication"
  162. if ($resume != 'non') {
  163. // mode "resume"
  164. $desc = strlen($data['descriptif']) ?
  165. $data['descriptif'] : $data['content'];
  166. $desc = couper(trim_more(textebrut($desc)), 300);
  167. } else {
  168. // mode "full syndication"
  169. // choisir le contenu pertinent
  170. // & refaire les liens relatifs
  171. $desc = strlen($data['content']) ?
  172. $data['content'] : $data['descriptif'];
  173. $desc = liens_absolus($desc, $url_syndic);
  174. }
  175. // tags & enclosures (preparer spip_syndic_articles.tags)
  176. $tags = $data['enclosures'];
  177. # eviter les doublons (cle = url+titre) et passer d'un tableau a une chaine
  178. if ($data['tags']) {
  179. $vus = array();
  180. foreach ($data['tags'] as $tag) {
  181. $cle = supprimer_tags($tag).extraire_attribut($tag,'href');
  182. $vus[$cle] = $tag;
  183. }
  184. $tags .= ($tags ? ', ' : '') . join(', ', $vus);
  185. }
  186. // Mise a jour du contenu (titre,auteurs,description,date?,source...)
  187. $vals = array(
  188. 'titre' => $data['titre'],
  189. 'lesauteurs' => $data['lesauteurs'],
  190. 'descriptif' => $desc,
  191. 'lang'=> substr($data['lang'],0,10),
  192. 'source' => substr($data['source'],0,255),
  193. 'url_source' => substr($data['url_source'],0,255),
  194. 'tags' => $tags);
  195. // Mettre a jour la date si lastbuilddate
  196. if ($data['lastbuilddate'])
  197. $vals['date']= date("Y-m-d H:i:s", $data['lastbuilddate']);
  198. sql_updateq('spip_syndic_articles', $vals, "id_syndic_article=$id_syndic_article");
  199. // Point d'entree post_syndication
  200. pipeline('post_syndication',
  201. array(
  202. $le_lien,
  203. $now_id_syndic,
  204. $data,
  205. $ajout
  206. )
  207. );
  208. return $ajout;
  209. }
  210. /**
  211. * Nettoyer les contenus de flux qui utilisent des espaces insecables en debut
  212. * pour faire un retrait.
  213. * Peut etre sous la forme de l'entite &nbsp; ou en utf8 \xc2\xa0
  214. */
  215. function trim_more($texte){
  216. $texte = trim($texte);
  217. // chr(194)chr(160)
  218. $texte = preg_replace(",^(\s|(&nbsp;)|(\xc2\xa0))+,ums","",$texte);
  219. return $texte;
  220. }
  221. ?>