From 59c9b1f5bebf04650529143ee4fffecb5c80f7d9 Mon Sep 17 00:00:00 2001 From: Francesco Picone Date: Tue, 9 Dec 2025 16:58:11 +0100 Subject: [PATCH] fix ffmpeg --- README.md | 146 +++++++++++++++------- admin/dashboard.php | 1 + admin/lesson_create.php | 28 +++++ admin/lesson_edit.php | 28 +++++ admin/lessons.php | 1 + admin/profile.php | 1 + admin/purchases.php | 1 + admin/users.php | 1 + convert_videos.php | 270 ++++++++++++++++++++++++++++++++++++++++ lesson.php | 14 ++- stream_video.php | 42 +++++-- 11 files changed, 476 insertions(+), 57 deletions(-) create mode 100644 convert_videos.php diff --git a/README.md b/README.md index b354bf3..a001a26 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,8 @@ Piattaforma completa per vendere videolezioni e lezioni live di Pilates. Svilupp - **Gestione utenti** (visualizza, blocca/sblocca, statistiche acquisti) - **Storico acquisti** con dettagli pagamenti PayPal e grafici - **Report e analisi** vendite con totali formattati +- **Profilo amministratore** con cambio password e test invio email +- **Conversione video** automatica in formato web-compatible (MP4 H.264) ### Funzionalità Tecniche - ✅ **Sicurezza**: Password crittografate con bcrypt (PHP 8.1+ compatibile) @@ -39,12 +41,17 @@ Piattaforma completa per vendere videolezioni e lezioni live di Pilates. Svilupp - ✅ **Soft delete**: I dati eliminati non sono rimossi definitivamente - ✅ **Gestione errori**: Controllo null values per compatibilità PHP 8.1+ - ✅ **Flash messages**: Sistema di messaggi temporanei per feedback utente - ---- - -## 🚀 Installazione +- ✅ **Email benvenuto**: Invio automatico email alla registrazione +- ✅ **Test email**: Strumento test SMTP nell'area admin +- ✅ **Video protetti**: Streaming sicuro con protezione download +- ✅ **Conversione video**: Automatica in MP4 H.264 per compatibilità browser ### Requisiti +- **PHP** 7.4 o superiore (8.0+ raccomandato) +- **MySQL** 5.7 o superiore (o MariaDB 10.3+) +- **Web Server** (Apache, Nginx, o PHP built-in server per sviluppo) +- **Account PayPal** Sandbox (per test) o Business (per produzione) +- **FFmpeg** (opzionale, per conversione automatica video in MP4) - **PHP** 7.4 o superiore - **MySQL** 5.7 o superiore (o MariaDB 10.3+) - **Web Server** (Apache, Nginx, o PHP built-in server per sviluppo) @@ -194,11 +201,12 @@ Poi apri: `http://localhost:8000` ## 📖 Guida all'Uso ### Per Amministratori - #### Primo Accesso 1. Vai su `http://tuo-sito/login.php` 2. Accedi con le credenziali di default 3. Vai su "Area Admin" → "Profilo" e cambia la password +4. Testa l'invio email usando il bottone "📨 Invia Email di Test" nel profilo admin +3. Vai su "Area Admin" → "Profilo" e cambia la password #### Creare una Nuova Lezione 1. **Area Admin** → **Gestione Lezioni** → **Nuova Lezione** @@ -332,16 +340,18 @@ define('USE_SMTP', false); // In config.php --- -## 🎥 Hosting Video - -### Opzione 1: File Locali (Upload Diretto) ⭐ **NUOVO** +### Opzione 1: File Locali (Upload Diretto) ⭐ **RACCOMANDATO** 1. Nella creazione/modifica lezione, seleziona **File Locale** 2. Clicca su "Scegli file" e seleziona il video dal tuo PC 3. Il sistema carica automaticamente il file in: - `uploads/lessons/demo/` per lezioni gratuite - `uploads/lessons/pay/` per lezioni a pagamento 4. Formati supportati: MP4, WebM, OGG, MOV -5. ✅ **Vantaggi**: Upload automatico, nessun inserimento manuale del path +5. ✅ **Vantaggi**: + - Upload automatico + - Conversione automatica in MP4 se FFmpeg disponibile + - Streaming protetto con divieto download + - Controllo accessi basato su permessi utente 6. ⚠️ Limiti: Dimensione massima upload dipende da `php.ini` (default ~2MB) **Per aumentare il limite di upload:** @@ -352,6 +362,27 @@ post_max_size = 500M max_execution_time = 300 ``` +**Conversione Automatica Video:** +Se carichi video in formato diverso da MP4, il sistema: +1. Verifica se FFmpeg è installato +2. Converte automaticamente il video in MP4 H.264 con codec AAC +3. Ottimizza per lo streaming web (fast start) +4. Sostituisce il file originale con quello convertito + +**Per installare FFmpeg:** +```bash +# Ubuntu/Debian +sudo apt-get install ffmpeg + +# CentOS/RHEL +sudo yum install ffmpeg + +# Mac +brew install ffmpeg +```t_max_size = 500M +max_execution_time = 300 +``` + ### Opzione 2: YouTube (Consigliato per Video Grandi) 1. Carica video su YouTube come **Non in elenco** 2. Copia l'URL (es: `https://youtube.com/watch?v=ABC123`) @@ -378,18 +409,23 @@ define('AWS_BUCKET', 'pilates-videos'); 4. Usa URL S3 nelle lezioni --- +### Checklist Produzione +Prima di mettere online: -## 💳 Configurare PayPal - -### Modalità Test (Sandbox) -1. Vai su [developer.paypal.com](https://developer.paypal.com) -2. Crea un'app Sandbox -3. Copia Client ID e Secret in `config.php` -4. Usa gli account test per simulare pagamenti - -### Modalità Produzione (Reale) -1. Vai su [paypal.com/businessmanage](https://www.paypal.com/businessmanage) -2. Crea app Live +- [ ] Cambia password admin di default +- [ ] Cambia `SECRET_KEY` in `config.php` +- [ ] Imposta `DEBUG_MODE` a `false` +- [ ] Usa HTTPS (certificato SSL) +- [ ] Limita permessi cartelle (755 per cartelle, 644 per file) +- [ ] Backup regolari del database +- [ ] Configura SMTP per email +- [ ] Testa invio email con bottone nel profilo admin +- [ ] Testa email di benvenuto alla registrazione +- [ ] Converti tutti i video in MP4 H.264 (se necessario) +- [ ] Testa streaming video protetto +- [ ] Testa tutti i flussi di pagamento +- [ ] Verifica che `includes/config.php` NON sia accessibile via web +- [ ] **ELIMINA** `test_password.php` e `test_email.php` (rischio sicurezza!) 3. Copia credenziali Live 4. In `config.php`: ```php @@ -417,12 +453,17 @@ Prima di mettere online: ### File .htaccess (per Apache) Crea `.htaccess` nella cartella `includes/`: -```apache -# Nega accesso a config.php - - Require all denied - -``` +### I video non si vedono +- Verifica che l'URL sia corretto +- Per YouTube/Vimeo: usa URL diretti al video +- Per file locali caricati: controlla che esistano in `uploads/lessons/demo/` o `pay/` +- Verifica permessi cartella uploads (755) +- Per video grandi, verifica limiti upload in `php.ini` +- **Se vedi schermo nero ma senti audio**: il video ha codec incompatibile + - Vai su **Area Admin** → **🔄 Converti Video** + - Converti il video in MP4 H.264 + - Oppure ricarica il video in formato MP4 già codificato correttamente +- Verifica nella console browser (F12) eventuali errori di caricamento --- @@ -506,10 +547,12 @@ pilates-platform/ │ └── js/ │ └── main.js # JavaScript │ -├── database/ -│ ├── schema.sql # Script creazione database -│ └── reset_admin_password.sql # Reset password admin -│ +├── process_payment.php # Elabora pagamento PayPal +├── stream_video.php # Streaming protetto video (verifica permessi) +├── convert_videos.php # Conversione batch video in MP4 H.264 +├── test_password.php # Utility test hash password (debug) +├── test_email.php # Utility test invio email SMTP (debug) +└── README.md # Questo file ├── includes/ # File PHP condivisi │ ├── config.php # Configurazione │ ├── functions.php # Funzioni comuni @@ -570,25 +613,32 @@ MySQL è dove vengono salvati i dati: 3. Utente paga 4. PayPal conferma il pagamento 5. `process_payment.php` registra l'acquisto nel DB +### Checklist Prossimi Passi -### Dove Modificare il Codice? -- **Aspetto grafico**: `assets/css/style.css` -- **Comportamento**: File `.php` specifici -- **Database**: Usa phpMyAdmin o client MySQL -- **Impostazioni**: `includes/config.php` - ---- - -## 📞 Supporto e Manutenzione - -### Backup Database -Esegui regolarmente (es: settimanalmente): -```bash -mysqldump -u root -p pilatesplatform > backup_$(date +%Y%m%d).sql -``` - -### Aggiornare PHP -Quando aggiorni PHP, testa la piattaforma in locale prima di aggiornare in produzione. +Dopo l'installazione: +- [ ] Cambia password admin (profilo o reset_admin_password.sql) +- [ ] **Configura Gmail SMTP** (obbligatorio per recupero password) +- [ ] Genera password applicazione Gmail +- [ ] Inserisci credenziali SMTP in config.php +- [ ] Testa invio email dal profilo admin +- [ ] Testa recupero password +- [ ] Testa email benvenuto registrazione +- [ ] Installa FFmpeg (opzionale, per conversione video) +- [ ] Configura PayPal Sandbox +- [ ] Carica almeno 3 lezioni demo con video +- [ ] Verifica che i video si vedano correttamente +- [ ] Testa registrazione utente +- [ ] Testa acquisto lezione (in sandbox) +- [ ] Verifica streaming protetto video +- [ ] Testa modifica lezioni esistenti +- [ ] Personalizza colori e logo +- [ ] Configura backup automatici database +- [ ] Passa a produzione PayPal +- [ ] Attiva HTTPS (certificato SSL) +- [ ] Converti tutti i video in MP4 se necessario +- [ ] **ELIMINA file di debug** (test_password.php, test_email.php) +- [ ] Testa tutti i flussi su produzione +- [ ] Lancia! 🚀PHP, testa la piattaforma in locale prima di aggiornare in produzione. ### Log Attività La tabella `activity_log` traccia: diff --git a/admin/dashboard.php b/admin/dashboard.php index 63d6523..51eb4f6 100644 --- a/admin/dashboard.php +++ b/admin/dashboard.php @@ -93,6 +93,7 @@ $top_lessons = $stmt->fetchAll();
  • 🎥 Gestione Lezioni
  • 👥 Gestione Utenti
  • 💰 Acquisti
  • +
  • 🔄 Converti Video
  • 👤 Profilo
  • diff --git a/admin/lesson_create.php b/admin/lesson_create.php index 6d930b2..0e77250 100644 --- a/admin/lesson_create.php +++ b/admin/lesson_create.php @@ -52,6 +52,34 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $upload_path = $upload_dir . $file_name; if (move_uploaded_file($_FILES['video_file']['tmp_name'], $upload_path)) { + // Se il video non è MP4, prova a convertirlo automaticamente + if ($file_extension !== 'mp4') { + $converted_path = $upload_dir . pathinfo($file_name, PATHINFO_FILENAME) . '.mp4'; + + // Verifica se FFmpeg è disponibile + $ffmpeg_check = []; + exec('ffmpeg -version 2>&1', $ffmpeg_check, $ffmpeg_return); + + if ($ffmpeg_return === 0) { + // Converti il video in MP4 + $convert_cmd = sprintf( + 'ffmpeg -i %s -c:v libx264 -preset medium -crf 23 -c:a aac -b:a 128k -movflags +faststart -y %s 2>&1', + escapeshellarg($upload_path), + escapeshellarg($converted_path) + ); + + exec($convert_cmd, $convert_output, $convert_return); + + if ($convert_return === 0 && file_exists($converted_path)) { + // Conversione riuscita, elimina il file originale e usa quello convertito + unlink($upload_path); + $file_name = pathinfo($file_name, PATHINFO_FILENAME) . '.mp4'; + $upload_path = $converted_path; + } + // Se la conversione fallisce, usa comunque il file originale + } + } + // Imposta il percorso relativo per il database (senza slash iniziale) $video_url = 'uploads/lessons/' . ($is_demo ? 'demo' : 'pay') . '/' . $file_name; diff --git a/admin/lesson_edit.php b/admin/lesson_edit.php index 518eeb6..e5b51a6 100644 --- a/admin/lesson_edit.php +++ b/admin/lesson_edit.php @@ -81,6 +81,34 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $upload_path = $upload_dir . $file_name; if (move_uploaded_file($_FILES['video_file']['tmp_name'], $upload_path)) { + // Se il video non è MP4, prova a convertirlo automaticamente + if ($file_extension !== 'mp4') { + $converted_path = $upload_dir . pathinfo($file_name, PATHINFO_FILENAME) . '.mp4'; + + // Verifica se FFmpeg è disponibile + $ffmpeg_check = []; + exec('ffmpeg -version 2>&1', $ffmpeg_check, $ffmpeg_return); + + if ($ffmpeg_return === 0) { + // Converti il video in MP4 + $convert_cmd = sprintf( + 'ffmpeg -i %s -c:v libx264 -preset medium -crf 23 -c:a aac -b:a 128k -movflags +faststart -y %s 2>&1', + escapeshellarg($upload_path), + escapeshellarg($converted_path) + ); + + exec($convert_cmd, $convert_output, $convert_return); + + if ($convert_return === 0 && file_exists($converted_path)) { + // Conversione riuscita, elimina il file originale e usa quello convertito + unlink($upload_path); + $file_name = pathinfo($file_name, PATHINFO_FILENAME) . '.mp4'; + $upload_path = $converted_path; + } + // Se la conversione fallisce, usa comunque il file originale + } + } + // Elimina il vecchio file se esisteva $old_video_path = ltrim($lesson['video_url'], '/'); if (!empty($lesson['video_url']) && file_exists('../' . $old_video_path)) { diff --git a/admin/lessons.php b/admin/lessons.php index b164b6c..76de257 100644 --- a/admin/lessons.php +++ b/admin/lessons.php @@ -83,6 +83,7 @@ $lessons = $stmt->fetchAll();
  • 🎥 Gestione Lezioni
  • 👥 Gestione Utenti
  • 💰 Acquisti
  • +
  • 🔄 Converti Video
  • 👤 Profilo
  • diff --git a/admin/profile.php b/admin/profile.php index cf1c217..a5852ca 100644 --- a/admin/profile.php +++ b/admin/profile.php @@ -183,6 +183,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['test_email'])) {
  • 🎥 Gestione Lezioni
  • 👥 Gestione Utenti
  • 💰 Acquisti
  • +
  • 🔄 Converti Video
  • 👤 Profilo
  • diff --git a/admin/purchases.php b/admin/purchases.php index 231729e..b18eb8b 100644 --- a/admin/purchases.php +++ b/admin/purchases.php @@ -74,6 +74,7 @@ $stats = $stmt->fetch();
  • 🎥 Gestione Lezioni
  • 👥 Gestione Utenti
  • 💰 Acquisti
  • +
  • 🔄 Converti Video
  • 👤 Profilo
  • diff --git a/admin/users.php b/admin/users.php index 0709ce7..aa7a465 100644 --- a/admin/users.php +++ b/admin/users.php @@ -81,6 +81,7 @@ $users = $stmt->fetchAll();
  • 🎥 Gestione Lezioni
  • 👥 Gestione Utenti
  • 💰 Acquisti
  • +
  • 🔄 Converti Video
  • 👤 Profilo
  • diff --git a/convert_videos.php b/convert_videos.php new file mode 100644 index 0000000..22b5034 --- /dev/null +++ b/convert_videos.php @@ -0,0 +1,270 @@ +query(" + SELECT id, title, video_url, video_platform + FROM lessons + WHERE type = 'video' + AND video_platform = 'local' + AND video_url IS NOT NULL + AND deleted_at IS NULL + ORDER BY created_at DESC +"); +$videos = $stmt->fetchAll(); + +// Verifica se FFmpeg è disponibile +function check_ffmpeg() { + $output = []; + $return_var = 0; + exec('ffmpeg -version 2>&1', $output, $return_var); + return $return_var === 0; +} + +$ffmpeg_available = check_ffmpeg(); + +// Funzione per convertire un video +function convert_video($input_path, $output_path) { + $command = sprintf( + 'ffmpeg -i %s -c:v libx264 -preset medium -crf 23 -c:a aac -b:a 128k -movflags +faststart -y %s 2>&1', + escapeshellarg($input_path), + escapeshellarg($output_path) + ); + + $output = []; + $return_var = 0; + exec($command, $output, $return_var); + + return [ + 'success' => $return_var === 0, + 'output' => implode("\n", $output) + ]; +} + +// Processa conversione se richiesta +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['convert_video'])) { + $lesson_id = intval($_POST['lesson_id'] ?? 0); + + if ($lesson_id > 0) { + $stmt = $pdo->prepare("SELECT video_url FROM lessons WHERE id = ?"); + $stmt->execute([$lesson_id]); + $lesson = $stmt->fetch(); + + if ($lesson && $lesson['video_url']) { + $video_path = ltrim($lesson['video_url'], '/'); + $input_file = __DIR__ . '/' . $video_path; + + if (file_exists($input_file)) { + // Crea nome file di output + $path_info = pathinfo($input_file); + $output_file = $path_info['dirname'] . '/' . $path_info['filename'] . '_converted.mp4'; + $backup_file = $input_file . '.backup'; + + // Backup del file originale + copy($input_file, $backup_file); + + $result = convert_video($input_file, $output_file); + + if ($result['success'] && file_exists($output_file)) { + // Sostituisci il file originale con quello convertito + unlink($input_file); + rename($output_file, $input_file); + + // Aggiorna il database se l'estensione è cambiata + $new_extension = 'mp4'; + $old_extension = strtolower($path_info['extension']); + + if ($old_extension !== $new_extension) { + $new_video_url = str_replace('.' . $old_extension, '.' . $new_extension, $lesson['video_url']); + $new_file_path = str_replace('.' . $old_extension, '.' . $new_extension, $input_file); + rename($input_file, $new_file_path); + + $stmt = $pdo->prepare("UPDATE lessons SET video_url = ? WHERE id = ?"); + $stmt->execute([$new_video_url, $lesson_id]); + } + + $message = "✅ Video convertito con successo! Il file originale è stato salvato come backup."; + + // Ricarica la lista + $stmt = $pdo->query(" + SELECT id, title, video_url, video_platform + FROM lessons + WHERE type = 'video' + AND video_platform = 'local' + AND video_url IS NOT NULL + AND deleted_at IS NULL + ORDER BY created_at DESC + "); + $videos = $stmt->fetchAll(); + } else { + $error = "❌ Errore durante la conversione: " . htmlspecialchars($result['output']); + // Ripristina il backup + if (file_exists($backup_file)) { + copy($backup_file, $input_file); + unlink($backup_file); + } + } + } else { + $error = "❌ File video non trovato: " . htmlspecialchars($video_path); + } + } + } +} + +?> + + + + + + Converti Video - Pilates Platform + + + +
    +
    +
    +

    Pilates Studio - Conversione Video

    + +
    +
    +
    + +
    +
    +

    🎬 Conversione Video in Formato Web-Compatible

    + + +
    + + + +
    + + +
    +

    ℹ️ Informazioni

    +

    Questo strumento converte i video in formato MP4 con codec H.264 e AAC per garantire la massima compatibilità con tutti i browser.

    +

    Parametri di conversione:

    +
      +
    • Codec Video: H.264 (libx264)
    • +
    • Codec Audio: AAC
    • +
    • Qualità: CRF 23 (bilanciamento qualità/dimensione)
    • +
    • Ottimizzazione: Fast start per streaming web
    • +
    +
    + + +
    +

    ⚠️ FFmpeg Non Disponibile

    +

    FFmpeg non è installato sul server. Per utilizzare questa funzionalità, installa FFmpeg:

    +
      +
    • Ubuntu/Debian: sudo apt-get install ffmpeg
    • +
    • CentOS/RHEL: sudo yum install ffmpeg
    • +
    • Windows: Scarica da ffmpeg.org
    • +
    +
    + +
    + ✅ FFmpeg è installato e disponibile +
    + + +

    Video Disponibili per Conversione

    + + +

    Nessun video locale trovato.

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    IDTitolo LezionePercorso VideoFormatoDimensioneAzione
    + + +
    ⚠️ File non trovato + +
    + + + + MB + +
    + + +
    + + Non disponibile + +
    + + +
    +

    💡 Suggerimenti

    +
      +
    • La conversione può richiedere diversi minuti per video di grandi dimensioni
    • +
    • Il file originale viene salvato come backup (.backup)
    • +
    • I video MP4 esistenti possono comunque essere riconvertiti per ottimizzazione
    • +
    • Per migliori risultati, carica video già in formato MP4 H.264
    • +
    +
    +
    +
    + + + + diff --git a/lesson.php b/lesson.php index 674c3b0..13cb63e 100644 --- a/lesson.php +++ b/lesson.php @@ -138,6 +138,16 @@ $can_view = $lesson['is_demo'] || $user_owns; 'video/mp4', + 'webm' => 'video/webm', + 'ogg' => 'video/ogg', + 'mov' => 'video/mp4' // MOV spesso funziona con il codec mp4 + ]; + $video_mime = $mime_types[$extension] ?? 'video/mp4'; ?>