2024-02-24 07:28:49 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace Tests\Integration\Services\Streamer;
|
|
|
|
|
2024-04-18 17:20:14 +00:00
|
|
|
use App\Enums\SongStorageType;
|
2024-02-24 07:28:49 +00:00
|
|
|
use App\Exceptions\KoelPlusRequiredException;
|
|
|
|
use App\Models\Song;
|
|
|
|
use App\Services\Streamer\Adapters\LocalStreamerAdapter;
|
|
|
|
use App\Services\Streamer\Adapters\PhpStreamerAdapter;
|
|
|
|
use App\Services\Streamer\Adapters\S3CompatibleStreamerAdapter;
|
|
|
|
use App\Services\Streamer\Adapters\TranscodingStreamerAdapter;
|
|
|
|
use App\Services\Streamer\Adapters\XAccelRedirectStreamerAdapter;
|
|
|
|
use App\Services\Streamer\Adapters\XSendFileStreamerAdapter;
|
|
|
|
use App\Services\Streamer\Streamer;
|
|
|
|
use Illuminate\Support\Facades\File;
|
|
|
|
use Tests\TestCase;
|
|
|
|
|
|
|
|
use function Tests\test_path;
|
|
|
|
|
|
|
|
class StreamerTest extends TestCase
|
|
|
|
{
|
|
|
|
public function testResolveAdapters(): void
|
|
|
|
{
|
2024-04-18 17:20:14 +00:00
|
|
|
collect(SongStorageType::cases())
|
|
|
|
->each(function (SongStorageType $type): void {
|
2024-02-24 07:28:49 +00:00
|
|
|
/** @var Song $song */
|
|
|
|
$song = Song::factory()->make(['storage' => $type]);
|
|
|
|
|
|
|
|
switch ($type) {
|
2024-04-18 17:20:14 +00:00
|
|
|
case SongStorageType::S3:
|
|
|
|
case SongStorageType::DROPBOX:
|
2024-03-22 20:34:32 +00:00
|
|
|
$this->expectException(KoelPlusRequiredException::class);
|
2024-02-24 07:28:49 +00:00
|
|
|
new Streamer($song);
|
|
|
|
break;
|
|
|
|
|
2024-04-18 17:20:14 +00:00
|
|
|
case SongStorageType::S3_LAMBDA:
|
2024-02-24 07:28:49 +00:00
|
|
|
self::assertInstanceOf(S3CompatibleStreamerAdapter::class, (new Streamer($song))->getAdapter());
|
|
|
|
break;
|
|
|
|
|
2024-04-18 17:20:14 +00:00
|
|
|
case SongStorageType::LOCAL:
|
2024-02-24 07:28:49 +00:00
|
|
|
self::assertInstanceOf(LocalStreamerAdapter::class, (new Streamer($song))->getAdapter());
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testResolveTranscodingAdapter(): void
|
|
|
|
{
|
|
|
|
config(['koel.streaming.transcode_flac' => true]);
|
|
|
|
|
|
|
|
File::partialMock()->shouldReceive('mimeType')->andReturn('audio/flac');
|
|
|
|
|
|
|
|
/** @var Song $song */
|
|
|
|
$song = Song::factory()->make(['path' => test_path('songs/blank.mp3')]);
|
|
|
|
self::assertInstanceOf(TranscodingStreamerAdapter::class, (new Streamer($song))->getAdapter());
|
|
|
|
|
|
|
|
config(['koel.streaming.transcode_flac' => false]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testForceTranscodingAdapter(): void
|
|
|
|
{
|
|
|
|
/** @var Song $song */
|
|
|
|
$song = Song::factory()->make(['path' => test_path('songs/blank.mp3')]);
|
|
|
|
|
|
|
|
self::assertInstanceOf(
|
|
|
|
TranscodingStreamerAdapter::class,
|
|
|
|
(new Streamer($song, null, ['transcode' => true]))->getAdapter()
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** @return array<mixed> */
|
|
|
|
public function provideStreamConfigData(): array
|
|
|
|
{
|
|
|
|
return [
|
|
|
|
PhpStreamerAdapter::class => [null, PhpStreamerAdapter::class],
|
|
|
|
XSendFileStreamerAdapter::class => ['x-sendfile', XSendFileStreamerAdapter::class],
|
|
|
|
XAccelRedirectStreamerAdapter::class => ['x-accel-redirect', XAccelRedirectStreamerAdapter::class],
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
/** @dataProvider provideStreamConfigData */
|
|
|
|
public function testResolveLocalAdapter(?string $config, string $expectedClass): void
|
|
|
|
{
|
|
|
|
config(['koel.streaming.method' => $config]);
|
|
|
|
|
|
|
|
/** @var Song $song */
|
|
|
|
$song = Song::factory()->make(['path' => test_path('songs/blank.mp3')]);
|
|
|
|
|
|
|
|
self::assertInstanceOf($expectedClass, (new Streamer($song))->getAdapter());
|
|
|
|
|
|
|
|
config(['koel.streaming.method' => null]);
|
|
|
|
}
|
|
|
|
}
|