Regenerate stale order.json when media file set changes

This commit is contained in:
hbrain 2026-05-31 13:54:15 +02:00
parent 9866524ad0
commit 617f205181

54
new.php
View file

@ -172,27 +172,6 @@ function list_files($dir){
$files = array_values(array_filter(scandir($dir), fn($f)=>editable_file($f) && is_file($dir.'/'.$f))); $files = array_values(array_filter(scandir($dir), fn($f)=>editable_file($f) && is_file($dir.'/'.$f)));
$orderFile = $dir . '/order.json'; $orderFile = $dir . '/order.json';
// Priority 1: explicit order file
if (is_file($orderFile)) {
$order = json_decode((string)file_get_contents($orderFile), true);
if (is_array($order)) {
$remaining = array_flip($files);
$sorted = [];
foreach ($order as $name) {
if (isset($remaining[$name])) {
$sorted[] = $name;
unset($remaining[$name]);
}
}
// append anything not listed (no filename sort)
foreach ($files as $name) {
if (isset($remaining[$name])) $sorted[] = $name;
}
return $sorted;
}
}
// No order.json: sort by datetime only and create it
$media = []; $media = [];
$other = []; $other = [];
foreach ($files as $name) { foreach ($files as $name) {
@ -200,6 +179,39 @@ function list_files($dir){
else $other[] = $name; else $other[] = $name;
} }
// Priority 1: explicit order file, but regenerate if file set changed.
if (is_file($orderFile)) {
$order = json_decode((string)file_get_contents($orderFile), true);
if (is_array($order)) {
$mediaSet = array_fill_keys($media, true);
$orderSet = [];
$sortedMedia = [];
foreach ($order as $name) {
if (!is_string($name) || !is_visual_media_file($name)) continue;
if (isset($mediaSet[$name]) && !isset($orderSet[$name])) {
$orderSet[$name] = true;
$sortedMedia[] = $name;
}
}
$sameSet = (count($orderSet) === count($mediaSet));
if ($sameSet) {
foreach ($mediaSet as $name => $_) {
if (!isset($orderSet[$name])) {
$sameSet = false;
break;
}
}
}
if ($sameSet) {
return array_merge($sortedMedia, $other);
}
}
}
// Missing/invalid/stale order.json: sort by datetime and recreate order.json
usort($media, function($a, $b) use ($dir) { usort($media, function($a, $b) use ($dir) {
$da = media_sort_datetime($dir . '/' . $a); $da = media_sort_datetime($dir . '/' . $a);
$db = media_sort_datetime($dir . '/' . $b); $db = media_sort_datetime($dir . '/' . $b);