Sauvegarde vers le serveur

This commit is contained in:
2026-03-27 14:56:49 +01:00
parent 9fee465f81
commit 23f2136058
10 changed files with 835 additions and 302 deletions

85
public/sync_global.php Normal file
View File

@@ -0,0 +1,85 @@
<?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"
]);