Zona de administracion para agregar eventos y subir imagenes
This commit is contained in:
303
common/Service/MediaLoader.php
Normal file
303
common/Service/MediaLoader.php
Normal file
@ -0,0 +1,303 @@
|
||||
<?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;
|
||||
}
|
||||
});
|
||||
return $medias;
|
||||
}
|
||||
public function add($event, $file) {
|
||||
$folder = $this->getFolder($event);
|
||||
if (!file_exists($folder)) {
|
||||
mkdir($folder);
|
||||
chmod($folder, 777);
|
||||
}
|
||||
$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);
|
||||
|
||||
$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) {
|
||||
$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);
|
||||
|
||||
$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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user