From aa3b8c3a6f56c9eb58e85fe2afd829b9bb874423 Mon Sep 17 00:00:00 2001 From: Fil Date: Fri, 29 May 2015 12:50:22 +0200 Subject: [PATCH] =?UTF-8?q?pour=20=C3=A9viter=20les=20doublons=20et=20bouc?= =?UTF-8?q?les=20infinies,=20on=20consid=C3=A8re=20TOUS=20les=20URLs=20pre?= =?UTF-8?q?sents=20dans=20un=20article=20syndiqu=C3=A9=20:=20que=20ce=20si?= =?UTF-8?q?t=20son=20adresse=20propre,=20ou=20des=20adresses=20citees=20da?= =?UTF-8?q?ns=20le=20contenu=20cf=20http://seenthis.net/messages/375002#me?= =?UTF-8?q?ssage375050?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- genie/seenthis_importer_flux.php | 279 ++++++++++++++++--------------- plugin.xml | 2 +- 2 files changed, 149 insertions(+), 132 deletions(-) diff --git a/genie/seenthis_importer_flux.php b/genie/seenthis_importer_flux.php index 6413dc9..f8027ee 100644 --- a/genie/seenthis_importer_flux.php +++ b/genie/seenthis_importer_flux.php @@ -41,61 +41,70 @@ function genie_seenthis_importer_flux($t){ function seenthis_importer_rss_article($article, $moi, $create=true) { include_spip('inc/charsets'); - $urlo = $article['url']; + $urls = array($article['url']); - # fixer les URLs - $urlo = sucrer_utm($urlo); + if (preg_match_all("/"._REG_URL."/ui", $article['content'], $regs)) { + $urls = array_merge($urls, $regs[0]); + } - // 'pmo' - $urlo = preg_replace( - ',^(http://www.piecesetmaindoeuvre.com/)spip.php\?article(\d+),', - '\1spip.php?page=resume&id_article=\2', $urlo); + foreach ($urls as $urlo) { + # fixer les URLs + $urlo = sucrer_utm($urlo); - // 'friendfeed' : - // purger les tags et le content (recuperer uniquement l'image si existe) - if (false !== strpos($article['item'], 'tag:friendfeed.com,')) { - $article['content'] = join("\n",extraire_balises($article['content'], 'img')); - $article['tags'] = array(); - } + // 'pmo' + $urlo = preg_replace( + ',^(http://www.piecesetmaindoeuvre.com/)spip.php\?article(\d+),', + '\1spip.php?page=resume&id_article=\2', $urlo); - // seenthis n'aime pas les / final : - $url = preg_replace(',/+$,', '', $urlo); - - # si l'url pointe un message local, il faut fav - if (preg_match(',^https?://(' - .preg_quote(_HOST).'/messages/(\d+)|' - .preg_quote(_SHORT_HOST).'/([a-f0-9]+)' - .'),', - $url, $r)) { - if ($r[3]) { # short - $id_me = base_convert($r[3],36,10); - } else { - $id_me = $r[2]; + // 'friendfeed' : + // purger les tags et le content (recuperer uniquement l'image si existe) + if (false !== strpos($article['item'], 'tag:friendfeed.com,')) { + $article['content'] = join("\n",extraire_balises($article['content'], 'img')); + $article['tags'] = array(); } - spip_log("$url local: $id_me", 'flux'); - } - else { - # Règles du jeu : - # 1. si un lien est deja en base mais dans un message - # effacé nous appartenant, on ne fait rien : cela permet - # de supprimer a la main un message ajouté par le rss, sans - # qu'il ne reviennent bégayer... - # 2. si un lien existe et appartient à quelqu'un d'autre, - # on le partage, sauf si on a bloqué la personne - $q = 'SELECT t.id_me,m.id_auteur - FROM spip_me_tags AS t - INNER JOIN spip_me AS m ON t.uuid=m.uuid AND t.tag='.sql_quote($url); - # auteurs que je bloque / ou que je follow - if ($block = sql_allfetsel('id_auteur', 'spip_me_block', 'id_block='.$moi['id_auteur'])) { - $b = array(); - foreach($block as $k) - $b[] = $k['id_auteur']; - $q .= ' WHERE '.sql_in('m.id_auteur', $b, 'NOT'); + + // seenthis n'aime pas les / final : + $url = preg_replace(',/+$,', '', $urlo); + + # si l'url pointe un message local, il faut fav + if (preg_match(',^https?://(' + .preg_quote(_HOST).'/messages/(\d+)|' + .preg_quote(_SHORT_HOST).'/([a-f0-9]+)' + .'),', + $url, $r)) { + if ($r[3]) { # short + $id_me = base_convert($r[3],36,10); + } else { + $id_me = $r[2]; + } + spip_log("$url local: $id_me", 'flux'); } - if ($deja = sql_fetch(sql_query($q))) { - # $deja = array (id_me => id_me, id_auteur => id_auteur) - $id_me = $deja['id_me']; + else { + # Règles du jeu : + # 1. si un lien est deja en base mais dans un message + # effacé nous appartenant, on ne fait rien : cela permet + # de supprimer a la main un message ajouté par le rss, sans + # qu'il ne reviennent bégayer... + # 2. si un lien existe et appartient à quelqu'un d'autre, + # on le partage, sauf si on a bloqué la personne + $q = 'SELECT t.id_me,m.id_auteur + FROM spip_me_tags AS t + INNER JOIN spip_me AS m ON t.uuid=m.uuid AND t.tag='.sql_quote($url); + # auteurs que je bloque / ou que je follow + if ($block = sql_allfetsel('id_auteur', 'spip_me_block', 'id_block='.$moi['id_auteur'])) { + $b = array(); + foreach($block as $k) + $b[] = $k['id_auteur']; + $q .= ' WHERE '.sql_in('m.id_auteur', $b, 'NOT'); + } + if ($deja = sql_fetch(sql_query($q))) { + # $deja = array (id_me => id_me, id_auteur => id_auteur) + $id_me = $deja['id_me']; + } } + + // le premier URL qui trouve un message arrete la boucle + if ($id_me) break; } # si rien, on cree @@ -104,7 +113,6 @@ function seenthis_importer_rss_article($article, $moi, $create=true) { spip_log("Ne pas creer ($url)", 'flux'); return 0; } - include_spip('inc/uuid'); $uuid = UUID::getuuid($moi['id_auteur'].$url); @@ -114,91 +122,13 @@ function seenthis_importer_rss_article($article, $moi, $create=true) { return 0; } - $message = $article['titre']."\n".'[@@@@@@]'; - if (strlen($desc = $article['descriptif']) - OR strlen($desc = $article['content'])) { - - if (!$image - AND $img = extraire_balise($desc, 'img') - AND $img = extraire_attribut($img, 'src') - AND preg_match(',^https?://.*(jpe?g|gif|png)$,i', $img)) { - $image = str_replace(' ', '+', $img); - } - - $desc = supprimer_tags($desc); - $desc = preg_replace(',The post .* appeared first on.*$,', '', $desc); - $desc = couper($desc,800); - $desc = str_replace(' ', ' ', $desc); - $desc = preg_replace(', +,', ' ', $desc); - - } - - if ($desc) - $message .= "\n\n❝".$desc."❞"; - - if (is_array($article['tags'])) { - $tags = array(); - # tags a ignorer - $censure = array_map('mb_strtolower', array_map('trim', file(find_in_path('tags_ignore.txt')))); - foreach ($article['tags'] as $tag) { - $rel = extraire_attribut($tag, 'rel'); - if (strstr(",tag,directory,", ",$rel,") - AND $tag = seenthis_nettoyer_tag($tag) - AND !in_array(translitteration(mb_strtolower($tag)), $censure) - ) { - $bt = '/(^|\s)'.str_replace('_', '[ _]', preg_quote($tag)).'\b/i'; - if (preg_match($bt, $message)) { - $message = preg_replace($bt, '\1#'.$tag, $message, 1); - $message = str_replace('##', '#', $message); - } - else - $tags[] = "#".$tag; - } - else - // les enclosures sont affichees sous forme de lien brut - if (strstr(",enclosure,external,", ",$rel,") - AND $href = extraire_attribut($tag, 'href')) - $tags[] = "\n".$href; - } - foreach (extraire_balises($article['enclosures'],'a') as $enc) { - $rel = extraire_attribut($enc, 'rel'); - if (strstr(",enclosure,external,", ",$rel,") - AND $href = extraire_attribut($enc, 'href') - AND $href != $url # enclosure <> adresse de l'article - AND false === strpos($message, $href)) # enclosure n'est pas dans le descriptif - $tags[] = "\n".$href; - } - } - if ($tags) $message = trim($message."\n".trim(join(' ',array_unique($tags)))); - - $message = unicode_to_utf_8( - html_entity_decode( - preg_replace('/&([lg]t;)/S', '&\1', charset2unicode($message)), - ENT_NOQUOTES, 'utf-8') - ); - - $message = str_replace( - array(''', ''', '"', '"'), - array("'" , "'" , '"' , '"' ), - $message); - - if ($image) - $urlo .= "\n\n$image"; - - - // cas particulier : syndiquer une instance de seenthis sur une autre - if (preg_match(',/messages/\d+$,', $url)) { - $message = $article['descriptif']."\n\n[@@@@@@]"; - if ($via = trim(preg_replace('/[(]@[^()]+[)]/', '', $article['lesauteurs']))) - $message .= " via $via"; - } - - $message = str_replace('[@@@@@@]', $urlo, $message); - + $message = seenthis_creer_message_local($article); spip_log("creation $uuid $message",'flux'); - if (strlen($message)) + if (strlen($message)) { instance_me($moi['id_auteur'], $message, $id_me=0, $id_parent=0, $time="NOW()", $uuid); + } return 2; + } // on a trouvé un message : @@ -224,6 +154,93 @@ function seenthis_importer_rss_article($article, $moi, $create=true) { return 1; } + +function seenthis_creer_message_local($article) { + $message = $article['titre']."\n".'[@@@@@@]'; + if (strlen($desc = $article['descriptif']) + OR strlen($desc = $article['content'])) { + + if (!$image + AND $img = extraire_balise($desc, 'img') + AND $img = extraire_attribut($img, 'src') + AND preg_match(',^https?://.*(jpe?g|gif|png)$,i', $img)) { + $image = str_replace(' ', '+', $img); + } + + $desc = supprimer_tags($desc); + $desc = preg_replace(',The post .* appeared first on.*$,', '', $desc); + $desc = couper($desc,800); + $desc = str_replace(' ', ' ', $desc); + $desc = preg_replace(', +,', ' ', $desc); + + } + + if ($desc) + $message .= "\n\n❝".$desc."❞"; + + if (is_array($article['tags'])) { + $tags = array(); + # tags a ignorer + $censure = array_map('mb_strtolower', array_map('trim', file(find_in_path('tags_ignore.txt')))); + foreach ($article['tags'] as $tag) { + $rel = extraire_attribut($tag, 'rel'); + if (strstr(",tag,directory,", ",$rel,") + AND $tag = seenthis_nettoyer_tag($tag) + AND !in_array(translitteration(mb_strtolower($tag)), $censure) + ) { + $bt = '/(^|\s)'.str_replace('_', '[ _]', preg_quote($tag)).'\b/i'; + if (preg_match($bt, $message)) { + $message = preg_replace($bt, '\1#'.$tag, $message, 1); + $message = str_replace('##', '#', $message); + } + else + $tags[] = "#".$tag; + } + else + // les enclosures sont affichees sous forme de lien brut + if (strstr(",enclosure,external,", ",$rel,") + AND $href = extraire_attribut($tag, 'href')) + $tags[] = "\n".$href; + } + foreach (extraire_balises($article['enclosures'],'a') as $enc) { + $rel = extraire_attribut($enc, 'rel'); + if (strstr(",enclosure,external,", ",$rel,") + AND $href = extraire_attribut($enc, 'href') + AND $href != $url # enclosure <> adresse de l'article + AND false === strpos($message, $href)) # enclosure n'est pas dans le descriptif + $tags[] = "\n".$href; + } + } + if ($tags) $message = trim($message."\n".trim(join(' ',array_unique($tags)))); + + $message = unicode_to_utf_8( + html_entity_decode( + preg_replace('/&([lg]t;)/S', '&\1', charset2unicode($message)), + ENT_NOQUOTES, 'utf-8') + ); + + $message = str_replace( + array(''', ''', '"', '"'), + array("'" , "'" , '"' , '"' ), + $message); + + if ($image) + $urlo .= "\n\n$image"; + + + // cas particulier : syndiquer une instance de seenthis sur une autre + if (preg_match(',/messages/\d+$,', $url)) { + $message = $article['descriptif']."\n\n[@@@@@@]"; + if ($via = trim(preg_replace('/[(]@[^()]+[)]/', '', $article['lesauteurs']))) + $message .= " via $via"; + } + + $message = str_replace('[@@@@@@]', $urlo, $message); + + return $message; +} + + function seenthis_nettoyer_tag($tag) { $tag = unicode2charset(charset2unicode(supprimer_tags($tag))); $tag = preg_replace('/�?39;/', "'", $tag); diff --git a/plugin.xml b/plugin.xml index 138583a..514d3ba 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,7 +1,7 @@ Seenthis Importer flux RSS des auteurs Fil - 1.0.4 + 1.0.5 stable Importation de flux RSS par les auteurs de Seenthis