]> Raphaƫl G. Git Repositories - packbundle/blobdiff - Util/FacebookUtil.php
Range command appending RAPSYSPACK_RANGE to local env config file
[packbundle] / Util / FacebookUtil.php
index ea3393deb1a3a9bcfded3b1112865c4959bac72b..8e5377fa0c2a542fffb7230c9d477d5ae94d7b94 100644 (file)
 
 namespace Rapsys\PackBundle\Util;
 
-use Symfony\Component\Asset\PackageInterface;
 use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
 use Symfony\Component\Filesystem\Filesystem;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\Routing\RouterInterface;
 
 /**
  * Helps manage facebook images
  */
 class FacebookUtil {
        /**
-        * The cache directory
-        *
-        * @var string
+        * The default fonts
         */
-       protected $cache;
+       const fonts = [ 'default' => 'ttf/default.ttf' ];
 
        /**
-        * The fonts array
-        *
-        * @var array
+        * The default font
         */
-       protected $fonts;
+       const font = 'default';
 
        /**
-        * The public path
-        *
-        * @var string
+        * The default font size
         */
-       protected $path;
+       const size = 60;
 
        /**
-        * The public url
-        *
-        * @var string
+        * The default width
         */
-       protected $url;
+       const width = 15;
 
        /**
-        * The package instance
-        *
-        * @var PackageInterface
+        * The default fill
         */
-       protected $package;
+       const fill = 'white';
 
        /**
-        * The prefix
-        *
-        * @var string
+        * The default stroke
         */
-       protected $prefix;
+       const stroke = '#00c3f9';
 
        /**
-        * The source
-        *
-        * @var string
+        * The default align
         */
-       protected $source;
+       const align = 'center';
 
        /**
-        * Creates a new osm util
+        * Creates a new facebook util
         *
-        * @param PackageInterface $package The package instance
+        * @param RouterInterface $router The RouterInterface instance
         * @param string $cache The cache directory
         * @param string $path The public path
-        * @param string $url The public url
         * @param string $prefix The prefix
+        * @param ?string $source The source
+        * @param array $fonts The fonts
+        * @param string $font The font
+        * @param int $size The size
+        * @param int $width The width
+        * @param string $fill The fill
+        * @param string $stroke The stroke
+        * @param string $align The align
         */
-       function __construct(PackageInterface $package, string $cache, string $path, string $url, string $prefix = 'facebook', string $source = 'png/facebook.png', array $fonts = [ 'default' => 'ttf/default.ttf' ]) {
-               //Set cache
-               $this->cache = $cache.'/'.$prefix;
-
-               //Set fonts
-               $this->fonts = $fonts;
-
-               //Set path
-               $this->path = $path.'/'.$prefix;
-
-               //Set url
-               $this->url = $url.'/'.$prefix;
-
-               //Set package instance
-               $this->package = $package;
-
-               //Set prefix key
-               $this->prefix = $prefix;
-
-               //Set source
-               $this->source = $source;
+       function __construct(protected RouterInterface $router, protected string $cache = '../var/cache', protected string $path = './bundles/rapsyspack', protected string $prefix = 'facebook', protected ?string $source = null, protected array $fonts = self::fonts, protected string $font = self::font, protected int $size = self::size, protected int $width = self::width, protected string $fill = self::fill, protected string $stroke = self::stroke, protected string $align = self::align) {
        }
 
        /**
@@ -114,8 +88,18 @@ class FacebookUtil {
         * @return array The image array
         */
        public function getImage(string $pathInfo, array $texts, int $updated, ?string $source = null, int $width = 1200, int $height = 630): array {
+               //Without source
+               if ($source === null && $this->source === null) {
+                       //Return empty image data
+                       return [];
+               //Without local source
+               } elseif ($source === null) {
+                       //Set local source
+                       $source = $this->source;
+               }
+
                //Set path file
-               $path = $this->path.$pathInfo.'.jpeg';
+               $path = $this->path.'/'.$this->prefix.$pathInfo.'.jpeg';
 
                //Without existing path
                if (!is_dir($dir = dirname($path))) {
@@ -138,8 +122,7 @@ class FacebookUtil {
 
                        //Return image data
                        return [
-                               #'og:image' => $this->package->getAbsoluteUrl('@RapsysAir/facebook/'.$mtime.$pathInfo.'.jpeg'),
-                               'og:image' => $this->package->getAbsoluteUrl($this->url.'/'.$mtime.$pathInfo.'.jpeg'),
+                               'og:image' => $this->router->generate('rapsys_pack_facebook', ['mtime' => $mtime, 'path' => $pathInfo], UrlGeneratorInterface::ABSOLUTE_URL),
                                'og:image:alt' => str_replace("\n", ' ', implode(' - ', array_keys($texts))),
                                'og:image:height' => $height,
                                'og:image:width' => $width
@@ -147,7 +130,7 @@ class FacebookUtil {
                }
 
                //Set cache path
-               $cache = $this->cache.$pathInfo.'.png';
+               $cache = $this->cache.'/'.$this->prefix.$pathInfo.'.png';
 
                //Without cache path
                if (!is_dir($dir = dirname($cache))) {
@@ -164,12 +147,6 @@ class FacebookUtil {
                        }
                }
 
-               //Without source
-               if ($source === null) {
-                       //Set source
-                       $source = realpath($this->source);
-               }
-
                //Create image object
                $image = new \Imagick();
 
@@ -190,7 +167,17 @@ class FacebookUtil {
                                }
                        }
 
+                       //Without source
+                       if (!is_file($source)) {
+                               //Throw error
+                               throw new \Exception(sprintf('Source file "%s" do not exists', $this->source));
+                       }
+
+                       //Convert to absolute path
+                       $source = realpath($source);
+
                        //Read image
+                       //XXX: Imagick::readImage only supports absolute path
                        $image->readImage($source);
 
                        //Crop using aspect ratio
@@ -227,24 +214,6 @@ class FacebookUtil {
                        'right' => \Imagick::ALIGN_RIGHT
                ];
 
-               //Set default font
-               $defaultFont = 'dejavusans';
-
-               //Set default align
-               $defaultAlign = 'center';
-
-               //Set default size
-               $defaultSize = 60;
-
-               //Set default stroke
-               $defaultStroke = '#00c3f9';
-
-               //Set default width
-               $defaultWidth = 15;
-
-               //Set default fill
-               $defaultFill = 'white';
-
                //Init counter
                $i = 1;
 
@@ -254,16 +223,16 @@ class FacebookUtil {
                //Draw each text stroke
                foreach($texts as $text => $data) {
                        //Set font
-                       $draw->setFont($this->fonts[$data['font']??$defaultFont]);
+                       $draw->setFont($this->fonts[$data['font']??$this->font]);
 
                        //Set font size
-                       $draw->setFontSize($data['size']??$defaultSize);
+                       $draw->setFontSize($data['size']??$this->size);
 
                        //Set stroke width
-                       $draw->setStrokeWidth($data['width']??$defaultWidth);
+                       $draw->setStrokeWidth($data['width']??$this->width);
 
                        //Set text alignment
-                       $draw->setTextAlignment($align = ($aligns[$data['align']??$defaultAlign]));
+                       $draw->setTextAlignment($align = ($aligns[$data['align']??$this->align]));
 
                        //Get font metrics
                        $metrics = $image->queryFontMetrics($draw, $text);
@@ -291,10 +260,10 @@ class FacebookUtil {
                        $texts[$text]['y'] = $data['y'] += $metrics['ascender'] - $metrics['textHeight']/2;
 
                        //Set stroke color
-                       $draw->setStrokeColor(new \ImagickPixel($data['stroke']??$defaultStroke));
+                       $draw->setStrokeColor(new \ImagickPixel($data['stroke']??$this->stroke));
 
                        //Set fill color
-                       $draw->setFillColor(new \ImagickPixel($data['stroke']??$defaultStroke));
+                       $draw->setFillColor(new \ImagickPixel($data['stroke']??$this->stroke));
 
                        //Add annotation
                        $draw->annotation($data['x'], $data['y'], $text);
@@ -338,16 +307,16 @@ class FacebookUtil {
                //Draw each text
                foreach($texts as $text => $data) {
                        //Set font
-                       $draw->setFont($this->fonts[$data['font']??$defaultFont]);
+                       $draw->setFont($this->fonts[$data['font']??$this->font]);
 
                        //Set font size
-                       $draw->setFontSize($data['size']??$defaultSize);
+                       $draw->setFontSize($data['size']??$this->size);
 
                        //Set text alignment
-                       $draw->setTextAlignment($aligns[$data['align']??$defaultAlign]);
+                       $draw->setTextAlignment($aligns[$data['align']??$this->align]);
 
                        //Set fill color
-                       $draw->setFillColor(new \ImagickPixel($data['fill']??$defaultFill));
+                       $draw->setFillColor(new \ImagickPixel($data['fill']??$this->fill));
 
                        //Add annotation
                        $draw->annotation($data['x'], $data['y'], $text);
@@ -379,7 +348,7 @@ class FacebookUtil {
 
                //Return image data
                return [
-                       'og:image' => $this->package->getAbsoluteUrl($this->url.'/'.stat($path)['mtime'].$pathInfo.'.jpeg'),
+                       'og:image' => $this->router->generate('rapsys_pack_facebook', ['mtime' => stat($path)['mtime'], 'path' => $pathInfo], UrlGeneratorInterface::ABSOLUTE_URL),
                        'og:image:alt' => str_replace("\n", ' ', implode(' - ', array_keys($texts))),
                        'og:image:height' => $height,
                        'og:image:width' => $width