From e2877aad77a243d99829b9e8a2806f9ac02ea616 Mon Sep 17 00:00:00 2001 From: Matt Walsh Date: Wed, 14 May 2025 15:03:35 -0500 Subject: [PATCH] refactor icon finding scripts --- server/scripts/modules/currentweather.mjs | 6 +- server/scripts/modules/extendedforecast.mjs | 4 +- server/scripts/modules/icons.mjs | 356 +----------------- server/scripts/modules/icons/icons-hourly.mjs | 51 +++ server/scripts/modules/icons/icons-large.mjs | 140 +++++++ server/scripts/modules/icons/icons-small.mjs | 155 ++++++++ .../modules/regionalforecast-utils.mjs | 4 +- server/scripts/modules/regionalforecast.mjs | 8 +- server/scripts/modules/travelforecast.mjs | 4 +- 9 files changed, 365 insertions(+), 363 deletions(-) create mode 100644 server/scripts/modules/icons/icons-hourly.mjs create mode 100644 server/scripts/modules/icons/icons-large.mjs create mode 100644 server/scripts/modules/icons/icons-small.mjs diff --git a/server/scripts/modules/currentweather.mjs b/server/scripts/modules/currentweather.mjs index 7df24c1..c10e7be 100644 --- a/server/scripts/modules/currentweather.mjs +++ b/server/scripts/modules/currentweather.mjs @@ -4,7 +4,7 @@ import { loadImg, preloadImg } from './utils/image.mjs'; import { json } from './utils/fetch.mjs'; import { directionToNSEW } from './utils/calc.mjs'; import { locationCleanup } from './utils/string.mjs'; -import { getWeatherIconFromIconLink } from './icons.mjs'; +import { getLargeIcon } from './icons.mjs'; import WeatherDisplay from './weatherdisplay.mjs'; import { registerDisplay } from './navigation.mjs'; import { @@ -84,7 +84,7 @@ class CurrentWeather extends WeatherDisplay { if (!superResult) return; // preload the icon - preloadImg(getWeatherIconFromIconLink(observations.features[0].properties.icon)); + preloadImg(getLargeIcon(observations.features[0].properties.icon)); this.setStatus(STATUS.loaded); } @@ -189,7 +189,7 @@ const parseData = (data) => { data.WindSpeed = windConverter(data.WindSpeed); data.WindUnit = windConverter.units; data.Humidity = Math.round(observations.relativeHumidity.value); - data.Icon = getWeatherIconFromIconLink(observations.icon); + data.Icon = getLargeIcon(observations.icon); data.PressureDirection = ''; data.TextConditions = observations.textDescription; diff --git a/server/scripts/modules/extendedforecast.mjs b/server/scripts/modules/extendedforecast.mjs index a5974d1..5600e6b 100644 --- a/server/scripts/modules/extendedforecast.mjs +++ b/server/scripts/modules/extendedforecast.mjs @@ -4,7 +4,7 @@ import STATUS from './status.mjs'; import { json } from './utils/fetch.mjs'; import { DateTime } from '../vendor/auto/luxon.mjs'; -import { getWeatherIconFromIconLink } from './icons.mjs'; +import { getLargeIcon } from './icons.mjs'; import { preloadImg } from './utils/image.mjs'; import WeatherDisplay from './weatherdisplay.mjs'; import { registerDisplay } from './navigation.mjs'; @@ -101,7 +101,7 @@ const parse = (fullForecast) => { // get the object to modify/populate const fDay = forecast[destIndex]; // high temperature will always be last in the source array so it will overwrite the low values assigned below - fDay.icon = getWeatherIconFromIconLink(period.icon); + fDay.icon = getLargeIcon(period.icon); fDay.text = shortenExtendedForecastText(period.shortForecast); fDay.dayName = dates[destIndex]; diff --git a/server/scripts/modules/icons.mjs b/server/scripts/modules/icons.mjs index 43c8d45..5c439bd 100644 --- a/server/scripts/modules/icons.mjs +++ b/server/scripts/modules/icons.mjs @@ -1,353 +1,9 @@ -/* spell-checker: disable */ - -const getWeatherRegionalIconFromIconLink = (link, _isNightTime) => { - // extract day or night if not provided - const isNightTime = _isNightTime ?? link.indexOf('/night/') >= 0; - // internal function to add path to returned icon - const addPath = (icon) => `images/r/${icon}`; - - // grab everything after the last slash ending at any of these: ?&, - const afterLastSlash = link.toLowerCase().match(/[^/]+$/)[0]; - let conditionName = afterLastSlash.match(/(.*?)[&,.?]/)[1]; - // using probability as a crude heavy/light indication where possible - const value = +(link.match(/,(\d{2,3})/) ?? [0, 100])[1]; - - // if a 'DualImage' is captured, adjust to just the j parameter - if (conditionName === 'dualimage') { - const match = link.match(/&j=(.*)&/); - [, conditionName] = match; - } - - // find the icon - switch (conditionName + (isNightTime ? '-n' : '')) { - case 'skc': - case 'hot': - case 'haze': - return addPath('Sunny.gif'); - - case 'skc-n': - case 'nskc': - case 'nskc-n': - case 'cold-n': - return addPath('Clear-1992.gif'); - - case 'bkn': - return addPath('Mostly-Cloudy-1994-2.gif'); - - case 'bkn-n': - case 'few-n': - case 'nfew-n': - case 'nfew': - return addPath('Partly-Clear-1994-2.gif'); - - case 'sct': - case 'few': - return addPath('Partly-Cloudy.gif'); - - case 'sct-n': - case 'nsct': - case 'nsct-n': - return addPath('Mostly-Clear.gif'); - - case 'ovc': - case 'ovc-n': - return addPath('Cloudy.gif'); - - case 'fog': - case 'fog-n': - return addPath('Fog.gif'); - - case 'rain_sleet': - return addPath('Sleet.gif'); - - case 'rain_showers': - case 'rain_showers_high': - return addPath('Scattered-Showers-1994-2.gif'); - - case 'rain_showers-n': - case 'rain_showers_high-n': - return addPath('Scattered-Showers-Night-1994-2.gif'); - - case 'rain': - case 'rain-n': - return addPath('Rain-1992.gif'); - - // case 'snow': - // return addPath('Light-Snow.gif'); - // break; - - // case 'cc_snowshowers.gif': - // //case "heavy-snow.gif": - // return addPath('AM-Snow-1994.gif'); - // break; - - case 'snow': - case 'snow-n': - if (value > 50) return addPath('Heavy-Snow-1994-2.gif'); - return addPath('Light-Snow.gif'); - - case 'rain_snow': - case 'rain_snow-n': - return addPath('Rain-Snow-1992.gif'); - - case 'snow_fzra': - case 'snow_fzra-n': - return addPath('Freezing-Rain-Snow-1992.gif'); - - case 'fzra': - case 'fzra-n': - case 'rain_fzra': - case 'rain_fzra-n': - return addPath('Freezing-Rain-1992.gif'); - - case 'snow_sleet': - case 'snow_sleet-n': - return addPath('Snow and Sleet.gif'); - - case 'sleet': - case 'sleet-n': - return addPath('Sleet.gif'); - - case 'tsra_sct': - case 'tsra': - return addPath('Scattered-Tstorms-1994-2.gif'); - - case 'tsra_sct-n': - case 'tsra-n': - return addPath('Scattered-Tstorms-Night-1994-2.gif'); - - case 'tsra_hi': - case 'tsra_hi-n': - case 'hurricane': - case 'tropical_storm': - case 'hurricane-n': - case 'tropical_storm-n': - return addPath('Thunderstorm.gif'); - - case 'wind': - case 'wind_few': - case 'wind_sct': - case 'wind_bkn': - case 'wind_ovc': - case 'wind-n': - case 'wind_few-n': - case 'wind_bkn-n': - case 'wind_ovc-n': - return addPath('Wind.gif'); - - case 'wind_skc': - return addPath('Sunny-Wind-1994.gif'); - - case 'wind_skc-n': - case 'wind_sct-n': - return addPath('Clear-Wind-1994.gif'); - - case 'blizzard': - case 'blizzard-n': - return addPath('Blowing Snow.gif'); - - case 'cold': - return addPath('cold.gif'); - - default: - console.log(`Unable to locate regional icon for ${conditionName} ${link} ${isNightTime}`); - return false; - } -}; - -const getWeatherIconFromIconLink = (link, _isNightTime) => { - if (!link) return false; - - // internal function to add path to returned icon - const addPath = (icon) => `images/${icon}`; - // extract day or night if not provided - const isNightTime = _isNightTime ?? link.indexOf('/night/') >= 0; - - // grab everything after the last slash ending at any of these: ?&, - const afterLastSlash = link.toLowerCase().match(/[^/]+$/)[0]; - let conditionName = afterLastSlash.match(/(.*?)[&,.?]/)[1]; - // using probability as a crude heavy/light indication where possible - const value = +(link.match(/,(\d{2,3})/) ?? [0, 100])[1]; - - // if a 'DualImage' is captured, adjust to just the j parameter - if (conditionName === 'dualimage') { - const match = link.match(/&j=(.*)&/); - [, conditionName] = match; - } - - // find the icon - switch (conditionName + (isNightTime ? '-n' : '')) { - case 'skc': - case 'hot': - case 'haze': - case 'cold': - return addPath('CC_Clear1.gif'); - - case 'skc-n': - case 'nskc': - case 'nskc-n': - case 'cold-n': - return addPath('CC_Clear0.gif'); - - case 'sct': - case 'few': - case 'bkn': - return addPath('CC_PartlyCloudy1.gif'); - - case 'bkn-n': - case 'few-n': - case 'nfew-n': - case 'nfew': - case 'sct-n': - case 'nsct': - case 'nsct-n': - return addPath('CC_PartlyCloudy0.gif'); - - case 'ovc': - case 'novc': - case 'ovc-n': - return addPath('CC_Cloudy.gif'); - - case 'fog': - case 'fog-n': - return addPath('CC_Fog.gif'); - - case 'rain_sleet': - case 'rain_sleet-n': - case 'sleet': - case 'sleet-n': - return addPath('Sleet.gif'); - - case 'rain_showers': - case 'rain_showers_high': - return addPath('CC_Showers.gif'); - - case 'rain_showers-n': - case 'rain_showers_high-n': - return addPath('CC_Showers.gif'); - - case 'rain': - case 'rain-n': - return addPath('CC_Rain.gif'); - - // case 'snow': - // return addPath('Light-Snow.gif'); - // break; - - // case 'cc_snowshowers.gif': - // //case "heavy-snow.gif": - // return addPath('AM-Snow-1994.gif'); - // break; - - case 'snow': - case 'snow-n': - if (value > 50) return addPath('CC_Snow.gif'); - return addPath('CC_SnowShowers.gif'); - - case 'rain_snow': - return addPath('CC_RainSnow.gif'); - - case 'snow_fzra': - case 'snow_fzra-n': - case 'fzra': - case 'fzra-n': - case 'rain_fzra': - case 'rain_fzra-n': - return addPath('CC_FreezingRain.gif'); - - case 'snow_sleet': - return addPath('Snow-Sleet.gif'); - - case 'tsra_sct': - case 'tsra': - return addPath('EF_ScatTstorms.gif'); - - case 'tsra_sct-n': - case 'tsra-n': - return addPath('CC_TStorm.gif'); - - case 'tsra_hi': - case 'tsra_hi-n': - case 'hurricane': - case 'tropical_storm': - case 'hurricane-n': - case 'tropical_storm-n': - return addPath('CC_TStorm.gif'); - - case 'wind_few': - case 'wind_sct': - case 'wind_bkn': - case 'wind_ovc': - case 'wind_skc': - case 'wind_few-n': - case 'wind_bkn-n': - case 'wind_ovc-n': - case 'wind_skc-n': - case 'wind_sct-n': - return addPath('CC_Windy.gif'); - - case 'blizzard': - case 'blizzard-n': - return addPath('Blowing-Snow.gif'); - - default: - console.log(`Unable to locate icon for ${conditionName} ${link} ${isNightTime}`); - return false; - } -}; - -const getHourlyIcon = (skyCover, weather, iceAccumulation, probabilityOfPrecipitation, snowfallAmount, windSpeed, isNight = false) => { - // internal function to add path to returned icon - const addPath = (icon) => `images/r/${icon}`; - - // possible phenomenon - let thunder = false; - let snow = false; - let ice = false; - let fog = false; - let wind = false; - - // test the phenomenon for various value if it is provided. - weather.forEach((phenomenon) => { - if (!phenomenon.weather) return; - if (phenomenon.weather.toLowerCase().includes('thunder')) thunder = true; - if (phenomenon.weather.toLowerCase().includes('snow')) snow = true; - if (phenomenon.weather.toLowerCase().includes('ice')) ice = true; - if (phenomenon.weather.toLowerCase().includes('fog')) fog = true; - if (phenomenon.weather.toLowerCase().includes('wind')) wind = true; - }); - - // first item in list is highest priority, units are metric where applicable - if (iceAccumulation > 0 || ice) return addPath('Freezing-Rain-1992.gif'); - if (snowfallAmount > 10) { - if (windSpeed > 30 || wind) return addPath('Blowing Snow.gif'); - return addPath('Heavy-Snow-1994.gif'); - } - if ((snowfallAmount > 0 || snow) && thunder) return addPath('ThunderSnow.gif'); - if (snowfallAmount > 0 || snow) return addPath('Light-Snow.gif'); - if (thunder) return (addPath('Thunderstorm.gif')); - if (probabilityOfPrecipitation > 70) return addPath('Rain-1992.gif'); - if (probabilityOfPrecipitation > 50) return addPath('Shower.gif'); - if (probabilityOfPrecipitation > 30) { - if (!isNight) return addPath('Scattered-Showers-1994.gif'); - return addPath('Scattered-Showers-Night.gif'); - } - if (fog) return addPath('Fog.gif'); - if (skyCover > 70) return addPath('Cloudy.gif'); - if (skyCover > 50) { - if (!isNight) return addPath('Mostly-Cloudy-1994.gif'); - return addPath('Partly-Clear-1994.gif'); - } - if (skyCover > 30) { - if (!isNight) return addPath('Partly-Cloudy.gif'); - return addPath('Mostly-Clear.gif'); - } - if (isNight) return addPath('Clear-1992.gif'); - return addPath('Sunny.gif'); -}; +import largeIcon from './icons/icons-large.mjs'; +import smallIcon from './icons/icons-small.mjs'; +import hourlyIcon from './icons/icons-hourly.mjs'; export { - getWeatherIconFromIconLink, - getWeatherRegionalIconFromIconLink, - getHourlyIcon, + largeIcon as getLargeIcon, + smallIcon as getSmallIcon, + hourlyIcon as getHourlyIcon, }; diff --git a/server/scripts/modules/icons/icons-hourly.mjs b/server/scripts/modules/icons/icons-hourly.mjs new file mode 100644 index 0000000..0e34735 --- /dev/null +++ b/server/scripts/modules/icons/icons-hourly.mjs @@ -0,0 +1,51 @@ +const hourlyIcon = (skyCover, weather, iceAccumulation, probabilityOfPrecipitation, snowfallAmount, windSpeed, isNight = false) => { + // internal function to add path to returned icon + const addPath = (icon) => `images/r/${icon}`; + + // possible phenomenon + let thunder = false; + let snow = false; + let ice = false; + let fog = false; + let wind = false; + + // test the phenomenon for various value if it is provided. + weather.forEach((phenomenon) => { + if (!phenomenon.weather) return; + if (phenomenon.weather.toLowerCase().includes('thunder')) thunder = true; + if (phenomenon.weather.toLowerCase().includes('snow')) snow = true; + if (phenomenon.weather.toLowerCase().includes('ice')) ice = true; + if (phenomenon.weather.toLowerCase().includes('fog')) fog = true; + if (phenomenon.weather.toLowerCase().includes('wind')) wind = true; + }); + + // first item in list is highest priority, units are metric where applicable + if (iceAccumulation > 0 || ice) return addPath('Freezing-Rain-1992.gif'); + if (snowfallAmount > 10) { + if (windSpeed > 30 || wind) return addPath('Blowing Snow.gif'); + return addPath('Heavy-Snow-1994.gif'); + } + if ((snowfallAmount > 0 || snow) && thunder) return addPath('ThunderSnow.gif'); + if (snowfallAmount > 0 || snow) return addPath('Light-Snow.gif'); + if (thunder) return (addPath('Thunderstorm.gif')); + if (probabilityOfPrecipitation > 70) return addPath('Rain-1992.gif'); + if (probabilityOfPrecipitation > 50) return addPath('Shower.gif'); + if (probabilityOfPrecipitation > 30) { + if (!isNight) return addPath('Scattered-Showers-1994.gif'); + return addPath('Scattered-Showers-Night.gif'); + } + if (fog) return addPath('Fog.gif'); + if (skyCover > 70) return addPath('Cloudy.gif'); + if (skyCover > 50) { + if (!isNight) return addPath('Mostly-Cloudy-1994.gif'); + return addPath('Partly-Clear-1994.gif'); + } + if (skyCover > 30) { + if (!isNight) return addPath('Partly-Cloudy.gif'); + return addPath('Mostly-Clear.gif'); + } + if (isNight) return addPath('Clear-1992.gif'); + return addPath('Sunny.gif'); +}; + +export default hourlyIcon; diff --git a/server/scripts/modules/icons/icons-large.mjs b/server/scripts/modules/icons/icons-large.mjs new file mode 100644 index 0000000..49de901 --- /dev/null +++ b/server/scripts/modules/icons/icons-large.mjs @@ -0,0 +1,140 @@ +const largeIcon = (link, _isNightTime) => { + if (!link) return false; + + // internal function to add path to returned icon + const addPath = (icon) => `images/${icon}`; + // extract day or night if not provided + const isNightTime = _isNightTime ?? link.indexOf('/night/') >= 0; + + // grab everything after the last slash ending at any of these: ?&, + const afterLastSlash = link.toLowerCase().match(/[^/]+$/)[0]; + let conditionName = afterLastSlash.match(/(.*?)[&,.?]/)[1]; + // using probability as a crude heavy/light indication where possible + const value = +(link.match(/,(\d{2,3})/) ?? [0, 100])[1]; + + // if a 'DualImage' is captured, adjust to just the j parameter + if (conditionName === 'dualimage') { + const match = link.match(/&j=(.*)&/); + [, conditionName] = match; + } + + // find the icon + switch (conditionName + (isNightTime ? '-n' : '')) { + case 'skc': + case 'hot': + case 'haze': + case 'cold': + return addPath('CC_Clear1.gif'); + + case 'skc-n': + case 'nskc': + case 'nskc-n': + case 'cold-n': + return addPath('CC_Clear0.gif'); + + case 'sct': + case 'few': + case 'bkn': + return addPath('CC_PartlyCloudy1.gif'); + + case 'bkn-n': + case 'few-n': + case 'nfew-n': + case 'nfew': + case 'sct-n': + case 'nsct': + case 'nsct-n': + return addPath('CC_PartlyCloudy0.gif'); + + case 'ovc': + case 'novc': + case 'ovc-n': + return addPath('CC_Cloudy.gif'); + + case 'fog': + case 'fog-n': + return addPath('CC_Fog.gif'); + + case 'rain_sleet': + case 'rain_sleet-n': + case 'sleet': + case 'sleet-n': + return addPath('Sleet.gif'); + + case 'rain_showers': + case 'rain_showers_high': + return addPath('CC_Showers.gif'); + + case 'rain_showers-n': + case 'rain_showers_high-n': + return addPath('CC_Showers.gif'); + + case 'rain': + case 'rain-n': + return addPath('CC_Rain.gif'); + + // case 'snow': + // return addPath('Light-Snow.gif'); + // break; + // case 'cc_snowshowers.gif': + // //case "heavy-snow.gif": + // return addPath('AM-Snow-1994.gif'); + // break; + case 'snow': + case 'snow-n': + if (value > 50) return addPath('CC_Snow.gif'); + return addPath('CC_SnowShowers.gif'); + + case 'rain_snow': + return addPath('CC_RainSnow.gif'); + + case 'snow_fzra': + case 'snow_fzra-n': + case 'fzra': + case 'fzra-n': + case 'rain_fzra': + case 'rain_fzra-n': + return addPath('CC_FreezingRain.gif'); + + case 'snow_sleet': + return addPath('Snow-Sleet.gif'); + + case 'tsra_sct': + case 'tsra': + return addPath('EF_ScatTstorms.gif'); + + case 'tsra_sct-n': + case 'tsra-n': + return addPath('CC_TStorm.gif'); + + case 'tsra_hi': + case 'tsra_hi-n': + case 'hurricane': + case 'tropical_storm': + case 'hurricane-n': + case 'tropical_storm-n': + return addPath('CC_TStorm.gif'); + + case 'wind_few': + case 'wind_sct': + case 'wind_bkn': + case 'wind_ovc': + case 'wind_skc': + case 'wind_few-n': + case 'wind_bkn-n': + case 'wind_ovc-n': + case 'wind_skc-n': + case 'wind_sct-n': + return addPath('CC_Windy.gif'); + + case 'blizzard': + case 'blizzard-n': + return addPath('Blowing-Snow.gif'); + + default: + console.log(`Unable to locate icon for ${conditionName} ${link} ${isNightTime}`); + return false; + } +}; + +export default largeIcon; diff --git a/server/scripts/modules/icons/icons-small.mjs b/server/scripts/modules/icons/icons-small.mjs new file mode 100644 index 0000000..0fcc3bf --- /dev/null +++ b/server/scripts/modules/icons/icons-small.mjs @@ -0,0 +1,155 @@ +/* spell-checker: disable */ +const smallIcon = (link, _isNightTime) => { + // extract day or night if not provided + const isNightTime = _isNightTime ?? link.indexOf('/night/') >= 0; + // internal function to add path to returned icon + const addPath = (icon) => `images/r/${icon}`; + + // grab everything after the last slash ending at any of these: ?&, + const afterLastSlash = link.toLowerCase().match(/[^/]+$/)[0]; + let conditionName = afterLastSlash.match(/(.*?)[&,.?]/)[1]; + // using probability as a crude heavy/light indication where possible + const value = +(link.match(/,(\d{2,3})/) ?? [0, 100])[1]; + + // if a 'DualImage' is captured, adjust to just the j parameter + if (conditionName === 'dualimage') { + const match = link.match(/&j=(.*)&/); + [, conditionName] = match; + } + + // find the icon + switch (conditionName + (isNightTime ? '-n' : '')) { + case 'skc': + case 'hot': + case 'haze': + return addPath('Sunny.gif'); + + case 'skc-n': + case 'nskc': + case 'nskc-n': + case 'cold-n': + return addPath('Clear-1992.gif'); + + case 'bkn': + return addPath('Mostly-Cloudy-1994-2.gif'); + + case 'bkn-n': + case 'few-n': + case 'nfew-n': + case 'nfew': + return addPath('Partly-Clear-1994-2.gif'); + + case 'sct': + case 'few': + return addPath('Partly-Cloudy.gif'); + + case 'sct-n': + case 'nsct': + case 'nsct-n': + return addPath('Mostly-Clear.gif'); + + case 'ovc': + case 'ovc-n': + return addPath('Cloudy.gif'); + + case 'fog': + case 'fog-n': + return addPath('Fog.gif'); + + case 'rain_sleet': + return addPath('Sleet.gif'); + + case 'rain_showers': + case 'rain_showers_high': + return addPath('Scattered-Showers-1994-2.gif'); + + case 'rain_showers-n': + case 'rain_showers_high-n': + return addPath('Scattered-Showers-Night-1994-2.gif'); + + case 'rain': + case 'rain-n': + return addPath('Rain-1992.gif'); + + // case 'snow': + // return addPath('Light-Snow.gif'); + // break; + // case 'cc_snowshowers.gif': + // //case "heavy-snow.gif": + // return addPath('AM-Snow-1994.gif'); + // break; + case 'snow': + case 'snow-n': + if (value > 50) return addPath('Heavy-Snow-1994-2.gif'); + return addPath('Light-Snow.gif'); + + case 'rain_snow': + case 'rain_snow-n': + return addPath('Rain-Snow-1992.gif'); + + case 'snow_fzra': + case 'snow_fzra-n': + return addPath('Freezing-Rain-Snow-1992.gif'); + + case 'fzra': + case 'fzra-n': + case 'rain_fzra': + case 'rain_fzra-n': + return addPath('Freezing-Rain-1992.gif'); + + case 'snow_sleet': + case 'snow_sleet-n': + return addPath('Snow and Sleet.gif'); + + case 'sleet': + case 'sleet-n': + return addPath('Sleet.gif'); + + case 'tsra_sct': + case 'tsra': + return addPath('Scattered-Tstorms-1994-2.gif'); + + case 'tsra_sct-n': + case 'tsra-n': + return addPath('Scattered-Tstorms-Night-1994-2.gif'); + + case 'tsra_hi': + case 'tsra_hi-n': + case 'hurricane': + case 'tropical_storm': + case 'hurricane-n': + case 'tropical_storm-n': + return addPath('Thunderstorm.gif'); + + case 'wind': + case 'wind_few': + case 'wind_sct': + case 'wind_bkn': + case 'wind_ovc': + case 'wind-n': + case 'wind_few-n': + case 'wind_bkn-n': + case 'wind_ovc-n': + return addPath('Wind.gif'); + + case 'wind_skc': + return addPath('Sunny-Wind-1994.gif'); + + case 'wind_skc-n': + case 'wind_sct-n': + return addPath('Clear-Wind-1994.gif'); + + case 'blizzard': + case 'blizzard-n': + return addPath('Blowing Snow.gif'); + + case 'cold': + return addPath('cold.gif'); + + default: + console.log(`Unable to locate regional icon for ${conditionName} ${link} ${isNightTime}`); + return false; + } +}; + +export default smallIcon; diff --git a/server/scripts/modules/regionalforecast-utils.mjs b/server/scripts/modules/regionalforecast-utils.mjs index 5672396..e8cb95f 100644 --- a/server/scripts/modules/regionalforecast-utils.mjs +++ b/server/scripts/modules/regionalforecast-utils.mjs @@ -1,4 +1,4 @@ -import { getWeatherRegionalIconFromIconLink } from './icons.mjs'; +import { getSmallIcon } from './icons.mjs'; import { preloadImg } from './utils/image.mjs'; import { json } from './utils/fetch.mjs'; import { temperature as temperatureUnit } from './utils/units.mjs'; @@ -28,7 +28,7 @@ const getRegionalObservation = async (point, city) => { const observation = await json(`${station}/observations/latest`); // preload the image if (!observation.properties.icon) return false; - const icon = getWeatherRegionalIconFromIconLink(observation.properties.icon, !observation.properties.daytime); + const icon = getSmallIcon(observation.properties.icon, !observation.properties.daytime); if (!icon) return false; preloadImg(icon); // return the observation diff --git a/server/scripts/modules/regionalforecast.mjs b/server/scripts/modules/regionalforecast.mjs index d476cd2..555ef72 100644 --- a/server/scripts/modules/regionalforecast.mjs +++ b/server/scripts/modules/regionalforecast.mjs @@ -5,7 +5,7 @@ import STATUS from './status.mjs'; import { distance as calcDistance } from './utils/calc.mjs'; import { json } from './utils/fetch.mjs'; import { temperature as temperatureUnit } from './utils/units.mjs'; -import { getWeatherRegionalIconFromIconLink } from './icons.mjs'; +import { getSmallIcon } from './icons.mjs'; import { preloadImg } from './utils/image.mjs'; import { DateTime } from '../vendor/auto/luxon.mjs'; import WeatherDisplay from './weatherdisplay.mjs'; @@ -28,7 +28,7 @@ class RegionalForecast extends WeatherDisplay { // there are enough other cities available to populate the map sufficiently even if some do not load // pre-load the base map - let baseMap = 'images/map/basemap.png'; + let baseMap = 'images/maps/basemap.png'; if (weatherParameters.state === 'HI') { baseMap = 'images/maps/radar-hawaii.png'; } else if (weatherParameters.state === 'AK') { @@ -106,7 +106,7 @@ class RegionalForecast extends WeatherDisplay { }; // preload the icon - preloadImg(getWeatherRegionalIconFromIconLink(regionalObservation.icon, !regionalObservation.daytime)); + preloadImg(getSmallIcon(regionalObservation.icon, !regionalObservation.daytime)); // return a pared-down forecast // 0th object is the current conditions @@ -178,7 +178,7 @@ class RegionalForecast extends WeatherDisplay { const fill = {}; const period = city[this.screenIndex]; - fill.icon = { type: 'img', src: getWeatherRegionalIconFromIconLink(period.icon, !period.daytime) }; + fill.icon = { type: 'img', src: getSmallIcon(period.icon, !period.daytime) }; fill.city = period.name; const { temperature } = period; fill.temp = temperature; diff --git a/server/scripts/modules/travelforecast.mjs b/server/scripts/modules/travelforecast.mjs index b03cf8a..bf3b9f1 100644 --- a/server/scripts/modules/travelforecast.mjs +++ b/server/scripts/modules/travelforecast.mjs @@ -1,7 +1,7 @@ // travel forecast display import STATUS from './status.mjs'; import { json } from './utils/fetch.mjs'; -import { getWeatherRegionalIconFromIconLink } from './icons.mjs'; +import { getSmallIcon } from './icons.mjs'; import { DateTime } from '../vendor/auto/luxon.mjs'; import WeatherDisplay from './weatherdisplay.mjs'; import { registerDisplay } from './navigation.mjs'; @@ -70,7 +70,7 @@ class TravelForecast extends WeatherDisplay { high: forecast.properties.periods[todayShift].temperature, low: forecast.properties.periods[todayShift + 1].temperature, name: city.Name, - icon: getWeatherRegionalIconFromIconLink(forecast.properties.periods[todayShift].icon), + icon: getSmallIcon(forecast.properties.periods[todayShift].icon), }; } catch (error) { console.error(`GetTravelWeather for ${city.Name} failed`);