116 lines
4.4 KiB
PHP
Executable File
116 lines
4.4 KiB
PHP
Executable File
#!/usr/bin/php
|
|
<?php
|
|
|
|
$log_directory = getenv('HOME') . '/logs';
|
|
|
|
// Vérification et création du répertoire de journalisation
|
|
if (!is_dir($log_directory)) {
|
|
mkdir($log_directory, 0777, true);
|
|
}
|
|
|
|
if (!is_writable($log_directory)) {
|
|
die("Impossible d'accéder au répertoire de journalisation : $log_directory\n");
|
|
}
|
|
|
|
$timestamp = date('YmdHis');
|
|
$file_log = "$log_directory/trierPhotos_$timestamp.log";
|
|
$file_undo = "$log_directory/trierPhotos_$timestamp" . "_undo.log";
|
|
|
|
function logMessage($file, $message) {
|
|
file_put_contents($file, $message . "\n", FILE_APPEND);
|
|
echo $message . "\n";
|
|
}
|
|
|
|
logMessage($file_log, "Début du script : " . date("c"));
|
|
logMessage($file_log, "Lieu d'exécution : " . getcwd());
|
|
|
|
if ($handle = opendir('.')) {
|
|
while (($entry = readdir($handle)) !== false) {
|
|
if ($entry === '.' || $entry === '..') continue;
|
|
|
|
$mime_type = explode("/", mime_content_type($entry));
|
|
logMessage($file_log, "\nFichier détecté : $entry");
|
|
logMessage($file_log, "MIME type : {$mime_type[0]}");
|
|
|
|
$traitement_ok = in_array($mime_type[0], ['image', 'video']);
|
|
$dateTimeOriginal = null;
|
|
|
|
// Lecture des métadonnées EXIF
|
|
if ($traitement_ok && $mime_type[0] === 'image' && $mime_type[1] === 'jpeg') {
|
|
$file_exif = @exif_read_data($entry, 'EXIF');
|
|
if (!empty($file_exif['DateTimeOriginal'])) {
|
|
$date_exif = explode(':', str_replace(' ', ':', $file_exif['DateTimeOriginal']));
|
|
$dateTimeOriginal = [
|
|
'y' => $date_exif[0],
|
|
'm' => $date_exif[1],
|
|
'd' => $date_exif[2]
|
|
];
|
|
logMessage($file_log, "EXIF DateTimeOriginal : {$file_exif['DateTimeOriginal']}");
|
|
}
|
|
}
|
|
|
|
// Détection via le nom du fichier
|
|
if (!$dateTimeOriginal) {
|
|
if (preg_match('/^(IMG-|VID_|IMG_|VID-)(\d{4})(\d{2})(\d{2})/', $entry, $matches)) {
|
|
$dateTimeOriginal = [
|
|
'y' => $matches[2],
|
|
'm' => $matches[3],
|
|
'd' => $matches[4]
|
|
];
|
|
logMessage($file_log, "Date extraite du nom de fichier.");
|
|
} elseif (preg_match('/^Screenshot_(\d{4})(\d{2})(\d{2})/', $entry, $matches)) {
|
|
$dateTimeOriginal = [
|
|
'y' => $matches[1],
|
|
'm' => $matches[2],
|
|
'd' => $matches[3]
|
|
];
|
|
}
|
|
}
|
|
|
|
// Vérification et correction des dates
|
|
if ($dateTimeOriginal) {
|
|
if ($dateTimeOriginal['m'] < 1 || $dateTimeOriginal['m'] > 12 ||
|
|
$dateTimeOriginal['d'] < 1 || $dateTimeOriginal['d'] > 31 ||
|
|
$dateTimeOriginal['y'] < 1900 || $dateTimeOriginal['y'] > date('Y')) {
|
|
$dateTimeOriginal = null;
|
|
}
|
|
}
|
|
|
|
// Utilisation de la date de modification si aucune autre date trouvée
|
|
if (!$dateTimeOriginal) {
|
|
$date_modif = explode(':', date('Y:m:d', filemtime($entry)));
|
|
$dateTimeOriginal = [
|
|
'y' => $date_modif[0],
|
|
'm' => $date_modif[1],
|
|
'd' => $date_modif[2]
|
|
];
|
|
}
|
|
|
|
// Création du dossier de destination et déplacement
|
|
if ($dateTimeOriginal) {
|
|
$rep_dest = "{$dateTimeOriginal['y']}/{$dateTimeOriginal['m']}/{$dateTimeOriginal['d']}";
|
|
if (!is_dir($rep_dest)) {
|
|
mkdir($rep_dest, 0777, true);
|
|
logMessage($file_log, "Dossier créé : $rep_dest");
|
|
}
|
|
|
|
$file_dest = "$rep_dest/$entry";
|
|
if (!file_exists($file_dest)) {
|
|
rename($entry, $file_dest);
|
|
logMessage($file_log, "Déplacé vers : $file_dest");
|
|
file_put_contents($file_undo, "mv \"$file_dest\" \"$entry\"\n", FILE_APPEND);
|
|
} else {
|
|
$md5_src = md5_file($entry);
|
|
$md5_dst = md5_file($file_dest);
|
|
if ($md5_src === $md5_dst) {
|
|
unlink($entry);
|
|
logMessage($file_log, "[ERREUR] Doublon détecté et supprimé : $file_dest");
|
|
} else {
|
|
logMessage($file_log, "[ERREUR] Conflit de fichier : $file_dest existe déjà mais avec un contenu différent.");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
closedir($handle);
|
|
}
|