|
| 1 | +<?php |
| 2 | + |
| 3 | +declare(strict_types=1); |
| 4 | + |
| 5 | +namespace Elegantly\Media\Definitions; |
| 6 | + |
| 7 | +use Closure; |
| 8 | +use Elegantly\Media\Enums\MediaType; |
| 9 | +use Elegantly\Media\Models\Media; |
| 10 | +use Elegantly\Media\Models\MediaConversion; |
| 11 | +use Illuminate\Contracts\Filesystem\Filesystem; |
| 12 | +use ProtoneMedia\LaravelFFMpeg\Exporters\MediaExporter; |
| 13 | +use ProtoneMedia\LaravelFFMpeg\Support\FFMpeg; |
| 14 | +use Spatie\TemporaryDirectory\TemporaryDirectory as SpatieTemporaryDirectory; |
| 15 | + |
| 16 | +class MediaConversionFFmpeg extends MediaConversionDefinition |
| 17 | +{ |
| 18 | + /** |
| 19 | + * @param Closure(MediaExporter $ffmpeg):void $manipulate |
| 20 | + * @param Closure(Media $media, ?MediaConversion $parent):string $fileName |
| 21 | + */ |
| 22 | + public function __construct( |
| 23 | + public string $name, |
| 24 | + public Closure $manipulate, |
| 25 | + public Closure $fileName, |
| 26 | + public null|bool|Closure $when = null, |
| 27 | + public ?Closure $onCompleted = null, |
| 28 | + public bool $immediate = true, |
| 29 | + public bool $queued = true, |
| 30 | + public ?string $queue = null, |
| 31 | + public array $conversions = [], |
| 32 | + ) { |
| 33 | + |
| 34 | + parent::__construct( |
| 35 | + name: $name, |
| 36 | + handle: fn () => null, |
| 37 | + when: $when, |
| 38 | + onCompleted: $onCompleted, |
| 39 | + immediate: $immediate, |
| 40 | + queued: $queued, |
| 41 | + queue: $queue, |
| 42 | + conversions: $conversions |
| 43 | + ); |
| 44 | + } |
| 45 | + |
| 46 | + public function shouldExecute(Media $media, ?MediaConversion $parent): bool |
| 47 | + { |
| 48 | + if ($this->when !== null) { |
| 49 | + return parent::shouldExecute($media, $parent); |
| 50 | + } |
| 51 | + |
| 52 | + $source = $parent ?? $media; |
| 53 | + |
| 54 | + return in_array($source->type, [MediaType::Video, MediaType::Audio]); |
| 55 | + } |
| 56 | + |
| 57 | + public function handle( |
| 58 | + Media $media, |
| 59 | + ?MediaConversion $parent, |
| 60 | + ?string $file, |
| 61 | + Filesystem $filesystem, |
| 62 | + SpatieTemporaryDirectory $temporaryDirectory |
| 63 | + ): ?MediaConversion { |
| 64 | + |
| 65 | + if (! $file) { |
| 66 | + return null; |
| 67 | + } |
| 68 | + |
| 69 | + $fileName = $this->fileName; |
| 70 | + $manipulate = $this->manipulate; |
| 71 | + |
| 72 | + $newFile = $fileName($media, $parent); |
| 73 | + |
| 74 | + $ffmpeg = FFMpeg::fromFilesystem($filesystem) |
| 75 | + ->open($file) |
| 76 | + ->export(); |
| 77 | + |
| 78 | + $manipulate($ffmpeg); |
| 79 | + |
| 80 | + $ffmpeg->save($newFile); |
| 81 | + |
| 82 | + return $media->addConversion( |
| 83 | + file: $filesystem->path($newFile), |
| 84 | + conversionName: $this->name, |
| 85 | + parent: $parent, |
| 86 | + ); |
| 87 | + |
| 88 | + } |
| 89 | +} |
0 commit comments