Specify temporary directory + fix for default ffmpeg-passes* temporary directory (#855)

This commit is contained in:
Pascal Baljet 2022-02-22 16:54:06 +01:00 committed by GitHub
commit bda300b69a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 119 additions and 35 deletions

View file

@ -2,6 +2,11 @@
All Notable changes to the library will be documented in this file
## 1.0.1 - 2022-02-22
- Added configuration key to customize the temporary directory used for passes.
- Fix for the path of the default `ffmpeg-passes*` temporary directory.
## 1.0.0 - 2022-02-09
Upgraded dependencies, integrated the Alchemy Binary library, and dropped support for anything below PHP 8.0

View file

@ -79,6 +79,14 @@ $ffmpeg = FFMpeg\FFMpeg::create(array(
), $logger);
```
You may pass a `temporary_directory` key to specify a path for temporary files.
```php
$ffmpeg = FFMpeg\FFMpeg::create(array(
'temporary_directory' => '/var/ffmpeg-tmp'
), $logger);
```
### Manipulate media
`FFMpeg\FFMpeg` creates media based on URIs. URIs could be either a pointer to a

View file

@ -57,7 +57,8 @@
"php-ffmpeg/extras": "A compilation of common audio & video drivers for PHP-FFMpeg"
},
"require-dev": {
"phpunit/phpunit": "^9.5.10"
"phpunit/phpunit": "^9.5.10",
"mockery/mockery": "^1.5"
},
"autoload": {
"psr-4": {

View file

@ -14,6 +14,7 @@ namespace FFMpeg\Media;
use FFMpeg\Driver\FFMpegDriver;
use FFMpeg\FFProbe;
use FFMpeg\Filters\FiltersCollection;
use Spatie\TemporaryDirectory\TemporaryDirectory;
abstract class AbstractMediaType implements MediaTypeInterface
{
@ -96,6 +97,18 @@ abstract class AbstractMediaType implements MediaTypeInterface
return $this->filters;
}
/**
* Returns a new instance of TemporaryDirectory with the optionally configured directory.
*
* @return \Spatie\TemporaryDirectory\TemporaryDirectory
*/
public function getTemporaryDirectory(): TemporaryDirectory
{
return new TemporaryDirectory(
$this->driver->getConfiguration()->get('temporary_directory') ?: ''
);
}
protected function cleanupTemporaryFile($filename)
{
if (file_exists($filename) && is_writable($filename)) {

View file

@ -267,7 +267,7 @@ abstract class AbstractVideo extends Audio
}
$this->fsId = uniqid('ffmpeg-passes');
$this->fs = (new TemporaryDirectory($this->fsId))->create();
$this->fs = $this->getTemporaryDirectory()->name($this->fsId)->create();
$passPrefix = $this->fs->path(uniqid('pass-'));
touch($passPrefix);
$passes = [];

View file

@ -85,7 +85,7 @@ class Concat extends AbstractMediaType
*/
// Create the file which will contain the list of videos
$fs = (new TemporaryDirectory())->create();
$fs = $this->getTemporaryDirectory()->create();
$sourcesFile = $fs->path('ffmpeg.concat');
// Set the content of this file

View file

@ -32,4 +32,42 @@ class AdvancedMediaTest extends AbstractMediaTestCase
$advancedMedia = new AdvancedMedia([__FILE__, __FILE__], $driver, $ffprobe);
$this->assertInstanceOf('FFMpeg\Filters\AdvancedMedia\ComplexFilters', $advancedMedia->filters());
}
public function testGetTemporaryDirectoryWithoutCustomConfiguration()
{
$driver = $this->getFFMpegDriverMock();
$ffprobe = $this->getFFProbeMock();
$configuration = $this->getConfigurationMock();
$driver->expects($this->any())
->method('getConfiguration')
->will($this->returnValue($configuration));
$configuration->expects($this->once())
->method('get')
->with($this->equalTo('temporary_directory'))
->will($this->returnValue(null));
$advancedMedia = new AdvancedMedia([__FILE__, __FILE__], $driver, $ffprobe);
$this->assertEquals('', $advancedMedia->getTemporaryDirectory()->path());
}
public function testGetTemporaryDirectoryWithCustomConfiguration()
{
$driver = $this->getFFMpegDriverMock();
$ffprobe = $this->getFFProbeMock();
$configuration = $this->getConfigurationMock();
$driver->expects($this->any())
->method('getConfiguration')
->will($this->returnValue($configuration));
$configuration->expects($this->once())
->method('get')
->with($this->equalTo('temporary_directory'))
->will($this->returnValue('/var/ffmpeg'));
$advancedMedia = new AdvancedMedia([__FILE__, __FILE__], $driver, $ffprobe);
$this->assertEquals('/var/ffmpeg', $advancedMedia->getTemporaryDirectory()->path());
}
}

View file

@ -3,6 +3,7 @@
namespace Tests\FFMpeg\Unit\Media;
use FFMpeg\Media\Concat;
use Mockery;
use Spatie\TemporaryDirectory\TemporaryDirectory;
class ConcatTest extends AbstractMediaTestCase
@ -57,6 +58,17 @@ class ConcatTest extends AbstractMediaTestCase
array_push($commands, $pathfile);
$configuration = Mockery::mock('Alchemy\BinaryDriver\ConfigurationInterface');
$driver->expects($this->any())
->method('getConfiguration')
->will($this->returnValue($configuration));
$configuration->shouldReceive('get')
->once()
->with('temporary_directory')
->andReturnNull();
$driver->expects($this->exactly(1))
->method('command')
->with($this->isType('array'), false, $this->anything())

View file

@ -5,6 +5,7 @@ namespace Tests\FFMpeg\Unit\Media;
use FFMpeg\Exception\RuntimeException;
use FFMpeg\Format\Video\X264;
use FFMpeg\Media\Video;
use Mockery;
class VideoTest extends AbstractStreamableTestCase
{
@ -158,25 +159,27 @@ class VideoTest extends AbstractStreamableTestCase
$driver = $this->getFFMpegDriverMock();
$ffprobe = $this->getFFProbeMock();
$configuration = $this->getMockBuilder('Alchemy\BinaryDriver\ConfigurationInterface')->getMock();
$configuration = Mockery::mock('Alchemy\BinaryDriver\ConfigurationInterface');
$driver->expects($this->any())
->method('getConfiguration')
->will($this->returnValue($configuration));
$configuration->expects($this->once())
->method('has')
->with($this->equalTo('ffmpeg.threads'))
->will($this->returnValue($threads));
$configuration->shouldReceive('has')
->once()
->with('ffmpeg.threads')
->andReturn($threads);
$configuration->shouldReceive('get')
->once()
->with('temporary_directory')
->andReturnNull();
if ($threads) {
$configuration->expects($this->once())
->method('get')
->with($this->equalTo('ffmpeg.threads'))
->will($this->returnValue(24));
} else {
$configuration->expects($this->never())
->method('get');
$configuration->shouldReceive('get')
->once()
->with('ffmpeg.threads')
->andReturn(24);
}
$capturedCommands = [];
@ -585,21 +588,25 @@ class VideoTest extends AbstractStreamableTestCase
$driver = $this->getFFMpegDriverMock();
$ffprobe = $this->getFFProbeMock();
$configuration = $this->getMockBuilder('Alchemy\BinaryDriver\ConfigurationInterface')->getMock();
$configuration = Mockery::mock('Alchemy\BinaryDriver\ConfigurationInterface');
$driver->expects($this->any())
->method('getConfiguration')
->will($this->returnValue($configuration));
$configuration->expects($this->any())
->method('has')
->with($this->equalTo('ffmpeg.threads'))
->will($this->returnValue(true));
$configuration->shouldReceive('has')
->with('ffmpeg.threads')
->andReturn(true);
$configuration->expects($this->any())
->method('get')
->with($this->equalTo('ffmpeg.threads'))
->will($this->returnValue(24));
$configuration->shouldReceive('get')
->once()
->with('ffmpeg.threads')
->andReturn(24);
$configuration->shouldReceive('get')
->once()
->with('temporary_directory')
->andReturnNull();
$capturedCommands = [];