'error', 'message' => 'Non authentifié'])); } $token = $matches[1]; // 2. Décodage du Payload du JWT $tokenParts = explode('.', $token); if (count($tokenParts) < 2) { die(json_encode(['status' => 'error', 'message' => 'Format Token invalide'])); } $payloadJson = base64_decode(str_replace(['-', '_'], ['+', '/'], $tokenParts[1])); $payload = json_decode($payloadJson, true); // Nettoyage du login pour le nom du dossier $userLogin = preg_replace('/[^a-zA-Z0-9\-\.]/', '', $payload['preferred_username'] ?? $payload['sub'] ?? ''); if (empty($userLogin)) { die(json_encode(['status' => 'error', 'message' => 'Login non trouvé'])); } // 3. Définition du chemin (vérifie que ce dossier est accessible en écriture) $userDir = $_SERVER['DOCUMENT_ROOT'] . '/../data/' . $userLogin . '/'; if (!is_dir($userDir)) { mkdir($userDir, 0755, true); } // 4. RÉCUPÉRATION DE LA CONFIG (Envoyée en JSON via FormData dans script.js) $configData = isset($_POST['config']) ? json_decode($_POST['config'], true) : null; if (!$configData) { // Fallback si tu envoies les champs un par un au lieu d'un objet config $index = $_POST['index'] ?? $_POST['id'] ?? null; } else { $index = $configData['id'] ?? $configData['index'] ?? null; } if ($index === null) { die(json_encode(['status' => 'error', 'message' => 'Index/ID manquant'])); } // 5. Sauvegarde Audio $extension = 'mp3'; // par défaut if (isset($_FILES['audio'])) { // On essaie de deviner l'extension si non fournie dans le nom $originalName = $_FILES['audio']['name']; $extension = pathinfo($originalName, PATHINFO_EXTENSION); // Si le Blob n'a pas d'extension (souvent le cas avec JS), on force selon le mime ou mp3 if (empty($extension)) { $finfo = new finfo(FILEINFO_MIME_TYPE); $mime = $finfo->file($_FILES['audio']['tmp_name']); $map = ['audio/wav' => 'wav', 'audio/opus' => 'opus', 'audio/ogg' => 'ogg', 'audio/mpeg' => 'mp3']; $extension = $map[$mime] ?? 'mp3'; } move_uploaded_file($_FILES['audio']['tmp_name'], $userDir . "sound-$index." . $extension); } // 6. Sauvegarde Config (on fusionne les infos) $finalConfig = [ 'id' => (int)$index, 'name' => $configData['name'] ?? ($_POST['name'] ?? 'Sans titre'), 'loop' => isset($configData['loop']) ? (bool)$configData['loop'] : ($_POST['loop'] === 'true'), 'volume' => isset($configData['volume']) ? (float)$configData['volume'] : (float)($_POST['volume'] ?? 1), 'extension' => $extension, 'updated_at' => date('Y-m-d H:i:s') ]; file_put_contents($userDir . "config-$index.json", json_encode($finalConfig, JSON_PRETTY_PRINT)); echo json_encode([ 'status' => 'success', 'user' => $userLogin, 'index' => $index, 'file' => "sound-$index.$extension" ]);