first commit
Some checks failed
Build / run (push) Has been cancelled

This commit is contained in:
maher
2025-10-29 11:42:25 +01:00
commit 703f50a09d
4595 changed files with 385164 additions and 0 deletions

View File

@@ -0,0 +1,185 @@
<?php
namespace App\Actions\Demo;
use App\Models\Episode;
use App\Models\Title;
use App\Models\Video;
use App\Models\VideoCaption;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Symfony\Component\Console\Output\ConsoleOutput;
class GenerateDemoStreamVideos
{
protected array $demoVideos = [
[
'name' => 'Demo HLS',
'src' =>
'https://stream.mux.com/buWV5Srtc9vUQTWmgpTFkDNlA3zImB7C9CQ2CVgkZpI.m3u8',
'type' => 'stream',
'quality' => '1080p',
],
[
'name' => 'Demo HLS',
'src' =>
'https://stream.mux.com/Rus46I1a5LSATgJ6YDhbDo024F7qHEYZBTbOxRZJdIn4.m3u8',
'type' => 'stream',
'quality' => '1080p',
],
[
'name' => 'Demo HLS',
'src' =>
'https://stream.mux.com/E7hs5dNds85023rGvL4rrAjPI02BpRE2024XyFnjx007oj4.m3u8',
'type' => 'stream',
'quality' => '1080p',
],
[
'name' => 'Demo HLS',
'src' =>
'https://stream.mux.com/Q20238p74cLNL4Bm2ivdjGnSozST6Gec2Ym1EuDnCMJI.m3u8',
'type' => 'stream',
'quality' => '1080p',
],
[
'name' => 'Demo HLS',
'src' =>
'https://stream.mux.com/spmRS3NLqWHkkBGEYM4KRhj6Hytnat00AnPS8v3hj9qA.m3u8',
'type' => 'stream',
'quality' => '1080p',
],
[
'name' => 'Demo WebM',
'src' => 'storage/demo-videos/sprite-fright/sprite-fright.webm',
'type' => 'video',
'quality' => '1080p',
'captions' => [
[
'name' => 'English',
'language' => 'en',
'url' =>
'storage/demo-videos/sprite-fright/subs/sprite-fright.en.vtt',
],
[
'name' => 'Russian',
'language' => 'ru',
'url' =>
'storage/demo-videos/sprite-fright/subs/sprite-fright.ru.vtt',
],
[
'name' => 'German',
'language' => 'de',
'url' =>
'storage/demo-videos/sprite-fright/subs/sprite-fright.de.vtt',
],
[
'name' => 'Italian',
'language' => 'it',
'url' =>
'storage/demo-videos/sprite-fright/subs/sprite-fright.it.vtt',
],
],
],
];
protected Sequence $demoVideoSequence;
public function execute(): void
{
$this->demoVideoSequence = new Sequence(...$this->demoVideos);
$output = new ConsoleOutput();
$output->write('Generating demo stream videos... ', true);
$this->createVideosForAllMovies();
$this->createEpisodeVideos();
$this->createCaptions();
}
private function createVideosForAllMovies(): void
{
Title::where('is_series', false)
->whereDoesntHave(
'videos',
fn($query) => $query
->where('origin', 'local')
->where('category', 'full'),
)
->select('id')
->chunkById(100, function (Collection $titles) {
$titleVideos = $titles->map(
fn($title) => $this->getVideoData($title->id),
);
Video::insert($titleVideos->toArray());
});
}
private function createCaptions(): void
{
collect($this->demoVideos)
->filter(fn($video) => isset($video['captions']))
->each(function ($data) {
Video::where('origin', 'local')
->where('category', 'full')
->where('name', $data['name'])
->whereDoesntHave('captions')
->chunkById(100, function (Collection $videos) use ($data) {
$captionPayload = $videos->flatMap(
fn(Video $video) => array_map(
fn($captionData) => [
'name' => $captionData['name'],
'language' => $captionData['language'],
'url' => $captionData['url'],
'video_id' => $video->id,
'created_at' => now(),
'updated_at' => now(),
],
$data['captions'],
),
);
VideoCaption::insert($captionPayload->toArray());
});
});
}
private function createEpisodeVideos(): void
{
Episode::whereDoesntHave(
'videos',
fn($query) => $query
->where('origin', 'local')
->where('category', 'full'),
)->chunkById(100, function (Collection $episodes) {
$episodeVideos = $episodes->map(
fn(Episode $episode) => $this->getVideoData(
$episode->title_id,
$episode,
),
);
Video::insert($episodeVideos->toArray());
});
}
private function getVideoData(int $titleId, Episode $episode = null): array
{
$sequence = $this->demoVideoSequence;
$data = $sequence();
return [
'name' => $data['name'],
'src' => $data['src'],
'type' => $data['type'],
'category' => 'full',
'quality' => $data['quality'],
'title_id' => $titleId,
'season_num' => $episode?->season_number,
'episode_num' => $episode?->episode_number,
'episode_id' => $episode?->id,
'origin' => 'local',
'approved' => true,
'created_at' => now(),
'updated_at' => now(),
'language' => 'en',
];
}
}