1
0
Fork 0
mirror of https://github.com/wallabag/wallabag.git synced 2025-09-15 18:57:05 +00:00

Ajout fonction pour archiver les images

Ajout de plusieurs fonctions au fichier function.php et modification de
l'index.php pour prendre en compte ces ajouts.
- Lors de l'ajout d'un lien, on extrait les urls absolues des images,
qu'on télécharge et stocke dans un répertoire, on remplace ensuite les
urls externes dans le "content', par des urls pointant sur ce même
répertoire.
- Lors de la suppression d'un lien, on supprime le répertoire également.
This commit is contained in:
PeaceCopathe 2013-04-15 23:39:25 +02:00
parent 1474dfbbdb
commit 7144cb9dc7
2 changed files with 113 additions and 11 deletions

View file

@ -89,7 +89,7 @@ function get_external_file($url)
/** /**
* Préparation de l'URL avec récupération du contenu avant insertion en base * Préparation de l'URL avec récupération du contenu avant insertion en base
*/ */
function prepare_url($url) function prepare_url($url,$id)
{ {
$parametres = array(); $parametres = array();
$url = html_entity_decode(trim($url)); $url = html_entity_decode(trim($url));
@ -110,20 +110,112 @@ function prepare_url($url)
$r = new Readability($html, $url); $r = new Readability($html, $url);
if($r->init()) if($r->init())
{ {
$title = $r->articleTitle->innerHTML; $content = $r->articleContent->innerHTML;
$parametres['title'] = $r->articleTitle->innerHTML;
$parametres['content']=filtre_img($content, $url, $id);
return $parametres;
} }
} }
$parametres['title'] = $title; return False;
$parametres['content'] = $r->articleContent->innerHTML;
return $parametres;
} }
function filtre_img($content, $url, $id)
{
$matches = array();
preg_match_all('#<\s*(img)[^>]+src="([^"]*)"[^>]*>#Si', $content, $matches, PREG_SET_ORDER);
foreach($matches as $i => $link)
{
$link[1] = trim($link[1]);
// ne conserve que les liens ne commençant pas par un protocole « protocole:// » ni par une ancre « # »
if (!preg_match('#^(([a-z]+://)|(\#))#', $link[1]) )
{
//on récupere le chemin absolu pour télécharger l'image.
$absolutePath=rel2abs($link[2],$url);
//on récupére le nom du fichier uniquement
$nameFileUrl = basename(parse_url($absolutePath,PHP_URL_PATH));
//on sauvegarde l'image
$rep=makeArchiveRep($id);
$fullpath = $rep.'/'.$nameFileUrl;
archiveImage($absolutePath,$fullpath);
// on remplace le lien originel, par le nouveau lien du dossier local.
$content = str_replace($matches[$i][2], $fullpath, $content);
}
}
return $content;
}
//renvoie le lien absolu
function rel2abs($lien_rel, $url)
{
/* return if already absolute URL */
if (parse_url($lien_rel, PHP_URL_SCHEME) != '') return $lien_rel;
/* queries and anchors */
if ($lien_rel[0]=='#' || $lien_rel[0]=='?') return $url.$lien_rel;
/* parse base URL and convert to local variables:
$scheme, $host, $path */
extract(parse_url($url));
/* remove non-directory element from path */
$path = preg_replace('#/[^/]*$#', '', $path);
/* destroy path if relative url points to root */
if ($lien_rel[0] == '/') $path = '';
/* dirty absolute URL */
$abs = "$host$path/$lien_rel";
/* replace '//' or '/./' or '/foo/../' with '/' */
$re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#');
for($n=1; $n>0; $abs=preg_replace($re, '/', $abs, -1, $n)) {}
/* absolute URL is ready! */
return $scheme.'://'.$abs;
}
//archive les images en provenance du site
function archiveImage($img_absolue,$fullpath)
{
$rawdata=get_external_file($img_absolue);
if(file_exists($fullpath))
{
unlink($fullpath);
}
$fp = fopen($fullpath,'x');
fwrite($fp, $rawdata);
fclose($fp);
}
// crée un répertoire unique par lien, pour archiver les images.
function makeArchiveRep($rep)
{
$exterPath=ABS_PATH;
if(!is_dir($exterPath)){mkdir($exterPath,0705);}
$exterPathRep=$exterPath.$rep;
if(!is_dir($exterPathRep)){mkdir($exterPathRep,0705);}
return $exterPathRep;
}
//supprime le répertoire si on supprime le lien.
function delArchiveRep($rep)
{
$files = array_diff(scandir($rep), array('.','..'));
foreach ($files as $file) {
(is_dir("$rep/$file")) ? delTree("$rep/$file") : unlink("$rep/$file");
}
return rmdir($rep);
}
/** /**
* Appel d'une action (mark as fav, archive, delete) * Appel d'une action (mark as fav, archive, delete)
*/ */
function action_to_do($action, $id) function action_to_do($action, $url,$id)
{ {
global $db; global $db;
@ -132,12 +224,22 @@ function action_to_do($action, $id)
case 'add': case 'add':
if ($url == '') if ($url == '')
continue; continue;
//on crée un id
$req = $db->getHandle()->query("SELECT id FROM entries ORDER BY id DESC");
$id = $req->fetchColumn()+1;
$parametres_url = prepare_url($url); if($parametres_url = prepare_url($url, $id))
$sql_action = 'INSERT INTO entries ( url, title, content ) VALUES (?, ?, ?)'; {
$params_action = array($url, $parametres_url['title'], $parametres_url['content']); $sql_action = 'INSERT INTO entries ( id, url, title, content ) VALUES (?,?, ?, ?)';
$params_action = array($id,$url, $parametres_url['title'], $parametres_url['content']);
}
else
{
continue;
}
break; break;
case 'delete': case 'delete':
delArchiveRep(ABS_PATH.$id);
$sql_action = "DELETE FROM entries WHERE id=?"; $sql_action = "DELETE FROM entries WHERE id=?";
$params_action = array($id); $params_action = array($id);
break; break;

View file

@ -15,7 +15,7 @@ $view = (isset ($_GET['view'])) ? htmlspecialchars($_GET['view']) : 'index';
$id = (isset ($_GET['id'])) ? htmlspecialchars($_GET['id']) : ''; $id = (isset ($_GET['id'])) ? htmlspecialchars($_GET['id']) : '';
$url = (isset ($_GET['url'])) ? $_GET['url'] : ''; $url = (isset ($_GET['url'])) ? $_GET['url'] : '';
action_to_do($action, $id); action_to_do($action, $url, $id);
$entries = display_view($view); $entries = display_view($view);
$tpl->assign('title', 'poche, a read it later open source system'); $tpl->assign('title', 'poche, a read it later open source system');