Update Saqel Platform: 2026-08-29 22:05:41

This commit is contained in:
Hamza-Ayed
2026-08-29 22:05:41 +03:00
parent d10e1c712c
commit 051b9322f6
3 changed files with 161 additions and 44 deletions
+62 -3
View File
@@ -415,6 +415,64 @@ class VideoController
$chapters = !empty($lesson['timeline_chapters_json']) ? json_decode($lesson['timeline_chapters_json'], true) : [];
// Find available versions (AI vs Teacher specific)
$lessonTitle = $lesson['title'];
$versionsRaw = Database::select(
"SELECT l.id, l.course_id, l.title, l.storage_type, l.video_uuid, l.hls_url, l.ai_video_url, l.bunny_video_id,
c.teacher_id, u.full_name as teacher_name, u.school_name
FROM lessons l
LEFT JOIN courses c ON l.course_id = c.id
LEFT JOIN users u ON c.teacher_id = u.id
WHERE l.title = ? AND l.encoding_status = 'ready'",
[$lessonTitle]
);
$availableVersions = [];
$studentSchool = $request->user['school_name'] ?? ''; // if student's school is in the token
foreach ($versionsRaw as $ver) {
$isAi = ($ver['course_id'] == 0 || $ver['course_id'] == null);
$vPlayback = [];
if ($ver['storage_type'] === 'api_upload') {
$vPlayback = [
'storage_type' => 'api_upload',
'stream_url' => '/api/videos/stream/' . $ver['video_uuid'],
'hls_url' => $ver['hls_url'] ?: ('/api/videos/hls/' . $ver['video_uuid'] . '/index.m3u8'),
'video_url' => $ver['ai_video_url'] ?: ($ver['hls_url'] ?: ('/api/videos/stream/' . $ver['video_uuid']))
];
} else {
$bId = $ver['bunny_video_id'] ?: 'mock-bunny-guid-2026';
$signed = VideoService::generateBunnySignedPlayback($bId, 10800);
$vPlayback = array_merge(['storage_type' => 'bunny_stream', 'video_url' => $signed['hls_url']], $signed);
}
$label = $isAi ? 'فيديو الذكاء الاصطناعي الأساسي 🤖' : 'شرح الأستاذ ' . $ver['teacher_name'];
$isRecommended = (!$isAi && !empty($studentSchool) && $ver['school_name'] === $studentSchool);
if ($isRecommended) {
$label .= ' (مدرستك 🏫)';
}
$availableVersions[] = [
'lesson_id' => (int)$ver['id'],
'is_ai' => $isAi,
'teacher_name' => $ver['teacher_name'],
'school_name' => $ver['school_name'],
'label' => $label,
'is_recommended' => $isRecommended,
'playback' => $vPlayback
];
}
// Sort: Recommended first, then AI, then others
usort($availableVersions, function($a, $b) {
if ($a['is_recommended'] && !$b['is_recommended']) return -1;
if (!$a['is_recommended'] && $b['is_recommended']) return 1;
if ($a['is_ai'] && !$b['is_ai']) return -1;
if (!$a['is_ai'] && $b['is_ai']) return 1;
return 0;
});
$response->json([
'status' => 'success',
'data' => [
@@ -426,9 +484,10 @@ class VideoController
'is_free_preview' => (bool)$lesson['is_free_preview'],
'storage_type' => $storageType
],
'playback' => $playbackInfo,
'chapters' => $chapters ?: [],
'checkpoints' => $checkpoints ?: []
'playback' => $playbackInfo,
'available_versions' => $availableVersions,
'chapters' => $chapters ?: [],
'checkpoints' => $checkpoints ?: []
]
]);
}