125 lines
3.6 KiB
PHP
125 lines
3.6 KiB
PHP
<?php
|
|
require_once '../../includes/config.php';
|
|
require_once '../../includes/auth.php';
|
|
require_once '../../includes/stories.php';
|
|
|
|
// Vérification de l'authentification
|
|
if (!Auth::check()) {
|
|
http_response_code(401);
|
|
exit(json_encode(['error' => 'Non autorisé']));
|
|
}
|
|
|
|
function extractImagePaths($content) {
|
|
$paths = [];
|
|
|
|
// Si le contenu est du JSON (format Delta de Quill)
|
|
if (is_string($content) && isJson($content)) {
|
|
$delta = json_decode($content, true);
|
|
if (isset($delta['ops'])) {
|
|
foreach ($delta['ops'] as $op) {
|
|
if (isset($op['insert']['image'])) {
|
|
$paths[] = normalizeImagePath($op['insert']['image']);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
// Si le contenu est du HTML
|
|
preg_match_all('/src=["\']([^"\']+)["\']/', $content, $matches);
|
|
if (!empty($matches[1])) {
|
|
foreach ($matches[1] as $path) {
|
|
$paths[] = normalizeImagePath($path);
|
|
}
|
|
}
|
|
}
|
|
|
|
return $paths;
|
|
}
|
|
|
|
function normalizeImagePath($path) {
|
|
// Supprimer les "../" au début du chemin
|
|
$path = preg_replace('/^(?:\.\.\/)+/', '', $path);
|
|
return $path;
|
|
}
|
|
|
|
function isJson($string) {
|
|
json_decode($string);
|
|
return json_last_error() === JSON_ERROR_NONE;
|
|
}
|
|
|
|
try {
|
|
$unusedFiles = [];
|
|
$usedFiles = [];
|
|
$totalSpace = 0;
|
|
$freedSpace = 0;
|
|
|
|
// Collecter tous les fichiers dans le dossier chapters
|
|
$chaptersDir = __DIR__ . '/../../assets/images/chapters/';
|
|
$allFiles = [];
|
|
|
|
foreach (glob($chaptersDir . '*', GLOB_ONLYDIR) as $storyDir) {
|
|
$storyId = basename($storyDir);
|
|
foreach (glob($storyDir . '/*') as $file) {
|
|
if (is_file($file)) {
|
|
$relativePath = 'assets/images/chapters/' . $storyId . '/' . basename($file);
|
|
$allFiles[$relativePath] = $file;
|
|
$totalSpace += filesize($file);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Parcourir tous les romans et leurs chapitres
|
|
$stories = Stories::getAll();
|
|
foreach ($stories as $story) {
|
|
// Vérifier la description du roman
|
|
if (!empty($story['description'])) {
|
|
$usedFiles = array_merge($usedFiles, extractImagePaths($story['description']));
|
|
}
|
|
|
|
// Vérifier les chapitres
|
|
if (!empty($story['chapters'])) {
|
|
foreach ($story['chapters'] as $chapter) {
|
|
if (!empty($chapter['content'])) {
|
|
$usedFiles = array_merge($usedFiles, extractImagePaths($chapter['content']));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Identifier les fichiers non utilisés
|
|
foreach ($allFiles as $relativePath => $fullPath) {
|
|
if (!in_array($relativePath, $usedFiles)) {
|
|
$unusedFiles[] = [
|
|
'path' => $relativePath,
|
|
'size' => filesize($fullPath)
|
|
];
|
|
$freedSpace += filesize($fullPath);
|
|
|
|
// Supprimer le fichier
|
|
unlink($fullPath);
|
|
}
|
|
}
|
|
|
|
// Nettoyer les dossiers vides
|
|
foreach (glob($chaptersDir . '*', GLOB_ONLYDIR) as $storyDir) {
|
|
if (count(glob("$storyDir/*")) === 0) {
|
|
rmdir($storyDir);
|
|
}
|
|
}
|
|
|
|
echo json_encode([
|
|
'success' => true,
|
|
'stats' => [
|
|
'filesRemoved' => count($unusedFiles),
|
|
'totalSpace' => $totalSpace,
|
|
'freedSpace' => $freedSpace,
|
|
'details' => $unusedFiles
|
|
]
|
|
]);
|
|
|
|
} catch (Exception $e) {
|
|
http_response_code(500);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'error' => $e->getMessage()
|
|
]);
|
|
} |