Files
ladill-meet/app/Services/Meet/LiveStreamService.php
T
isaaccladandCursor 965fb992e9
Deploy Ladill Meet / deploy (push) Failing after 7s
Initial Ladill Meet release.
Phases 0–18: core meetings, webinar, breakouts, team chat, live streaming, town hall, billing, and Ladill Mail calendar wiring.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-30 23:35:29 +00:00

92 lines
2.4 KiB
PHP

<?php
namespace App\Services\Meet;
use App\Models\LiveStream;
use App\Models\Session;
use App\Models\User;
use Illuminate\Support\Str;
class LiveStreamService
{
/** @var array<string, string> */
public const PLATFORMS = [
'youtube' => 'YouTube',
'facebook' => 'Facebook Live',
'linkedin' => 'LinkedIn Live',
'custom' => 'Custom RTMP',
];
/** @var array<string, string> */
public const LAYOUTS = [
'speaker' => 'Speaker view',
'gallery' => 'Gallery view',
'screen' => 'Screen share focus',
];
/**
* @param array<string, mixed> $data
*/
public function configure(Session $session, User $host, array $data): LiveStream
{
$platform = $data['platform'] ?? 'custom';
$rtmpUrl = $this->defaultRtmpUrl($platform, $data['rtmp_url'] ?? null);
return LiveStream::updateOrCreate(
['session_id' => $session->id, 'platform' => $platform],
[
'owner_ref' => $session->owner_ref,
'rtmp_url' => $rtmpUrl,
'stream_key' => $data['stream_key'] ?? '',
'layout' => $data['layout'] ?? 'speaker',
'status' => 'idle',
],
);
}
public function start(LiveStream $stream): LiveStream
{
$stream->update([
'status' => 'live',
'started_at' => now(),
'ended_at' => null,
'health' => 'ok',
]);
AuditLogger::record(
$stream->owner_ref,
'livestream.started',
$stream->session->room->organization_id,
$stream->owner_ref,
LiveStream::class,
$stream->id,
);
return $stream->fresh();
}
public function stop(LiveStream $stream): LiveStream
{
$stream->update([
'status' => 'stopped',
'ended_at' => now(),
]);
return $stream->fresh();
}
protected function defaultRtmpUrl(string $platform, ?string $custom): string
{
if ($custom) {
return $custom;
}
return match ($platform) {
'youtube' => 'rtmp://a.rtmp.youtube.com/live2',
'facebook' => 'rtmps://live-api-s.facebook.com:443/rtmp/',
'linkedin' => 'rtmp://stream.linkedin.com:1935/live/',
default => '',
};
}
}