diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..de27207 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,15 @@ +# Ce qui ne descend pas chez le consommateur du package. +# +# Composer installe depuis l'archive « dist » que GitHub génère en respectant +# export-ignore : ces fichiers restent sur GitHub — la CI et les contributeurs +# les ont — mais n'alourdissent pas un `composer require`. +# +# Vérifier avant publication : composer archive --format=zip +/.github/ export-ignore +/tests/ export-ignore +/bin/ export-ignore +/.gitattributes export-ignore +/.gitignore export-ignore +/phpunit.dist.xml export-ignore + +# LICENSE et README restent : ils font partie de ce qu'on publie. diff --git a/bin/extract-local.php b/bin/extract-local.php new file mode 100644 index 0000000..4ca87ce --- /dev/null +++ b/bin/extract-local.php @@ -0,0 +1,87 @@ + is_file($p) + && !str_contains($p, '/output/') + && !str_ends_with(strtolower($p), '.jpg'), +); + +if ([] === $files) { + echo "Aucun RAW dans {$inputDir}.\n"; + echo "Dépose-y tes fichiers (ils sont git-ignorés), puis relance.\n"; + exit(0); +} + +$extractor = RawPreviewExtractor::createDefault(); +$ok = 0; +$failed = 0; + +printf("%-28s %-12s %-11s %9s %8s\n", 'FICHIER', 'FORMAT', 'DIMENSIONS', 'TAILLE', 'DURÉE'); +echo str_repeat('─', 74), "\n"; + +foreach ($files as $path) { + $name = basename($path); + $start = microtime(true); + + try { + $preview = $extractor->extract($path); + $elapsed = (microtime(true) - $start) * 1000; + + $target = $outputDir . '/' . pathinfo($name, PATHINFO_FILENAME) . '.jpg'; + file_put_contents($target, $preview->jpegData); + + printf( + "✅ %-25s %-12s %5dx%-5d %6.0f Ko %5.0f ms\n", + $name, + $preview->sourceFormat->name, + $preview->width, + $preview->height, + strlen($preview->jpegData) / 1024, + $elapsed, + ); + + // Validation croisée : GD relit-il ce que nous avons extrait ? + if (false === @getimagesizefromstring($preview->jpegData)) { + echo " ⚠️ GD ne parvient pas à relire ce JPEG\n"; + } + + ++$ok; + } catch (RawPreviewExtractorException $e) { + printf("❌ %-25s %s\n", $name, (new ReflectionClass($e))->getShortName()); + printf(" %s\n", $e->getMessage()); + ++$failed; + } +} + +echo str_repeat('─', 74), "\n"; +printf("%d extraite(s), %d échec(s) — vignettes dans %s\n", $ok, $failed, $outputDir); + +exit($failed > 0 ? 1 : 0);