Loading app/Entities/Clip/BaseClip.php +11 −1 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ namespace App\Entities\Clip; use App\Entities\Episode; use App\Entities\Media\Audio; use App\Entities\Media\BaseMedia; use App\Entities\Media\Video; use App\Entities\Podcast; use App\Models\EpisodeModel; Loading Loading @@ -44,6 +45,11 @@ use Modules\Auth\Entities\User; */ class BaseClip extends Entity { /** * @var BaseMedia */ protected $media = null; /** * @var array<string, string> */ Loading Loading @@ -122,12 +128,16 @@ class BaseClip extends Entity return $this; } public function getMedia(): Audio | Video /** * @noRector ReturnTypeDeclarationRector */ public function getMedia(): Audio | Video | null { if ($this->media_id !== null && $this->media === null) { $this->media = (new MediaModel($this->type))->getMediaById($this->media_id); } // @phpstan-ignore-next-line return $this->media; } } app/Entities/Clip/VideoClip.php +2 −1 Original line number Diff line number Diff line Loading @@ -69,7 +69,8 @@ class VideoClip extends BaseClip return $this; } $file = new File($filePath); helper('media'); $file = new File(media_path($filePath)); $video = new Video([ 'file_path' => $filePath, Loading app/Libraries/MediaClipper/VideoClipper.php +7 −3 Original line number Diff line number Diff line Loading @@ -35,7 +35,9 @@ class VideoClipper public bool $error = false; public string $videoClipOutput; public string $videoClipFilePath; protected string $videoClipOutput; protected float $duration; Loading Loading @@ -95,6 +97,7 @@ class VideoClipper $this->subtitlesClipOutput = $podcastFolder . "/{$this->episode->slug}-subtitles-clip-{$this->start}-to-{$this->end}.srt"; $this->videoClipBgOutput = $podcastFolder . "/{$this->episode->slug}-clip-bg-{$this->format}-{$this->theme}.png"; $this->videoClipOutput = $podcastFolder . "/{$this->episode->slug}-clip-{$this->start}-to-{$this->end}-{$this->format}-{$this->theme}.mp4"; $this->videoClipFilePath = "podcasts/{$this->episode->podcast->handle}/{$this->episode->slug}-clip-{$this->start}-to-{$this->end}-{$this->format}-{$this->theme}.mp4"; } public function soundbite(): void Loading Loading @@ -152,6 +155,7 @@ class VideoClipper "color=0x{$this->colors['watermarkBg']}:{$this->dimensions['watermark']['width']}x{$this->dimensions['watermark']['height']}[over]", '[over][watermark]overlay=x=0:y=0:shortest=1[watermark_box]', "[outv][watermark_box]overlay=x={$this->dimensions['watermark']['x']}:y={$this->dimensions['watermark']['y']}:shortest=1[watermarked]", '[watermarked]scale=w=-1:h=-1:out_color_matrix=bt709[outfinal]', ]; $watermark = config('MediaClipper') Loading @@ -167,10 +171,10 @@ class VideoClipper "-f lavfi -i color=white:{$this->dimensions['width']}x{$this->dimensions['height']}", "-loop 1 -framerate 1 -i {$watermark}", '-filter_complex "' . implode(';', $filters) . '"', '-map "[watermarked]"', '-map "[outfinal]"', '-map 0:a', '-acodec copy', '-vcodec libx264rgb', '-vcodec libx264 -pix_fmt yuv420p', "{$this->videoClipOutput}", ]; Loading app/Models/ClipModel.php +20 −0 Original line number Diff line number Diff line Loading @@ -114,6 +114,26 @@ class ClipModel extends Model return $found; } public function getVideoClipById(int $videoClipId): ?VideoClip { $cacheName = "video-clip#{$videoClipId}"; if (! ($found = cache($cacheName))) { $clip = $this->find($videoClipId); if ($clip === null) { return null; } // @phpstan-ignore-next-line $found = new VideoClip($clip->toArray()); cache() ->save($cacheName, $found, DECADE); } return $found; } /** * Gets all video clips for an episode * Loading app/Views/Components/Alert.php +1 −1 Original line number Diff line number Diff line Loading @@ -21,7 +21,7 @@ class Alert extends Component { $variantClasses = [ 'default' => 'text-gray-800 bg-gray-100 border-gray-300', 'success' => 'text-pine-900 bg-pine-100 border-castopod-300', 'success' => 'text-pine-900 bg-pine-100 border-pine-300', 'danger' => 'text-red-900 bg-red-100 border-red-300', 'warning' => 'text-yellow-900 bg-yellow-100 border-yellow-300', ]; Loading Loading
app/Entities/Clip/BaseClip.php +11 −1 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ namespace App\Entities\Clip; use App\Entities\Episode; use App\Entities\Media\Audio; use App\Entities\Media\BaseMedia; use App\Entities\Media\Video; use App\Entities\Podcast; use App\Models\EpisodeModel; Loading Loading @@ -44,6 +45,11 @@ use Modules\Auth\Entities\User; */ class BaseClip extends Entity { /** * @var BaseMedia */ protected $media = null; /** * @var array<string, string> */ Loading Loading @@ -122,12 +128,16 @@ class BaseClip extends Entity return $this; } public function getMedia(): Audio | Video /** * @noRector ReturnTypeDeclarationRector */ public function getMedia(): Audio | Video | null { if ($this->media_id !== null && $this->media === null) { $this->media = (new MediaModel($this->type))->getMediaById($this->media_id); } // @phpstan-ignore-next-line return $this->media; } }
app/Entities/Clip/VideoClip.php +2 −1 Original line number Diff line number Diff line Loading @@ -69,7 +69,8 @@ class VideoClip extends BaseClip return $this; } $file = new File($filePath); helper('media'); $file = new File(media_path($filePath)); $video = new Video([ 'file_path' => $filePath, Loading
app/Libraries/MediaClipper/VideoClipper.php +7 −3 Original line number Diff line number Diff line Loading @@ -35,7 +35,9 @@ class VideoClipper public bool $error = false; public string $videoClipOutput; public string $videoClipFilePath; protected string $videoClipOutput; protected float $duration; Loading Loading @@ -95,6 +97,7 @@ class VideoClipper $this->subtitlesClipOutput = $podcastFolder . "/{$this->episode->slug}-subtitles-clip-{$this->start}-to-{$this->end}.srt"; $this->videoClipBgOutput = $podcastFolder . "/{$this->episode->slug}-clip-bg-{$this->format}-{$this->theme}.png"; $this->videoClipOutput = $podcastFolder . "/{$this->episode->slug}-clip-{$this->start}-to-{$this->end}-{$this->format}-{$this->theme}.mp4"; $this->videoClipFilePath = "podcasts/{$this->episode->podcast->handle}/{$this->episode->slug}-clip-{$this->start}-to-{$this->end}-{$this->format}-{$this->theme}.mp4"; } public function soundbite(): void Loading Loading @@ -152,6 +155,7 @@ class VideoClipper "color=0x{$this->colors['watermarkBg']}:{$this->dimensions['watermark']['width']}x{$this->dimensions['watermark']['height']}[over]", '[over][watermark]overlay=x=0:y=0:shortest=1[watermark_box]', "[outv][watermark_box]overlay=x={$this->dimensions['watermark']['x']}:y={$this->dimensions['watermark']['y']}:shortest=1[watermarked]", '[watermarked]scale=w=-1:h=-1:out_color_matrix=bt709[outfinal]', ]; $watermark = config('MediaClipper') Loading @@ -167,10 +171,10 @@ class VideoClipper "-f lavfi -i color=white:{$this->dimensions['width']}x{$this->dimensions['height']}", "-loop 1 -framerate 1 -i {$watermark}", '-filter_complex "' . implode(';', $filters) . '"', '-map "[watermarked]"', '-map "[outfinal]"', '-map 0:a', '-acodec copy', '-vcodec libx264rgb', '-vcodec libx264 -pix_fmt yuv420p', "{$this->videoClipOutput}", ]; Loading
app/Models/ClipModel.php +20 −0 Original line number Diff line number Diff line Loading @@ -114,6 +114,26 @@ class ClipModel extends Model return $found; } public function getVideoClipById(int $videoClipId): ?VideoClip { $cacheName = "video-clip#{$videoClipId}"; if (! ($found = cache($cacheName))) { $clip = $this->find($videoClipId); if ($clip === null) { return null; } // @phpstan-ignore-next-line $found = new VideoClip($clip->toArray()); cache() ->save($cacheName, $found, DECADE); } return $found; } /** * Gets all video clips for an episode * Loading
app/Views/Components/Alert.php +1 −1 Original line number Diff line number Diff line Loading @@ -21,7 +21,7 @@ class Alert extends Component { $variantClasses = [ 'default' => 'text-gray-800 bg-gray-100 border-gray-300', 'success' => 'text-pine-900 bg-pine-100 border-castopod-300', 'success' => 'text-pine-900 bg-pine-100 border-pine-300', 'danger' => 'text-red-900 bg-red-100 border-red-300', 'warning' => 'text-yellow-900 bg-yellow-100 border-yellow-300', ]; Loading