✅ 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>
153 lines
5.2 KiB
PHP
153 lines
5.2 KiB
PHP
<?php
|
|
|
|
namespace WebPExpress;
|
|
|
|
use \WebPExpress\Config;
|
|
use \WebPExpress\ConvertersHelper;
|
|
use \WebPExpress\Paths;
|
|
use \WebPExpress\FileHelper;
|
|
|
|
use \WebPConvert\Convert\ConverterFactory;
|
|
use \WebPConvert\Convert\Helpers\JpegQualityDetector;
|
|
|
|
include_once WEBPEXPRESS_PLUGIN_DIR . '/vendor/autoload.php';
|
|
|
|
/**
|
|
*
|
|
*/
|
|
|
|
class TestRun
|
|
{
|
|
|
|
|
|
public static $converterStatus = null; // to cache the result
|
|
|
|
private static $warnings;
|
|
|
|
public static function warningHandler($errno, $errstr, $errfile, $errline, $errcontext = null)
|
|
{
|
|
$errorTypes = [
|
|
E_WARNING => "Warning",
|
|
E_NOTICE => "Notice",
|
|
E_STRICT => "Strict Notice",
|
|
E_DEPRECATED => "Deprecated",
|
|
E_USER_DEPRECATED => "User Deprecated",
|
|
];
|
|
|
|
if (isset($errorTypes[$errno])) {
|
|
$errType = $errorTypes[$errno];
|
|
} else {
|
|
$errType = "Warning ($errno)";
|
|
}
|
|
|
|
$msg = $errType . ': ' . $errstr . ' in ' . $errfile . ', line ' . $errline;
|
|
self::$warnings[] = $msg;
|
|
|
|
// suppress!
|
|
return true;
|
|
}
|
|
/**
|
|
* Get a test result object OR false, if tests cannot be made.
|
|
*
|
|
* @return object|false
|
|
*/
|
|
public static function getConverterStatus() {
|
|
//return false;
|
|
|
|
// Is result cached?
|
|
if (isset(self::$converterStatus)) {
|
|
return self::$converterStatus;
|
|
}
|
|
$source = Paths::getWebPExpressPluginDirAbs() . '/test/small-q61.jpg';
|
|
$destination = Paths::getUploadDirAbs() . '/webp-express-test-conversion.webp';
|
|
if (!FileHelper::canCreateFile($destination)) {
|
|
$destination = Paths::getContentDirAbs() . '/webp-express-test-conversion.webp';
|
|
}
|
|
if (!FileHelper::canCreateFile($destination)) {
|
|
self::$converterStatus = false; // // cache the result
|
|
return false;
|
|
}
|
|
$workingConverters = [];
|
|
$errors = [];
|
|
self::$warnings = [];
|
|
|
|
// We need wod options.
|
|
// But we cannot simply use loadWodOptions - because that would leave out the deactivated
|
|
// converters. And we need to test all converters - even the deactivated ones.
|
|
// So we load config, set "deactivated" to false, and generate Wod options from the config
|
|
$config = Config::loadConfigAndFix();
|
|
|
|
// set deactivated to false on all converters
|
|
foreach($config['converters'] as &$converter) {
|
|
$converter['deactivated'] = false;
|
|
}
|
|
|
|
$options = Config::generateWodOptionsFromConfigObj($config);
|
|
$options['converters'] = ConvertersHelper::normalize($options['webp-convert']['convert']['converters']);
|
|
|
|
$previousErrorHandler = set_error_handler(
|
|
array('\WebPExpress\TestRun', "warningHandler"),
|
|
E_WARNING | E_USER_WARNING | E_NOTICE | E_USER_NOTICE
|
|
);
|
|
|
|
$warnings = [];
|
|
//echo '<pre>' . print_r($options, true) . '</pre>';
|
|
foreach ($options['converters'] as $converter) {
|
|
$converterId = $converter['converter'];
|
|
self::$warnings = [];
|
|
try {
|
|
$converterOptions = array_merge($options, $converter['options']);
|
|
unset($converterOptions['converters']);
|
|
|
|
//ConverterHelper::runConverter($converterId, $source, $destination, $converterOptions);
|
|
$converterInstance = ConverterFactory::makeConverter(
|
|
$converterId,
|
|
$source,
|
|
$destination,
|
|
$converterOptions
|
|
);
|
|
// Note: We now suppress warnings.
|
|
// WebPConvert logs warnings but purposefully does not stop them - warnings should generally not be
|
|
// stopped. However, as these warnings are logged in conversion log, it is preferable not to make them
|
|
// bubble here. #
|
|
$converterInstance->doConvert();
|
|
|
|
if (count(self::$warnings) > 0) {
|
|
$warnings[$converterId] = self::$warnings;
|
|
}
|
|
$workingConverters[] = $converterId;
|
|
} catch (\Exception $e) {
|
|
$errors[$converterId] = $e->getMessage();
|
|
} catch (\Throwable $e) {
|
|
$errors[$converterId] = $e->getMessage();
|
|
}
|
|
}
|
|
|
|
restore_error_handler();
|
|
//print_r($errors);
|
|
|
|
// cache the result
|
|
self::$converterStatus = [
|
|
'workingConverters' => $workingConverters,
|
|
'errors' => $errors,
|
|
'warnings' => $warnings,
|
|
];
|
|
return self::$converterStatus;
|
|
}
|
|
|
|
|
|
public static $localQualityDetectionWorking = null; // to cache the result
|
|
|
|
public static function isLocalQualityDetectionWorking() {
|
|
if (isset(self::$localQualityDetectionWorking)) {
|
|
return self::$localQualityDetectionWorking;
|
|
} else {
|
|
$q = JpegQualityDetector::detectQualityOfJpg(
|
|
Paths::getWebPExpressPluginDirAbs() . '/test/small-q61.jpg'
|
|
);
|
|
self::$localQualityDetectionWorking = ($q === 61);
|
|
return self::$localQualityDetectionWorking;
|
|
}
|
|
}
|
|
}
|