Commit 42538dd7 authored by Yassine Doghri's avatar Yassine Doghri
Browse files

feat(video-clip): add video-clip page with video preview + logs

parent 2065ebbe
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -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;
@@ -44,6 +45,11 @@ use Modules\Auth\Entities\User;
 */
class BaseClip extends Entity
{
    /**
     * @var BaseMedia
     */
    protected $media = null;

    /**
     * @var array<string, string>
     */
@@ -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;
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -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,
+7 −3
Original line number Diff line number Diff line
@@ -35,7 +35,9 @@ class VideoClipper

    public bool $error = false;

    public string $videoClipOutput;
    public string $videoClipFilePath;

    protected string $videoClipOutput;

    protected float $duration;

@@ -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
@@ -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')
@@ -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}",
        ];

+20 −0
Original line number Diff line number Diff line
@@ -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
     *
+1 −1
Original line number Diff line number Diff line
@@ -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