85 lines
3.0 KiB
PHP
85 lines
3.0 KiB
PHP
<?php
|
|
header('Content-Type: application/json');
|
|
|
|
// 1. Récupération du Token dans les Headers
|
|
$headers = getallheaders();
|
|
$authHeader = $headers['Authorization'] ?? '';
|
|
|
|
if (!preg_match('/Bearer\s(\S+)/', $authHeader, $matches)) {
|
|
die(json_encode(['status' => '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"
|
|
]); |