Skip to content

Commit

Permalink
pour éviter les doublons et boucles infinies, on considère TOUS les U…
Browse files Browse the repository at this point in the history
…RLs presents dans un article syndiqué : que ce sit son adresse propre, ou des adresses citees dans le contenu

cf http://seenthis.net/messages/375002#message375050
  • Loading branch information
Fil committed May 29, 2015
1 parent 3c0857c commit aa3b8c3
Show file tree
Hide file tree
Showing 2 changed files with 149 additions and 132 deletions.
279 changes: 148 additions & 131 deletions genie/seenthis_importer_flux.php
Expand Up @@ -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'], '<id>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'], '<id>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
Expand All @@ -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);

Expand All @@ -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('&nbsp;', ' ', $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', '&amp;\1', charset2unicode($message)),
ENT_NOQUOTES, 'utf-8')
);

$message = str_replace(
array('&#39;', '&#039;', '&#34;', '&#034;'),
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 :
Expand All @@ -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('&nbsp;', ' ', $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', '&amp;\1', charset2unicode($message)),
ENT_NOQUOTES, 'utf-8')
);

$message = str_replace(
array('&#39;', '&#039;', '&#34;', '&#034;'),
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('/&#0?39;/', "'", $tag);
Expand Down
2 changes: 1 addition & 1 deletion plugin.xml
@@ -1,7 +1,7 @@
<plugin>
<nom>Seenthis Importer flux RSS des auteurs</nom>
<auteur>Fil</auteur>
<version>1.0.4</version>
<version>1.0.5</version>
<etat>stable</etat>
<description>
Importation de flux RSS par les auteurs de Seenthis
Expand Down

0 comments on commit aa3b8c3

Please sign in to comment.