Ignore:
Timestamp:
Sep 26, 2018, 2:02:29 PM (3 months ago)
Author:
marcimat@…
Message:

Amélioration de la commande image:verifier:extension.
On utilise pour tester plus rapidement le mime type (on divise le temps par 10) la fonction getImageSize() ;
On utilise file $f uniquement si le mime ne correspond pas (ce qui est assez rare finalement), pour avoir une description complete du contenu du fichier.

On propose une option --supprimer qui permet de supprimer les fichiers en erreur *qui ne sont pas* dans la médiathèque (dans spip_documents).
Cette option passe après les réparations (lorsque --reparer --supprimer sont présents), de sorte que ça ne supprimera que les fichiers que l’on n’a pas réussi à réparer.
Typiquement des fichiers de 0 octets, ou des images TIFF dans des .jpg ou .png…

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _outils_/spip-cli/trunk/src/Command/ImagesVerifierExtensions.php

    r111669 r111691  
    1010
    1111class ImagesVerifierExtensions extends Command {
     12
     13        protected $mimes = [
     14                'jpg' => 'image/jpeg',
     15                'png' => 'image/png',
     16                'gif' => 'image/gif',
     17        ];
    1218
    1319        protected $requirements = [
     
    3238                        ->addOption('extension', null, InputOption::VALUE_OPTIONAL, 'Uniquement cette extension. Choix : jpg, png, gif')
    3339                        ->addOption('reparer', null, InputOption::VALUE_NONE, 'Tente de réparer le format')
     40                        ->addOption('supprimer', null, InputOption::VALUE_NONE, 'Supprime les documents en erreur s’ils ne sont pas connus dans la médiathèque')
    3441                        ->addUsage("")
    3542                        ->addUsage("--logos --extension=jpg")
     
    3845                        ->addUsage("--logos --reparer")
    3946                        ->addUsage("--documents --reparer")
     47                        ->addUsage("--documents --reparer --supprimer")
    4048                ;
    4149        }
     
    6472
    6573                $reparer = $input->getOption('reparer');
     74                $supprimer = $input->getOption('supprimer');
    6675
    6776                foreach ($extensions as $extension) {
     
    7887                                }
    7988                                if ($errors) {
    80                                         $this->verifier_fichiers_en_base(array_keys($errors));
     89                                        $errors = $this->verifier_fichiers_en_base(array_keys($errors));
     90                                        if ($errors and $supprimer) {
     91                                                $this->effacer_fichiers($errors);
     92                                        }
    8193                                }
    8294                        }
     
    131143
    132144        function verifier_fichier($file, $extension) {
     145                // Version rapide, si ça matche
     146                // Sinon, on attrape plus d’infos avec `file`.
     147                if ($info = @getimagesize($file)) {
     148                        $mime = image_type_to_mime_type($info[2]);
     149                        if ($mime === $this->mimes[$extension]) {
     150                                return [true, $mime];
     151                        }
     152                }
    133153                $infos = `file {$file}`;
    134154                $ok = (false !== strpos($infos, $this->requirements[$extension]));
     
    278298        protected function verifier_fichiers_en_base($files) {
    279299                $base = $this->getDataDirectory();
    280                 $_files = array_map(function($file) use ($base) {
     300                $absents = array_map(function($file) use ($base) {
    281301                        return substr($file, strlen($base));
    282302                }, $files);
     
    284304                $presents = sql_allfetsel('id_document, fichier', 'spip_documents', sql_in('fichier', $_files));
    285305                if ($presents) {
    286                         $presents = array_column($presents, 'fichier');
    287                         $_files = array_diff($_files, $presents);
    288                 }
    289 
    290                 if ($_files) {
     306                        $absents = array_diff($absents, array_column($presents, 'fichier'));
     307                }
     308
     309                if ($absents) {
    291310                        $this->io->text("<info>Fichiers absents dans spip_documents :</info>");
    292311                        $this->io->text("Ils peuvent peut être être supprimés du coup…");
    293                         $this->io->listing(array_map(function($file) { return "<comment>$file</comment>"; }, $_files));
     312                        $this->io->listing(array_map(function($file) {
     313                                return "<comment>$file</comment>";
     314                        }, $absents));
    294315                } else {
    295316                        $this->io->text("Tous les fichiers en erreur sont présents dans spip_documents.");
    296                 }
    297                 return $files;
     317                        $this->io->text("");
     318                }
     319                if ($presents) {
     320                        $this->io->text("<info>Fichiers présents dans spip_documents :</info>");
     321                        $this->io->listing(array_map(function($row) {
     322                                return "<comment>{$row['fichier']}</comment> : n° {$row['id_document']}";
     323                        }, $presents));
     324                }
     325
     326                // remettre le chemin complet
     327                $absents = array_map(function($file) use ($base) {
     328                        return $base . $file;
     329                }, $absents);
     330
     331                return $absents;
     332        }
     333
     334        function effacer_fichiers($fichiers) {
     335                $fichiers = array_filter($fichiers);
     336                $this->io->text("Effacer " . count($fichiers) . " fichiers");
     337                foreach ($fichiers as $fichier) {
     338                        $name = substr($fichier, strlen($this->getDataDirectory()));
     339                        if (strpos($fichier, $this->getDataDirectory()) === 0) {
     340                                unlink($fichier);
     341                                if (file_exists($fichier)) {
     342                                        $this->io->fail($name);
     343                                } else {
     344                                        $this->io->check($name);
     345                                }
     346                        } else {
     347                                $this->io->care("<comment>$name</comment> : Fichier ignoré (hors IMG)");
     348                        }
     349                }
    298350        }
    299351}
Note: See TracChangeset for help on using the changeset viewer.