OpenMeteo fixes

This commit is contained in:
2026-06-27 17:52:32 -04:00
parent 835856e74c
commit 96a86c4d12
2 changed files with 144 additions and 61 deletions

View File

@@ -78,41 +78,54 @@ app.get('/api/hourly', asyncHandler(async (req, res) => {
const coords = await getCoords()
const now = new Date()
now.setMinutes(0, 0, 0)
const forecastLimit = new Date(now.getTime() + 24 * 60 * 60_000)
const forecast24Limit = new Date(now.getTime() + 24 * 60 * 60_000)
const start = req.query.start ? new Date(req.query.start) : now
const end = req.query.end ? new Date(req.query.end) : forecastLimit
const end = req.query.end ? new Date(req.query.end) : forecast24Limit
const [history, forecast24, forecast3rdParty] = await Promise.all([
start.getTime() < now.getTime() ? queryHourly(start, now) : Promise.resolve([]),
end.getTime() > now.getTime() ? getForecast().then(f => f.slots.filter(h => new Date(h.time) <= end)) : Promise.resolve([]),
end.getTime() > forecastLimit.getTime() ? hourlyWeather(coords.latitude, coords.longitude, forecastLimit, end) : Promise.resolve([]),
const [history, forecast24, meteo] = await Promise.all([
start < now
? queryHourly(start, now)
: Promise.resolve([]),
now < forecast24Limit && end > now
? getForecast().then(f => f.slots.filter(h => new Date(h.time) >= now && new Date(h.time) <= Math.min(end, forecast24Limit)))
: Promise.resolve([]),
end > forecast24Limit
? hourlyWeather(coords.latitude, coords.longitude, forecast24Limit, end)
: Promise.resolve([]),
])
const hourly = getCelestialForecast(coords.latitude, coords.longitude, [...history, ...forecast24, ...forecast3rdParty])
res.json(filterArr(hourly, fields))
}));
const combined = getCelestialForecast(coords.latitude, coords.longitude, [...history, ...forecast24, ...meteo])
res.json(filterArr(combined, fields))
}))
// ── Daily ─────────────────────────────────────────────────────────────────────
app.get('/api/daily', asyncHandler(async (req, res) => {
const { fields } = req.query
const coords = await getCoords();
const now = new Date()
const coords = await getCoords()
const now = new Date()
const todayStart = new Date(now)
todayStart.setHours(0, 0, 0, 0)
const todayEnd = new Date(todayStart)
todayEnd.setDate(todayStart.getDate() + 1)
const start = req.query.start ? new Date(req.query.start) : todayEnd
const end = req.query.end ? new Date(req.query.end) : new Date(todayEnd.getTime() + 5 * 24 * 60 * 60_000)
const start = req.query.start ? new Date(req.query.start) : todayStart
const end = req.query.end ? new Date(req.query.end) : new Date(todayEnd.getTime() + 5 * 24 * 60 * 60_000)
const [history, current, future] = Promise.all([
start.getTime() < todayStart.getTime() ? queryDaily(start, todayStart) : Promise.resolve([]), // Historic
start.getTime() <= todayStart.getTime() ? queryCurrent().then(resp => [resp]) : Promise.resolve([]), // Current
start.getTime() >= todayEnd.getTime() ? dailyWeather(coords.latitude, coords.longitude, todayStart, end) : Promise.resolve([]), // Future
]);
const daily = [...history, ...current, ...getCelestialForecast(coords.latitude, coords.longitude, future)];
const [history, current, future] = await Promise.all([
start < todayStart
? queryDaily(start, todayStart)
: Promise.resolve([]),
start <= todayStart && end >= todayStart
? queryCurrent().then(resp => [resp])
: Promise.resolve([]),
end > todayEnd
? dailyWeather(coords.latitude, coords.longitude, todayEnd, end)
: Promise.resolve([]),
])
const daily = getCelestialForecast(coords.latitude, coords.longitude, [...history, ...current, ...future])
res.json(filterArr(daily, fields))
}));
}))
// ── Position ──────────────────────────────────────────────────────────────────