diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4d9d5de --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +# Vendor e dipendenze +/vendor/ +composer.lock + +# File caricati +/uploads/lessons/**/*.mp4 +/uploads/lessons/**/*.webm +/uploads/lessons/**/*.ogg +/uploads/lessons/**/*.mov +/uploads/images/*.jpg +/uploads/images/*.png + +# Configurazione (contiene password) +# includes/config.php + +# File di debug +test_password.php +test_email.php + +# Log +*.log + +# OS +.DS_Store +Thumbs.db +desktop.ini + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ diff --git a/README.md b/README.md index f941bcf..b354bf3 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,32 @@ define('PAYPAL_CLIENT_ID', 'il-tuo-client-id-sandbox'); define('PAYPAL_SECRET', 'il-tuo-secret-sandbox'); ``` -### Passo 4: Configura i Permessi (Linux/Mac) +### Passo 4: Installa getID3 (Opzionale - per durata video automatica) + +La piattaforma può estrarre automaticamente la durata dei video caricati usando getID3. + +#### Metodo 1: Con Composer (raccomandato) +```bash +composer install +``` + +#### Metodo 2: Script Automatico +```bash +# Linux/Mac +bash install_getid3.sh + +# Windows PowerShell +.\install_getid3.ps1 +``` + +#### Metodo 3: Manuale +1. Scarica getID3 da [GitHub](https://github.com/JamesHeinrich/getID3/releases) +2. Estrai in `vendor/getid3/getid3/` +3. Verifica che esista il file `vendor/getid3/getid3/getid3.php` + +**Nota:** Se getID3 non è disponibile, la piattaforma proverà ad usare ffmpeg/ffprobe. Se anche questi non sono disponibili, dovrai inserire manualmente la durata. + +### Passo 5: Configura i Permessi (Linux/Mac) ```bash # Rendi scrivibile la cartella uploads e sottocartelle chmod -R 755 uploads/ @@ -150,7 +175,9 @@ chmod -R 755 uploads/lessons/pay/ chmod -R 755 uploads/images/ ``` -### Passo 5: Avvia il Server +**Nota:** Le cartelle `demo/` e `pay/` vengono create automaticamente all'upload se non esistono. + +### Passo 6: Avvia il Server #### Con PHP Built-in (per sviluppo) ```bash cd pilates-platform @@ -426,6 +453,15 @@ Crea `.htaccess` nella cartella `includes/`: - Controlla `upload_max_filesize` e `post_max_size` in `php.ini` - Verifica che la cartella `uploads/lessons/` sia scrivibile - Assicurati che il formato sia supportato (MP4, WebM, OGG, MOV) +- Le cartelle `demo/` e `pay/` vengono create automaticamente se non esistono + +### La durata video non viene rilevata +- Installa getID3 per estrazione automatica durata: + - Con Composer: `composer install` + - Manualmente (Linux/Mac): `bash install_getid3.sh` + - Manualmente (Windows): `.\install_getid3.ps1` +- Oppure usa ffmpeg/ffprobe (già installato sulla maggior parte dei server) +- Se non disponibile, inserisci manualmente la durata nel form ### PayPal non funziona - Verifica Client ID e Secret diff --git a/admin/lesson_create.php b/admin/lesson_create.php index 92f50a1..ecc4b4a 100644 --- a/admin/lesson_create.php +++ b/admin/lesson_create.php @@ -36,6 +36,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { if ($type === 'video' && $video_platform === 'local' && isset($_FILES['video_file']) && $_FILES['video_file']['error'] === UPLOAD_ERR_OK) { $upload_dir = $is_demo ? '../uploads/lessons/demo/' : '../uploads/lessons/pay/'; + // Crea le cartelle se non esistono + if (!is_dir($upload_dir)) { + mkdir($upload_dir, 0755, true); + } + // Crea nome file sicuro $file_extension = strtolower(pathinfo($_FILES['video_file']['name'], PATHINFO_EXTENSION)); $allowed_extensions = ['mp4', 'webm', 'ogg', 'mov']; @@ -49,6 +54,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (move_uploaded_file($_FILES['video_file']['tmp_name'], $upload_path)) { // Imposta il percorso relativo per il database $video_url = '/uploads/lessons/' . ($is_demo ? 'demo' : 'pay') . '/' . $file_name; + + // Estrai durata automaticamente se non specificata + if (empty($duration)) { + $duration = get_video_duration($upload_path); + } } else { $error = 'Errore durante il caricamento del file'; } diff --git a/admin/lesson_edit.php b/admin/lesson_edit.php index 59b3be7..59425b2 100644 --- a/admin/lesson_edit.php +++ b/admin/lesson_edit.php @@ -65,6 +65,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { if ($type === 'video' && $video_platform === 'local' && isset($_FILES['video_file']) && $_FILES['video_file']['error'] === UPLOAD_ERR_OK) { $upload_dir = $is_demo ? '../uploads/lessons/demo/' : '../uploads/lessons/pay/'; + // Crea le cartelle se non esistono + if (!is_dir($upload_dir)) { + mkdir($upload_dir, 0755, true); + } + // Crea nome file sicuro $file_extension = strtolower(pathinfo($_FILES['video_file']['name'], PATHINFO_EXTENSION)); $allowed_extensions = ['mp4', 'webm', 'ogg', 'mov']; @@ -82,6 +87,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { } // Imposta il nuovo percorso $video_url = '/uploads/lessons/' . ($is_demo ? 'demo' : 'pay') . '/' . $file_name; + + // Estrai durata automaticamente se non specificata + if (empty($duration)) { + $duration = get_video_duration($upload_path); + } } else { $error = 'Errore durante il caricamento del file'; } diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..6e9ee29 --- /dev/null +++ b/composer.json @@ -0,0 +1,14 @@ +{ + "name": "pilates-platform", + "description": "Piattaforma Pilates per vendita videolezioni", + "type": "project", + "require": { + "php": ">=7.4", + "james-heinrich/getid3": "^1.9" + }, + "autoload": { + "files": [ + "includes/functions.php" + ] + } +} diff --git a/includes/functions.php b/includes/functions.php index 7cabfbf..725fd1d 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -669,4 +669,67 @@ function redirect($url) { exit; } +/** + * Estrae la durata di un video in minuti + * + * @param string $file_path Percorso del file video + * @return int|null Durata in minuti o null se non rilevabile + */ +function get_video_duration($file_path) { + // Metodo 1: Usa getID3 se disponibile + if (file_exists(__DIR__ . '/../vendor/getid3/getid3/getid3.php')) { + require_once __DIR__ . '/../vendor/getid3/getid3/getid3.php'; + + try { + $getID3 = new getID3(); + $file_info = $getID3->analyze($file_path); + + if (isset($file_info['playtime_seconds'])) { + return (int) ceil($file_info['playtime_seconds'] / 60); + } + } catch (Exception $e) { + // Continua con altri metodi + } + } + + // Metodo 2: Usa ffprobe se disponibile + if (function_exists('shell_exec') && !in_array('shell_exec', explode(',', ini_get('disable_functions')))) { + $ffprobe_commands = [ + 'ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 ' . escapeshellarg($file_path), + '/usr/bin/ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 ' . escapeshellarg($file_path), + '/usr/local/bin/ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 ' . escapeshellarg($file_path) + ]; + + foreach ($ffprobe_commands as $cmd) { + $output = @shell_exec($cmd . ' 2>&1'); + if ($output && is_numeric(trim($output))) { + $seconds = (float) trim($output); + return (int) ceil($seconds / 60); + } + } + } + + // Metodo 3: Usa ffmpeg se disponibile + if (function_exists('shell_exec') && !in_array('shell_exec', explode(',', ini_get('disable_functions')))) { + $ffmpeg_commands = [ + 'ffmpeg -i ' . escapeshellarg($file_path) . ' 2>&1', + '/usr/bin/ffmpeg -i ' . escapeshellarg($file_path) . ' 2>&1', + '/usr/local/bin/ffmpeg -i ' . escapeshellarg($file_path) . ' 2>&1' + ]; + + foreach ($ffmpeg_commands as $cmd) { + $output = @shell_exec($cmd); + if ($output && preg_match('/Duration: (\d{2}):(\d{2}):(\d{2})/', $output, $matches)) { + $hours = (int) $matches[1]; + $minutes = (int) $matches[2]; + $seconds = (int) $matches[3]; + return $hours * 60 + $minutes + (int) ceil($seconds / 60); + } + } + } + + // Nessun metodo funzionante + return null; +} + ?> diff --git a/install_getid3.ps1 b/install_getid3.ps1 new file mode 100644 index 0000000..2caa25e --- /dev/null +++ b/install_getid3.ps1 @@ -0,0 +1,31 @@ +# Script PowerShell per installare getID3 manualmente + +Write-Host "Installazione getID3..." -ForegroundColor Green + +# Crea cartella vendor se non esiste +New-Item -ItemType Directory -Force -Path "vendor\getid3" | Out-Null + +# URL del download +$url = "https://github.com/JamesHeinrich/getID3/archive/refs/tags/v1.9.23.zip" +$zipFile = "vendor\getid3\getid3.zip" + +# Scarica getID3 +Write-Host "Download in corso..." -ForegroundColor Yellow +Invoke-WebRequest -Uri $url -OutFile $zipFile + +# Estrai +Write-Host "Estrazione file..." -ForegroundColor Yellow +Expand-Archive -Path $zipFile -DestinationPath "vendor\getid3\temp" -Force + +# Sposta i file nella posizione corretta +Get-ChildItem "vendor\getid3\temp\getID3-*" | Get-ChildItem | Move-Item -Destination "vendor\getid3" -Force + +# Pulisci +Remove-Item -Path "vendor\getid3\temp" -Recurse -Force +Remove-Item -Path $zipFile -Force + +Write-Host "" +Write-Host "✅ getID3 installato con successo!" -ForegroundColor Green +Write-Host "" +Write-Host "Nota: Se hai Composer disponibile, puoi usare invece:" -ForegroundColor Cyan +Write-Host " composer install" -ForegroundColor White diff --git a/install_getid3.sh b/install_getid3.sh new file mode 100644 index 0000000..68a423f --- /dev/null +++ b/install_getid3.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# Script per installare getID3 manualmente + +echo "Installazione getID3..." + +# Crea cartella vendor se non esiste +mkdir -p vendor/getid3 + +# Scarica getID3 +cd vendor/getid3 +wget https://github.com/JamesHeinrich/getID3/archive/refs/tags/v1.9.23.tar.gz -O getid3.tar.gz + +# Estrai +tar -xzf getid3.tar.gz --strip-components=1 +rm getid3.tar.gz + +echo "✅ getID3 installato con successo!" +echo "" +echo "Nota: Se hai Composer disponibile, puoi usare invece:" +echo " composer install"