Sort by precise embedded video date

This commit is contained in:
hbrain 2026-05-25 19:04:35 +02:00
parent dfeee1c187
commit 7e96be1f54

View file

@ -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 nice_title($s){ return trim(ucwords(str_replace(['_','-'], ' ', $s))); }
function video_metadata($path){ function video_metadata($path){
$base = pathinfo($path, PATHINFO_FILENAME); $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)) { if (preg_match('/^(\d{4})(\d{2})(\d{2})[_-](.+)$/', $base, $m)) {
$meta['date'] = "$m[1]-$m[2]-$m[3]"; $meta['date'] = "$m[1]-$m[2]-$m[3]";
$meta['sort_date'] = "$m[1]-$m[2]-$m[3]";
$meta['title'] = nice_title($m[4]); $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['title'])) $meta['title'] = $lower['title'];
if (!empty($lower['date'])) { if (!empty($lower['date'])) {
$meta['date'] = $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) { 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; } if (!empty($lower[$k])) { $meta['location'] = $lower[$k]; break; }
@ -48,7 +51,7 @@ function video_metadata($path){
function load_video_cache($videos){ function load_video_cache($videos){
$cacheFile = __DIR__ . '/cache/videos.json'; $cacheFile = __DIR__ . '/cache/videos.json';
$cache = is_file($cacheFile) ? json_decode((string)file_get_contents($cacheFile), true) : []; $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'] ?? []; $items = $cache['items'] ?? [];
$newItems = []; $newItems = [];
$changed = false; $changed = false;
@ -67,7 +70,7 @@ function load_video_cache($videos){
if (array_diff(array_keys($items), array_keys($newItems))) $changed = true; if (array_diff(array_keys($items), array_keys($newItems))) $changed = true;
if ($changed) { 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; return $newItems;
} }
@ -76,8 +79,8 @@ $videoCache = load_video_cache($videos);
usort($videos, function($a, $b) use ($videoCache) { usort($videos, function($a, $b) use ($videoCache) {
$am = $videoCache[basename($a)] ?? []; $am = $videoCache[basename($a)] ?? [];
$bm = $videoCache[basename($b)] ?? []; $bm = $videoCache[basename($b)] ?? [];
$ad = strtotime($am['metadata']['date'] ?? '') ?: filemtime($a); $ad = strtotime($am['metadata']['sort_date'] ?? $am['metadata']['date'] ?? '') ?: filemtime($a);
$bd = strtotime($bm['metadata']['date'] ?? '') ?: filemtime($b); $bd = strtotime($bm['metadata']['sort_date'] ?? $bm['metadata']['date'] ?? '') ?: filemtime($b);
return $bd <=> $ad; 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); $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);