<?php /** * FavMasToKey - Traitement des favoris */ // Définir la constante pour inclure les fichiers define('FAVMASTOKEY', true); // Forcer les en-têtes JSON dès le début pour éviter tout conflit header('Content-Type: application/json'); // Activer la capture d'erreurs set_error_handler(function($errno, $errstr, $errfile, $errline) { echo json_encode([ 'success' => false, 'message' => "Erreur PHP: $errstr (ligne $errline dans $errfile)", ]); exit; }); try { // Inclure les fichiers requis require_once 'includes/config.php'; require_once 'includes/functions.php'; // Vérifier que la requête est en POST if ($_SERVER['REQUEST_METHOD'] !== 'POST') { http_response_code(405); echo json_encode(['success' => false, 'message' => 'Méthode non autorisée']); exit; } // Vérifier que l'utilisateur est authentifié if (!isset($_SESSION['misskey_token']) || empty($_SESSION['misskey_token'])) { http_response_code(401); echo json_encode(['success' => false, 'message' => 'Non authentifié']); exit; } // Récupérer l'instance Misskey $misskey_instance = isset($_SESSION['misskey_instance']) ? $_SESSION['misskey_instance'] : ''; if (empty($misskey_instance)) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'Instance Misskey non définie']); exit; } // Récupérer le token d'accès $token = $_SESSION['misskey_token']; // Récupérer les données envoyées $input_data = file_get_contents('php://input'); $input = json_decode($input_data, true); if (!$input || !isset($input['batch']) || !is_array($input['batch'])) { http_response_code(400); echo json_encode([ 'success' => false, 'message' => 'Données invalides', 'debug' => [ 'received' => $input_data ? substr($input_data, 0, 200) . '...' : 'Aucune donnée reçue' ] ]); exit; } // Récupérer le lot à traiter $batch = $input['batch']; $currentIndex = isset($input['currentIndex']) ? (int)$input['currentIndex'] : 0; $totalItems = isset($input['totalItems']) ? (int)$input['totalItems'] : count($batch); // Résultats du traitement $results = []; // Traiter chaque URL du lot foreach ($batch as $index => $url) { // Extraire les informations de l'URL $urlParts = parse_url($url); // Vérifier que l'URL est valide if (!$urlParts || !isset($urlParts['host']) || !isset($urlParts['path'])) { $results[] = [ 'status' => 'error', 'message' => "URL invalide: $url" ]; continue; } // Ajouter un log pour déboguer error_log("Recherche de l'URL: " . $url . " sur l'instance: " . $misskey_instance); // Rechercher la note sur Misskey à partir de l'URL $searchResult = search_federated_note($misskey_instance, $url, $token); // Vérifier si la recherche a réussi ET si les données contiennent un ID valide if ($searchResult['success'] && isset($searchResult['data']) && !empty($searchResult['data'])) { // Vérifier et extraire l'ID de manière sécurisée if (isset($searchResult['data']['id']) && !empty($searchResult['data']['id'])) { $noteId = $searchResult['data']['id']; // Tenter d'ajouter la note aux favoris $favoriteResult = add_to_favorites($misskey_instance, $noteId, $token); if ($favoriteResult['success']) { $results[] = [ 'status' => 'success', 'message' => "Ajouté aux favoris: $url" ]; } else { // Vérifier si c'est une erreur de "déjà ajouté aux favoris" $errorMessage = isset($favoriteResult['data']['error']['message']) ? $favoriteResult['data']['error']['message'] : (isset($favoriteResult['message']) ? $favoriteResult['message'] : 'Erreur inconnue'); if (strpos($errorMessage, 'already') !== false) { $results[] = [ 'status' => 'info', 'message' => "Déjà dans vos favoris: $url" ]; } else { $results[] = [ 'status' => 'error', 'message' => "Erreur lors de l'ajout aux favoris: $errorMessage" ]; } } } else { // L'ID est manquant ou vide dans la réponse $dataKeys = is_array($searchResult['data']) ? array_keys($searchResult['data']) : ['non_array']; $results[] = [ 'status' => 'error', 'message' => "Note trouvée mais sans ID valide: $url. Clés disponibles: " . implode(', ', $dataKeys) ]; // Log pour déboguer error_log("Structure de données reçue: " . json_encode($searchResult['data'])); } } else { // Note non trouvée ou erreur de recherche $errorMessage = isset($searchResult['message']) ? $searchResult['message'] : "Publication introuvable"; $results[] = [ 'status' => 'error', 'message' => "Publication non trouvée sur le réseau fédéré: $url ($errorMessage)" ]; // Ajouter des infos de debug if (isset($searchResult['data']) && is_array($searchResult['data'])) { error_log("Données reçues pour URL $url: " . json_encode($searchResult['data'])); } } // Pause pour éviter le rate limiting usleep($config['delay_between_requests'] * 1000); } // Renvoyer les résultats echo json_encode([ 'success' => true, 'results' => $results, 'progress' => [ 'current' => $currentIndex + count($batch), 'total' => $totalItems, 'percentage' => round((($currentIndex + count($batch)) / $totalItems) * 100, 2) ] ]); } catch (Exception $e) { // Capturer toutes les exceptions et renvoyer un message d'erreur formaté en JSON echo json_encode([ 'success' => false, 'message' => 'Exception: ' . $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine() ]); }