ldc-dam/app/Http/Traits/MediaTools.php
2022-06-20 14:04:15 +02:00

209 lines
7.6 KiB
PHP

<?php
namespace App\Http\Traits;
use App\Models\Format;
use App\Models\Media;
use Illuminate\Support\Facades\Storage;
trait MediaTools
{
public function getFileSize($file_path)
{
return $this->fixIntegerOverflow(filesize($file_path));
}
/**
* Create thumbnail for a Media
*
* @param Media $media
* @return void
*/
public function createThumb(Media $media)
{
/** @var \Illuminate\Support\Collection<\App\Models\Format> $formats */
$formats = optional($media->sujet)->formats ?? collect();
$mediaPath = public_path("/{$media->folder}{$media->uid}.{$media->extension}");
$im = new \Imagick($mediaPath);
$im->setImageBackgroundColor('#ffffff');
$im->setImageAlphaChannel(\Imagick::ALPHACHANNEL_REMOVE);
$im->mergeImageLayers(\Imagick::LAYERMETHOD_FLATTEN);
$im->stripImage();
if (in_array($media->extension, array("pdf", "ai", "psd"))) {
$im->setIteratorIndex(0);
}
foreach ($formats as $format) {
$fp = public_path("/{$media->folder}{$media->uid}_{$format->libelle}.{$format->extension}");
$targetWidth = $format->largeur;
if ($format->hauteur == 0) {
$targetHeight = floor(($media->hauteur * $format->largeur) / $media->largeur);
} else {
$targetHeight = $format->hauteur;
}
$im->setImageFormat($format->extension);
if ($media->largeur >= $targetWidth || $media->hauteur >= $targetHeight) {
$im->thumbnailImage($targetWidth, $targetHeight, true);
}
$im->writeImage($fp);
}
$im->destroy();
unset($im);
}
public function createSysThumb($media)
{
$mediaPath = public_path() . "/" . $media->folder . $media->uid . "." . $media->extension;
$im = new \Imagick();
$im->readImage($mediaPath);
if (in_array($media->extension, array("pdf", "ai", "psd"))) {
$extension = "png";
$im->setIteratorIndex(0);
} else {
$extension = $media->extension;
}
/*
Handle CMJN - DOESN'T WORK
if ($im->getImageColorspace() === \Imagick::COLORSPACE_CMYK){
$im->transformImageColorspace(\Imagick::COLORSPACE_RGB);
}*/
// * create preview
$format = Format::withoutGlobalScope('App\Scopes\SystemScope')->where('libelle', '=', 'preview')->first();
$fp = public_path() . "/" . $media->folder . $media->uid . '_preview.' . $extension;
if ($media->extension == "gif") {
if ($media->largeur >= $format->largeur || $media->hauteur >= $format->hauteur || $media->largeur == "") {
$im = $im->coalesceImages();
foreach ($im as $frame) {
$frame->thumbnailImage($format->largeur, $format->hauteur);
$frame->setImagePage($format->largeur, $format->hauteur, 0, 0);
}
$im = $im->deconstructImages();
}
$im->writeImages($fp, true);
} else {
if ($media->largeur >= $format->largeur || $media->hauteur >= $format->hauteur || $media->largeur == "") {
$im->thumbnailImage($format->largeur, $format->hauteur, true);
}
$im->writeImage($fp);
}
// * create thumb
$format = Format::withoutGlobalScope('App\Scopes\SystemScope')->where('libelle', '=', 'thumb')->first();
if ($extension != "png") {
$im->setImageBackgroundColor('#ffffff');
$im->setImageAlphaChannel(\Imagick::ALPHACHANNEL_REMOVE);
$im->mergeImageLayers(\Imagick::LAYERMETHOD_FLATTEN);
$im->stripImage();
}
$fp = public_path() . "/" . $media->folder . $media->uid . '_thumb.' . $extension;
$im->thumbnailImage($format->largeur, $format->hauteur, true);
$im->writeImage($fp);
$im->destroy();
unset($im);
}
public function getMediaFolder()
{
$mediaPath = "medias/";
$directories = Storage::allDirectories($mediaPath);
$selectedFolder = "";
// * on obtient le dernier dossier créé
foreach ($directories as $key => $foldername) {
if ($selectedFolder < $foldername) {
$selectedFolder = $foldername;
}
}
// * si on n'a pas de dossier, on le créé
if ($selectedFolder == "") {
$selectedFolder = $mediaPath . uniqid();
Storage::makeDirectory($selectedFolder);
} else {
// * on compte le nombre de fichier
$files = Storage::allFiles($selectedFolder);
// * si on en a plus de 1000, on créé un nouveau dossier
if (count($files) > 1000) {
$selectedFolder = $mediaPath . uniqid();
Storage::makeDirectory($selectedFolder);
}
}
return $selectedFolder;
}
public function fixIntegerOverflow($size)
{
if ($size < 0) {
$size += 2.0 * (PHP_INT_MAX + 1);
}
return $size;
}
public function formatBytes($octet, $precision = 2)
{
// * Array contenant les differents unités
$unite = array('octet', 'Ko', 'Mo', 'Go');
// * octet
if ($octet < 1000) {
return $octet . $unite[0];
} else {
if ($octet < 1000000) {
// * ko
$ko = round($octet / 1024, 2);
return $ko . $unite[1];
} else {
// * Mo ou Go
if ($octet < 1000000000) {
// * Mo
$mo = round($octet / (1024 * 1024), 2);
return $mo . $unite[2];
} else {
// * Go
$go = round($octet / (1024 * 1024 * 1024), 2);
return $go . $unite[3];
}
}
}
}
/**
* Renvoi le chemin attendu d'un média selon le format demandé
*
* @param \App\Models\Media $media
* @param \App\Models\Format $format
* @return string
* @throws \ErrorException If Format is not handled.
*/
public function getMediaPath(Media $media, Format $format): string
{
// * format spécifique
if ($format->system) {
if (in_array($media->extension, array("gif", "jpeg", "jpg", "png", "pdf", "ai", "psd"))) {
return public_path("/{$media->folder}{$media->uid}_{$format->libelle}.{$format->extension}");
}
return public_path("/{$media->folder}{$media->uid}.{$media->extension}");
}
// * format système (thumb et preview)
if ($format->system) {
if (in_array($media->extension, array("gif", "jpeg", "jpg", "png"))) {
// * Gestion du cas de format qui fixe l'extension
if ($format->extension != '') {
$file_extension = $format->extension;
} else {
$file_extension = $media->extension;
}
return public_path("/{$media->folder}{$media->uid}_{$format->libelle}.{$file_extension}");
} elseif (in_array($media->extension, array("pdf", "ai", "psd"))) {
return public_path("/{$media->folder}{$media->uid}_{$format->libelle}.png");
}
return public_path("/{$media->folder}.{$media->uid}.{$media->extension}");
}
throw new \ErrorException("Unhandled Format $format->id $format->libelle");
}
}