53 lines
2.0 KiB
TypeScript
53 lines
2.0 KiB
TypeScript
import { execSync } from 'child_process';
|
|
|
|
// How many minutes after the 10-minute mark should we run the scraper?
|
|
// The basin authority (PVL) generates data at HH:00, HH:10, HH:20... but it takes time to publish.
|
|
// 7 minutes (HH:07, HH:17...) is a safe buffer to avoid fetching outdated data.
|
|
const offsetMinutes = 7;
|
|
|
|
console.log(`\n⏱️ HLADINATOR Watcher spuštěn!`);
|
|
console.log(`Budu automaticky stahovat nová data vždy v časech končících na ${offsetMinutes} (např. 10:07, 10:17, 10:27...).\nTo zajistí, že má Povodí dostatek času data vygenerovat a nahrát.\n`);
|
|
|
|
function runUpdate() {
|
|
const now = new Date().toLocaleTimeString('cs-CZ');
|
|
console.log(`[${now}] 🔄 Spouštím npm run data:update...`);
|
|
try {
|
|
execSync('npm run data:update', { stdio: 'inherit' });
|
|
console.log(`[${new Date().toLocaleTimeString('cs-CZ')}] ✅ Úspěšně hotovo.\n`);
|
|
} catch (error: any) {
|
|
console.error(`[${new Date().toLocaleTimeString('cs-CZ')}] ❌ Chyba při aktualizaci:`, error.message);
|
|
}
|
|
scheduleNextRun();
|
|
}
|
|
|
|
function scheduleNextRun() {
|
|
const now = new Date();
|
|
const currentMinute = now.getMinutes();
|
|
|
|
// Find the next target minute (ending in 5)
|
|
// E.g. if it's 12, next will be 15. If it's 26, next will be 35.
|
|
let nextMinute = Math.floor(currentMinute / 10) * 10 + offsetMinutes;
|
|
if (nextMinute <= currentMinute) {
|
|
nextMinute += 10;
|
|
}
|
|
|
|
const targetTime = new Date(now);
|
|
if (nextMinute >= 60) {
|
|
targetTime.setHours(targetTime.getHours() + 1);
|
|
targetTime.setMinutes(nextMinute % 60);
|
|
} else {
|
|
targetTime.setMinutes(nextMinute);
|
|
}
|
|
targetTime.setSeconds(0);
|
|
targetTime.setMilliseconds(0);
|
|
|
|
const waitMs = targetTime.getTime() - now.getTime();
|
|
|
|
console.log(`[${new Date().toLocaleTimeString('cs-CZ')}] ⏳ Další stahování naplánováno na: ${targetTime.toLocaleTimeString('cs-CZ')} (za ${(waitMs / 60000).toFixed(1)} minut)\n`);
|
|
|
|
setTimeout(runUpdate, waitMs);
|
|
}
|
|
|
|
// Run update immediately on first launch and then set the timer
|
|
runUpdate();
|