folder = $media_folder; $this->media_url = $media_assets_url; } 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('', [ '' ]); case 'mkv': case 'mp4': case 'mov': case 'avi': case 'ogg': case 'webm': return implode('', [ '' ]); } } 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->media === null) { $item->media = $item->original; } 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); $thumb = implode(DIRECTORY_SEPARATOR, [ $folder, implode('.', [ implode('_', [ $base_name, 'thumb' ]), 'jpg' ]) ]); $image = imagecreatetruecolor(300, 300); $black = imagecolorallocate($image, 0, 0, 0); imagefill($image, 0, 0, $black); $pfile = implode(DIRECTORY_SEPARATOR, [ dirname($this->folder, 3), 'resources', 'data', 'play.png' ]); $play = imagecreatefrompng($pfile); list($w, $h) = getimagesize($pfile); $r = $w / $h; $w = 100; $h = $r * $w; $play = imagescale($play, $w, $h); $x = (300 - $w) / 2; $y = (300 - $h) / 2; $x2 = (300 + $w) / 2 - $x; $y2 = (300 + $h) / 2 - $y; imagecopyresampled($image, $play, $x, $y, 0, 0, $x2, $y2, $w, $h); imagejpeg($image, $thumb, 50); 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); } }