From 7e96be1f547aa2c95ef39c9afc2eb5a9d1133919 Mon Sep 17 00:00:00 2001 From: hbrain Date: Mon, 25 May 2026 19:04:35 +0200 Subject: [PATCH] Sort by precise embedded video date --- index.php | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/index.php b/index.php index 5fc48d1..763a7e2 100644 --- a/index.php +++ b/index.php @@ -6,10 +6,11 @@ function h($s){ return htmlspecialchars((string)$s, ENT_QUOTES, "UTF-8"); } function nice_title($s){ return trim(ucwords(str_replace(['_','-'], ' ', $s))); } function video_metadata($path){ $base = pathinfo($path, PATHINFO_FILENAME); - $meta = ['title' => nice_title($base), 'date' => date('Y-m-d', filemtime($path)), 'location' => '', 'description' => '']; + $meta = ['title' => nice_title($base), 'date' => date('Y-m-d', filemtime($path)), 'sort_date' => date('Y-m-d', filemtime($path)), 'location' => '', 'description' => '']; if (preg_match('/^(\d{4})(\d{2})(\d{2})[_-](.+)$/', $base, $m)) { $meta['date'] = "$m[1]-$m[2]-$m[3]"; + $meta['sort_date'] = "$m[1]-$m[2]-$m[3]"; $meta['title'] = nice_title($m[4]); } @@ -33,8 +34,10 @@ function video_metadata($path){ if (!empty($lower['title'])) $meta['title'] = $lower['title']; if (!empty($lower['date'])) { $meta['date'] = $lower['date']; - } elseif (!empty($lower['creation_time'])) { - $meta['date'] = substr($lower['creation_time'], 0, 10); + } + if (!empty($lower['creation_time'])) { + $meta['sort_date'] = substr($lower['creation_time'], 0, 10); + if (empty($lower['date'])) $meta['date'] = $meta['sort_date']; } foreach (['location','place','location-eng','com.apple.quicktime.location.name','com.apple.quicktime.location.iso6709'] as $k) { if (!empty($lower[$k])) { $meta['location'] = $lower[$k]; break; } @@ -48,7 +51,7 @@ function video_metadata($path){ function load_video_cache($videos){ $cacheFile = __DIR__ . '/cache/videos.json'; $cache = is_file($cacheFile) ? json_decode((string)file_get_contents($cacheFile), true) : []; - if (!is_array($cache)) $cache = []; + if (!is_array($cache) || ($cache['version'] ?? 0) !== 2) $cache = []; $items = $cache['items'] ?? []; $newItems = []; $changed = false; @@ -67,7 +70,7 @@ function load_video_cache($videos){ if (array_diff(array_keys($items), array_keys($newItems))) $changed = true; if ($changed) { - file_put_contents($cacheFile, json_encode(['generated_at' => date('c'), 'items' => $newItems], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), LOCK_EX); + file_put_contents($cacheFile, json_encode(['version' => 2, 'generated_at' => date('c'), 'items' => $newItems], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), LOCK_EX); } return $newItems; } @@ -76,8 +79,8 @@ $videoCache = load_video_cache($videos); usort($videos, function($a, $b) use ($videoCache) { $am = $videoCache[basename($a)] ?? []; $bm = $videoCache[basename($b)] ?? []; - $ad = strtotime($am['metadata']['date'] ?? '') ?: filemtime($a); - $bd = strtotime($bm['metadata']['date'] ?? '') ?: filemtime($b); + $ad = strtotime($am['metadata']['sort_date'] ?? $am['metadata']['date'] ?? '') ?: filemtime($a); + $bd = strtotime($bm['metadata']['sort_date'] ?? $bm['metadata']['date'] ?? '') ?: filemtime($b); return $bd <=> $ad; }); $page=max(1,(int)($_GET['page']??1)); $per=$config['items_per_page']; $total=count($videos); $pages=max(1,(int)ceil($total/$per)); $page=min($page,$pages); $slice=array_slice($videos,($page-1)*$per,$per);