aboutsummaryrefslogtreecommitdiffstats
path: root/.i3/py3status/backup/weather_yahoo.py
diff options
context:
space:
mode:
Diffstat (limited to '.i3/py3status/backup/weather_yahoo.py')
-rw-r--r--.i3/py3status/backup/weather_yahoo.py106
1 files changed, 106 insertions, 0 deletions
diff --git a/.i3/py3status/backup/weather_yahoo.py b/.i3/py3status/backup/weather_yahoo.py
new file mode 100644
index 0000000..6b91b04
--- /dev/null
+++ b/.i3/py3status/backup/weather_yahoo.py
@@ -0,0 +1,106 @@
+# -*- coding: utf-8 -*-
+from time import time
+import requests
+
+
+class Py3status:
+ """
+ Display current day + 3 days weather forecast as icons on your i3bar
+ Based on Yahoo! Weather. forecast, thanks guys !
+ See: http://developer.yahoo.com/weather/
+ """
+ def __init__(self):
+ """
+ Basic configuration
+ Find your city code using:
+ http://answers.yahoo.com/question/index?qid=20091216132708AAf7o0g
+ The city_code in this example is for Paris, France
+ """
+ self.cache_timeout = 1800
+ self.city_code = 'FRXX0076'
+ self.request_timeout = 10
+
+ def _get_forecast(self):
+ """
+ Ask Yahoo! Weather. for a forecast
+ """
+ r = requests.get(
+ 'http://query.yahooapis.com/v1/public/yql?q=select item from weather.forecast where location="%s"&format=json' % self.city_code,
+ timeout=self.request_timeout
+ )
+
+ result = r.json()
+ status = r.status_code
+ forecasts = []
+
+ if status == 200:
+ forecasts = result['query']['results']['channel']['item']['forecast']
+ # reset today
+ forecasts[0] = result['query']['results']['channel']['item']['condition']
+ else:
+ raise Exception('got status {}'.format(status))
+
+ # return current today + 3 days forecast
+ return forecasts[:4]
+
+ def _get_icon(self, forecast):
+ """
+ Return an unicode icon based on the forecast code and text
+ See: http://developer.yahoo.com/weather/#codes
+ """
+ icons = ['☀', '☁', '☂', '☃', '?']
+ code = int(forecast['code'])
+ text = forecast['text'].lower()
+
+ # sun
+ if 'sun' in text or code in [31, 32, 33, 34, 36]:
+ code = 0
+
+ # cloud / early rain
+ elif 'cloud' in text or code in [
+ 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
+ 44
+ ]:
+ code = 1
+
+ # rain
+ elif 'rain' in text or code in [
+ 0, 1, 2, 3, 4, 5, 6, 9,
+ 11, 12,
+ 37, 38, 39,
+ 40, 45, 47
+ ]:
+ code = 2
+
+ # snow
+ elif 'snow' in text or code in [
+ 7, 8,
+ 10, 13, 14, 15, 16, 17, 18,
+ 35,
+ 41, 42, 43, 46
+ ]:
+ code = 3
+
+ # dunno
+ else:
+ code = -1
+
+ return icons[code]
+
+ def weather_yahoo(self, json, i3status_config):
+ """
+ This method gets executed by py3status
+ """
+ response = {
+ 'cached_until': time() + self.cache_timeout,
+ 'full_text': '',
+ 'name': 'weather_yahoo'
+ }
+
+ forecasts = self._get_forecast()
+ for forecast in forecasts:
+ icon = self._get_icon(forecast)
+ response['full_text'] += '{} '.format(icon)
+ response['full_text'] = response['full_text'].strip()
+
+ return (0, response)