X-Git-Url: https://git.rapsys.eu/packbundle/blobdiff_plain/df7b4f1cde5b1f7c3534df258047d1581f066134..b5bfae95e2e0a3561ac9277d17bcc6450e569033:/Util/FacebookUtil.php

diff --git a/Util/FacebookUtil.php b/Util/FacebookUtil.php
index ea3393d..8e5377f 100644
--- a/Util/FacebookUtil.php
+++ b/Util/FacebookUtil.php
@@ -11,93 +11,67 @@
 
 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