Image Optimizer for XF 2.0

Image Optimizer for XF 2.0 [Paid] 2.1.8

No permission to buy ($29.00)
Hi @truonglv

I think it's better to use a different temp folder since the current version is trying to use the /tmp folder which is mounted with noexec on cPanel servers for security reasons.
 
Bump pngquant to version 3.0.1
Bump jpegoptim to version 1.5.1
Bump gifsicle to version 1.93
Required Rust v1.5.6 or higher
I was able to get everything but pngquant to the needed version.
Archlinux is bleeding edge and there isn't a pngquant version 3.0 for them.
At the bottom of this page, it doesn't look like this is an available version -
https://pkgs.org/download/pngquant

In fact, here is the latest version which looks to be 2 - https://github.com/kornelski/pngquant
Am I missing something??!?
 
I was able to get everything but pngquant to the needed version.
Archlinux is bleeding edge and there isn't a pngquant version 3.0 for them.
At the bottom of this page, it doesn't look like this is an available version -
https://pkgs.org/download/pngquant

In fact, here is the latest version which looks to be 2 - https://github.com/kornelski/pngquant
Am I missing something??!?
Some OS may not have latest version. You can build it from source: https://pngquant.org/install.html

Btw, this add-on also work with older version but it's may not work well in some cases.
 
I get these lately with the newest version. Does it mean anything?
GuzzleHttp\Exception\ConnectException: Job Truonglv\ImageOptimizer\Job\Optimizer: cURL error 7: (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)

src/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:200

Generated by: Unknown account


Stack trace​

#0 src/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php(155): GuzzleHttp\Handler\CurlFactory::createRejection(Object(GuzzleHttp\Handler\EasyHandle), Array)
#1 src/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php(105): GuzzleHttp\Handler\CurlFactory::finishError(Object(GuzzleHttp\Handler\CurlHandler), Object(GuzzleHttp\Handler\EasyHandle), Object(GuzzleHttp\Handler\CurlFactory))
#2 src/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php(43): GuzzleHttp\Handler\CurlFactory::finish(Object(GuzzleHttp\Handler\CurlHandler), Object(GuzzleHttp\Handler\EasyHandle), Object(GuzzleHttp\Handler\CurlFactory))
#3 src/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php(28): GuzzleHttp\Handler\CurlHandler->__invoke(Object(GuzzleHttp\Psr7\Request), Array)
#4 src/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php(51): GuzzleHttp\Handler\Proxy::GuzzleHttp\Handler\{closure}(Object(GuzzleHttp\Psr7\Request), Array)
#5 src/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php(37): GuzzleHttp\Handler\Proxy::GuzzleHttp\Handler\{closure}(Object(GuzzleHttp\Psr7\Request), Array)
#6 src/vendor/guzzlehttp/guzzle/src/Middleware.php(29): GuzzleHttp\PrepareBodyMiddleware->__invoke(Object(GuzzleHttp\Psr7\Request), Array)
#7 src/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php(70): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Request), Array)
#8 src/vendor/guzzlehttp/guzzle/src/Middleware.php(59): GuzzleHttp\RedirectMiddleware->__invoke(Object(GuzzleHttp\Psr7\Request), Array)
#9 src/vendor/guzzlehttp/guzzle/src/HandlerStack.php(71): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Request), Array)
#10 src/vendor/guzzlehttp/guzzle/src/Client.php(351): GuzzleHttp\HandlerStack->__invoke(Object(GuzzleHttp\Psr7\Request), Array)
#11 src/vendor/guzzlehttp/guzzle/src/Client.php(162): GuzzleHttp\Client->transfer(Object(GuzzleHttp\Psr7\Request), Array)
#12 src/vendor/guzzlehttp/guzzle/src/Client.php(182): GuzzleHttp\Client->requestAsync('GET', Object(GuzzleHttp\Psr7\Uri), Array)
#13 src/addons/DigitalPoint/Cloudflare/Traits/XF.php(73): GuzzleHttp\Client->request('GET', 'https://c1d25e6...', Array)
#14 src/addons/DigitalPoint/Cloudflare/Api/Cloudflare.php(462): DigitalPoint\Cloudflare\Api\Cloudflare->request('GET', 'https://c1d25e6...', Array)
#15 src/addons/DigitalPoint/Cloudflare/Api/Advanced.php(382): DigitalPoint\Cloudflare\Api\CloudflareAbstract->makeRequest('GET', 'avatars/o/33/33...', Array, 0, 'dev-data')
#16 src/addons/DigitalPoint/Cloudflare/League/Flysystem/Adapter/R2.php(128): DigitalPoint\Cloudflare\Api\Advanced->getR2Object('dev-data', 'avatars/o/33/33...')
#17 src/addons/DigitalPoint/Cloudflare/League/Flysystem/Adapter/R2.php(108): DigitalPoint\Cloudflare\League\Flysystem\Adapter\R2->read('avatars/o/33/33...')
#18 src/vendor/league/flysystem/src/Filesystem.php(196): DigitalPoint\Cloudflare\League\Flysystem\Adapter\R2->readStream('avatars/o/33/33...')
#19 [internal function]: League\Flysystem\Filesystem->readStream('avatars/o/33/33...', Array)
#20 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(431): call_user_func_array('League\\Flysyste...', Array)
#21 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(395): League\Flysystem\EventableFilesystem\EventableFilesystem->callFilesystemMethod('readStream', Array)
#22 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(154): League\Flysystem\EventableFilesystem\EventableFilesystem->delegateMethodCall('readStream', Array)
#23 src/vendor/league/flysystem/src/MountManager.php(345): League\Flysystem\EventableFilesystem\EventableFilesystem->readStream('avatars/o/33/33...')
#24 src/XF/Util/File.php(190): League\Flysystem\MountManager->readStream('avatars/o/33/33...')
#25 src/addons/Truonglv/ImageOptimizer/Job/Optimizer.php(181): XF\Util\File::copyAbstractedPathToTempFile('data://avatars/...')
#26 src/addons/Truonglv/ImageOptimizer/Job/Optimizer.php(123): Truonglv\ImageOptimizer\Job\Optimizer->optimizeImageFile('data://avatars/...', Object(Truonglv\ImageOptimizer\ContentData\Avatar))
#27 src/addons/Truonglv/ImageOptimizer/Job/Optimizer.php(69): Truonglv\ImageOptimizer\Job\Optimizer->processImages(Array, 'avatar', Object(XF\Timer), 1673953684)
#28 src/XF/Job/Manager.php(260): Truonglv\ImageOptimizer\Job\Optimizer->run(8)
#29 src/XF/Job/Manager.php(202): XF\Job\Manager->runJobInternal(Array, 8)
#30 src/XF/Job/Manager.php(86): XF\Job\Manager->runJobEntry(Array, 8)
#31 src/XF/Cli/Command/RunJobs.php(59): XF\Job\Manager->runQueue(false, 8)
#32 src/vendor/symfony/console/Command/Command.php(255): XF\Cli\Command\RunJobs->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#33 src/vendor/symfony/console/Application.php(992): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#34 src/vendor/symfony/console/Application.php(255): Symfony\Component\Console\Application->doRunCommand(Object(XF\Cli\Command\RunJobs), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#35 src/vendor/symfony/console/Application.php(148): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#36 src/XF/Cli/Runner.php(111): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#37 cmd.php(15): XF\Cli\Runner->run()
#38 {main}

Request state​

array(1) {
["cli"] => string(46) "forum/cmd.php xf:run-jobs"
}
https://dev.lbs.co.il/admin.php?logs/server-errors/3/delete
 
I get these lately with the newest version. Does it mean anything?
GuzzleHttp\Exception\ConnectException: Job Truonglv\ImageOptimizer\Job\Optimizer: cURL error 7: (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)

src/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:200

Generated by: Unknown account


Stack trace​

#0 src/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php(155): GuzzleHttp\Handler\CurlFactory::createRejection(Object(GuzzleHttp\Handler\EasyHandle), Array)
#1 src/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php(105): GuzzleHttp\Handler\CurlFactory::finishError(Object(GuzzleHttp\Handler\CurlHandler), Object(GuzzleHttp\Handler\EasyHandle), Object(GuzzleHttp\Handler\CurlFactory))
#2 src/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php(43): GuzzleHttp\Handler\CurlFactory::finish(Object(GuzzleHttp\Handler\CurlHandler), Object(GuzzleHttp\Handler\EasyHandle), Object(GuzzleHttp\Handler\CurlFactory))
#3 src/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php(28): GuzzleHttp\Handler\CurlHandler->__invoke(Object(GuzzleHttp\Psr7\Request), Array)
#4 src/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php(51): GuzzleHttp\Handler\Proxy::GuzzleHttp\Handler\{closure}(Object(GuzzleHttp\Psr7\Request), Array)
#5 src/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php(37): GuzzleHttp\Handler\Proxy::GuzzleHttp\Handler\{closure}(Object(GuzzleHttp\Psr7\Request), Array)
#6 src/vendor/guzzlehttp/guzzle/src/Middleware.php(29): GuzzleHttp\PrepareBodyMiddleware->__invoke(Object(GuzzleHttp\Psr7\Request), Array)
#7 src/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php(70): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Request), Array)
#8 src/vendor/guzzlehttp/guzzle/src/Middleware.php(59): GuzzleHttp\RedirectMiddleware->__invoke(Object(GuzzleHttp\Psr7\Request), Array)
#9 src/vendor/guzzlehttp/guzzle/src/HandlerStack.php(71): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Request), Array)
#10 src/vendor/guzzlehttp/guzzle/src/Client.php(351): GuzzleHttp\HandlerStack->__invoke(Object(GuzzleHttp\Psr7\Request), Array)
#11 src/vendor/guzzlehttp/guzzle/src/Client.php(162): GuzzleHttp\Client->transfer(Object(GuzzleHttp\Psr7\Request), Array)
#12 src/vendor/guzzlehttp/guzzle/src/Client.php(182): GuzzleHttp\Client->requestAsync('GET', Object(GuzzleHttp\Psr7\Uri), Array)
#13 src/addons/DigitalPoint/Cloudflare/Traits/XF.php(73): GuzzleHttp\Client->request('GET', 'https://c1d25e6...', Array)
#14 src/addons/DigitalPoint/Cloudflare/Api/Cloudflare.php(462): DigitalPoint\Cloudflare\Api\Cloudflare->request('GET', 'https://c1d25e6...', Array)
#15 src/addons/DigitalPoint/Cloudflare/Api/Advanced.php(382): DigitalPoint\Cloudflare\Api\CloudflareAbstract->makeRequest('GET', 'avatars/o/33/33...', Array, 0, 'dev-data')
#16 src/addons/DigitalPoint/Cloudflare/League/Flysystem/Adapter/R2.php(128): DigitalPoint\Cloudflare\Api\Advanced->getR2Object('dev-data', 'avatars/o/33/33...')
#17 src/addons/DigitalPoint/Cloudflare/League/Flysystem/Adapter/R2.php(108): DigitalPoint\Cloudflare\League\Flysystem\Adapter\R2->read('avatars/o/33/33...')
#18 src/vendor/league/flysystem/src/Filesystem.php(196): DigitalPoint\Cloudflare\League\Flysystem\Adapter\R2->readStream('avatars/o/33/33...')
#19 [internal function]: League\Flysystem\Filesystem->readStream('avatars/o/33/33...', Array)
#20 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(431): call_user_func_array('League\\Flysyste...', Array)
#21 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(395): League\Flysystem\EventableFilesystem\EventableFilesystem->callFilesystemMethod('readStream', Array)
#22 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(154): League\Flysystem\EventableFilesystem\EventableFilesystem->delegateMethodCall('readStream', Array)
#23 src/vendor/league/flysystem/src/MountManager.php(345): League\Flysystem\EventableFilesystem\EventableFilesystem->readStream('avatars/o/33/33...')
#24 src/XF/Util/File.php(190): League\Flysystem\MountManager->readStream('avatars/o/33/33...')
#25 src/addons/Truonglv/ImageOptimizer/Job/Optimizer.php(181): XF\Util\File::copyAbstractedPathToTempFile('data://avatars/...')
#26 src/addons/Truonglv/ImageOptimizer/Job/Optimizer.php(123): Truonglv\ImageOptimizer\Job\Optimizer->optimizeImageFile('data://avatars/...', Object(Truonglv\ImageOptimizer\ContentData\Avatar))
#27 src/addons/Truonglv/ImageOptimizer/Job/Optimizer.php(69): Truonglv\ImageOptimizer\Job\Optimizer->processImages(Array, 'avatar', Object(XF\Timer), 1673953684)
#28 src/XF/Job/Manager.php(260): Truonglv\ImageOptimizer\Job\Optimizer->run(8)
#29 src/XF/Job/Manager.php(202): XF\Job\Manager->runJobInternal(Array, 8)
#30 src/XF/Job/Manager.php(86): XF\Job\Manager->runJobEntry(Array, 8)
#31 src/XF/Cli/Command/RunJobs.php(59): XF\Job\Manager->runQueue(false, 8)
#32 src/vendor/symfony/console/Command/Command.php(255): XF\Cli\Command\RunJobs->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#33 src/vendor/symfony/console/Application.php(992): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#34 src/vendor/symfony/console/Application.php(255): Symfony\Component\Console\Application->doRunCommand(Object(XF\Cli\Command\RunJobs), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#35 src/vendor/symfony/console/Application.php(148): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#36 src/XF/Cli/Runner.php(111): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#37 cmd.php(15): XF\Cli\Runner->run()
#38 {main}

Request state​

array(1) {
["cli"] => string(46) "forum/cmd.php xf:run-jobs"
}
https://dev.lbs.co.il/admin.php?logs/server-errors/3/delete
Hi,

@truonglv any idea what it means? I keep seeing these.

Thanks
 
@truonglv I'm getting this:

Code:
[LIST]
[*]League\Flysystem\FileNotFoundException: [tl] Image Optimizer: File not found at path: attachments/95/95906-103c7b11cf55e41a07d47317010db106.jpg
[*]src/vendor/league/flysystem/src/Filesystem.php:389
[/LIST]


Stack trace
#0 src/vendor/league/flysystem/src/Filesystem.php(194): League\Flysystem\Filesystem->assertPresent('attachments/95/...')
#1 [internal function]: League\Flysystem\Filesystem->readStream('attachments/95/...', Array)
#2 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(431): call_user_func_array('League\\Flysyste...', Array)
#3 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(395): League\Flysystem\EventableFilesystem\EventableFilesystem->callFilesystemMethod('readStream', Array)
#4 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(154): League\Flysystem\EventableFilesystem\EventableFilesystem->delegateMethodCall('readStream', Array)
#5 src/vendor/league/flysystem/src/MountManager.php(345): League\Flysystem\EventableFilesystem\EventableFilesystem->readStream('attachments/95/...')
#6 src/XF/Util/File.php(190): League\Flysystem\MountManager->readStream('attachments/95/...')
#7 src/addons/Truonglv/ImageOptimizer/ContentData/AttachmentData.php(102): XF\Util\File::copyAbstractedPathToTempFile('data://attachme...')
#8 src/addons/Truonglv/ImageOptimizer/Job/Optimizer.php(162): Truonglv\ImageOptimizer\ContentData\AttachmentData->onSuccess(Object(XF\Entity\AttachmentData), Array)
#9 src/addons/Truonglv/ImageOptimizer/Job/Optimizer.php(69): Truonglv\ImageOptimizer\Job\Optimizer->processImages(Array, 'attachment_data', Object(XF\Timer), 95906)
#10 src/XF/Job/Manager.php(260): Truonglv\ImageOptimizer\Job\Optimizer->run(8)
#11 src/XF/Job/Manager.php(202): XF\Job\Manager->runJobInternal(Array, 8)
#12 src/XF/Job/Manager.php(86): XF\Job\Manager->runJobEntry(Array, 8)
#13 job.php(43): XF\Job\Manager->runQueue(false, 8)
#14 {main}
 
@truonglv I'm getting this:

Code:
[LIST]
[*]League\Flysystem\FileNotFoundException: [tl] Image Optimizer: File not found at path: attachments/95/95906-103c7b11cf55e41a07d47317010db106.jpg
[*]src/vendor/league/flysystem/src/Filesystem.php:389
[/LIST]


Stack trace
#0 src/vendor/league/flysystem/src/Filesystem.php(194): League\Flysystem\Filesystem->assertPresent('attachments/95/...')
#1 [internal function]: League\Flysystem\Filesystem->readStream('attachments/95/...', Array)
#2 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(431): call_user_func_array('League\\Flysyste...', Array)
#3 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(395): League\Flysystem\EventableFilesystem\EventableFilesystem->callFilesystemMethod('readStream', Array)
#4 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(154): League\Flysystem\EventableFilesystem\EventableFilesystem->delegateMethodCall('readStream', Array)
#5 src/vendor/league/flysystem/src/MountManager.php(345): League\Flysystem\EventableFilesystem\EventableFilesystem->readStream('attachments/95/...')
#6 src/XF/Util/File.php(190): League\Flysystem\MountManager->readStream('attachments/95/...')
#7 src/addons/Truonglv/ImageOptimizer/ContentData/AttachmentData.php(102): XF\Util\File::copyAbstractedPathToTempFile('data://attachme...')
#8 src/addons/Truonglv/ImageOptimizer/Job/Optimizer.php(162): Truonglv\ImageOptimizer\ContentData\AttachmentData->onSuccess(Object(XF\Entity\AttachmentData), Array)
#9 src/addons/Truonglv/ImageOptimizer/Job/Optimizer.php(69): Truonglv\ImageOptimizer\Job\Optimizer->processImages(Array, 'attachment_data', Object(XF\Timer), 95906)
#10 src/XF/Job/Manager.php(260): Truonglv\ImageOptimizer\Job\Optimizer->run(8)
#11 src/XF/Job/Manager.php(202): XF\Job\Manager->runJobInternal(Array, 8)
#12 src/XF/Job/Manager.php(86): XF\Job\Manager->runJobEntry(Array, 8)
#13 job.php(43): XF\Job\Manager->runQueue(false, 8)
#14 {main}
It's like a warning issue. It occurs many times you may check your attachment system.
 
Almalinux 8.5: Installed rust but cargo not there and setup.sh won't compile/complete and fails making pngquant - any advice on how to get this working please?
 
Oh, and since it may be of interest to others who migrate from CentOS to Almalinux - we manually compiled the latest version of ImageMagick 7 on the server and jpg uploads stopped working (no decode delegate for this image format).

Turns out we were missing lots of dependencies so ImageMagick only installed with four image type delegates. The fix was to install the dependencies using:

Code:
# dnf builddep ImageMagick
 
Top Bottom