diff --git a/classes/Imageoptim.php b/classes/Imageoptim.php index c898269..3a7400f 100644 --- a/classes/Imageoptim.php +++ b/classes/Imageoptim.php @@ -14,6 +14,40 @@ public static function instance() return static::$instance; } + private static function push(string $key, string $value) + { + kirby()->cache('bnomei.thumbimageoptim')->set(\md5($key), [ + 'dst' => $key, + 'time' => $value, + ]); + } + + private static function pop(string $key) + { + kirby()->cache('bnomei.thumbimageoptim')->remove(\md5($key)); + } + + public static function removeFilesOfUnfinishedJobs() + { + $r = kirby()->roots()->cache().'/bnomei/thumbimageoptim'; + $cachefiles = \Kirby\Toolkit\Dir::files($r); + foreach($cachefiles as $file) { + $md5 = basename($file, '.cache'); + if($job = kirby()->cache('bnomei.thumbimageoptim')->get($md5)) { + if (is_array($job) && array_key_exists('dst', $job)) { + $dst = $job['dst']; + if (file_exists($dst)) { + if (unlink($dst)) { + static::pop($dst); + } + } else { + static::pop($dst); + } + } + } + } + } + private static function log(string $msg = '', string $level = 'info', array $context = []):bool { $log = option('bnomei.thumbimageoptim.log'); @@ -28,45 +62,19 @@ private static function log(string $msg = '', string $level = 'info', array $con return false; } - private static $kirbyThumbsComponent = null; - public static function beforeRegisterComponent() - { - if (!static::$kirbyThumbsComponent) { - static::log('beforeRegisterComponent', 'debug'); - static::$kirbyThumbsComponent = kirby()->component('thumb'); - } - } - - public static function kirbyThumb($src, $dst, $options) { - if (static::$kirbyThumbsComponent && \is_callable(static::$kirbyThumbsComponent)) { - return static::$kirbyThumbsComponent($src, $dst, $options); - } - return null; + // https://github.com/getkirby/kirby/blob/master/config/components.php#L85 + $darkroom = \Kirby\Image\Darkroom::factory(option('thumbs.driver', 'gd'), option('thumbs', [])); + $options = $darkroom->preprocess($src, $options); + $root = (new \Kirby\Cms\Filename($src, $dst, $options))->toString(); + \Kirby\Toolkit\F::copy($src, $root); + $darkroom->process($root, $options); + return $root; } public static function thumb($src, $dst, $options) { - // $root = (new \Kirby\Cms\Filename($src, $dst, $options))->toString(); - if (\file_exists($dst) == true && \filemtime($dst) >= \filemtime($src)) { - static::log('exists', 'debug', [ - 'src' => $src, - 'src-filemtime' => date('c', \filemtime($src)), - 'dst' => $dst, - 'dst-filemtime' => date('c', \filemtime($dst)), - ]); - return $dst; - } else { - \Kirby\Toolkit\F::copy($src, $dst); - static::log('copy', 'debug', [ - 'src' => $src, - 'src-filemtime' => date('c', \filemtime($src)), - 'dst' => $dst, - 'dst-filemtime' => date('c', \filemtime($dst)), - ]); - } - $api = static::instance(); if (!option('bnomei.thumbimageoptim.optimize') || !$api) { static::log('kirbyThumb:early', 'debug', [ @@ -81,6 +89,8 @@ public static function thumb($src, $dst, $options) $defaults = option('bnomei.thumbimageoptim.defaults'); $settings = array_merge($options, $defaults); + static::push($dst, date('c')); + try { // https://github.com/ImageOptim/php-imageoptim-api $request = null; @@ -94,7 +104,6 @@ public static function thumb($src, $dst, $options) ]); } else { // request download - $path = explode('/', ltrim(str_replace(kirby()->roots()->content(), '', \dirname($src)), '/')); $pathO = array_map(function ($v) { // https://github.com/bnomei/kirby3-thumb-imageoptim/issues/2 @@ -108,41 +117,46 @@ public static function thumb($src, $dst, $options) $pathO = implode('/', $pathO); $page = page($pathO); + \Kirby\Toolkit\F::copy($src, $dst); // or url will not work if ($img = $page->image(\pathinfo($src, PATHINFO_BASENAME))) { $url = $img->url(); $request = $api->imageFromURL($url); - static::log('imageFromURL', 'debug', [ - 'src' => $src, - 'dst' => $dst, - 'dst-url' => $url, - 'options' => $options, - ]); + if (option('bnomei.thumbimageoptim.log.enabled')) { + static::log('imageFromURL', 'debug', [ + 'src' => $src, + 'dst' => $dst, + 'dst-url' => $url, + 'options' => $options, + ]); + } } else { - static::log('Image not found at Page-object', 'warning', [ - 'src' => $src, - 'dst' => $dst, - 'pathO' => $pathO, - 'file' => \pathinfo($src, PATHINFO_BASENAME), - 'options' => $options, - ]); + if (option('bnomei.thumbimageoptim.log.enabled')) { + static::log('Image not found at Page-object', 'warning', [ + 'src' => $src, + 'dst' => $dst, + 'pathO' => $pathO, + 'file' => \pathinfo($src, PATHINFO_BASENAME), + 'options' => $options, + ]); + } } } if ($request) { $request = $request->resize( - $settings['width'], - $settings['height'], - $settings['crop'] == 1 ? 'crop' : 'scale-down' - )->quality( - $settings['io_quality'] - ) - ->dpr(intval($settings['io_dpr'])); + $settings['width'], + $settings['height'], + $settings['crop'] == 1 ? 'crop' : 'scale-down' + )->quality( + $settings['io_quality'] + ) + ->dpr(intval($settings['io_dpr'])); if ($tl = option('bnomei.thumbimageoptim.timelimit')) { set_time_limit(intval($tl)); } - + $bytes = null; // https://github.com/bnomei/kirby3-thumb-imageoptim/issues/4 if (static::is_localhost() || option('bnomei.thumbimageoptim.forceupload')) { @@ -151,12 +165,15 @@ public static function thumb($src, $dst, $options) static::log('Image URL', 'debug', [ 'url' => $request->apiURL() ]); - + // https://github.com/ImageOptim/php-imageoptim-api#apiurl--debug-or-use-another-https-client $bytes = \Kirby\Http\Remote::get($request->apiURL(), ['method' => 'POST'])->content(); } - + $success = $bytes ? \Kirby\Toolkit\F::write($dst, $bytes) : false; + if ($success) { + static::pop($dst); + } } } catch (Exception $ex) { static::log($ex->getMessage(), 'error', [ @@ -170,13 +187,7 @@ public static function thumb($src, $dst, $options) if ($success) { return $dst; } - // else - static::log('kirbyThumb:late', 'debug', [ - 'src' => $src, - 'dst' => $dst, - 'options' => $options, - ]); - return static::kirbyThumb($src, $dst, $options); + return null; } private static function is_localhost() diff --git a/composer.json b/composer.json index 3e1b7d6..5c52712 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "bnomei/kirby3-thumb-imageoptim", "description": "Kirby 3 Thumb Driver using Imageoptim", "type": "plugin", - "version": "1.1.7", + "version": "1.2.0", "license": "MIT", "authors": [ { @@ -33,12 +33,6 @@ "optimize-autoloader": true, "sort-packages": true }, - "repositories": [ - { - "type": "vcs", - "url": "https://github.com/k-next/kirby" - } - ], "require": { "php": ">=7.1.0", "getkirby/cms": "^3.0.0-RC-2.0", @@ -49,6 +43,7 @@ }, "scripts": { "zip": [ + "touch kirby3-thumb-imageoptim.zip", "rm kirby3-thumb-imageoptim.zip", "composer install --no-dev", "composer remove getkirby/cms", diff --git a/config.php b/config.php index d21ca35..d7bfc2f 100644 --- a/config.php +++ b/config.php @@ -1,10 +1,5 @@ [ 'optimize' => true, @@ -23,10 +18,16 @@ } return false; }, + 'cache' => true, ], 'components' => [ 'thumb' => function ($kirby, $src, $dst, $options) { - return \Bnomei\Imageoptim::thumb($src, $dst, $options); + return \Bnomei\Imageoptim::thumb($src, $dst, $options); } - ] + ], + 'hooks' => [ + 'route:before' => function () { + \Bnomei\Imageoptim::removeFilesOfUnfinishedJobs(); + }, + ], ]); diff --git a/readme.md b/readme.md index 3490cfe..c5ab3f0 100644 --- a/readme.md +++ b/readme.md @@ -14,7 +14,7 @@ This plugin is free but if you use it in a commercial project please consider to ## Installation - for devkit-setup use `composer require bnomei/kirby3-thumb-imageoptim` or -- extract latest release of [kirby3-thumb-imageoptim.zip](https://github.com/bnomei/kirby3-thumb-imageoptim/releases/download/v1.1.7/kirby3-thumb-imageoptim.zip) as folder `site/plugins/kirby3-thumb-imageoptim` +- extract latest release of [kirby3-thumb-imageoptim.zip](https://github.com/bnomei/kirby3-thumb-imageoptim/releases/download/v1.2.0/kirby3-thumb-imageoptim.zip) as folder `site/plugins/kirby3-thumb-imageoptim` > Installation as a gitsubmodule is *not* supported.