# دليل إعداد Cron Job لمعالجة الفيديو

## 📋 نظرة عامة

السكريبت الحالي `process_videos.php` **مصمم للعمل مع Cron** ويعالج:
- ✅ فيديو واحد في كل مرة (أو حتى 10 فيديوهات)
- ✅ يتحقق من الحالة في قاعدة البيانات
- ✅ يتجنب المعالجة المكررة
- ✅ يسجل جميع العمليات

---

## 🔧 إعداد Cron Job

### الخطوة 1: فتح Crontab
```bash
crontab -e
```

### الخطوة 2: إضافة المهمة

#### خيار 1: كل 30 دقيقة (موصى به)
```bash
*/30 * * * * cd /Applications/XAMPP/xamppfiles/htdocs/Rassd26/backend/api && /Applications/XAMPP/xamppfiles/bin/php process_videos.php >> video_processing.log 2>&1
```

#### خيار 2: كل ساعة
```bash
0 * * * * cd /Applications/XAMPP/xamppfiles/htdocs/Rassd26/backend/api && /Applications/XAMPP/xamppfiles/bin/php process_videos.php >> video_processing.log 2>&1
```

#### خيار 3: كل 15 دقيقة
```bash
*/15 * * * * cd /Applications/XAMPP/xamppfiles/htdocs/Rassd26/backend/api && /Applications/XAMPP/xamppfiles/bin/php process_videos.php >> video_processing.log 2>&1
```

#### خيار 4: مرة واحدة يومياً (2 صباحاً)
```bash
0 2 * * * cd /Applications/XAMPP/xamppfiles/htdocs/Rassd26/backend/api && /Applications/XAMPP/xamppfiles/bin/php process_videos.php >> video_processing.log 2>&1
```

---

## 📝 شرح الأمر

```bash
*/30 * * * *                                    ← كل 30 دقيقة
cd /path/to/api                                 ← الانتقال للمجلد
&& /path/to/php process_videos.php             ← تشغيل السكريبت
>> video_processing.log 2>&1                    ← حفظ السجلات
```

### مكونات Cron:
```
* * * * *
│ │ │ │ │
│ │ │ │ └─── يوم الأسبوع (0-7, 0=الأحد)
│ │ │ └───── الشهر (1-12)
│ │ └─────── يوم الشهر (1-31)
│ └───────── الساعة (0-23)
└─────────── الدقيقة (0-59)
```

---

## 🎯 كيف يعمل السكريبت؟

### 1. عند كل تشغيل:
```php
// يبحث عن فيديوهات غير معالجة
SELECT * FROM social_media_content 
WHERE video_url IS NOT NULL 
AND video_processing = 0 
LIMIT 10;  // ← يعالج حتى 10 فيديوهات في كل مرة
```

### 2. لكل فيديو:
1. تحديث `video_processing = 1` (جاري المعالجة)
2. معالجة 4 جودات (360p, 480p, 720p, 1080p)
3. إنشاء master playlist
4. تحديث `video_processing = 2` (تمت المعالجة)

### 3. إذا فشلت المعالجة:
- يعيد `video_processing = 0`
- يسجل الخطأ في `video_processing.log`
- ينتقل للفيديو التالي

---

## 🎬 استدعاء الفيديو في الموقع

### الطريقة 1: استخدام Master Playlist (موصى به)
```html
<video id="video" controls width="100%"></video>
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<script>
    var video = document.getElementById('video');
    
    // استبدل post_id بالرقم الفعلي
    var postId = '2020965931523158098';
    var videoSrc = 'backend/api/upload_media/' + postId + '_hls/master.m3u8';
    
    // Safari - دعم أصلي
    if (video.canPlayType('application/vnd.apple.mpegurl')) {
        video.src = videoSrc;
    } 
    // المتصفحات الأخرى - hls.js
    else if (Hls.isSupported()) {
        var hls = new Hls({
            // التحكم في الجودة
            startLevel: -1,  // -1 = تلقائي حسب سرعة الإنترنت
            // startLevel: 0,   // 0 = أقل جودة (360p)
            // startLevel: 3,   // 3 = أعلى جودة (1080p)
        });
        
        hls.loadSource(videoSrc);
        hls.attachMedia(video);
        
        // الاستماع للأحداث
        hls.on(Hls.Events.MANIFEST_PARSED, function() {
            console.log('جاهز للتشغيل!');
            console.log('الجودات المتاحة:', hls.levels.length);
        });
        
        // تغيير الجودة يدوياً
        hls.on(Hls.Events.LEVEL_SWITCHED, function(event, data) {
            var level = hls.levels[data.level];
            console.log('الجودة الحالية:', level.height + 'p');
        });
    }
</script>
```

### الطريقة 2: جودة محددة
```html
<script>
    // استخدام جودة محددة (480p)
    var videoSrc = 'backend/api/upload_media/' + postId + '_hls/480p/playlist.m3u8';
</script>
```

---

## 🎛️ التحكم في الجودة

### 1. تلقائي (Adaptive Bitrate)
```javascript
var hls = new Hls({
    startLevel: -1,  // تلقائي
    enableWorker: true,
    lowLatencyMode: false,
});
```

### 2. جودة محددة
```javascript
// بدء بجودة محددة
hls.startLevel = 0;  // 360p
hls.startLevel = 1;  // 480p
hls.startLevel = 2;  // 720p
hls.startLevel = 3;  // 1080p

// تغيير الجودة أثناء التشغيل
hls.currentLevel = 2;  // التبديل إلى 720p
```

### 3. واجهة تحكم للمستخدم
```html
<select id="quality" onchange="changeQuality()">
    <option value="-1">تلقائي</option>
    <option value="0">360p</option>
    <option value="1">480p</option>
    <option value="2">720p</option>
    <option value="3">1080p</option>
</select>

<script>
function changeQuality() {
    var quality = document.getElementById('quality').value;
    hls.currentLevel = parseInt(quality);
}
</script>
```

---

## 📊 مراقبة المعالجة

### 1. عرض السجلات
```bash
# عرض آخر 50 سطر
tail -50 video_processing.log

# متابعة السجلات مباشرة
tail -f video_processing.log
```

### 2. التحقق من الحالة في قاعدة البيانات
```sql
-- عرض حالة جميع الفيديوهات
SELECT 
    id,
    post_id,
    video_url,
    video_processing,
    CASE video_processing
        WHEN 0 THEN 'لم تتم ⏳'
        WHEN 1 THEN 'جاري المعالجة ⚙️'
        WHEN 2 THEN 'تمت ✅'
    END as status,
    created_at
FROM social_media_content 
WHERE video_url IS NOT NULL
ORDER BY id DESC;
```

### 3. إحصائيات
```sql
-- عدد الفيديوهات حسب الحالة
SELECT 
    CASE video_processing
        WHEN 0 THEN 'لم تتم'
        WHEN 1 THEN 'جاري'
        WHEN 2 THEN 'تمت'
    END as status,
    COUNT(*) as count
FROM social_media_content 
WHERE video_url IS NOT NULL
GROUP BY video_processing;
```

---

## 🔄 إعادة معالجة فيديو

### إعادة معالجة فيديو واحد
```sql
UPDATE social_media_content 
SET video_processing = 0 
WHERE post_id = '2020965931523158098';
```

### إعادة معالجة جميع الفيديوهات
```sql
UPDATE social_media_content 
SET video_processing = 0 
WHERE video_url IS NOT NULL;
```

---

## ⚙️ تخصيص الجودات

إذا أردت تغيير الجودات، عدّل في `process_videos.php`:

```php
$qualities = [
    // يمكنك إضافة أو حذف جودات
    '240p' => [
        'resolution' => '426:240',
        'video_bitrate' => '400k',
        'audio_bitrate' => '64k'
    ],
    '360p' => [
        'resolution' => '640:360',
        'video_bitrate' => '800k',
        'audio_bitrate' => '96k'
    ],
    '480p' => [
        'resolution' => '854:480',
        'video_bitrate' => '1400k',
        'audio_bitrate' => '128k'
    ],
    '720p' => [
        'resolution' => '1280:720',
        'video_bitrate' => '2800k',
        'audio_bitrate' => '128k'
    ],
    // حذف 1080p لتوفير المساحة
    // '1080p' => [...]
];
```

---

## 🚀 أمثلة عملية

### مثال 1: صفحة عرض الفيديو
```php
<?php
// get_video.php
$postId = $_GET['post_id'] ?? '';
$db = new PDO(...);

$stmt = $db->prepare("SELECT * FROM social_media_content WHERE post_id = ?");
$stmt->execute([$postId]);
$post = $stmt->fetch();

if ($post && $post['video_processing'] == 2) {
    $videoUrl = "upload_media/{$postId}_hls/master.m3u8";
    echo json_encode(['status' => 'ready', 'url' => $videoUrl]);
} else {
    echo json_encode(['status' => 'processing']);
}
?>
```

### مثال 2: قائمة الفيديوهات
```php
<?php
// list_videos.php
$db = new PDO(...);
$stmt = $db->query("SELECT * FROM social_media_content WHERE video_processing = 2 ORDER BY id DESC");
$videos = $stmt->fetchAll();

foreach ($videos as $video) {
    echo '<div class="video-item">';
    echo '<h3>' . $video['title'] . '</h3>';
    echo '<video-player data-post-id="' . $video['post_id'] . '"></video-player>';
    echo '</div>';
}
?>
```

---

## ✅ الخلاصة

**للبدء:**
1. أضف Cron Job (كل 30 دقيقة موصى به)
2. السكريبت سيعالج الفيديوهات تلقائياً
3. استخدم master.m3u8 في الموقع
4. الجودة ستتغير تلقائياً حسب سرعة الإنترنت

**الأمر الكامل للـ Cron:**
```bash
*/30 * * * * cd /Applications/XAMPP/xamppfiles/htdocs/Rassd26/backend/api && /Applications/XAMPP/xamppfiles/bin/php process_videos.php >> video_processing.log 2>&1
```

**التاريخ**: 2026-02-10
