rsshub
Version:
Make RSS Great Again!
143 lines (142 loc) • 4.76 kB
JavaScript
import { t as rofetch } from "./ofetch-U0CdpE2g.mjs";
import "./types-DNj6Etbg.mjs";
import { t as parseDate } from "./parse-date-3kcy2Eau.mjs";
import { t as timezone } from "./timezone-UiMFOuvL.mjs";
//#region lib/routes/jma/wxchart.ts
const route = {
path: "/wxchart/:type?",
categories: ["forecast"],
view: 2,
example: "/jma/wxchart/daily",
parameters: { type: {
description: "Chart type",
options: [{
value: "daily",
label: "天気図(最新)"
}, {
value: "monthly",
label: "過去の実況天気図(今月)"
}],
default: "daily"
} },
radar: [{
source: ["www.jma.go.jp/bosai/weather_map/"],
target: "/wxchart/daily"
}, {
source: ["www.data.jma.go.jp/yoho/wxchart/quickmonthly.html"],
target: "/wxchart/monthly"
}],
name: "天気図",
maintainers: ["TonyRL"],
handler,
url: "www.jma.go.jp/bosai/weather_map/"
};
const yohoUrl = "https://www.data.jma.go.jp/yoho";
const archiveUrl = `${yohoUrl}/data/wxchart/quick`;
const areas = {
near: {
region: "日本周辺域",
prefix: "SPAS",
mono: false
},
near_monochrome: {
region: "日本周辺域",
prefix: "SPAS",
mono: true
},
asia: {
region: "アジア太平洋域",
prefix: "ASAS",
mono: false
},
asia_monochrome: {
region: "アジア太平洋域",
prefix: "ASAS",
mono: true
}
};
const charts = {
spas: "実況天気図",
asas: "実況天気図",
fsas24: "24時間予想天気図",
fsas48: "48時間予想天気図"
};
const toJst = (marker) => timezone(parseDate(marker.slice(0, 12), "YYYYMMDDHHmm"), -9);
const toYmd = (date) => date.toISOString().slice(0, 10).replaceAll("-", "");
async function handler(ctx) {
const { type = "daily" } = ctx.req.param();
return type === "monthly" ? await monthly() : await daily();
}
async function daily() {
const bosaiUrl = "https://www.jma.go.jp/bosai/weather_map";
const list = await rofetch(`${bosaiUrl}/data/list.json`);
const files = Object.entries(list).flatMap(([area, chartGroups]) => Object.values(chartGroups).flat().map((file) => {
const [, issued, valid, chart] = file.match(/^(\d{14})_.+?_(\d{14})_MET_CHT_JCI(\w+?)_/);
return {
...areas[area],
file,
issued,
valid,
chart
};
}));
const items = Map.groupBy(files, ({ region, chart, valid }) => `${region}_${chart}_${valid}`).values().toArray().map((group) => {
const { region, prefix, chart, valid, issued } = group[0];
const lead = {
fsas24: 24,
fsas48: 48
}[chart] ?? 0;
const jst = timezone(parseDate(valid, "YYYYMMDDHHmmss"), -(9 + lead));
const description = group.map(({ file, prefix, mono }) => {
let html = `<img src="${bosaiUrl}/data/png/${file}">`;
if (chart === "spas" || chart === "asas") {
const archiveFile = `${archiveUrl}/${valid.slice(0, 6)}/${prefix}_${mono ? "MONO" : "COLOR"}_${valid.slice(0, 12)}`;
html += `<br><a href="${archiveFile}.png">[PNG]</a> <a href="${archiveFile}.svgz">[SVG]</a> <a href="${archiveFile}.pdf">[PDF]</a>`;
}
return html;
}).join("");
return {
title: `${charts[chart]} ${region} ${jst.getUTCMonth() + 1}月${jst.getUTCDate()}日${jst.getUTCHours()}時`,
link: `${yohoUrl}/wxchart/quickdaily.html?show=${toYmd(jst)}#${prefix.toLowerCase()}`,
guid: `${bosaiUrl}/data/png/${group[0].file}`,
description,
pubDate: timezone(parseDate(issued, "YYYYMMDDHHmmss"), 0)
};
});
return {
title: "気象庁 天気図",
link: `${bosaiUrl}/`,
image: "https://www.jma.go.jp/bosai/favicon.ico",
item: items
};
}
async function monthly() {
const [first, latest] = await Promise.all([rofetch(`${archiveUrl}/first.txt`), rofetch(`${archiveUrl}/spas_latest.txt`)]);
const firstDay = toYmd(toJst(first));
const latestJst = toJst(latest);
const latestDay = toYmd(latestJst);
const ym = latestDay.slice(0, 6);
const year = Number(ym.slice(0, 4));
const monthIndex = Number(ym.slice(4, 6)) - 1;
const items = Array.from({ length: 31 }, (_, i) => new Date(Date.UTC(year, monthIndex, i + 1))).filter((date) => {
const ymd = toYmd(date);
return ymd.slice(0, 6) === ym && ymd >= firstDay && ymd <= latestDay;
}).map((date) => {
const ymd = toYmd(date);
const image = ymd === latestDay && latestJst.getUTCHours() < 9 ? `${archiveUrl}/${latest.slice(0, 6)}/SPAS_COLOR_${latest.slice(0, 10)}00.png` : `${archiveUrl}/${ym}/SPAS_COLOR_${ymd}0000.png`;
return {
title: `${date.getUTCMonth() + 1}月${date.getUTCDate()}日`,
link: `${yohoUrl}/wxchart/quickdaily.html?show=${ymd}`,
description: `<img src="${image}">`,
pubDate: date
};
});
return {
title: `気象庁 ${year}年${monthIndex + 1}月の天気図一覧`,
link: `${yohoUrl}/wxchart/quickmonthly.html?show=${ym}`,
image: "https://www.jma.go.jp/bosai/favicon.ico",
item: items
};
}
//#endregion
export { route };