sr0wx/lib/rozne/y_weather.py

121 wiersze
4.5 KiB
Python
Executable File

#!/usr/bin/python -tt
# -*- coding: utf-8 -*-
#
# Copyright 2009-2011 Michal Sadowski (sq6jnx at hamradio dot pl)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
fake_gettext = lambda(s): s
_ = fake_gettext
from config import y_weather as config
# For debugging purposes:
import debug
import urllib2
lang = None
def my_import(name):
mod = __import__(name)
components = name.split('.')
for comp in components[1:]:
mod = getattr(mod, comp)
return mod
# Taken from http://developer.yahoo.com/python/python-xml.html (SLIGHTLY modified)
# simple and elegant, but I HATE XML!
import urllib
from xml.dom import minidom
import datetime
format_date_time = lambda s: datetime.datetime.strptime(s, '%a, %d %b %Y %I:%M %p %Z')
format_date= lambda s: datetime.datetime.strptime(s, '%d %b %Y')
kmph2mps = lambda s: round(float(s)*(5.0/18.0))
def weather_for_zip(zip_code):
WEATHER_URL = 'http://weather.yahooapis.com/forecastrss?w=%s&u=c'
#WEATHER_URL = 'http://xml.weather.yahoo.com/forecastrss?p=%s'
WEATHER_NS = 'http://xml.weather.yahoo.com/ns/rss/1.0'
url = WEATHER_URL % zip_code
dom = minidom.parse(urllib.urlopen(url))
forecasts = []
for node in dom.getElementsByTagNameNS(WEATHER_NS, 'forecast'):
forecasts.append({
'date': format_date(node.getAttribute('date')),
'low': int(node.getAttribute('low')),
'high': int(node.getAttribute('high')),
#'condition': node.getAttribute('text')
'condition': int(node.getAttribute('code'))
})
ycondition = dom.getElementsByTagNameNS(WEATHER_NS, 'condition')[0]
wind = dom.getElementsByTagNameNS(WEATHER_NS, 'wind')[0]
atmosphere = dom.getElementsByTagNameNS(WEATHER_NS, 'atmosphere')[0]
return {
#'current_condition': ycondition.getAttribute('text'),
'pub_date': format_date_time(dom.getElementsByTagName('pubDate')[0].firstChild.data),
'current_conditions': int(ycondition.getAttribute('code')),
'current_temp': int(ycondition.getAttribute('temp')),
'wind_chill': int(wind.getAttribute('chill')),
'wind_direction': int(wind.getAttribute('direction')),
'wind_speed': float(kmph2mps(wind.getAttribute('speed'))),
'humidity': atmosphere.getAttribute('humidity'),
'visibility': atmosphere.getAttribute('visibility'),
'pressure': float(atmosphere.getAttribute('pressure')),
'tendention': atmosphere.getAttribute('rising'),
'forecasts': forecasts,
#'title': dom.getElementsByTagName('title')[0].firstChild.data
}
def getData(l):
rv = {'data':'', "needCTCSS":False,"source":"y_weather" }
lang = my_import(l+"."+l)
conditions = lang.y_weather.conditions
w = weather_for_zip(config.zipcode)
data = {
'PUB_DATE_HOUR': lang.readISODT(str(w['pub_date'])),
'CURR_TEMP': lang.cardinal(w['current_temp'], lang.C),
'HUMIDITY': lang.cardinal(int(float(w['humidity'])), lang.percent),
'CURRENT_CONDITION': conditions[str(w['current_conditions'])].replace(' ','_'),
'WIND_DIR_NEWS': '',
'WIN_DIR_DEG': lang.cardinal(w['wind_direction'], lang.deg),
'WIND_SPEED': lang.cardinal(int(w['wind_speed']), lang.mPs),
'VISIBILITY_KM': '', #lang.cardinal(w['visibility'], lang.km), '' => None == nieograniczona
'PRESSURE': lang.cardinal(int(w['pressure']), lang.hPa),
'PRESSURE_TENDENTION': lang.tendention[int(w['tendention'])],
'TEMP_WIND_CHILL': lang.cardinal(w['wind_chill'], lang.C),
'FORECAST0_CONDITION': '',
'FORECAST0_MIN_TEMP': lang.cardinal(w['forecasts'][0]['low'], lang.C),
'FORECAST0_MIN_TEMP_SHORT': lang.cardinal(w['forecasts'][0]['low']),
'FORECAST0_MAX_TEMP': lang.cardinal(w['forecasts'][0]['high'], lang.C),
'FORECAST1_CONDITION': '',
'FORECAST1_MIN_TEMP': lang.cardinal(w['forecasts'][1]['low'], lang.C),
'FORECAST1_MIN_TEMP_SHORT': lang.cardinal(w['forecasts'][1]['low']),
'FORECAST1_MAX_TEMP': lang.cardinal(w['forecasts'][1]['high'], lang.C),
}
rv['data']=lang.removeDiacritics(config.template.format(**data))
return rv