Annonce

  •  » Plugins
  •  » Module de tri automatique

#1 2007-11-06 23:46:19

gandalf76fr
Membre
Paris
2006-11-02
7

Module de tri automatique

Bonjour,

utilisant phpwebgallery pour une galerie photo de ma fille a destination de ma famille éloignée de près de 1000km de nous et y mettant beaucoup de photos (près de 2000 en 2 ans et demi) je me suis vite confronté à un problème de tri :
A l'origine, je seletionnais les photos que je souhaitais mettre en ligne les réduisait à une taille adéquate au web, les renommait manuellement sous la forme Nom-du-jour_chiffre-du-jour_mois_annee.jpg puis les plaçait dans une arborescence de dossiers adéquates pour enfin les uploader, créer les miniatures et enfin synchroniser la base à l'aide du panneau d'admin).

Hélas avec plus de 4000 photos prises dont près de 2000 publiées ce travail est devenu vite assez fastidieux, très chronophage et accumula beaucoup de retard au fur et à mesure.

De plus attendant un heureux évènement pour mars et ayant une charge professionnelle qui ne va pas en diminuant cela risquait de devenir de pire en pire.

J'ai donc décider de "perdre" un peu de temps pour en gagner beaucoup : j'ai développé un script de tri "automatique" selon mes critères : renommage du fichier en "nom-du-fichier_jour-de-la-semaine_nb-du-jour-de-la-semaine_mois_annee.jpg", création des répertoires annee, mois, jours et thumbnail. Enfin génération des vignettes à la volée.

Ce script est actuelement fonctionnel bien que TRES rudimentaire. Je le fais tourner sans soucis sur un serveur dédié ou il arrive à traiter 2000 photos en 15mins avec environ 60% de conso CPU.

Je me dis que bien que ce besoins étant très précis et particulier, que ce script ne s'adresse pas à tout le monde, je vais vous le proposer afin que les parents ayant le même soucis que moi et les mêmes besoins puissent gagner un peu de temps.

Je vous invite à poster ici vos critiques, commentaires, demandes d'évolutions car je suis ok pour éventuelement retravailler un peu dessus.

Comment il marche :
Il prend les fichiers.jgp du dossier a_trier (qu'il faut creer et uploader vos photos dedans).
Il met les fichiers qu'il n'as pas put traiter dans un dossier "en_erreur" (a creer)
Vous mettez le code php qui suit dans un fichier à la racine du site puis vous appelez avec votre navigateur ce fichier (par ex. http://www.mosite.com/trie.php)
Il va traiter les photos par lots de 30 et la page va s'auto appeler jusqu'a ce que je repertoire à trier soit vide.
Voici le code :

Code:

<?php
//error_reporting(E_ALL);
function get_extension($fichier)
{
  $extArray = explode(".", $fichier);
  $extension = $extArray[count($extArray) - 1]; 
  return strtolower($extension);
}
function get_date($img)
{
if(in_array(strtolower(end(explode('.', $img))), array('jpg', 'jpeg', 'tif', 'tiff'))) // Si fichier Jpeg ou Tiff
    {
      if($exif = exif_read_data($img, 'EXIF' , true)) // Si le fichier $img contient des infos Exif
      {
      foreach ($exif as $key => $section) // On parcourt la première partie du tableau multidimensionnel
      {      
          foreach ($section as $name => $value) // On parcourt la seconde partie
          {
              $exif_tab[$name] .= $value; // Récupération des valeurs dans le tableau $exif_tab
          }
      }
      }
      if($exif_tab['DateTimeOriginal'])
      {
        $date = $exif_tab['DateTimeOriginal']; // Date de la prise de vue (heure de l'appareil)
      // La date est d'un format spécial, on va donc la rendre lisible
      $date = substr_replace($date, '-',4,1);
      $date = substr_replace($date, '-',7,1);
      $tab_month = array(1=>"Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre");
      $tab_day = array("Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi");
      $tab_date = explode(' ', $date);
      $tab_dmy = explode('-', $tab_date[0]);
      $day = date("w", mktime(0, 0, 0, $tab_dmy[1], $tab_dmy[2], $tab_dmy[0]));
      settype($tab_dmy[1], integer);
      $jour_nom=$tab_day[$day];
      $jour_num=$tab_dmy[2];
      $mois=$tab_month[$tab_dmy[1]];
      $annee=$tab_dmy[0];
      $date=$jour_nom.'_'.$jour_num.'_'.$mois.'_'.$annee.'_';
      $result = array("date"=>$date, "annee"=>$annee, "mois"=>$mois, "jour_num"=>$jour_num, "jour_nom"=>$jour_nom);
      return $result;
      }
    }
}
function miniature($dest,$img_finale,$rep_tn_finale,$tn_finale)
{
if (isset($dest) && !empty($dest) && isset($img_finale) && !empty($img_finale) && isset($rep_tn_finale) && !empty($rep_tn_finale) && isset($tn_finale) && !empty($tn_finale))
{
$thumb_largeur_max = 128;
$thumb_hauteur_max = 128;
$srcImage = imagecreatefromjpeg($dest.$img_finale);
      $srcWidth    = imagesx( $srcImage ); 
      $srcHeight   = imagesy( $srcImage ); 
      $ratioWidth  = $srcWidth/$thumb_largeur_max;
      $ratioHeight = $srcHeight/$thumb_hauteur_max;
      if ( ( $ratioWidth > 1 ) or ( $ratioHeight > 1 ) )
          {
            if ( $ratioWidth < $ratioHeight)
            { 
              $destWidth = $srcWidth/$ratioHeight;
              $destHeight = $thumb_hauteur_max; 
            }
            else
            { 
              $destWidth = $thumb_largeur_max; 
              $destHeight = $srcHeight/$ratioWidth;
            }
          }
      else
      {
       $destWidth = $srcWidth;
       $destHeight = $srcHeight;
      }
      $destImage = imagecreatetruecolor( $destWidth, $destHeight);
      imagecopyresampled( $destImage, $srcImage, 0, 0, 0, 0,$destWidth,$destHeight,$srcWidth,$srcHeight );
      if(!is_dir($rep_tn_finale))
      {
      mkdir($rep_tn_finale, 0755);
      chmod($rep_tn_finale, 0755); 
      }
      imagejpeg($destImage, $tn_finale);
}
}
$rep = "a_trier/";
$rep_dest = "galleries/";
$rep_erreur="en_erreur/";
$entree = opendir($rep);
$entree_erreur = opendir($rep_erreur);
$compteur_lot = 0;
while (($file = readdir($entree)) !== false && $compteur_lot <= 30)
{
  if (is_file($rep.$file) && $file !="." && $file !=".." && get_extension($file) == 'jpg')
  {
    $img=$rep.$file;
    $file=str_replace(' ','',$file);
    $retour= get_date($img);
    $date=$retour[date];
    $annee=$retour[annee];
    $mois=$retour[mois];
    $jour_num=$retour[jour_num];
    $jour_nom=$retour[jour_nom];
    if (empty($annee) OR empty($mois) OR empty($jour_num) OR empty($jour_nom))
    {
      rename($img,$rep_erreur.$file);
    }
    else
    {
      $date=$retour[date];
      $annee=$retour[annee];
      $mois=$retour[mois];
      $jour_num=$retour[jour_num];
      $jour_nom=$retour[jour_nom];
      $dest=$rep_dest.$annee.'/'.$mois.'/'.$jour_num.'/';
      if(!is_dir($rep_dest.$annee.'/'))
      {
      mkdir($rep_dest.$annee.'/', 0755);
      chmod($rep_dest.$annee.'/', 0755);      
      }
      if(!is_dir($rep_dest.$annee.'/'.$mois.'/'))
      {
      mkdir($rep_dest.$annee.'/'.$mois.'/', 0755);
      chmod($rep_dest.$annee.'/'.$mois.'/', 0755); 
      }
      if(!is_dir($rep_dest.$annee.'/'.$mois.'/'.$jour_num.'/'))
      {
      mkdir($rep_dest.$annee.'/'.$mois.'/'.$jour_num.'/', 0755);
      chmod($rep_dest.$annee.'/'.$mois.'/'.$jour_num.'/', 0755); 
      }
      $img_finale=$file.'_'.$date.'.jpg';
      $rep_tn_finale=$dest.'/thumbnail/';
      $tn_finale=$rep_tn_finale.'TN-'.$file.'_'.$date.'.jpg';
      rename($img,$dest.$img_finale);
      miniature($dest,$img_finale,$rep_tn_finale,$tn_finale);
      unset($exif_tab);
      sleep(0.5);
    }
  }
  $compteur_lot++;
}
if ($compteur_lot > 30)
{
  echo "<script language='javascript'>document.location.href='".$_SERVER['PHP_SELF']."';</script>";
}
else
{
  echo "Traitement terminé :<br />";
  echo "Fichiers en erreur :";
  echo '<table>';
  while (($file = readdir($entree_erreur)) !== false) 
  {
    if (is_file($rep_erreur.$file) && $file !="." && $file !="..")
    {
      echo '<tr>';
      echo '<td><a href="'.$rep_erreur.$file.'">'.$rep_erreur.$file.'</a></td>';
      echo '</tr>';
    }
  }
  echo '</table>';
}
?>

En gros :
créer un répertoire "a_trier" chmod 755.
créer un répertoire "en_erreur" chmod 755.
créer un fichier trie.php à la racine du site et copiez y le code ci dessus.

Testé sur un serveur dédié (P4 3ghz, 512 ram) avec apache2, php5, suphp... (15 mins environ de traitement pour 1972 photos jpg en 1024/768)

Pas de problème de dépassement de max exécution time grâce au rafraichissement auto de la page.

Autres sites du serveur entièrement visibles sans latence particulières (à éviter je pense quand même sur des serveurs chargés).

Faire attention : Se script se basant sur les infos exifs des images, il donnera des résultats abérant sur des photos venant d'APN non à l'heure ou sur des EXIFS corrompus.

Dernière modification par gandalf76fr (2007-11-07 00:28:55)


Tout ce qui ne nous tue pas nous rend plus fort.
DAR Saint Louis

Hors ligne

#2 2007-11-07 10:22:26

mathiasm
Former Piwigo Team
2006-02-06
2692

Re: Module de tri automatique

ça peut servir.
je déplace dans extensions.

Hors ligne

  •  » Plugins
  •  » Module de tri automatique

Pied de page des forums

Propulsé par FluxBB

github twitter newsletter Faire un don Piwigo.org © 2002-2024 · Contact