123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- <?php
- /**
- * @package Grav\Common\Page
- *
- * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
- * @license MIT License; see LICENSE file for details.
- */
- namespace Grav\Common\Page\Medium;
- use Grav\Common\Grav;
- use Grav\Common\Data\Blueprint;
- use Grav\Framework\Form\FormFlashFile;
- class MediumFactory
- {
- /**
- * Create Medium from a file
- *
- * @param string $file
- * @param array $params
- * @return Medium
- */
- public static function fromFile($file, array $params = [])
- {
- if (!file_exists($file)) {
- return null;
- }
- $parts = pathinfo($file);
- $path = $parts['dirname'];
- $filename = $parts['basename'];
- $ext = $parts['extension'];
- $basename = $parts['filename'];
- $config = Grav::instance()['config'];
- $media_params = $config->get('media.types.' . strtolower($ext));
- if (!\is_array($media_params)) {
- return null;
- }
- $params += $media_params;
- // Add default settings for undefined variables.
- $params += (array)$config->get('media.types.defaults');
- $params += [
- 'type' => 'file',
- 'thumb' => 'media/thumb.png',
- 'mime' => 'application/octet-stream',
- 'filepath' => $file,
- 'filename' => $filename,
- 'basename' => $basename,
- 'extension' => $ext,
- 'path' => $path,
- 'modified' => filemtime($file),
- 'thumbnails' => []
- ];
- $locator = Grav::instance()['locator'];
- $file = $locator->findResource("image://{$params['thumb']}");
- if ($file) {
- $params['thumbnails']['default'] = $file;
- }
- return static::fromArray($params);
- }
- /**
- * Create Medium from an uploaded file
- *
- * @param FormFlashFile $uploadedFile
- * @param array $params
- * @return Medium
- */
- public static function fromUploadedFile(FormFlashFile $uploadedFile, array $params = [])
- {
- $parts = pathinfo($uploadedFile->getClientFilename());
- $filename = $parts['basename'];
- $ext = $parts['extension'];
- $basename = $parts['filename'];
- $file = $uploadedFile->getTmpFile();
- $path = dirname($file);
- $config = Grav::instance()['config'];
- $media_params = $config->get('media.types.' . strtolower($ext));
- if (!\is_array($media_params)) {
- return null;
- }
- $params += $media_params;
- // Add default settings for undefined variables.
- $params += (array)$config->get('media.types.defaults');
- $params += [
- 'type' => 'file',
- 'thumb' => 'media/thumb.png',
- 'mime' => 'application/octet-stream',
- 'filepath' => $file,
- 'filename' => $filename,
- 'basename' => $basename,
- 'extension' => $ext,
- 'path' => $path,
- 'modified' => filemtime($file),
- 'thumbnails' => []
- ];
- $locator = Grav::instance()['locator'];
- $file = $locator->findResource("image://{$params['thumb']}");
- if ($file) {
- $params['thumbnails']['default'] = $file;
- }
- return static::fromArray($params);
- }
- /**
- * Create Medium from array of parameters
- *
- * @param array $items
- * @param Blueprint|null $blueprint
- * @return Medium
- */
- public static function fromArray(array $items = [], Blueprint $blueprint = null)
- {
- $type = $items['type'] ?? null;
- switch ($type) {
- case 'image':
- return new ImageMedium($items, $blueprint);
- case 'thumbnail':
- return new ThumbnailImageMedium($items, $blueprint);
- case 'animated':
- case 'vector':
- return new StaticImageMedium($items, $blueprint);
- case 'video':
- return new VideoMedium($items, $blueprint);
- case 'audio':
- return new AudioMedium($items, $blueprint);
- default:
- return new Medium($items, $blueprint);
- }
- }
- /**
- * Create a new ImageMedium by scaling another ImageMedium object.
- *
- * @param ImageMedium $medium
- * @param int $from
- * @param int $to
- * @return Medium|array
- */
- public static function scaledFromMedium($medium, $from, $to)
- {
- if (! $medium instanceof ImageMedium) {
- return $medium;
- }
- if ($to > $from) {
- return $medium;
- }
- $ratio = $to / $from;
- $width = $medium->get('width') * $ratio;
- $height = $medium->get('height') * $ratio;
- $prev_basename = $medium->get('basename');
- $basename = str_replace('@'.$from.'x', '@'.$to.'x', $prev_basename);
- $debug = $medium->get('debug');
- $medium->set('debug', false);
- $medium->setImagePrettyName($basename);
- $file = $medium->resize($width, $height)->path();
- $medium->set('debug', $debug);
- $medium->setImagePrettyName($prev_basename);
- $size = filesize($file);
- $medium = self::fromFile($file);
- if ($medium) {
- $medium->set('size', $size);
- }
- return ['file' => $medium, 'size' => $size];
- }
- }
|