315 lines
8.0 KiB
PHP
315 lines
8.0 KiB
PHP
<?php
|
|
namespace ProVM\TotalSport\Common\Service;
|
|
|
|
use function Stringy\create as s;
|
|
use FFMpeg\FFMpeg;
|
|
|
|
class MediaLoader {
|
|
protected $folder;
|
|
protected $media_url;
|
|
public function __construct(string $media_folder, string $media_assets_url) {
|
|
$this->folder = $media_folder;
|
|
$this->media_url = $media_assets_url;
|
|
}
|
|
protected $ffmpeg;
|
|
public function setFFMpeg(FFMpeg $ffmpeg) {
|
|
$this->ffmpeg = $ffmpeg;
|
|
}
|
|
protected function getFolder($event) {
|
|
return implode(DIRECTORY_SEPARATOR, [
|
|
$this->folder,
|
|
'eventos',
|
|
s($event->servicio)->removeLeft('Eventos '),
|
|
rtrim(implode(', ', [
|
|
$event->titulo,
|
|
$event->empresa
|
|
]), ', ')
|
|
]);
|
|
}
|
|
protected function buildHtml($file, $filename) {
|
|
switch ($file->getExtension()) {
|
|
default:
|
|
return implode('', [
|
|
'<img src="',
|
|
$filename,
|
|
'" class="media" />'
|
|
]);
|
|
case 'mkv':
|
|
case 'mp4':
|
|
case 'mov':
|
|
case 'avi':
|
|
case 'ogg':
|
|
case 'webm':
|
|
return implode(PHP_EOL, [
|
|
'<video class="media" controls="controls">',
|
|
implode('', [
|
|
'<source src="',
|
|
$filename,
|
|
'" type="video/',
|
|
$file->getExtension(),
|
|
'" />'
|
|
]),
|
|
'No se soporta el elemento de video para HTML5 en este navegador.',
|
|
'</video>'
|
|
]);
|
|
}
|
|
}
|
|
public function load($event) {
|
|
$folder = $this->getFolder($event);
|
|
if (!file_exists($folder)) {
|
|
return false;
|
|
}
|
|
$files = new \DirectoryIterator($folder);
|
|
$medias = [];
|
|
foreach ($files as $file) {
|
|
if ($file->isDir()) {
|
|
continue;
|
|
}
|
|
$name = $file->getBasename('.' . $file->getExtension());
|
|
$type = 'media';
|
|
if (strpos($name, '_') !== false) {
|
|
if (strpos($name, '_org') !== false) {
|
|
$type = 'original';
|
|
}
|
|
if (strpos($name, '_thumb') !== false) {
|
|
$type = 'thumb';
|
|
}
|
|
$name = explode('_', $name)[0];
|
|
}
|
|
$filename = implode('/', [
|
|
$this->media_url,
|
|
'eventos',
|
|
s($event->servicio)->removeLeft('Eventos '),
|
|
($event->empresa != '') ?
|
|
rtrim(implode(', ', [
|
|
$event->titulo,
|
|
$event->empresa
|
|
]), ', ') :
|
|
$event->titulo,
|
|
$file->getFilename()
|
|
]);
|
|
$obj = (object) [
|
|
'n' => $name,
|
|
'filename' => $filename,
|
|
'type' => $type,
|
|
'html' => $this->buildHtml($file, $filename)
|
|
];
|
|
if (!isset($medias[$name])) {
|
|
$medias[$name] = (object) [
|
|
'media' => null,
|
|
'thumb' => null,
|
|
'original' => null
|
|
];
|
|
}
|
|
$medias[$name]->{$type} = $obj;
|
|
}
|
|
array_walk($medias, function(&$item) {
|
|
if ($item->thumb === null) {
|
|
$item->thumb = $item->media;
|
|
}
|
|
});
|
|
sort($medias);
|
|
return $medias;
|
|
}
|
|
public function add($event, $file) {
|
|
$folder = $this->getFolder($event);
|
|
if (!file_exists($folder)) {
|
|
mkdir($folder);
|
|
chmod($folder, 0777);
|
|
}
|
|
$extension = pathinfo($file->getClientFilename(), PATHINFO_EXTENSION);
|
|
switch ($extension) {
|
|
default:
|
|
return $this->addImage($event, $file);
|
|
case 'mkv':
|
|
case 'mp4':
|
|
case 'mov':
|
|
case 'avi':
|
|
case 'ogg':
|
|
case 'webm':
|
|
return $this->addVideo($event, $file);
|
|
}
|
|
}
|
|
public function addImage($event, $file) {
|
|
$folder = $this->getFolder($event);
|
|
$medias = $this->load($event);
|
|
$base_name = '01';
|
|
if ($medias !== false and count($medias) > 0) {
|
|
$base_name = str_pad(count($medias) + 1, 2, '0', \STR_PAD_LEFT);
|
|
}
|
|
$extension = pathinfo($file->getClientFilename(), PATHINFO_EXTENSION);
|
|
$filename = implode(DIRECTORY_SEPARATOR, [
|
|
$folder,
|
|
implode('.', [
|
|
implode('_', [
|
|
$base_name,
|
|
'org'
|
|
]),
|
|
$extension
|
|
])
|
|
]);
|
|
$file->moveTo($filename);
|
|
|
|
try {
|
|
gd_info();
|
|
} catch(\Exception $e) {
|
|
return file_exists($filename);
|
|
}
|
|
$thumb = implode(DIRECTORY_SEPARATOR, [
|
|
$folder,
|
|
implode('.', [
|
|
implode('_', [
|
|
$base_name,
|
|
'thumb'
|
|
]),
|
|
'jpg'
|
|
])
|
|
]);
|
|
$this->copyResize($filename, $thumb, 50, 300);
|
|
$media = implode(DIRECTORY_SEPARATOR, [
|
|
$folder,
|
|
implode('.', [
|
|
$base_name,
|
|
'jpg'
|
|
])
|
|
]);
|
|
$this->copyResize($filename, $media, 75, 1024);
|
|
|
|
return file_exists($filename);
|
|
}
|
|
protected function resize_image($source, $w, $h, $crop = FALSE) {
|
|
list($width, $height) = getimagesize($source);
|
|
$r = $width / $height;
|
|
if ($crop) {
|
|
if ($width > $height) {
|
|
$width = ceil($width-($width*abs($r-$w/$h)));
|
|
} else {
|
|
$height = ceil($height-($height*abs($r-$w/$h)));
|
|
}
|
|
$newwidth = $w;
|
|
$newheight = $h;
|
|
} else {
|
|
if ($w/$h > $r) {
|
|
$newwidth = $h*$r;
|
|
$newheight = $h;
|
|
} else {
|
|
$newheight = $w/$r;
|
|
$newwidth = $w;
|
|
}
|
|
}
|
|
$src = imagecreatefromjpeg($file);
|
|
$dst = imagecreatetruecolor($newwidth, $newheight);
|
|
imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
|
|
|
|
return $dst;
|
|
}
|
|
protected function copyResize($source, $destination, $quality, $w, $h = 0, $crop = false) {
|
|
$info = getimagesize($source);
|
|
if ($info['mime'] == 'image/jpeg') {
|
|
$image = imagecreatefromjpeg($source);
|
|
} elseif ($info['mime'] == 'image/gif') {
|
|
$image = imagecreatefromgif($source);
|
|
} elseif ($info['mime'] == 'image/png') {
|
|
$image = imagecreatefrompng($source);
|
|
}
|
|
|
|
list($width, $height) = getimagesize($source);
|
|
$r = $width / $height;
|
|
if ($h == 0) {
|
|
$h = $w * $r;
|
|
}
|
|
if ($crop) {
|
|
if ($width > $height) {
|
|
$width = ceil($width-($width*abs($r-$w/$h)));
|
|
} else {
|
|
$height = ceil($height-($height*abs($r-$w/$h)));
|
|
}
|
|
$newwidth = $w;
|
|
$newheight = $h;
|
|
} else {
|
|
if ($w/$h > $r) {
|
|
$newwidth = $h*$r;
|
|
$newheight = $h;
|
|
} else {
|
|
$newheight = $w/$r;
|
|
$newwidth = $w;
|
|
}
|
|
}
|
|
$dst = imagecreatetruecolor($newwidth, $newheight);
|
|
imagecopyresampled($dst, $image, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
|
|
imagejpeg($dst, $destination, $quality);
|
|
}
|
|
public function addVideo($event, $file) {
|
|
$folder = $this->getFolder($event);
|
|
$medias = $this->load($event);
|
|
$base_name = '01';
|
|
if ($medias !== false and count($medias) > 0) {
|
|
$base_name = str_pad(count($medias) + 1, 2, '0', \STR_PAD_LEFT);
|
|
}
|
|
$extension = pathinfo($file->getClientFilename(), PATHINFO_EXTENSION);
|
|
$filename = implode(DIRECTORY_SEPARATOR, [
|
|
$folder,
|
|
implode('.', [
|
|
implode('_', [
|
|
$base_name,
|
|
'org'
|
|
]),
|
|
$extension
|
|
])
|
|
]);
|
|
$file->moveTo($filename);
|
|
|
|
if ($this->ffmpeg === null) {
|
|
return file_exists($filename);
|
|
}
|
|
|
|
$thumb = implode(DIRECTORY_SEPARATOR, [
|
|
$folder,
|
|
implode('.', [
|
|
implode('_', [
|
|
$base_name,
|
|
'thumb'
|
|
]),
|
|
'jpg'
|
|
])
|
|
]);
|
|
|
|
$video
|
|
->filters()
|
|
->resize(new FFMpeg\Coordinate\Dimension(320, 240))
|
|
->synchronize();
|
|
$video
|
|
->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(1))
|
|
->save($thumb);
|
|
$media = implode(DIRECTORY_SEPARATOR, [
|
|
$folder,
|
|
implode('.', [
|
|
$base_name,
|
|
$extension
|
|
])
|
|
]);
|
|
$video
|
|
->save(new FFMpeg\Format\Video\X264(), $media);
|
|
return file_exists($filename);
|
|
}
|
|
public function delete($event, $filename) {
|
|
$folder = $this->getFolder($event);
|
|
$media = implode(DIRECTORY_SEPARATOR, [
|
|
$folder,
|
|
$filename . '*.*'
|
|
]);
|
|
$files = glob($media);
|
|
foreach ($files as $filename) {
|
|
unlink($filename);
|
|
}
|
|
if (count(scandir($folder)) <= 2) {
|
|
rmdir($folder);
|
|
}
|
|
$filename = implode(DIRECTORY_SEPARATOR, [
|
|
$folder,
|
|
$filename . '.jpg'
|
|
]);
|
|
return file_exists($filename);
|
|
}
|
|
}
|