Thumb source: =h((string)$thumbMeta['source_file'])?>
No input directories yet.
Thumb source: =h((string)$thumbMeta['source_file'])?>
diff --git a/admin.php b/admin.php index f985b58..7611602 100644 --- a/admin.php +++ b/admin.php @@ -925,12 +925,47 @@ function set_input_dir_visible($dir, $visible){ if ($visible) { if (is_file($path)) unlink($path); } else { file_put_contents($path, "hidden\n"); @chmod($path, 0664); } } -function input_dir_permalink($dir){ return is_file($dir . '/' . PERMALINK_FILE); } -function input_dir_can_permalink($dir, $config){ +function input_dir_has_full_output($dir, $config){ $state = input_dir_state($dir); $output = basename((string)($state['output'] ?? '')); - return $output !== '' && is_file($config['videos_dir'] . '/' . $output) && !input_dir_preview($dir); + return $output !== '' && is_file($config['videos_dir'] . '/' . $output) && !preg_match('/_preview\.(mp4|webm|mov|m4v)$/i', $output); } +function input_dir_can_show($dir, $config){ return input_dir_has_full_output($dir, $config) && !input_dir_preview($dir); } +function input_dir_effective_visible($dir, $config){ return input_dir_can_show($dir, $config) && input_dir_visible($dir); } +function input_dir_permalink($dir){ return is_file($dir . '/' . PERMALINK_FILE); } +function input_dir_can_permalink($dir, $config){ return input_dir_can_show($dir, $config); } +function input_dir_ui_state($dir, $config){ + $preview = input_dir_preview($dir); + $enabled = input_dir_enabled($dir); + $canShow = input_dir_can_show($dir, $config); + $visible = $canShow && input_dir_visible($dir); + $permalink = input_dir_permalink($dir); + $canPermalink = input_dir_can_permalink($dir, $config); + return [ + 'enabled' => $enabled, + 'preview' => $preview, + 'visible' => $visible, + 'permalink' => $permalink, + 'can_show' => $canShow, + 'can_permalink' => $canPermalink, + 'public_locked' => $visible || $permalink, + ]; +} +function input_dir_public_locked($dir, $config){ $s = input_dir_ui_state($dir, $config); return !empty($s['public_locked']); } +function input_dir_switch_payload($dir, $config, $articleId = ''){ + $s = input_dir_ui_state($dir, $config); + $s['dir'] = basename((string)$dir); + $s['id'] = $articleId !== '' ? $articleId : read_article_id($dir); + return $s; +} +function initialize_input_dir_defaults($dir, $config){ + // Directly uploaded directories do not have admin marker files yet. + // Keep them private by default so Show is off, Permalink is off, and Preview/Render stay available. + if (!is_file($dir . '/.mvlog-hidden') && !input_dir_permalink($dir) && !input_dir_has_full_output($dir, $config)) { + set_input_dir_visible($dir, false); + } +} +function initialize_input_dirs_defaults($dirs, $config){ foreach ($dirs as $dir) initialize_input_dir_defaults($dir, $config); } function set_input_dir_permalink($dir, $permalink){ $path = $dir . '/' . PERMALINK_FILE; if ($permalink) { file_put_contents($path, "permalink\n"); @chmod($path, 0664); } @@ -1132,7 +1167,9 @@ function save_uploads($field, $dest, $allowed){ $msg = $_GET['msg'] ?? null; $err = null; $allowedMedia = ['jpg','jpeg','png','webp','gif','mp4','mov','m4v','avi','mkv','webm']; $allowedAudio = ['mp3','wav','m4a','aac','ogg','flac']; -$articleIndex = load_articles_index($config['uploads_dir']); +$initialDirs = input_dirs($config['uploads_dir']); +initialize_input_dirs_defaults($initialDirs, $config); +$articleIndex = load_articles_index($config['uploads_dir'], $initialDirs); try { if ($_SERVER['REQUEST_METHOD'] === 'POST') { $action = $_POST['action'] ?? 'create'; @@ -1166,55 +1203,37 @@ try { } elseif ($action === 'set_enabled') { $dir = resolve_input_dir_from_request($config['uploads_dir'], $_POST['id'] ?? '', $_POST['dir'] ?? '', $articleIndex); $articleId = ensure_state_article_id($dir); - if (input_dir_visible($dir) || input_dir_permalink($dir)) throw new RuntimeException('Disable Show and Permalink before changing render.'); + initialize_input_dir_defaults($dir, $config); + if (input_dir_public_locked($dir, $config)) throw new RuntimeException('Disable Show and Permalink before changing render.'); $enabledNow = !empty($_POST['enabled']); set_input_dir_enabled($dir, $enabledNow); if ($enabledNow) { set_input_dir_preview($dir, false); } - $state = input_dir_state($dir); - $output = basename((string)($state['output'] ?? '')); - $canShow = $output !== '' && is_file($config['videos_dir'].'/'.$output) && !input_dir_preview($dir); - if (!$canShow) set_input_dir_visible($dir, false); + if (!input_dir_can_show($dir, $config)) set_input_dir_visible($dir, false); $message = ($enabledNow ? 'Enabled rendering for: in-dir/' : 'Disabled rendering for: in-dir/') . basename($dir); if (!empty($_POST['ajax'])) { - ajax_json([ - 'ok' => true, - 'enabled' => $enabledNow, - 'preview' => input_dir_preview($dir), - 'visible' => input_dir_visible($dir) && $canShow, - 'can_show' => $canShow, - 'can_permalink' => input_dir_can_permalink($dir, $config), - 'dir' => basename($dir), - 'id' => $articleId, - 'message' => $message, - ]); + $payload = input_dir_switch_payload($dir, $config, $articleId); + $payload['ok'] = true; + $payload['message'] = $message; + ajax_json($payload); } header('Location: admin.php?tab=edit&msg=' . rawurlencode($message)); exit; } elseif ($action === 'set_preview') { $dir = resolve_input_dir_from_request($config['uploads_dir'], $_POST['id'] ?? '', $_POST['dir'] ?? '', $articleIndex); $articleId = ensure_state_article_id($dir); - if (input_dir_visible($dir) || input_dir_permalink($dir)) throw new RuntimeException('Disable Show and Permalink before changing preview.'); + initialize_input_dir_defaults($dir, $config); + if (input_dir_public_locked($dir, $config)) throw new RuntimeException('Disable Show and Permalink before changing preview.'); $previewNow = !empty($_POST['preview']); set_input_dir_preview($dir, $previewNow); if ($previewNow) { set_input_dir_enabled($dir, false); set_input_dir_visible($dir, false); } - $state = input_dir_state($dir); - $output = basename((string)($state['output'] ?? '')); - $canShow = $output !== '' && is_file($config['videos_dir'].'/'.$output) && !input_dir_preview($dir); $message = ($previewNow ? 'Enabled preview for: in-dir/' : 'Disabled preview for: in-dir/') . basename($dir); if (!empty($_POST['ajax'])) { - ajax_json([ - 'ok' => true, - 'preview' => $previewNow, - 'enabled' => input_dir_enabled($dir), - 'visible' => input_dir_visible($dir) && $canShow, - 'can_show' => $canShow, - 'can_permalink' => input_dir_can_permalink($dir, $config), - 'dir' => basename($dir), - 'id' => $articleId, - 'message' => $message, - ]); + $payload = input_dir_switch_payload($dir, $config, $articleId); + $payload['ok'] = true; + $payload['message'] = $message; + ajax_json($payload); } header('Location: admin.php?tab=edit&msg=' . rawurlencode($message)); exit; @@ -1225,9 +1244,7 @@ try { $sendImmediately = !empty($_POST['send_immediately']); $articleAlreadyAnnounced = mvlog_announcement_sent(__DIR__, $articleId, basename($dir)); if ($articleAlreadyAnnounced) $sendImmediately = false; - $state = input_dir_state($dir); - $output = basename((string)($state['output'] ?? '')); - $canShow = $output !== '' && is_file($config['videos_dir'].'/'.$output) && !input_dir_preview($dir); + $canShow = input_dir_can_show($dir, $config); $canPermalink = input_dir_can_permalink($dir, $config); if ($visibleNow && !$canShow) throw new RuntimeException('Only finished full-quality videos can be shown.'); if ($visibleNow && !$canPermalink) throw new RuntimeException('Only finished full-quality videos can use permalinks.'); @@ -1245,19 +1262,12 @@ try { } $message = ($visibleNow ? 'Shown: in-dir/' : 'Hidden: in-dir/') . basename($dir); - $currentVisible = input_dir_visible($dir) && $canShow; if (!empty($_POST['ajax'])) { - ajax_json([ - 'ok' => true, - 'visible' => $currentVisible, - 'permalink' => input_dir_permalink($dir), - 'can_show' => $canShow, - 'can_permalink' => $canPermalink, - 'announced' => mvlog_announcement_sent(__DIR__, $articleId, basename($dir)), - 'dir' => basename($dir), - 'id' => $articleId, - 'message' => $message, - ]); + $payload = input_dir_switch_payload($dir, $config, $articleId); + $payload['ok'] = true; + $payload['announced'] = mvlog_announcement_sent(__DIR__, $articleId, basename($dir)); + $payload['message'] = $message; + ajax_json($payload); } header('Location: admin.php?tab=edit&msg=' . rawurlencode($message)); exit; @@ -1269,41 +1279,29 @@ try { if ($permalinkNow && !$canPermalink) throw new RuntimeException('Only finished full-quality videos can use permalinks.'); set_input_dir_permalink($dir, $permalinkNow && $canPermalink); if (!$permalinkNow) set_input_dir_visible($dir, false); - $currentPermalink = input_dir_permalink($dir); - $state = input_dir_state($dir); - $output = basename((string)($state['output'] ?? '')); - $canShow = $output !== '' && is_file($config['videos_dir'].'/'.$output) && !input_dir_preview($dir); - $currentVisible = input_dir_visible($dir) && $canShow; $message = ($permalinkNow ? 'Permalink enabled for: in-dir/' : 'Permalink disabled for: in-dir/') . basename($dir); if (!empty($_POST['ajax'])) { - ajax_json([ - 'ok' => true, - 'permalink' => $currentPermalink, - 'visible' => $currentVisible, - 'can_show' => $canShow, - 'can_permalink' => $canPermalink, - 'dir' => basename($dir), - 'id' => $articleId, - 'message' => $message, - ]); + $payload = input_dir_switch_payload($dir, $config, $articleId); + $payload['ok'] = true; + $payload['message'] = $message; + ajax_json($payload); } header('Location: admin.php?tab=edit&msg=' . rawurlencode($message)); exit; } elseif ($action === 'set_map_hidden') { $dir = resolve_input_dir_from_request($config['uploads_dir'], $_POST['id'] ?? '', $_POST['dir'] ?? '', $articleIndex); $articleId = ensure_state_article_id($dir); - if (input_dir_visible($dir) || input_dir_permalink($dir)) throw new RuntimeException('Disable Show and Permalink before changing map visibility.'); + initialize_input_dir_defaults($dir, $config); + if (input_dir_public_locked($dir, $config)) throw new RuntimeException('Disable Show and Permalink before changing map visibility.'); $mapHiddenNow = !empty($_POST['map_hidden']); set_input_dir_map_hidden($dir, $mapHiddenNow); $message = ($mapHiddenNow ? 'Map hidden on index for: in-dir/' : 'Map visible on index for: in-dir/') . basename($dir); if (!empty($_POST['ajax'])) { - ajax_json([ - 'ok' => true, - 'map_hidden' => $mapHiddenNow, - 'dir' => basename($dir), - 'id' => $articleId, - 'message' => $message, - ]); + $payload = input_dir_switch_payload($dir, $config, $articleId); + $payload['ok'] = true; + $payload['map_hidden'] = $mapHiddenNow; + $payload['message'] = $message; + ajax_json($payload); } header('Location: admin.php?tab=edit&msg=' . rawurlencode($message)); exit; @@ -1470,6 +1468,7 @@ try { $err = $e->getMessage(); } $dirs = input_dirs($config['uploads_dir']); +initialize_input_dirs_defaults($dirs, $config); $articleIndex = load_articles_index($config['uploads_dir'], $dirs); $dirInfo = load_input_dir_cache($dirs); sort_input_dirs_by_metadata_date($dirs, $dirInfo); @@ -1502,8 +1501,8 @@ if ($keywordValue !== '' || $statusFilterActive) { $displayOutput = ($preview && $hasPreviewVideo) ? $previewOutput : ($hasFullVideo ? $fullOutput : ($hasPreviewVideo ? $previewOutput : '')); $hasVideo = $displayOutput !== ''; $enabled = input_dir_enabled($dir); - $canShow = $hasFullVideo && !$preview; - $visible = $canShow && input_dir_visible($dir); + $canShow = input_dir_can_show($dir, $config); + $visible = input_dir_effective_visible($dir, $config); if ($statusFilterActive) { $statusMatch = false; @@ -1545,7 +1544,7 @@ $runningJobs = active_worker_jobs($config);
No orphan videos.
=page_links('videos',$videoPage,$videoPages)?>No input directories yet.
Thumb source: =h((string)$thumbMeta['source_file'])?>
No input directories yet.
Thumb source: =h((string)$thumbMeta['source_file'])?>