Skip to content

Commit 4288cc2

Browse files
committed
add spritesheet conversion
1 parent 2ba6e6b commit 4288cc2

8 files changed

+170
-36
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Elegantly\Media\Definitions\Concerns;
6+
7+
use Closure;
8+
use Elegantly\Media\Models\Media;
9+
use Elegantly\Media\Models\MediaConversion;
10+
11+
/**
12+
* @property null|string|(Closure(Media $media, ?MediaConversion $parent):string) $fileName
13+
*/
14+
trait HasFilename
15+
{
16+
public function getFilename(Media $media, ?MediaConversion $parent): string
17+
{
18+
if ($fileName = $this->fileName) {
19+
return is_string($fileName) ? $fileName : $fileName($media, $parent);
20+
}
21+
22+
return $this->getDefaultFilename($media, $parent);
23+
}
24+
25+
public function getDefaultFilename(Media $media, ?MediaConversion $parent): string
26+
{
27+
$source = $parent ?? $media;
28+
29+
return "{$source->name}.{$source->extension}";
30+
}
31+
}

src/Definitions/MediaConversionAudio.php

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Elegantly\Media\Definitions;
66

77
use Closure;
8+
use Elegantly\Media\Definitions\Concerns\HasFilename;
89
use Elegantly\Media\Enums\MediaType;
910
use Elegantly\Media\Models\Media;
1011
use Elegantly\Media\Models\MediaConversion;
@@ -17,6 +18,8 @@
1718

1819
class MediaConversionAudio extends MediaConversionDefinition
1920
{
21+
use HasFilename;
22+
2023
/**
2124
* @param null|string|(Closure(Media $media, ?MediaConversion $parent):string) $fileName
2225
*/
@@ -67,12 +70,8 @@ public function hasFileAudioStream(string $path): bool
6770
return (bool) $streams->audios()->count();
6871
}
6972

70-
public function getFileName(Media $media, ?MediaConversion $parent): string
73+
public function getDefaultFilename(Media $media, ?MediaConversion $parent): string
7174
{
72-
if ($fileName = $this->fileName) {
73-
return is_string($fileName) ? $fileName : $fileName($media, $parent);
74-
}
75-
7675
$source = $parent ?? $media;
7776

7877
return "{$source->name}.mp3";
@@ -96,7 +95,7 @@ public function handle(
9695
return null;
9796
}
9897

99-
$fileName = $this->getFileName($media, $parent);
98+
$fileName = $this->getFilename($media, $parent);
10099

101100
$ffmpeg = FFMpeg::fromFilesystem($filesystem)
102101
->open($file)

src/Definitions/MediaConversionFFmpeg.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@
1010
use Elegantly\Media\Models\MediaConversion;
1111
use Illuminate\Contracts\Filesystem\Filesystem;
1212
use ProtoneMedia\LaravelFFMpeg\Exporters\MediaExporter;
13+
use ProtoneMedia\LaravelFFMpeg\MediaOpener;
1314
use ProtoneMedia\LaravelFFMpeg\Support\FFMpeg;
1415
use Spatie\TemporaryDirectory\TemporaryDirectory as SpatieTemporaryDirectory;
1516

1617
class MediaConversionFFmpeg extends MediaConversionDefinition
1718
{
1819
/**
19-
* @param Closure(MediaExporter $ffmpeg, Media $media, ?MediaConversion $parent):void $manipulate
20+
* @param Closure(MediaOpener $ffmpeg, Media $media, ?MediaConversion $parent):MediaExporter $manipulate
2021
* @param Closure(Media $media, ?MediaConversion $parent):string $fileName
2122
*/
2223
public function __construct(
@@ -72,10 +73,9 @@ public function handle(
7273
$newFile = $fileName($media, $parent);
7374

7475
$ffmpeg = FFMpeg::fromFilesystem($filesystem)
75-
->open($file)
76-
->export();
76+
->open($file);
7777

78-
$manipulate($ffmpeg, $media, $parent);
78+
$ffmpeg = $manipulate($ffmpeg, $media, $parent);
7979

8080
$ffmpeg->save($newFile);
8181

src/Definitions/MediaConversionImage.php

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Elegantly\Media\Definitions;
66

77
use Closure;
8+
use Elegantly\Media\Definitions\Concerns\HasFilename;
89
use Elegantly\Media\Enums\MediaType;
910
use Elegantly\Media\Models\Media;
1011
use Elegantly\Media\Models\MediaConversion;
@@ -16,6 +17,8 @@
1617

1718
class MediaConversionImage extends MediaConversionDefinition
1819
{
20+
use HasFilename;
21+
1922
/**
2023
* @param null|string|(Closure(Media $media, ?MediaConversion $parent):string) $fileName
2124
*/
@@ -55,12 +58,8 @@ public function shouldExecute(Media $media, ?MediaConversion $parent): bool
5558
return ($parent ?? $media)->type === MediaType::Image;
5659
}
5760

58-
public function getFileName(Media $media, ?MediaConversion $parent): string
61+
public function getDefaultFilename(Media $media, ?MediaConversion $parent): string
5962
{
60-
if ($fileName = $this->fileName) {
61-
return is_string($fileName) ? $fileName : $fileName($media, $parent);
62-
}
63-
6463
$source = $parent ?? $media;
6564

6665
return "{$source->name}.jpg";
@@ -77,7 +76,7 @@ public function handle(
7776
return null;
7877
}
7978

80-
$fileName = $this->getFileName($media, $parent);
79+
$fileName = $this->getFilename($media, $parent);
8180

8281
Image::load($filesystem->path($file))
8382
->fit($this->fit, $this->width, $this->height)

src/Definitions/MediaConversionPdfPreview.php

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Elegantly\Media\Definitions;
66

77
use Closure;
8+
use Elegantly\Media\Definitions\Concerns\HasFilename;
89
use Elegantly\Media\Enums\MediaType;
910
use Elegantly\Media\Models\Media;
1011
use Elegantly\Media\Models\MediaConversion;
@@ -16,6 +17,8 @@
1617

1718
class MediaConversionPdfPreview extends MediaConversionDefinition
1819
{
20+
use HasFilename;
21+
1922
/**
2023
* @param null|string|(Closure(Media $media, ?MediaConversion $parent):string) $fileName
2124
*/
@@ -57,12 +60,8 @@ public function shouldExecute(Media $media, ?MediaConversion $parent): bool
5760
return $source->type === MediaType::Pdf;
5861
}
5962

60-
public function getFileName(Media $media, ?MediaConversion $parent): string
63+
public function getDefaultFilename(Media $media, ?MediaConversion $parent): string
6164
{
62-
if ($fileName = $this->fileName) {
63-
return is_string($fileName) ? $fileName : $fileName($media, $parent);
64-
}
65-
6665
$source = $parent ?? $media;
6766

6867
return "{$source->name}.jpg";
@@ -81,7 +80,7 @@ public function handle(
8180

8281
$path = $filesystem->path($file);
8382

84-
$fileName = $this->getFileName($media, $parent);
83+
$fileName = $this->getFilename($media, $parent);
8584

8685
$target = $filesystem->path($fileName);
8786

src/Definitions/MediaConversionPoster.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Elegantly\Media\Definitions;
66

77
use Closure;
8+
use Elegantly\Media\Definitions\Concerns\HasFilename;
89
use Elegantly\Media\Enums\MediaType;
910
use Elegantly\Media\Models\Media;
1011
use Elegantly\Media\Models\MediaConversion;
@@ -18,6 +19,8 @@
1819

1920
class MediaConversionPoster extends MediaConversionDefinition
2021
{
22+
use HasFilename;
23+
2124
/**
2225
* @param null|string|(Closure(Media $media, ?MediaConversion $parent):string) $fileName
2326
* @param TimeCode|float|(Closure(Media $media, ?MediaConversion $parent):TimeCode) $seconds
@@ -59,11 +62,8 @@ public function shouldExecute(Media $media, ?MediaConversion $parent): bool
5962
return ($parent ?? $media)->type === MediaType::Video;
6063
}
6164

62-
public function getFileName(Media $media, ?MediaConversion $parent): string
65+
public function getDefaultFilename(Media $media, ?MediaConversion $parent): string
6366
{
64-
if ($fileName = $this->fileName) {
65-
return is_string($fileName) ? $fileName : $fileName($media, $parent);
66-
}
6767

6868
$source = $parent ?? $media;
6969

@@ -96,7 +96,7 @@ public function handle(
9696
return null;
9797
}
9898

99-
$fileName = $this->getFileName($media, $parent);
99+
$fileName = $this->getFilename($media, $parent);
100100

101101
FFMpeg::fromFilesystem($filesystem)
102102
->open($file)
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Elegantly\Media\Definitions;
6+
7+
use Closure;
8+
use Elegantly\Media\Definitions\Concerns\HasFilename;
9+
use Elegantly\Media\Enums\MediaType;
10+
use Elegantly\Media\Helpers\File;
11+
use Elegantly\Media\Models\Media;
12+
use Elegantly\Media\Models\MediaConversion;
13+
use Illuminate\Contracts\Filesystem\Filesystem;
14+
use ProtoneMedia\LaravelFFMpeg\Filters\TileFactory;
15+
use ProtoneMedia\LaravelFFMpeg\Support\FFMpeg;
16+
use Spatie\TemporaryDirectory\TemporaryDirectory as SpatieTemporaryDirectory;
17+
18+
class MediaConversionSpritesheet extends MediaConversionDefinition
19+
{
20+
use HasFilename;
21+
22+
/**
23+
* @param float $interval in seconds
24+
* @param MediaConversionDefinition[] $conversions
25+
* @param null|bool|Closure(Media $media, ?MediaConversion $parent): bool $when
26+
*/
27+
public function __construct(
28+
public string $name,
29+
public null|bool|Closure $when = null,
30+
public ?Closure $onCompleted = null,
31+
public bool $immediate = true,
32+
public bool $queued = true,
33+
public ?string $queue = null,
34+
public array $conversions = [],
35+
public null|string|Closure $fileName = null,
36+
public float $interval = 3.0,
37+
public int $width = 180,
38+
) {
39+
40+
parent::__construct(
41+
name: $name,
42+
handle: fn () => null,
43+
when: $when,
44+
onCompleted: $onCompleted,
45+
immediate: $immediate,
46+
queued: $queued,
47+
queue: $queue,
48+
conversions: $conversions
49+
);
50+
}
51+
52+
public function shouldExecute(Media $media, ?MediaConversion $parent): bool
53+
{
54+
if ($this->when !== null) {
55+
return parent::shouldExecute($media, $parent);
56+
}
57+
58+
$source = $parent ?? $media;
59+
60+
return $source->type === MediaType::Video;
61+
}
62+
63+
public function getDefaultFilename(Media $media, ?MediaConversion $parent): string
64+
{
65+
$source = $parent ?? $media;
66+
67+
return "{$source->name}.jpg";
68+
}
69+
70+
public function handle(
71+
Media $media,
72+
?MediaConversion $parent,
73+
?string $file,
74+
Filesystem $filesystem,
75+
SpatieTemporaryDirectory $temporaryDirectory
76+
): ?MediaConversion {
77+
if (! $file) {
78+
return null;
79+
}
80+
81+
$newFile = $this->getFilename($media, $parent);
82+
83+
$ffmpeg = FFMpeg::fromFilesystem($filesystem)
84+
->open($file);
85+
86+
// in ms
87+
$duration = File::duration($filesystem->path($file)) ?? 0.0;
88+
89+
$count = (int) ceil(($duration / 1_000) / $this->interval);
90+
91+
$ffmpeg = $ffmpeg->exportTile(
92+
fn (TileFactory $tileFactory) => $tileFactory
93+
->interval($this->interval)
94+
->grid(1, $count)
95+
->scale($this->width)
96+
);
97+
98+
$ffmpeg->save($newFile);
99+
100+
return $media->addConversion(
101+
file: $filesystem->path($newFile),
102+
conversionName: $this->name,
103+
parent: $parent,
104+
);
105+
106+
}
107+
}

src/Definitions/MediaConversionVideo.php

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Elegantly\Media\Definitions;
66

77
use Closure;
8+
use Elegantly\Media\Definitions\Concerns\HasFilename;
89
use Elegantly\Media\Enums\MediaType;
910
use Elegantly\Media\Models\Media;
1011
use Elegantly\Media\Models\MediaConversion;
@@ -20,6 +21,8 @@
2021

2122
class MediaConversionVideo extends MediaConversionDefinition
2223
{
24+
use HasFilename;
25+
2326
/**
2427
* @param null|string|(Closure(Media $media, ?MediaConversion $parent):string) $fileName
2528
*/
@@ -53,19 +56,15 @@ public function __construct(
5356

5457
public function shouldExecute(Media $media, ?MediaConversion $parent): bool
5558
{
56-
if ($this->when !== null) {
57-
return parent::shouldExecute($media, $parent);
59+
if ($this->when === null) {
60+
return ($parent ?? $media)->type === MediaType::Video;
5861
}
5962

60-
return ($parent ?? $media)->type === MediaType::Video;
63+
return parent::shouldExecute($media, $parent);
6164
}
6265

63-
public function getFileName(Media $media, ?MediaConversion $parent): string
66+
public function getDefaultFilename(Media $media, ?MediaConversion $parent): string
6467
{
65-
if ($fileName = $this->fileName) {
66-
return is_string($fileName) ? $fileName : $fileName($media, $parent);
67-
}
68-
6968
$source = $parent ?? $media;
7069

7170
return "{$source->name}.mp4";
@@ -85,7 +84,7 @@ public function handle(
8584

8685
$source = $parent ?? $media;
8786

88-
$fileName = $this->getFileName($media, $parent);
87+
$fileName = $this->getFilename($media, $parent);
8988
$aspectRatio = new AspectRatio($source->aspect_ratio);
9089

9190
$width = min($this->width, $source->width);

0 commit comments

Comments
 (0)