From 6bb8e644eb7e9256bf36b49dcf4add0c9b55912c Mon Sep 17 00:00:00 2001 From: Cyrill Gsell Date: Mon, 25 Mar 2024 12:04:50 +0100 Subject: [PATCH 1/5] [TASK] Task-35198-18: Adding focuspoint to imgproxy url generation --- Classes/Aspects/ThumbnailAspect.php | 9 +++++++++ Classes/ImgproxyUrl.php | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/Classes/Aspects/ThumbnailAspect.php b/Classes/Aspects/ThumbnailAspect.php index f6caf4a..ee97a80 100644 --- a/Classes/Aspects/ThumbnailAspect.php +++ b/Classes/Aspects/ThumbnailAspect.php @@ -9,6 +9,7 @@ use Neos\Media\Domain\Model\Image; use Neos\Media\Domain\Model\ImageVariant; use Neos\Media\Domain\Model\ThumbnailConfiguration; +use Neos\Utility\ObjectAccess; use Networkteam\ImageProxy\Eel\SourceUriHelper; use Networkteam\ImageProxy\ImgproxyBuilder; use Networkteam\ImageProxy\Model\Dimensions; @@ -109,6 +110,14 @@ public function generateImgproxyUri(JoinPointInterface $joinPoint): ?array $expectedSize = ImgproxyBuilder::expectedSize($actualDimension, $targetDimension, $resizingType, $enlarge); + $focusPointX = ObjectAccess::getProperty($configuration, 'focusPointX', true); + $focusPointY = ObjectAccess::getProperty($configuration, 'focusPointY', true); + if($focusPointX && $focusPointY){ + $focusPointX = ($focusPointX + 1) / 2; + $focusPointY = ($focusPointY + 1) / 2; + $url->focusPoint($focusPointX, $focusPointY); + } + return [ 'width' => $expectedSize->getWidth(), 'height' => $expectedSize->getHeight(), diff --git a/Classes/ImgproxyUrl.php b/Classes/ImgproxyUrl.php index 9401be2..c200f0c 100644 --- a/Classes/ImgproxyUrl.php +++ b/Classes/ImgproxyUrl.php @@ -76,4 +76,9 @@ public function cacheBuster(string $cacheBuster) { $this->processingOptions[] = 'cb:' . $cacheBuster; } + + public function focusPoint(float $focusPointX, float $focusPointY) + { + $this->processingOptions[] = 'gravity:fp:' . $focusPointX . ':' . $focusPointY; + } } From 3f6758ddce07d338892830418d0c13f79182f8ab Mon Sep 17 00:00:00 2001 From: Cyrill Gsell Date: Mon, 25 Mar 2024 12:21:47 +0100 Subject: [PATCH 2/5] [TASK] Task-35198-18: Check if focuspoint is set with is_float --- Classes/Aspects/ThumbnailAspect.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/Aspects/ThumbnailAspect.php b/Classes/Aspects/ThumbnailAspect.php index ee97a80..8681848 100644 --- a/Classes/Aspects/ThumbnailAspect.php +++ b/Classes/Aspects/ThumbnailAspect.php @@ -112,7 +112,7 @@ public function generateImgproxyUri(JoinPointInterface $joinPoint): ?array $focusPointX = ObjectAccess::getProperty($configuration, 'focusPointX', true); $focusPointY = ObjectAccess::getProperty($configuration, 'focusPointY', true); - if($focusPointX && $focusPointY){ + if(is_float($focusPointX) && is_float($focusPointX)){ $focusPointX = ($focusPointX + 1) / 2; $focusPointY = ($focusPointY + 1) / 2; $url->focusPoint($focusPointX, $focusPointY); From 364458531bea9deb5fa5550d873110ab782fa237 Mon Sep 17 00:00:00 2001 From: Cyrill Gsell Date: Wed, 24 Apr 2024 13:59:17 +0200 Subject: [PATCH 3/5] [TASK] Allow override of ImgproxyBuilder class & make the ThumbnailConfiguration available --- Classes/Aspects/ThumbnailAspect.php | 16 ++++++++++--- Classes/ImgproxyBuilder.php | 36 ++++++++++++++++------------ Classes/ImgproxyBuilderInterface.php | 19 +++++++++++++++ Classes/ImgproxyUrl.php | 22 ++++++++++++++++- 4 files changed, 74 insertions(+), 19 deletions(-) create mode 100644 Classes/ImgproxyBuilderInterface.php diff --git a/Classes/Aspects/ThumbnailAspect.php b/Classes/Aspects/ThumbnailAspect.php index 8681848..19fddcc 100644 --- a/Classes/Aspects/ThumbnailAspect.php +++ b/Classes/Aspects/ThumbnailAspect.php @@ -5,6 +5,7 @@ use Neos\Flow\Annotations as Flow; use Neos\Flow\Aop\JoinPointInterface; use Neos\Flow\Mvc\ActionRequest; +use Neos\Flow\ObjectManagement\ObjectManager; use Neos\Media\Domain\Model\Asset; use Neos\Media\Domain\Model\Image; use Neos\Media\Domain\Model\ImageVariant; @@ -12,6 +13,7 @@ use Neos\Utility\ObjectAccess; use Networkteam\ImageProxy\Eel\SourceUriHelper; use Networkteam\ImageProxy\ImgproxyBuilder; +use Networkteam\ImageProxy\ImgproxyBuilderInterface; use Networkteam\ImageProxy\Model\Dimensions; /** @@ -37,6 +39,12 @@ class ThumbnailAspect */ protected $sourceUriHelper; + /** + * @Flow\Inject + * @var ObjectManager + */ + protected $objectManager; + /** * @Flow\Around("method(Neos\Media\Domain\Service\AssetService->getThumbnailUriAndSizeForAsset())") */ @@ -57,8 +65,10 @@ public function generateImgproxyUri(JoinPointInterface $joinPoint): ?array /** @var ThumbnailConfiguration $configuration */ $configuration = $joinPoint->getMethodArgument('configuration'); - $builder = new ImgproxyBuilder( + $builder = $this->objectManager->get( + ImgproxyBuilderInterface::class, $this->settings['imgproxyUrl'], + $configuration, $this->settings['key'], $this->settings['salt'] ); @@ -112,7 +122,7 @@ public function generateImgproxyUri(JoinPointInterface $joinPoint): ?array $focusPointX = ObjectAccess::getProperty($configuration, 'focusPointX', true); $focusPointY = ObjectAccess::getProperty($configuration, 'focusPointY', true); - if(is_float($focusPointX) && is_float($focusPointX)){ + if (is_float($focusPointX) && is_float($focusPointX)) { $focusPointX = ($focusPointX + 1) / 2; $focusPointY = ($focusPointY + 1) / 2; $url->focusPoint($focusPointX, $focusPointY); @@ -121,7 +131,7 @@ public function generateImgproxyUri(JoinPointInterface $joinPoint): ?array return [ 'width' => $expectedSize->getWidth(), 'height' => $expectedSize->getHeight(), - 'src' => $url->build() + 'src' => $url->build(), ]; } diff --git a/Classes/ImgproxyBuilder.php b/Classes/ImgproxyBuilder.php index bb2c4d8..4200f1f 100644 --- a/Classes/ImgproxyBuilder.php +++ b/Classes/ImgproxyBuilder.php @@ -2,9 +2,10 @@ namespace Networkteam\ImageProxy; +use Neos\Media\Domain\Model\ThumbnailConfiguration; use Networkteam\ImageProxy\Model\Dimensions; -class ImgproxyBuilder +class ImgproxyBuilder implements ImgproxyBuilderInterface { /** @@ -20,23 +21,30 @@ class ImgproxyBuilder */ public const RESIZE_TYPE_FORCE = 'force'; - private string $imgproxyUrl; - private ?string $key = null; - private ?string $salt = null; + protected string $imgproxyUrl; + protected ThumbnailConfiguration $thumbnailConfiguration; + protected ?string $key = null; + protected ?string $salt = null; /** * @param string $imgproxyUrl The URL where imgproxy is publicly available + * @param ThumbnailConfiguration $thumbnailConfiguration * @param string|null $key * @param string|null $salt */ - public function __construct(string $imgproxyUrl, string $key = null, string $salt = null) - { + public function __construct( + string $imgproxyUrl, + ThumbnailConfiguration $thumbnailConfiguration, + string $key = null, + string $salt = null + ) { if ((string)$key !== '' && (string)$salt !== '') { $this->key = pack("H*", $key); $this->salt = pack("H*", $salt); } $this->imgproxyUrl = $imgproxyUrl; + $this->thumbnailConfiguration = $thumbnailConfiguration; } /** @@ -98,20 +106,18 @@ public function buildUrl(string $sourceUrl): ImgproxyUrl } /** - * @param string $sourceUrl - * @param string[] $processingOptions - * @param string|null $extension + * @param ImgproxyUrl $imgproxyUrl * @return string * @internal * Generate an imgproxy URL with processing options and signature (if key and salt are set). * */ - public function generateUrl(string $sourceUrl, array $processingOptions, ?string $extension): string + public function generateUrl(ImgproxyUrl $imgproxyUrl): string { - $encodedSourceUrl = self::base64UrlEncode($sourceUrl); - $pathAfterSignature = '/' . join('/', $processingOptions) . '/' . $encodedSourceUrl; - if ($extension !== null) { - $pathAfterSignature .= '.' . $extension; + $encodedSourceUrl = self::base64UrlEncode($imgproxyUrl->getUrl()); + $pathAfterSignature = '/' . implode('/', $imgproxyUrl->getProcessingOptions()) . '/' . $encodedSourceUrl; + if ($imgproxyUrl->getExtension() !== null) { + $pathAfterSignature .= '.' . $imgproxyUrl->getExtension(); } if ($this->key !== null) { @@ -124,7 +130,7 @@ public function generateUrl(string $sourceUrl, array $processingOptions, ?string } } - private static function base64UrlEncode(string $data): string + protected static function base64UrlEncode(string $data): string { return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); } diff --git a/Classes/ImgproxyBuilderInterface.php b/Classes/ImgproxyBuilderInterface.php new file mode 100644 index 0000000..9f41651 --- /dev/null +++ b/Classes/ImgproxyBuilderInterface.php @@ -0,0 +1,19 @@ +builder->generateUrl($this->url, $this->processingOptions, $this->extension); + return $this->builder->generateUrl($this); } public function quality(int $quality) @@ -81,4 +81,24 @@ public function focusPoint(float $focusPointX, float $focusPointY) { $this->processingOptions[] = 'gravity:fp:' . $focusPointX . ':' . $focusPointY; } + + public function getUrl(): string + { + return $this->url; + } + + public function getExtension(): ?string + { + return $this->extension; + } + + public function getProcessingOptions(): array + { + return $this->processingOptions; + } + + public function addProcessingOption(string $key, string $value) + { + $this->processingOptions[$key] = $value; + } } From cd4db828c422fc27ced0d8d40a06967a35346936 Mon Sep 17 00:00:00 2001 From: Cyrill Gsell Date: Wed, 24 Apr 2024 14:15:51 +0200 Subject: [PATCH 4/5] [CLEANUP] Removes focuspoint implementation from ThumbnailAspect --- Classes/Aspects/ThumbnailAspect.php | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/Classes/Aspects/ThumbnailAspect.php b/Classes/Aspects/ThumbnailAspect.php index 19fddcc..83a2f9e 100644 --- a/Classes/Aspects/ThumbnailAspect.php +++ b/Classes/Aspects/ThumbnailAspect.php @@ -120,18 +120,10 @@ public function generateImgproxyUri(JoinPointInterface $joinPoint): ?array $expectedSize = ImgproxyBuilder::expectedSize($actualDimension, $targetDimension, $resizingType, $enlarge); - $focusPointX = ObjectAccess::getProperty($configuration, 'focusPointX', true); - $focusPointY = ObjectAccess::getProperty($configuration, 'focusPointY', true); - if (is_float($focusPointX) && is_float($focusPointX)) { - $focusPointX = ($focusPointX + 1) / 2; - $focusPointY = ($focusPointY + 1) / 2; - $url->focusPoint($focusPointX, $focusPointY); - } - return [ 'width' => $expectedSize->getWidth(), 'height' => $expectedSize->getHeight(), - 'src' => $url->build(), + 'src' => $url->build(), ]; } From d4ae44e28e525810dbd1c5290d1788ac5518496f Mon Sep 17 00:00:00 2001 From: Cyrill Gsell Date: Wed, 24 Apr 2024 14:24:04 +0200 Subject: [PATCH 5/5] [CLEANUP] Cleanup addProcessingOption method --- Classes/ImgproxyUrl.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Classes/ImgproxyUrl.php b/Classes/ImgproxyUrl.php index 9ee204a..1c15e3d 100644 --- a/Classes/ImgproxyUrl.php +++ b/Classes/ImgproxyUrl.php @@ -97,8 +97,8 @@ public function getProcessingOptions(): array return $this->processingOptions; } - public function addProcessingOption(string $key, string $value) + public function addProcessingOption(string $option) { - $this->processingOptions[$key] = $value; + $this->processingOptions[] = $option; } }