Read the statement by Michael Teeuw here.
Can anyone revive AviationWX, PilotWX, or TAF
-
@sdetweil The below code works fine. Tested it. Having issues with my system at the moment and can’t make the changes. Can you incorporate?
async function fetchData(metarUrl, airports) { try { const response = await axios.get(metarUrl, { responseType: 'arraybuffer', // ensure response is treated as binary headers: { 'Accept-Encoding': 'gzip', // request gzip compression }, }); // Unzip the gzip response const unzippedData = zlib.gunzipSync(response.data).toString(); let json_string = convert.toJson(unzippedData); var json = JSON.parse(json_string); var metarData = json.response.data.METAR; var airportData = new Object(); var airports = payload.airportList.split(",").map(function (airport) { airport = airport.trim(); return (airport.length < 4) ? "K" + airport : airport; }); airports.forEach(function (airport) { metarData.forEach(function (metar) { if (airport === metar.station_id) { if (this.debug) console.log("METAR data found for " + airport); airportData[airport] = metar; return; // check next airport in list } }); console.log(metarData) }); } catch (error) { console.error('Error fetching data:', error); } }
-
@sdetweil I can fix the other fetch as well no issues. Give me a few on this one.
-
@sdetweil Both calls working.
try { const response = await axios.get(metarUrl, { responseType: 'arraybuffer', // ensure response is treated as binary headers: { 'Accept-Encoding': 'gzip', // request gzip compression }, }); // Unzip the gzip response const unzippedData = zlib.gunzipSync(response.data).toString(); let json_string = convert.toJson(unzippedData); var json = JSON.parse(json_string); var metarData = json.response.data.METAR; var airportData = new Object(); var airports = payload.airportList.split(",").map(function (airport) { airport = airport.trim(); return (airport.length < 4) ? "K" + airport : airport; }); airports.forEach(function (airport) { metarData.forEach(function (metar) { if (airport === metar.station_id) { if (this.debug) console.log("METAR data found for " + airport); airportData[airport] = metar; return; // check next airport in list } }); // console.log(metarData) }); } catch (error) { console.error('Error fetching data:', error); } const checktype = { "Airspace_Flow_List":"Airspace_Flow", "Ground_Delay_List": "Ground_Delay", "Arrival_Departure_Delay_List": "Delay","Airport_Closure_List":"Airport" } try { const response = await axios.get(FAAUrl); // Your further processing let json_string = //convert.toJson(test_data) swap comments to use test FAA data convert.toJson(response.data.toString()); if (this.debug) console.log("json faa=" + json_string); const faa_data = JSON.parse(json_string); if (!Array.isArray(faa_data['AIRPORT_STATUS_INFORMATION'].Delay_type)) { // save the current entry const x = faa_data['AIRPORT_STATUS_INFORMATION'].Delay_type // init as an array faa_data['AIRPORT_STATUS_INFORMATION'].Delay_type = [] // add the element into the array faa_data['AIRPORT_STATUS_INFORMATION'].Delay_type.push(x) } // loop thru the delay types faa_data['AIRPORT_STATUS_INFORMATION'].Delay_type.forEach(t => { // if (t.name !== "Airspace Flow Programs") { // for each the there are two major keys, name and the list for that type // get the key of the list const keyname = Object.keys(t)[1] // remove the "_list" part for passing to front end const key = keyname.split('_').slice(0, -1).join('_') if (this.debug) console.log("key data=" + JSON.stringify(t[keyname][checktype[keyname]]) + "keyname=" + keyname + " key=" + checktype[keyname] + "\n") if (!Array.isArray(t[keyname][checktype[keyname]])) { const x = t[keyname][checktype[keyname]] t[keyname][checktype[keyname]] = [] t[keyname][checktype[keyname]].push(x) } else { console.log("checkytype=" + checktype[keyname]) } if (this.debug) console.log("data=" + Object.keys(faa_data['AIRPORT_STATUS_INFORMATION'].Delay_type)[0] + " data=" + JSON.stringify(t) + " keyname=" + keyname + " key=" + key + " last part=" + JSON.stringify(t[keyname][key]) + "\n") // look thru all the aaffected airports for this record type t[keyname][checktype[keyname]].forEach(airport_record => { // if the airport is one the user requested if (airports.includes('K' + airport_record.ARPT)) { if (airportData['K' + airport_record.ARPT]['FAA'] == undefined) airportData['K' + airport_record.ARPT]['FAA'] = {} // save this data record airportData['K' + airport_record.ARPT]['FAA'][key] = airport_record } }) } }); // Emitting data to Socket //self.sendSocketNotification("WX_RESULT", airportData); } catch (error) { console.error('Error fetching FAA data:', error); }
-
@mumblebaj thx. but there is a way to not have to use zlib. I just haven’t found any that work
-
@sdetweil If you want to use fetch you can do the first call as follows.
try { const response = await fetch(metarUrl, { headers: { 'Accept-Encoding': 'gzip', // Request gzip compression }, }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } // Read response body as buffer const buffer = await response.buffer(); // Manually decompress gzip data const zlib = require('zlib'); const decompressedData = zlib.gunzipSync(buffer).toString();
You could use pako.
const decompressedData = pako.inflate(buffer, { to: 'string' });
-
@mumblebaj but… you are not supposed to have to do either
-
@sdetweil I have not seen another way. Sorry…:man_facepalming:
-
@mumblebaj @sdetweil fwiw, and I don’t know if this would be any easier for the situation.
There is a site called avwx.rest
(I believe the pilot wx all was using that source)It’s an API built solely for pilot data
You do need a key but maybe the data will be easier to pull? -
@FSAHD I might use that for pilot.
we are just talking about using more current support , so the module lasts longer
-
@sdetweil There is a simple api call from the site to get the metar data whicg might be simpler to use.