diff --git a/new.php b/new.php index 0126d39..2fd0aab 100644 --- a/new.php +++ b/new.php @@ -45,15 +45,32 @@ function write_data($dir, $post){ file_put_contents($dir . '/data.txt', implode("\n", $lines) . "\n"); } function list_files($dir){ $files = array_values(array_filter(scandir($dir), fn($f)=>$f!=='.' && $f!=='..' && is_file($dir.'/'.$f) && $f !== 'data.txt')); natcasesort($files); return $files; } +function video_title($path){ + $ffprobe = trim((string)shell_exec('command -v ffprobe 2>/dev/null')); + if ($ffprobe === '') return ''; + $json = shell_exec(escapeshellarg($ffprobe).' -v quiet -print_format json -show_entries format_tags=title '.escapeshellarg($path).' 2>/dev/null'); + $data = json_decode((string)$json, true); + $tags = $data['format']['tags'] ?? []; + foreach ($tags as $k => $v) if (strtolower($k) === 'title') return trim((string)$v); + return ''; +} function orphan_videos($config){ $referenced = []; + $sourceTitles = []; foreach (input_dirs($config['uploads_dir']) as $dir) { $stateFile = $dir . '/.movmaker-state.json'; $state = is_file($stateFile) ? json_decode((string)file_get_contents($stateFile), true) : []; if (is_array($state) && !empty($state['output'])) $referenced[basename((string)$state['output'])] = true; + $data = read_data($dir); + if (!empty($data['title'])) $sourceTitles[mb_strtolower($data['title'], 'UTF-8')] = true; } $videos = glob($config['videos_dir'].'/*.{mp4,webm,mov,m4v}', GLOB_BRACE) ?: []; - return array_values(array_filter($videos, fn($v)=>empty($referenced[basename($v)]))); + return array_values(array_filter($videos, function($v) use ($referenced, $sourceTitles) { + if (!empty($referenced[basename($v)])) return false; + $title = video_title($v); + if ($title !== '' && !empty($sourceTitles[mb_strtolower($title, 'UTF-8')])) return false; + return true; + })); } function save_uploads($field, $dest, $allowed){ if (empty($_FILES[$field])) return [];