From bab8e649d3e1dee7fe3a428b79864e06548377bf Mon Sep 17 00:00:00 2001 From: hbrain Date: Tue, 26 May 2026 08:17:37 +0200 Subject: [PATCH] Disable editing for running jobs --- new.php | 21 +++++++++++++++++---- style.css | 2 +- 2 files changed, 18 insertions(+), 5 deletions(-) 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'])?>

Videos without input dir

No orphan videos.


MB
-

Existing input dirs

No input directories yet.


· files
Edit
-

Edit input dir

in-dir/

Files and captions

No caption for audio files
+

Existing input dirs

No input directories yet.


· files
Edit
+

Edit input dir

in-dir/

This input directory is . Editing is disabled until the job completes.
+

Edit input dir

in-dir/

Files and captions

No caption for audio files

Add new movie input