diff --git a/new.php b/new.php
index 6b400cc..722203e 100644
--- a/new.php
+++ b/new.php
@@ -74,6 +74,15 @@ function orphan_videos($config){
$videos = glob($config['videos_dir'].'/*.{mp4,webm,mov,m4v}', GLOB_BRACE) ?: [];
return array_values(array_filter($videos, fn($v)=>empty($referenced[basename($v)])));
}
+function input_dir_status($dir){
+ $stateFile = $dir . '/.movmaker-state.json';
+ $lockDir = $dir . '/.movmaker-lock';
+ $state = is_file($stateFile) ? json_decode((string)file_get_contents($stateFile), true) : [];
+ $status = is_array($state) ? (string)($state['status'] ?? '') : '';
+ if (is_dir($lockDir)) return $status !== '' ? $status : 'processing';
+ return in_array($status, ['processing', 'stale'], true) ? $status : '';
+}
+function input_dir_running($dir){ return input_dir_status($dir) !== ''; }
function paginate($items, $page, $perPage = 10){
$total = count($items);
$pages = max(1, (int)ceil($total / $perPage));
@@ -126,6 +135,7 @@ try {
$_GET['edit'] = $slug;
} elseif ($action === 'update') {
$dir = safe_input_dir($config['uploads_dir'], $_POST['dir'] ?? '');
+ if (input_dir_running($dir)) throw new RuntimeException('This input directory is being rendered. Editing is disabled until the job completes.');
write_data($dir, $_POST);
save_uploads('media', $dir, $allowedMedia);
save_uploads('audio', $dir, $allowedAudio);
@@ -133,6 +143,7 @@ try {
exit;
} elseif ($action === 'delete_file') {
$dir = safe_input_dir($config['uploads_dir'], $_POST['dir'] ?? '');
+ if (input_dir_running($dir)) throw new RuntimeException('This input directory is being rendered. Editing is disabled until the job completes.');
$file = basename((string)($_POST['file'] ?? ''));
if (!editable_file($file) || !is_file($dir.'/'.$file)) throw new RuntimeException('Invalid file.');
unlink($dir.'/'.$file);
@@ -148,6 +159,7 @@ try {
$msg = 'Deleted video: ' . $file;
} elseif ($action === 'delete_dir') {
$dir = safe_input_dir($config['uploads_dir'], $_POST['dir'] ?? '');
+ if (input_dir_running($dir)) throw new RuntimeException('This input directory is being rendered. Editing is disabled until the job completes.');
$name = basename($dir);
$stateFile = $dir . '/.movmaker-state.json';
$state = is_file($stateFile) ? json_decode((string)file_get_contents($stateFile), true) : [];
@@ -171,16 +183,17 @@ $page = max(1, (int)($_GET['page'] ?? 1));
[$editPage, $editPages, $dirsPage, $dirsTotal] = paginate($dirs, $tab === 'edit' ? $page : 1);
[$videoPage, $videoPages, $orphanVideosPage, $orphanVideosTotal] = paginate($orphanVideos, $tab === 'videos' ? $page : 1);
$editName = $_GET['edit'] ?? '';
-$editDir = null; $editData = ['title'=>'','date'=>'','place'=>'','description'=>'','captions'=>[]]; $editFiles = [];
-if ($editName !== '') { try { $editDir = safe_input_dir($config['uploads_dir'], $editName); $editData = read_data($editDir); $editFiles = list_files($editDir); } catch (Throwable $e) { $err = $e->getMessage(); } }
+$editDir = null; $editStatus = ''; $editRunning = false; $editData = ['title'=>'','date'=>'','place'=>'','description'=>'','captions'=>[]]; $editFiles = [];
+if ($editName !== '') { try { $editDir = safe_input_dir($config['uploads_dir'], $editName); $editStatus = input_dir_status($editDir); $editRunning = $editStatus !== ''; if (!$editRunning) { $editData = read_data($editDir); $editFiles = list_files($editDir); } } catch (Throwable $e) { $err = $e->getMessage(); } }
?>
Admin - =h($config['site_name'])?>
=h($msg)?>
=h($err)?>
Videos without input dir
No orphan videos.
=page_links('videos',$videoPage,$videoPages)?>
-Existing input dirs
No input directories yet.
=h($data['title'] ?: basename($d))?>
=h(basename($d))?> · =h(count(list_files($d)))?> files
Edit =page_links('edit',$editPage,$editPages)?>
-
+Existing input dirs
No input directories yet.
=h($data['title'] ?: basename($d))?>
=h(basename($d))?> · =h(count(list_files($d)))?> files= $running ? ' · '.h(ucfirst($runStatus)) : '' ?>
=h(ucfirst($runStatus))?>Edit =page_links('edit',$editPage,$editPages)?>
+Edit input dir
in-dir/=h(basename($editDir))?>
This input directory is =h($editStatus)?>. Editing is disabled until the job completes.
+