✅ Fixed bulk conversion getting stuck on missing files ✅ Added robust error handling and timeout protection ✅ Improved JavaScript response parsing ✅ Added file existence validation ✅ Fixed missing PHP class imports ✅ Added comprehensive try-catch error recovery 🔧 Key fixes: - File existence checks before conversion attempts - 30-second timeout protection per file - Graceful handling of 500 errors and JSON parsing issues - Automatic continuation to next file on failures - Cache busting for JavaScript updates 🎯 Result: Bulk conversion now completes successfully even with missing files 🚀 Generated with Claude Code (https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
121 lines
4.7 KiB
PHP
121 lines
4.7 KiB
PHP
<?php
|
|
|
|
namespace WebPExpress;
|
|
|
|
|
|
class BiggerThanSourceDummyFilesBulk
|
|
{
|
|
|
|
private static $settings;
|
|
|
|
/**
|
|
* Update the status for a all images.
|
|
*
|
|
*/
|
|
public static function updateStatus($config = null)
|
|
{
|
|
if (is_null($config)) {
|
|
$config = Config::loadConfigAndFix(false);
|
|
}
|
|
self::$settings = [
|
|
'ext' => $config['destination-extension'],
|
|
'destination-folder' => $config['destination-folder'], /* hm, "destination-folder" is a bad name... */
|
|
'webExpressContentDirAbs' => Paths::getWebPExpressContentDirAbs(),
|
|
'uploadDirAbs' => Paths::getUploadDirAbs(),
|
|
'useDocRootForStructuringCacheDir' => (($config['destination-structure'] == 'doc-root') && (Paths::canUseDocRootForStructuringCacheDir())),
|
|
//'imageRoots' => new ImageRoots(Paths::getImageRootsDefForSelectedIds($config['scope'])), // (Paths::getImageRootsDef()
|
|
'imageRoots' => new ImageRoots(Paths::getImageRootsDefForSelectedIds(Paths::getImageRootIds())), // (Paths::getImageRootsDef()
|
|
'image-types' => $config['image-types'],
|
|
];
|
|
|
|
|
|
//$rootIds = Paths::filterOutSubRoots($config['scope']);
|
|
|
|
// We want to update status on ALL root dirs (so we don't have to re-run when user changes scope)
|
|
$rootIds = Paths::filterOutSubRoots(Paths::getImageRootIds());
|
|
//$rootIds = ['uploads'];
|
|
//$rootIds = ['uploads', 'themes'];
|
|
|
|
foreach ($rootIds as $rootId) {
|
|
self::updateStatusForRoot($rootId);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Pre-requirement: self::$settings is set.
|
|
*
|
|
* Idea for improvement: Traverse destination dirs instead. This will be quicker, as there will not be
|
|
* as many images (unless all have been converted), and not as many folders (non-image folders will not be present.
|
|
* however, index does not take too long to traverse, even though it has many non-image folders, so it will only
|
|
* be a problem if there are plugins or themes with extremely many folders).
|
|
*/
|
|
private static function updateStatusForRoot($rootId, $dir = '')
|
|
{
|
|
if ($dir == '') {
|
|
$dir = Paths::getAbsDirById($rootId);
|
|
}
|
|
|
|
// Canonicalize because dir might contain "/./", which causes file_exists to fail (#222)
|
|
$dir = PathHelper::canonicalize($dir);
|
|
|
|
if (!@file_exists($dir) || !@is_dir($dir)) {
|
|
return [];
|
|
}
|
|
|
|
$fileIterator = new \FilesystemIterator($dir);
|
|
|
|
$results = [];
|
|
|
|
while ($fileIterator->valid()) {
|
|
$filename = $fileIterator->getFilename();
|
|
|
|
if (($filename != ".") && ($filename != "..")) {
|
|
if (@is_dir($dir . "/" . $filename)) {
|
|
$newDir = $dir . "/" . $filename;
|
|
|
|
// The new dir might have its own root id
|
|
$newRootId = Paths::findImageRootOfPath($newDir, Paths::getImageRootIds());
|
|
//echo $newRootId . ': ' . $newDir . "\n";
|
|
self::updateStatusForRoot($newRootId, $newDir);
|
|
} else {
|
|
// its a file - check if its a valid image type (jpeg or png)
|
|
$regex = '#\.(jpe?g|png)$#';
|
|
if (preg_match($regex, $filename)) {
|
|
|
|
$source = $dir . "/" . $filename;
|
|
|
|
$destination = ConvertHelperIndependent::getDestination(
|
|
$source,
|
|
self::$settings['destination-folder'],
|
|
self::$settings['ext'],
|
|
self::$settings['webExpressContentDirAbs'],
|
|
self::$settings['uploadDirAbs'],
|
|
self::$settings['useDocRootForStructuringCacheDir'],
|
|
self::$settings['imageRoots'],
|
|
//$rootId
|
|
|
|
);
|
|
$webpExists = @file_exists($destination);
|
|
|
|
//echo ($webpExists ? 'YES' : 'NO') . ' ' . $rootId . ': ' . $source . "\n";
|
|
|
|
BiggerThanSourceDummyFiles::updateStatus(
|
|
$source,
|
|
$destination,
|
|
self::$settings['webExpressContentDirAbs'],
|
|
self::$settings['imageRoots'],
|
|
self::$settings['destination-folder'],
|
|
self::$settings['ext'],
|
|
// TODO: send rootId so the function doesn't need to try all
|
|
// $rootId,
|
|
);
|
|
|
|
}
|
|
}
|
|
}
|
|
$fileIterator->next();
|
|
}
|
|
return $results;
|
|
}
|
|
}
|