Files
dotfiles/local/share/sway/scripts/weather.py
2025-09-27 01:01:01 +04:00

90 lines
2.6 KiB
Python
Executable File

#!/usr/bin/env python
"""Script for the Waybar weather module."""
import getopt
import json
import locale
import sys
import urllib.parse
from datetime import datetime
import requests
import configparser
from os import path, environ
config_path = path.join(
environ.get('APPDATA') or
environ.get('XDG_CONFIG_HOME') or
path.join(environ['HOME'], '.config'),
"weather.cfg"
)
config = configparser.ConfigParser()
config.read(config_path)
# see https://docs.python.org/3/library/locale.html#background-details-hints-tips-and-caveats
locale.setlocale(locale.LC_ALL, "")
current_locale, _ = locale.getlocale(locale.LC_NUMERIC)
city = config.get('DEFAULT', 'city', fallback='auto')
temperature = config.get('DEFAULT', 'temperature', fallback='C')
distance = config.get('DEFAULT', 'distance', fallback='km')
lng = config.get('DEFAULT', 'locale', fallback=locale.getlocale()[0] or current_locale)
if current_locale == "en_US":
temperature = temperature or "F"
distance = distance or "miles"
argument_list = sys.argv[1:]
options = "t:c:d:"
long_options = ["temperature=", "city=", "distance="]
try:
args, values = getopt.getopt(argument_list, options, long_options)
for current_argument, current_value in args:
if current_argument in ("-t", "--temperature"):
temperature = current_value[0].upper()
if temperature not in ("C", "F"):
msg = "temperature unit is neither (C)elsius, nor (F)ahrenheit"
raise RuntimeError(
msg,
temperature,
)
elif current_argument in ("-d", "--distance"):
distance = current_value.lower()
if distance not in ("km", "miles"):
msg = "distance unit is neither km, nor miles", distance
raise RuntimeError(msg)
else:
city = urllib.parse.quote(current_value)
except getopt.error as err:
print(str(err))
sys.exit(1)
if temperature == "F":
temperature_unit = "fahrenheit"
if temperature == "C":
temperature_unit = "celsius"
if distance == "miles":
wind_speed_unit = "mph"
if distance == "km":
wind_speed_unit = "kmh"
try:
headers = {"Accept-Language": f"{lng.replace("_", "-")},{lng.split("_")[0]};q=0.5"}
weather = requests.get(f"https://manjaro-sway.download/weather/{city}?temperature_unit={temperature_unit}&wind_speed_unit={wind_speed_unit}", timeout=10, headers=headers).json()
except (
requests.exceptions.HTTPError,
requests.exceptions.ConnectionError,
requests.exceptions.Timeout,
) as err:
print(str(err))
sys.exit(1)
print(json.dumps(weather))