AudioVideoTest.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <?php
  2. namespace Pbmedia\LaravelFFMpeg\Tests;
  3. use FFMpeg\Coordinate\Dimension;
  4. use FFMpeg\Coordinate\TimeCode;
  5. use FFMpeg\Filters\Video\ClipFilter;
  6. use FFMpeg\Media\Video;
  7. use Illuminate\Config\Repository as ConfigRepository;
  8. use Illuminate\Contracts\Filesystem\Factory as Filesystems;
  9. use Illuminate\Filesystem\FilesystemAdapter;
  10. use Illuminate\Log\Writer;
  11. use League\Flysystem\AdapterInterface;
  12. use League\Flysystem\FilesystemInterface;
  13. use Mockery;
  14. use Monolog\Logger;
  15. use Pbmedia\LaravelFFMpeg\Disk;
  16. use Pbmedia\LaravelFFMpeg\FFMpeg;
  17. use Pbmedia\LaravelFFMpeg\File;
  18. use Pbmedia\LaravelFFMpeg\Media;
  19. use Pbmedia\LaravelFFMpeg\MediaExporter;
  20. class AudioVideoTest extends TestCase
  21. {
  22. public function testInstantiationOfService()
  23. {
  24. $service = $this->getService();
  25. $this->assertInstanceOf(Filesystems::class, $service->getFilesystems());
  26. }
  27. public function testMediaClass()
  28. {
  29. $media = $this->getGuitarMedia();
  30. $this->assertInstanceOf(Media::class, $media);
  31. $this->assertFalse($media->isFrame());
  32. }
  33. public function testFileClass()
  34. {
  35. $media = $this->getGuitarMedia();
  36. $file = $media->getFile();
  37. $this->assertInstanceOf(File::class, $file);
  38. $this->assertEquals($file->getPath(), 'guitar.m4a');
  39. $this->assertEquals($file->getFullPath(), $this->srcDir . '/guitar.m4a');
  40. }
  41. public function testDurationInSeconds()
  42. {
  43. $media = $this->getGuitarMedia();
  44. $this->assertEquals(4, $media->getDurationInSeconds());
  45. }
  46. public function testDiskClass()
  47. {
  48. $media = $this->getGuitarMedia();
  49. $file = $media->getFile();
  50. $disk = $file->getDisk();
  51. $this->assertInstanceOf(Disk::class, $disk);
  52. $this->assertEquals($disk->getPath(), $this->srcDir . '/');
  53. }
  54. public function testAddingAFilterWithAClosure()
  55. {
  56. $media = $this->getVideoMedia();
  57. $this->assertCount(0, $media->getFiltersCollection());
  58. $media->addFilter(function ($filters) {
  59. $filters->resize(new Dimension(640, 480));
  60. });
  61. $this->assertCount(1, $media->getFiltersCollection());
  62. }
  63. public function testAddingAFilterWithAnObject()
  64. {
  65. $media = $this->getVideoMedia();
  66. $this->assertCount(0, $media->getFiltersCollection());
  67. $media->addFilter(new ClipFilter(TimeCode::fromSeconds(5)));
  68. $this->assertCount(1, $media->getFiltersCollection());
  69. }
  70. public function testExportingToLocalDisk()
  71. {
  72. $media = $this->getGuitarMedia();
  73. $exporter = $media->export();
  74. $this->assertInstanceOf(MediaExporter::class, $exporter);
  75. $file = $media->getFile();
  76. $format = new \FFMpeg\Format\Audio\Aac;
  77. $media = Mockery::mock(Media::class);
  78. $media->shouldReceive('getFile')->once()->andReturn($file);
  79. $media->shouldReceive('isFrame')->once()->andReturn(false);
  80. $media->shouldReceive('save')->once()->withArgs([
  81. $format, $this->srcDir . '/guitar_aac.aac',
  82. ]);
  83. $exporter = new MediaExporter($media);
  84. $exporter->inFormat($format)->toDisk('local')->save('guitar_aac.aac');
  85. }
  86. public function testOpeningFromRemoteDisk()
  87. {
  88. $filesystems = Mockery::mock(Filesystems::class);
  89. $config = Mockery::mock(ConfigRepository::class);
  90. $logger = new Writer(new Logger('ffmpeg'));
  91. $adapter = Mockery::mock(AdapterInterface::class);
  92. $driver = Mockery::mock(FilesystemInterface::class);
  93. $driver->shouldReceive('getAdapter')->andReturn($adapter);
  94. $remoteDisk = Mockery::mock(FilesystemAdapter::class);
  95. $remoteDisk->shouldReceive('getDriver')->andReturn($driver);
  96. $remoteDisk->shouldReceive('read')->with('remote_guitar.m4a')->andReturn(
  97. $videoContents = file_get_contents(__DIR__ . '/src/guitar.m4a')
  98. );
  99. $localDisk = $this->getLocalAdapter();
  100. $filesystems->shouldReceive('disk')->once()->with('s3')->andReturn($remoteDisk);
  101. $filesystems->shouldReceive('disk')->once()->with('local')->andReturn($localDisk);
  102. $config->shouldReceive('get')->once()->with('laravel-ffmpeg')->andReturn(array_merge($this->getDefaultConfig(), ['default_disk' => 's3']));
  103. $config->shouldReceive('get')->once()->with('filesystems.default')->andReturn('s3');
  104. $service = new FFMpeg($filesystems, $config, $logger);
  105. $media = $service->open('remote_guitar.m4a');
  106. $format = new \FFMpeg\Format\Audio\Aac;
  107. $media->export()
  108. ->inFormat($format)
  109. ->toDisk('local')
  110. ->save('local_guitar.m4a');
  111. $this->assertFileExists(__DIR__ . '/src/local_guitar.m4a');
  112. @unlink($this->srcDir . '/local_guitar.m4a');
  113. }
  114. public function testExportingToRemoteDisk()
  115. {
  116. $this->remoteFilesystem = true;
  117. $guitarFile = $this->getGuitarMedia()->getFile();
  118. $baseMedia = Mockery::mock(Video::class);
  119. $baseMedia->shouldReceive('save')->once();
  120. $media = new Media($guitarFile, $baseMedia);
  121. $exporter = new MediaExporter($media);
  122. $mockedRemoteDisk = Mockery::mock(Disk::class);
  123. $remoteFile = new File($mockedRemoteDisk, 'guitar_aac.aac');
  124. $remoteFileMocked = Mockery::mock(File::class);
  125. $remoteFileMocked->shouldReceive('getPath')->once()->andReturn($remoteFile->getPath());
  126. $remoteFileMocked->shouldReceive('getDisk')->once()->andReturn($remoteFile->getDisk());
  127. $remoteFileMocked->shouldReceive('getExtension')->once()->andReturn($remoteFile->getExtension());
  128. $remoteFileMocked->shouldReceive('put')->once()->andReturn(true);
  129. $mockedRemoteDisk->shouldReceive('isLocal')->once()->andReturn(false);
  130. $mockedRemoteDisk->shouldReceive('newFile')->once()->withArgs(['guitar_aac.aac'])->andReturn($remoteFileMocked);
  131. $format = new \FFMpeg\Format\Audio\Aac;
  132. $exporter->inFormat($format)->toDisk($mockedRemoteDisk)->save('guitar_aac.aac');
  133. }
  134. public function testCreatingAndUnlinkingOfTemporaryFiles()
  135. {
  136. $newTemporaryFile = FFMpeg::newTemporaryFile();
  137. file_put_contents($newTemporaryFile, 'test');
  138. $this->assertTrue(file_exists($newTemporaryFile));
  139. $this->assertEquals('test', file_get_contents($newTemporaryFile));
  140. $service = $this->getService()->cleanupTemporaryFiles();
  141. $this->assertFalse(file_exists($newTemporaryFile));
  142. }
  143. }