116 lines
3.3 KiB
Python
Executable File
116 lines
3.3 KiB
Python
Executable File
#!/usr/bin/python3
|
|
"""
|
|
Tool to asynchronously fetch weather data from OpenWeatherMap.org
|
|
"""
|
|
import json
|
|
import subprocess
|
|
import os
|
|
import sys
|
|
|
|
with open('/etc/weather.json','r') as f:
|
|
config = json.loads(f.read())
|
|
|
|
home = os.environ['HOME']
|
|
if os.path.exists(f'{home}/.weather.json'):
|
|
with open(f'{home}/.weather.json','r') as f:
|
|
x_config = json.loads(f.read())
|
|
for k in x_config:
|
|
config[k] = x_config[k]
|
|
else:
|
|
x_config = {}
|
|
|
|
|
|
key = config['key']
|
|
city = config['city']
|
|
units = config['units']
|
|
|
|
def write_config():
|
|
with open(f'{home}/.weather.json','w') as f:
|
|
f.write(json.dumps(x_config))
|
|
|
|
def write_out(data):
|
|
with open('/tmp/weather.json','w') as f:
|
|
f.write(data)
|
|
try:
|
|
os.chmod('/tmp/weather.json',0o666) # Ensure users can write this, too, for now.
|
|
# Obviously a better approach would be a per-user file, but whatever.
|
|
except:
|
|
pass
|
|
|
|
def update_weather():
|
|
|
|
with open('/proc/netif','r') as f:
|
|
lines = f.readlines()
|
|
if len(lines) < 4 or "no network" in lines[0]:
|
|
with open('/tmp/weather.json','w') as f:
|
|
f.write("")
|
|
sys.exit(1)
|
|
|
|
try:
|
|
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={key}&units={units}"
|
|
data = subprocess.check_output(['fetch',url]).decode('utf-8').strip()
|
|
weather = json.loads(data)
|
|
if 'weather' in weather and len(weather['weather']) >= 1:
|
|
conditions = weather['weather'][0]
|
|
else:
|
|
conditions = None
|
|
temp = round(weather['main']['temp'])
|
|
|
|
output = {
|
|
'temp': weather['main']['temp'],
|
|
'temp_r': round(weather['main']['temp']),
|
|
'conditions': conditions['main'] if conditions else None,
|
|
'icon': conditions['icon'] if conditions else None,
|
|
'humidity': weather['main']['humidity'],
|
|
'clouds': weather['clouds']['all'] if 'all' in weather['clouds'] else None,
|
|
'city': city,
|
|
}
|
|
|
|
with open('/tmp/weather.json','w') as f:
|
|
f.write(json.dumps(output))
|
|
return True
|
|
except:
|
|
with open('/tmp/weather.json','w') as f:
|
|
f.write("")
|
|
return False
|
|
|
|
if __name__ == "__main__":
|
|
|
|
if "--config" in sys.argv:
|
|
import yutani
|
|
import yutani_mainloop
|
|
from input_box import TextInputWindow
|
|
|
|
if __name__ == '__main__':
|
|
yutani.Yutani()
|
|
d = yutani.Decor()
|
|
|
|
def quit():
|
|
sys.exit(0)
|
|
|
|
def set_units(inputbox):
|
|
global units
|
|
x_config['units'] = inputbox.text()
|
|
units = x_config['units']
|
|
inputbox.close()
|
|
write_config()
|
|
update_weather()
|
|
quit()
|
|
|
|
def set_city(inputbox):
|
|
global city
|
|
x_config['city'] = inputbox.text()
|
|
city = x_config['city']
|
|
inputbox.close()
|
|
TextInputWindow(d,"What units would you like? (metric, imperial, kelvin)","",text=units,callback=set_units, cancel_callback=quit)
|
|
|
|
TextInputWindow(d,"What city are you in?","",text=city,callback=set_city,cancel_callback=quit)
|
|
|
|
yutani_mainloop.mainloop()
|
|
sys.exit(0)
|
|
|
|
else:
|
|
if not update_weather():
|
|
sys.exit(1)
|
|
|