webworld888/app/Providers/MediaServiceProvider.php
2021-10-26 19:14:12 +09:00

150 lines
4.5 KiB
PHP

<?php
/**
* MediaServiceProvider.php
*
* PHP version 7
*
* @category Providers
* @package App\Providers
* @author XE Developers <developers@xpressengine.com>
* @copyright 2020 Copyright XEHub Corp. <https://www.xehub.io>
* @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL
* @link https://xpressengine.io
*/
namespace App\Providers;
use FFMpeg\FFMpeg;
use Illuminate\Support\ServiceProvider;
use Xpressengine\Media\CommandFactory;
use Xpressengine\Media\Extensions\DummyExtension;
use Xpressengine\Media\Extensions\FFMpegExtension;
use Xpressengine\Media\Handlers\AudioHandler;
use Xpressengine\Media\Handlers\ImageHandler;
use Xpressengine\Media\Handlers\VideoHandler;
use Xpressengine\Media\MediaManager;
use Intervention\Image\ImageManager;
use Xpressengine\Media\Models\Audio;
use Xpressengine\Media\Models\Image;
use Xpressengine\Media\Models\Media;
use Xpressengine\Media\Models\Video;
use Xpressengine\Media\Repositories\AudioRepository;
use Xpressengine\Media\Repositories\ImageRepository;
use Xpressengine\Media\Repositories\VideoRepository;
use Xpressengine\Media\Thumbnailer;
/**
* Class MediaServiceProvider
*
* @category Providers
* @package App\Providers
* @author XE Developers <developers@xpressengine.com>
* @copyright 2020 Copyright XEHub Corp. <https://www.xehub.io>
* @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL
* @link https://xpressengine.io
*/
class MediaServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application events.
*
* @return void
*/
public function boot()
{
Thumbnailer::setManager(new ImageManager());
ImageRepository::setModel(Image::class);
VideoRepository::setModel(Video::class);
AudioRepository::setModel(Audio::class);
$this->hooks();
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->app->singleton(MediaManager::class, function ($app) {
$config = $app['config']['xe.media'];
$proxyClass = $app['xe.interception']->proxy(MediaManager::class, 'XeMedia');
$mediaManager = new $proxyClass($app['xe.storage'], new CommandFactory(), $config['thumbnail']);
$mediaManager->extend(Media::TYPE_IMAGE, new ImageHandler(new ImageRepository(), $app['xe.storage']));
$extensionName = isset($config['videoExtensionDefault']) ? $config['videoExtensionDefault'] : 'dummy';
$method = 'create' . ucfirst($extensionName) . 'Extension';
if (method_exists($this, $method) !== true) {
throw new \InvalidArgumentException(
sprintf('Unknown extension [%s]', $config['videoExtensionDefault'])
);
}
$extension = $this->{$method}($config);
$mediaManager->extend(Media::TYPE_VIDEO, new VideoHandler(
new VideoRepository(),
new \getID3(),
$app['xe.storage.temp'],
$extension,
isset($config['videoSnapshotFromSec']) ?: null
));
$mediaManager->extend(Media::TYPE_AUDIO, new AudioHandler(
new AudioRepository(),
new \getID3(),
$app['xe.storage.temp']
));
return $mediaManager;
});
$this->app->alias(MediaManager::class, 'xe.media');
}
/**
* Returns DummyExtension
*
* @param array $config config data
* @return DummyExtension
*/
private function createDummyExtension($config)
{
return new DummyExtension();
}
/**
* Returns FFMpegExtension
*
* @param array $config config data
* @return FFMpegExtension
*/
private function createFfmpegExtension($config)
{
return new FFMpegExtension(FFMpeg::create($config['videoExtensions']['ffmpeg']), $this->app['xe.storage.temp']);
}
/**
* Add event listener.
*
* @return void
*/
private function hooks()
{
intercept('XeStorage@delete', 'media.delete', function ($target, $file) {
/** @var MediaManager $manager */
$manager = $this->app['xe.media'];
if ($manager->is($file)) {
if (!$file instanceof Media) {
$file = $manager->cast($file);
}
$manager->metaDelete($file);
}
return $target($file);
});
}
}