Merge pull request #193 from simon04/direct_weather

Remove `pywapi` dependency from weather module
This commit is contained in:
enkore 2015-04-05 17:00:47 +02:00
commit ba7ca67453

View File

@ -1,11 +1,16 @@
from i3pystatus import IntervalModule
import pywapi
from i3pystatus.core.util import internet, require
from urllib.request import urlopen
import re
import xml.etree.ElementTree as ElementTree
WEATHER_COM_URL = 'http://wxdata.weather.com/wxdata/weather/local/%s?unit=%s&cc=*'
class Weather(IntervalModule):
"""
This module gets the weather from weather.com using pywapi module
This module gets the weather from weather.com.
First, you need to get the code for the location from the www.weather.com
.. rubric:: Available formatters
@ -14,7 +19,6 @@ class Weather(IntervalModule):
* {current_wind}
* {humidity}
Requires pywapi from PyPI.
"""
interval = 20
@ -27,6 +31,7 @@ class Weather(IntervalModule):
)
required = ("location_code",)
location_code = None
units = "metric"
format = "{current_temp}"
colorize = False
@ -40,9 +45,37 @@ class Weather(IntervalModule):
"default": ("", None),
}
def fetch_weather(self):
'''Fetches the current weather from wxdata.weather.com service.'''
unit = '' if self.units == 'imperial' or self.units == '' else 'm'
url = WEATHER_COM_URL % (self.location_code, unit)
with urlopen(url) as handler:
try:
content_type = dict(handler.getheaders())['Content-Type']
charset = re.search(r'charset=(.*)', content_type).group(1)
except AttributeError:
charset = 'utf-8'
xml = handler.read().decode(charset)
doc = ElementTree.XML(xml)
return dict(
current_conditions=dict(
text=doc.findtext('cc/t'),
temperature=doc.findtext('cc/tmp'),
humidity=doc.findtext('cc/hmid'),
wind=dict(
text=doc.findtext('cc/wind/t'),
speed=doc.findtext('cc/wind/s'),
),
),
units=dict(
temperature=doc.findtext('head/ut'),
speed=doc.findtext('head/us'),
),
)
@require(internet)
def run(self):
result = pywapi.get_weather_from_weather_com(self.location_code, self.units)
result = self.fetch_weather()
conditions = result["current_conditions"]
temperature = conditions["temperature"]
humidity = conditions["humidity"]
@ -61,6 +94,10 @@ class Weather(IntervalModule):
color = color
self.output = {
"full_text": self.format.format(current_temp=current_temp, current_wind=current_wind, humidity=humidity),
"full_text": self.format.format(
current_temp=current_temp,
current_wind=current_wind,
humidity=humidity,
),
"color": color
}