diff --git a/backend/app/Views/CurriculumStudio.php b/backend/app/Views/CurriculumStudio.php index 19694c3..d2803f3 100644 --- a/backend/app/Views/CurriculumStudio.php +++ b/backend/app/Views/CurriculumStudio.php @@ -506,7 +506,13 @@ class CurriculumStudio const raw = await res.text(); let data; try { data = JSON.parse(raw); } - catch (_) { throw new Error(`HTTP ${res.status}: ${raw.slice(0, 240) || 'استجابة غير مفهومة من السيرفر'}`); } + catch (_) { + const plain = raw.replace(/<[^>]*>/g, ' ').replace(/\s+/g, ' ').trim(); + if (res.status === 413) { + throw new Error('حجم الفيديو أكبر من الحد المسموح في Nginx. ارفع client_max_body_size إلى 512M أو أكثر.'); + } + throw new Error(`HTTP ${res.status}: ${plain.slice(0, 240) || 'استجابة غير مفهومة من السيرفر'}`); + } if (res.ok && data.status === 'processing') { currentUploadTaskId = data.task_id; statusSpan.textContent = data.message || '⏳ تم استلام الفيديو، جاري تحويله ورفعه إلى Cloudflare...'; diff --git a/docs/IMPLEMENTATION_STATUS.md b/docs/IMPLEMENTATION_STATUS.md index 30ec561..3e1e930 100644 --- a/docs/IMPLEMENTATION_STATUS.md +++ b/docs/IMPLEMENTATION_STATUS.md @@ -44,3 +44,5 @@ مجلدات R2 القديمة مثل `hls/0` و`hls/1` و`hls/4` ليست فهرس الدروس؛ المرجع المعتمد هو قاعدة البيانات و`curriculum_key`، لذلك لا تُحذف قبل ترحيلها والتحقق من كل درس. بعد نشر الكود يجب أن يكون عامل PHP قادرًا على الكتابة إلى `backend/storage/curriculum/processing` و`backend/storage/videos` و`backend/storage/hls`، وأن يكون FFmpeg مثبتًا على الخادم. وللفيديوهات الكبيرة يجب ضبط `upload_max_filesize` و`post_max_size` في PHP و`client_max_body_size` في Nginx بما يتجاوز حجم أكبر فيديو. + +إذا ظهر `HTTP 413 Request Entity Too Large` فهذا يعني أن Nginx رفض الملف قبل وصوله إلى PHP. في CloudPanel ارفع `client_max_body_size` إلى `512M` أو أكثر، وارفع `upload_max_filesize` و`post_max_size` في إعدادات PHP-FPM، ثم أعد تشغيل/Reload خدمة Nginx وPHP-FPM. لا تعالج 413 من كود التطبيق لأنه يحدث قبل تشغيل الـ API.