diff --git a/.gitignore b/.gitignore index f665e46..df5bc7e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ cache/ push.json node_modules/ bin/.personality_index +backups/ +*.bak.* diff --git a/admin.php b/admin.php index d3859a6..cd02240 100644 --- a/admin.php +++ b/admin.php @@ -260,6 +260,16 @@ function read_article_id($dir){ $id = trim((string)file_get_contents($idFile)); return article_id_is_valid($id) ? $id : ''; } +function mvlog_announcement_sent(string $mvlogRoot, string $articleId, string $job): bool { + $cacheFile = rtrim($mvlogRoot, '/') . '/cache/push_notifications.json'; + if (!is_file($cacheFile)) return false; + $cache = json_decode((string)@file_get_contents($cacheFile), true); + if (!is_array($cache) || !is_array($cache['shown'] ?? null)) return false; + $shown = $cache['shown']; + $job = basename(trim($job)); + if (article_id_is_valid($articleId) && isset($shown[$articleId])) return true; + return $job !== '' && isset($shown[$job]); +} function write_article_id($dir, $id){ if (!article_id_is_valid($id)) throw new RuntimeException('Invalid article id.'); $idFile = rtrim((string)$dir, '/').'/'.ARTICLE_ID_FILE; @@ -1142,6 +1152,8 @@ try { $articleId = ensure_state_article_id($dir); $visibleNow = !empty($_POST['visible']); $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); @@ -1170,6 +1182,7 @@ try { '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, @@ -1461,7 +1474,7 @@ $runningJobs = active_worker_jobs($config);

Videos without input dir

No orphan videos.


MB
-

No input directories yet.

(string)($data['title'] ?? ''),'teaser'=>(string)($data['teaser'] ?? ''),'date'=>(string)($data['date'] ?? ''),'location'=>(string)($data['place'] ?? ''),'quote_da'=>(string)($data['quote_da'] ?? ''),'description'=>(string)($data['description'] ?? '')]; $currentSignature=$info['signature'] ?? ''; $fullFingerprint=is_array($state)?(string)($state['fingerprint'] ?? ''):''; $previewFingerprint=is_array($state)?(string)($state['preview_fingerprint'] ?? ''):''; $editedSinceRender=$hasFullVideo && $currentSignature !== '' && $fullFingerprint !== '' && $currentSignature !== $fullFingerprint; $editedSincePreview=!$hasFullVideo && $previewVideo && $currentSignature !== '' && $previewFingerprint !== '' && $currentSignature !== $previewFingerprint; $staleLabel=$editedSinceRender ? 'Edited since render' : ($editedSincePreview ? 'Edited since preview' : ''); ?>
Map
No video yet
Map

Thumb source:

+

No input directories yet.

(string)($data['title'] ?? ''),'teaser'=>(string)($data['teaser'] ?? ''),'date'=>(string)($data['date'] ?? ''),'location'=>(string)($data['place'] ?? ''),'quote_da'=>(string)($data['quote_da'] ?? ''),'description'=>(string)($data['description'] ?? '')]; $currentSignature=$info['signature'] ?? ''; $fullFingerprint=is_array($state)?(string)($state['fingerprint'] ?? ''):''; $previewFingerprint=is_array($state)?(string)($state['preview_fingerprint'] ?? ''):''; $editedSinceRender=$hasFullVideo && $currentSignature !== '' && $fullFingerprint !== '' && $currentSignature !== $fullFingerprint; $editedSincePreview=!$hasFullVideo && $previewVideo && $currentSignature !== '' && $previewFingerprint !== '' && $currentSignature !== $previewFingerprint; $staleLabel=$editedSinceRender ? 'Edited since render' : ($editedSincePreview ? 'Edited since preview' : ''); ?>
Map
No video yet
Map

Thumb source:

@@ -1951,8 +1964,10 @@ async function handleSwitchToggle(form, checkbox){ data.set('ajax', '1'); const useBusyOverlay = form.dataset.switch === 'show'; const isShowingNow = useBusyOverlay && checkbox.checked && !previousState; + const row = form.closest('.admin-video-row'); + const alreadyAnnounced = !!(row && row.dataset.announced === '1'); let sendImmediately = false; - if(isShowingNow){ + if(isShowingNow && !alreadyAnnounced){ sendImmediately = await promptSendEmailsImmediately(); } if(checkbox.checked){ @@ -2073,6 +2088,9 @@ function applySwitchPayload(payload){ } } } + if('announced' in payload){ + row.dataset.announced = payload.announced ? '1' : '0'; + } if('can_permalink' in payload){ row.dataset.canPermalink = payload.can_permalink ? '1' : '0'; const permalinkInput = row.querySelector('form[data-switch="permalink"] input[type="checkbox"]');