79 lines
2.3 KiB
JavaScript
79 lines
2.3 KiB
JavaScript
import RSS from "rss";
|
|
import axios from "axios";
|
|
import fs from 'fs';
|
|
|
|
const API_URL = "https://aviationweather.gov/api/data/";
|
|
const METAR_SERVICE = "metar";
|
|
const feedOutput = process.env.METAR_FEED_OUTPUT;
|
|
const icao = process.env.METAR_ICAO;
|
|
const rssMetarOptions = {
|
|
title: icao + " METAR",
|
|
description: "METAR feed for " + icao + " Airport",
|
|
feed_url: process.env.METAR_FEED_URL,
|
|
site_url: process.env.METAR_SITE_URL,
|
|
generator: "https://git.entropic.pro/Aiden/metar-rss"
|
|
}
|
|
const checkInterval = 10 * 1000 * 60; //10 Minute Check Interval
|
|
|
|
|
|
let lastMetar;
|
|
let metarRSS = new RSS(rssMetarOptions);
|
|
|
|
checkMetar(); //Inital check run
|
|
const metarCheckJob = setInterval(checkMetar, checkInterval); //Run the check every interval
|
|
|
|
/**
|
|
* Pulls the current metar and adds it to the feed if it is new
|
|
*/
|
|
function checkMetar() {
|
|
console.log("Checking METAR for " + icao);
|
|
getMetar().then(res => {
|
|
if (res.data != lastMetar) {
|
|
console.log("New METAR: " + res.data);
|
|
newMetar(metarRSS, res.data);
|
|
writeFeed(metarRSS);
|
|
lastMetar = res.data;
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Adds a new METAR to the given RSS Feed
|
|
* @param {*} rss - RSS Feed to add the entry to
|
|
* @param {*} metar - metar data to add
|
|
*/
|
|
function newMetar(rss, metar) {
|
|
let metarSplit = metar.split(" ");
|
|
let date = new Date(Date.now());
|
|
let eventDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), Number(metarSplit[2].substring(0,2)), Number(metarSplit[2].substring(2,4)), Number(metarSplit[2].substring(4,6))));
|
|
|
|
rss.item({
|
|
title: metarSplit[0] + " " + metarSplit[1] + " " + metarSplit[2],
|
|
description: metar,
|
|
url: API_URL + METAR_SERVICE,
|
|
guid: metarSplit[1] + metarSplit[2],
|
|
date: eventDate
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Pulls METAR data from the API
|
|
* @returns Axios generated GET Request Response
|
|
*/
|
|
function getMetar() {
|
|
let requestURL = API_URL + METAR_SERVICE + "?ids=" + icao;
|
|
return axios.get(requestURL);
|
|
}
|
|
|
|
/**
|
|
* Writes the given RSS feed to the specified file
|
|
* @param {*} rss - RSS Feed to Write
|
|
*/
|
|
function writeFeed(rss) {
|
|
let xmlFeed = rss.xml({indent: true})
|
|
try {
|
|
fs.writeFileSync(feedOutput, xmlFeed);
|
|
} catch(err) {
|
|
console.error(err);
|
|
}
|
|
} |