The weather widgets asked wttr.in to geolocate by IP, which lands on
whatever city the ISP registers its address block under -- Downey when
you're in Malibu. Now the location can be set explicitly:
* Click the location in the weather panel to search via open-meteo
geocoding, pick a suggestion (disambiguated by region), and it sticks.
The X next to the field returns to IP auto-detect, as does committing
an empty search.
* State lives in ~/.local/state/omarchy/settings/weather.json as
{name, latitude, longitude}, owned by the new omarchy-weather-location
command (bare call prints the current location, --set/--clear write).
The panel watches the file, so hand edits apply live.
* Stored coordinates make wttr.in and open-meteo exact. Open-meteo also
now supplies current conditions alongside the daily forecast it
already served, which fills the panel within a second of a location
change instead of waiting out wttr.in's multi-second responses; wttr
results still win once they land. Failed wttr fetches retry instead
of sitting stale until the next refresh cycle.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
47 lines
1.6 KiB
Bash
Executable File
47 lines
1.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# omarchy:summary=Show or set the location used for weather reports
|
|
#
|
|
# State lives in ~/.local/state/omarchy/settings/weather.json as
|
|
# {"name": ..., "latitude": ..., "longitude": ...}. A missing file means the
|
|
# location is auto-detected from the IP address. Coordinates make the weather
|
|
# panel exact; a hand-written {"name": "Malibu"} alone works too.
|
|
#
|
|
# (no args) the current location: the stored name, or the
|
|
# IP-detected city when nothing is set
|
|
# --set <name> [lat,lon] store a location
|
|
# --clear return to IP auto-detect
|
|
|
|
LOC_FILE="$HOME/.local/state/omarchy/settings/weather.json"
|
|
COORDS_PATTERN='^(-?[0-9]+(\.[0-9]+)?),(-?[0-9]+(\.[0-9]+)?)$'
|
|
|
|
case "${1:-}" in
|
|
"")
|
|
name=""
|
|
[[ -f $LOC_FILE ]] && name=$(jq -r '.name // "" | if type == "string" then . else "" end' "$LOC_FILE" 2>/dev/null)
|
|
if [[ -z $name ]]; then
|
|
name=$(curl -fsS --max-time 4 "https://wttr.in/?format=%l" 2>/dev/null)
|
|
name=${name%%,*}
|
|
fi
|
|
[[ -n $name ]] && echo "$name"
|
|
;;
|
|
--set)
|
|
[[ -n ${2:-} ]] || { echo "Usage: omarchy-weather-location --set <name> [lat,lon]" >&2; exit 1; }
|
|
if [[ -n ${3:-} ]]; then
|
|
[[ ${3} =~ $COORDS_PATTERN ]] || { echo "Invalid coordinates: $3 (expected lat,lon)" >&2; exit 1; }
|
|
location=$(jq -n --arg name "$2" --argjson latitude "${3%,*}" --argjson longitude "${3#*,}" '{$name, $latitude, $longitude}')
|
|
else
|
|
location=$(jq -n --arg name "$2" '{$name}')
|
|
fi
|
|
mkdir -p "$(dirname "$LOC_FILE")"
|
|
echo "$location" >"$LOC_FILE"
|
|
;;
|
|
--clear)
|
|
rm -f "$LOC_FILE"
|
|
;;
|
|
*)
|
|
echo "Usage: omarchy-weather-location [--set <name> [lat,lon]|--clear]" >&2
|
|
exit 1
|
|
;;
|
|
esac
|