PK {OOrVj= j= weather.yahoo/addon.xml
Weervoorspelling van yahoo.comየ አየር ንብረት ከ ያሁ.ኮምتنبؤات الطقس من موقع yahoo.comСиноптична прогноза от www.yahoo.comPrevisió del temps des de yahoo.comPředpověď počasí z yahoo.comVejrudsigt fra yahoo.comWettervorhersage von yahoo.comΠρόγνωση καιρού από το yahoo.comWeather forecast from yahoo.comWeather forecast from yahoo.comWeather forecast from yahoo.comPredicción meteorológica de yahoo.comyahoo.com ilmaennustusYahoo.com sääennustePrévisions météo depuis yahoo.comPrévisions météorologiques de yahoo.comPredición meteorolóxica de yahoo.comתחזית מזג אוויר מ-yahoo.comPrognoza vremena sa yahoo.comIdőjárás előrejelzés a yahoo.com oldalrólRamalan Cuaca dari yahoo.comVeðurspá frá yahoo.comServizio meteo di yahoo.comyahoo.com 天気予報yahoo.com 일기예보Orų prognozė iš yahoo.comLaikapstākļu prognoze no yahoo.comWeerbericht van yahoo.comVærvarsel fra yahoo.comPrognoza pogody z serwisu yahoo.comPrevisão do tempo a partir de yahoo.comPrevisão Climática de yahoo.comPrognoze meteo de la yahoo.comПрогноз погоды от yahoo.comPredpoveď počasia z yahoo.comVremenska napoved iz yahoo.comПрогноза времена са yahoo.comVäderprognos från yahoo.comHava durumu - yahoo.comПрогноз погоди з 来源于 yahoo.com 的天气预报Weervoorspelling verskaf deur Yahoo! Weer (http://weather.yahoo.com/)خدمه تنبؤات الطقس تأتيكم برعايه ياهوو الطقس (http://weather.yahoo.com/)Синоптична прогноза, предоставена от Yahoo! Weather (http://www.yahoo.com/)Previsió del temps proporcionada per Yahoo! Weather (http://weather.yahoo.com/)Předpověď počasí poskytnuta stránkou Yahoo! Weather (http://weather.yahoo.com/)Vejrudsigten leveret af Yahoo! vejr (http://weather.com/)Wettervorhersage bereitgestellt durch Yahoo! Weather (http://weather.yahoo.com/)Η πρόγνωση καιρού παρέχεται από το Yahoo! Weather (http://weather.yahoo.com/)Weather forecast provided by Yahoo! Weather (http://weather.yahoo.com/)Weather forecast provided by Yahoo! Weather (http://weather.yahoo.com/)Weather forecast provided by Yahoo! Weather (http://weather.yahoo.com/)Predicción meteorológica facilitada por Yahoo! Weather (http://weather.yahoo.com/)Ilmaennustuse toob teieni Yahoo! Weather (http://weather.yahoo.com/)Sääennusteen tarjoaa Yahoo! Weather (http://weather.yahoo.com)Prévisions météo fournies par Yahoo! Weather (http://weather.yahoo.com/)Prévisions météorologiques fournies par Yahoo! Weather (http://weather.yahoo.com/)Predición meteorolóxica fornecida por Yahoo! Weather (http://weather.yahoo.com/)תחזית מזג אוויר מסופקת ע"י Yahoo! Weather (בכתובת http://weather.yahoo.com)Prognoza vremena koju pruža Yahoo! Weather (http://weather.yahoo.com/)Az időjárás előrejelzést biztosítja a Yahoo! Weather (http://weather.yahoo.com/)Veðurspá frá Yahoo! Weather (http://weather.yahoo.com/)Servizio meteo fornito da Yahoo! Weather (http://weather.yahoo.com/)Yahoo! Weather (http://weather.yahoo.com/) 提供の天気予報Yahoo! Weather (http://weather.yahoo.com/) 에서 제공하는 일기예보Yahoo! Weather pateikta orų prognozė (http://weather.yahoo.com/)Laikapstākļu prognoze pēc Yahoo! laika ar nosacījumu (http://weather.yahoo.com/)Weersverwachting geleverd door Yahoo! (http://weather/yahoo.com)Værvarsel levert av Yahoo! Weather (http://weather.yahoo.com/)Prognoza pogody jest dostarczona dzięki uprzejmości serwisu Yahoo! (http://weather.yahoo.com/)Previsão metereológica fornecida por Yahoo! Weather (http://weather.yahoo.com/)Previsão climática fornecida por Yahoo! Weather (http://weather.yahoo.com)Prognoză meteo oferită de Yahoo! Weather (http://weather.yahoo.com/)Прогноз погоды предоставлен Yahoo! Weather (http://weather.yahoo.com/)Predpoveď počasia poskytovaná službou Yahoo! Weather (http://weather.yahoo.com/)Vremenska napoved od Yahoo! Weather (http://weather.yahoo.com/)Прогноза времена коју је омогућио Yahoo! Weather (http://weather.yahoo.com/)Väderprognos tillhandahållen av Yahoo! Weather (http://weather.yahoo.com/)Yahoo! Weather tarafından sağlana hava durumu tahmini (http://weather.yahoo.com/)Прогноз погоди надано Yahoo! Weather (http://weather.yahoo.com/)由雅虎天气提供的天气预报(http://weather.yahoo.com/)Die gebruik van hierdie byvoeging beteken dat jy ooreengekom met die diensvoorwaardes wat op geleë is http://developer.yahoo.com/weather/#termsإستخدامك لهذه اﻹضافه يعنى موافقتك على شروط الخدمه التى يمكن اﻹطلاع عليها من خلال http://developer.yahoo.com/weather/#termsУпотребявайки добавката Вие се съгласявате с условията за ползване на услугата, които се намират на http://developer.yahoo.com/weather/#termsL'ús d'aquest complement implica que vostè ha acceptat els termes de servei ubicats a http://developer.yahoo.com/weather/#termsPoužíváním tohoto rozšíření schvalujete podmínky užívání umístěné na http://developer.yahoo.com/weather/#termsBrug af denne add-on betyder at du har accepteret betingelserne for brug som du finder på http://developer.yahoo.com/weather/#termsDie Benutzung der Erweiterung impliziert, das sie den Nutzungsbedingungen unter http://developer.yahoo.com/weather/#terms zugestimmt habenΧρήση αυτού του πρόσθετου συνεπάγεται την αποδοχή των Όρων Χρήσης της Υπηρεσίας (Terms of Service) οι οποίοι βρίσκονται στο http://developer.yahoo.com/weather/#termsUse of this add-on implies that you have agreed to the Terms of Service located at http://developer.yahoo.com/weather/#termsUse of this add-on implies that you have agreed to the Terms of Service located at http://developer.yahoo.com/weather/#termsUse of this add-on implies that you have agreed to the Terms of Service located at http://developer.yahoo.com/weather/#termsEl uso de este add-on implica la aceptación de los Términos de Servicio recogidos en http://developer.yahoo.com/weather/#termsSelle lisa kasutamine tähendab nõustumist Kasutustingimustega aadressilt http://developer.yahoo.com/weather/#termsTämän lisäosan käyttäminen tarkoittaa että hyväksyt käyttäehdot, jotka ovat osoitteessa http://developer.yahoo.com/weather/#termsPar l'utilisation de ce module, vous attestez accepter les Conditions Générales d'Utilisation disponibles sur http://developer.yahoo.com/weather/#termsL'utilisation de cet addiciel implique que vous avez accepté les conditions générales d'utilisation situées à http://developer.yahoo.com/weather/#termsEmpregar este complemento implica que vostede acepta os termos do servizo localizados en http://developer.yahoo.com/weather/#termsמהשימוש בהרחבה זו משתמע כי הסכמת לתנאי השירות המפורטים ב-http://developer.yahoo.com/weather/#termsKorištenje ovog dodatka podrazumijeva da se slažete sa Pravilima korištenja koji se nalaze na: http://developer.yahoo.com/weather/#termsEnnek a kiegészínőnek a használatával elfogadja a Felhasználói Feltételeket amik megtalálhatóak a http://developer.yahoo.com/weather/#terms oldalonNotkun á þessarri viðbót gefur til kynna að þú hafir samþykkt skilmálana sem finna má á http://developer.yahoo.com/weather/#termsL'uso di questo Add-on implica l'accettazione delle Condizioni di Servizio che trovi su http://developer.yahoo.com/weather/#termsこのアドオンを使うことにより、http://developer.yahoo.com/weather/#terms にある利用規約に同意したとみなされます。이 애드온을 사용하는 것은 http://developer.yahoo.com/weather/#terms 에 있는 서비스 이용 약관에 동의함을 의미합니다.Naudodami šį priedą, jūs sutinkate su paslaugos sąlygomis, esančiomis http://developer.yahoo.com/weather/#termsLietojot šo spraudni nozīmē, ka jūs esat piekrituši pakalpojumu sniegšanas noteikumiem, kas atrodas http://developer.yahoo.com/weather/#termsHet gebruik van deze add-on impliceert dat je akkoord gaat met de service-voorwaarden op http://developer.yahoo.com/weather/#termsBruken av dette tillegget betinger at du har godkjent brukervilkårene på http://developer.yahoo.com/weather/#termsKorzystanie z tego dodatku jest równoznaczne z akceptacją regulaminu dostępnego pod adresem: http://developer.yahoo.com/weather/#termsO uso deste add-on implica o seu acordo com os Termos de Serviço disponíveis em http://developer.yahoo.com/weather/#termsO uso deste complemento implica em aceitar os Termos de Serviço localizado em http://developer.yahoo.com/weather/#termsИспользуя это дополнение, вы соглашаетесь с условиями предоставления услуг,
доступными по адресу: http://developer.yahoo.com/weather/#termsPoužívaním tohto doplnku súhlasíte s podmienkami používania služby umiestnenými na http://developer.yahoo.com/weather/#termsUporaba tega dodatka pomeni, da ste se strinjali s pogoji storitve, ki se nahajajo na http://developer.yahoo.com/weather/#termsУпотреба овог додатка подразумева да сте сагласни са Условима Коришћења који се налазе на http://developer.yahoo.com/weather/#termsAnvändning av detta tillägg innebär att du har accepterat användarvillkoren som hittas på http://developer.yahoo.com/weather/#termsBu eklentinin kullanımı aynı zamanda http://developer.yahoo.com/weather/#terms adresindeki Kullanım Koşullarını da kabul ettiğiniz anlamına gelir.Скориставшись цією надбудовою, ви тим самим погоджуєтеся з умовами використання: 使用此插件表示你已同意此服务条款:http://developer.yahoo.com/weather/#termsallGNU GENERAL PUBLIC LICENSE Version 2https://forum.kodi.tv/showthread.php?tid=169410resources/icon.pngresources/fanart.jpg
PK {OO3# weather.yahoo/changelog.txtv5.0.6
- cleanup
v5.0.5
- fix url. thx olympus
v5.0.4
- fix hourly wind direction
v5.0.3
- cosmetics
v5.0.2
- fix crash when speed is set to Beaufort
v5.0.1
- fix crash when speed is set to Beaufort
v5.0.0
- new version, old api closed
v4.3.2
- move repo to gitlab
v4.3.1
- retry to fetch weather a few times
v4.3.0
- cache weather data
v4.2.4
- update translations
v4.2.3
- fix sunrise/sunset format
v4.2.2
- handle keys with value null
v4.2.1
- bugfix
v4.2.0
- add support for daily infolabels
v4.1.0
- update to new api
v4.0.1
- localize sunset/sunrise
v4.0.0
- remove simplejson support
v3.1.1
- remove unused code
v3.1.0
- change url due to api changes
v3.0.9
- add option for 5 locations
v3.0.8
- cosmetics
- language update
v3.0.7
- updated language files from Transifex
v3.0.6
- fix another crash on empty values
v3.0.5
- fix potential crash on empty values
v3.0.4
- clear category properties
v3.0.3
- updated language files from Transifex
3.0.2
- deprecate xbmc.abortRequested
v3.0.1
- fix UnicodeDecodeError
v3.0.0
- kodi name change
v2.0.4
- language update
v2.0.3
- no reason
v2.0.2
- language update
v2.0.1
- language update
v2.0.0
- gotham release
v1.0.3
- add provider logo
v1.0.2
- fix bug in clear infolabels
v1.0.1
- initial release
PK {OO}5 5 weather.yahoo/default.py# -*- coding: utf-8 -*-
import os
import sys
import socket
import time
import _strptime
import requests
import xbmc
import xbmcgui
import xbmcaddon
import xbmcvfs
ADDON = xbmcaddon.Addon()
ADDONNAME = ADDON.getAddonInfo('name')
ADDONID = ADDON.getAddonInfo('id')
ADDONVERSION = ADDON.getAddonInfo('version')
CWD = ADDON.getAddonInfo('path').decode("utf-8")
RESOURCE = xbmc.translatePath( os.path.join( CWD, 'resources', 'lib' ).encode("utf-8") ).decode("utf-8")
DATAPATH = xbmc.translatePath(ADDON.getAddonInfo('profile')).decode('utf-8')
WEATHER_WINDOW = xbmcgui.Window(12600)
sys.path.append(RESOURCE)
from utils import *
LCURL = 'https://www.yahoo.com/news/_tdnews/api/resource/WeatherSearch;text=%s'
FCURL = 'https://www.yahoo.com/news/_tdnews/api/resource/WeatherService;woeids=%%5B%s%%5D'
socket.setdefaulttimeout(10)
def convert_datetime(stamp):
timestruct = time.strptime(stamp[:-5], "%Y-%m-%dT%H:%M:%S")
if DATEFORMAT[1] == 'd' or DATEFORMAT[0] == 'D':
localdate = time.strftime('%d-%m-%Y', timestruct)
elif DATEFORMAT[1] == 'm' or DATEFORMAT[0] == 'M':
localdate = time.strftime('%m-%d-%Y', timestruct)
else:
localdate = time.strftime('%Y-%m-%d', timestruct)
if TIMEFORMAT != '/':
localtime = time.strftime('%I:%M %p', timestruct)
else:
localtime = time.strftime('%H:%M', timestruct)
return localtime + ' ' + localdate
def get_date(stamp, form):
timestruct = time.strptime(stamp[:-5], "%Y-%m-%dT%H:%M:%S")
month = time.strftime('%m', timestruct)
day = time.strftime('%d', timestruct)
if form == 'short':
if DATEFORMAT[1] == 'd' or DATEFORMAT[0] == 'D':
label = day + ' ' + xbmc.getLocalizedString(MONTHS[month])
else:
label = xbmc.getLocalizedString(MONTHS[month]) + ' ' + day
elif form == 'long':
if DATEFORMAT[1] == 'd' or DATEFORMAT[0] == 'D':
label = day + ' ' + xbmc.getLocalizedString(LMONTHS[month])
else:
label = xbmc.getLocalizedString(LMONTHS[month]) + ' ' + day
return label
def get_time(stamp):
timestruct = time.strptime(stamp[:-5], "%Y-%m-%dT%H:%M:%S")
if TIMEFORMAT != '/':
localtime = time.strftime('%I:%M %p', timestruct)
else:
localtime = time.strftime('%H:%M', timestruct)
return localtime
def convert_temp(temp):
celc = (float(temp)-32) * 5/9
return str(int(round(celc)))
def convert_speed(speed):
kmh = float(speed) * 1.609
return str(int(round(kmh)))
def convert_seconds(sec):
m, s = divmod(sec, 60)
h, m = divmod(m, 60)
hm = "%02d:%02d" % (h, m)
if TIMEFORMAT != '/':
timestruct = time.strptime(hm, "%H:%M")
hm = time.strftime('%I:%M %p', timestruct)
return hm
def log(txt):
if ADDON.getSetting('Debug') == 'true':
if isinstance (txt,str):
txt = txt.decode("utf-8")
message = u'%s: %s' % (ADDONID, txt)
xbmc.log(msg=message.encode("utf-8"), level=xbmc.LOGDEBUG)
def set_property(name, value):
WEATHER_WINDOW.setProperty(name, value)
def refresh_locations():
locations = 0
for count in range(1, 6):
loc_name = ADDON.getSetting('Location%s' % count)
if loc_name:
locations += 1
set_property('Location%s' % count, loc_name)
set_property('Locations', str(locations))
log('available locations: %s' % str(locations))
def location(loc):
locs = []
locids = []
log('searching for location: %s' % loc)
data = get_data(LCURL, loc)
log('location data: %s' % data)
if data:
for item in data:
locs.append(item['qualifiedName'])
locids.append(str(item['woeid']))
return locs, locids
def get_data(api, search):
url = api % search
try:
response = requests.get(url)
return response.json()
except:
return
def forecast(loc, locid):
log('weather location: %s' % locid)
retry = 0
while (retry < 10) and (not MONITOR.abortRequested()):
data = get_data(FCURL, locid)
if data:
# response
retry = 10
else:
# no response
retry += 1
xbmc.sleep(10000)
log('weather download failed')
log('forecast data: %s' % data)
if data:
properties(data, loc, locid)
else:
clear()
def clear():
set_property('Current.Condition' , 'N/A')
set_property('Current.Temperature' , '0')
set_property('Current.Wind' , '0')
set_property('Current.WindDirection' , 'N/A')
set_property('Current.Humidity' , '0')
set_property('Current.FeelsLike' , '0')
set_property('Current.UVIndex' , '0')
set_property('Current.DewPoint' , '0')
set_property('Current.OutlookIcon' , 'na.png')
set_property('Current.FanartCode' , 'na')
for count in range (0, MAXDAYS+1):
set_property('Day%i.Title' % count, 'N/A')
set_property('Day%i.HighTemp' % count, '0')
set_property('Day%i.LowTemp' % count, '0')
set_property('Day%i.Outlook' % count, 'N/A')
set_property('Day%i.OutlookIcon' % count, 'na.png')
set_property('Day%i.FanartCode' % count, 'na')
def properties(response, loc, locid):
data = response['weathers'][0]
#current - standard
set_property('Location' , loc)
set_property('Updated' , convert_datetime(data['observation']['observationTime']['timestamp']))
set_property('Current.Location' , data['location']['displayName'])
set_property('Current.Condition' , data['observation']['conditionDescription'])
set_property('Current.Temperature' , convert_temp(data['observation']['temperature']['now']))
set_property('Current.UVIndex' , str(data['observation']['uvIndex']))
set_property('Current.OutlookIcon' , '%s.png' % str(data['observation']['conditionCode'])) # Kodi translates it to Current.ConditionIcon
set_property('Current.FanartCode' , str(data['observation']['conditionCode']))
set_property('Current.Wind' , convert_speed(data['observation']['windSpeed']))
set_property('Current.WindDirection' , xbmc.getLocalizedString(WIND_DIR(data['observation']['windDirection'])))
set_property('Current.Humidity' , str(data['observation']['humidity']))
set_property('Current.DewPoint' , dewpoint(int(convert_temp(data['observation']['temperature']['now'])), data['observation']['humidity']))
set_property('Current.FeelsLike' , convert_temp(data['observation']['temperature']['feelsLike']))
#current - extended
set_property('Current.WindChill' , TEMP(windchill(data['observation']['temperature']['now'], data['observation']['windSpeed'])) + TEMPUNIT)
if 'F' in TEMPUNIT:
set_property('Current.Visibility' , str(round(data['observation']['visibility'],2)) + ' mi')
set_property('Current.Pressure' , str(round(data['observation']['barometricPressure'],2)) + ' inHg')
else:
set_property('Current.Visibility' , str(round(1.60934 * data['observation']['visibility'],2)) + ' km')
set_property('Current.Pressure' , str(int(round((33.864 * data['observation']['barometricPressure'])))) + ' mbar')
set_property('Current.Precipitation' , str(data['observation']['precipitationProbability']) + '%')
#forecast - extended
set_property('Forecast.City' , data['location']['displayName'])
set_property('Forecast.Country' , data['location']['countryName'])
set_property('Forecast.Latitude' , str(data['location']['latitude']))
set_property('Forecast.Longitude' , str(data['location']['longitude']))
set_property('Forecast.Updated' , convert_datetime(data['observation']['observationTime']['timestamp']))
#today - extended
set_property('Today.Sunrise' , convert_seconds(data['sunAndMoon']['sunrise']))
set_property('Today.Sunset' , convert_seconds(data['sunAndMoon']['sunset']))
set_property('Today.Moonphase' , MOONPHASE[data['sunAndMoon']['moonPhase']])
#hourly - extended
for count, item in enumerate(data['forecasts']['hourly']):
set_property('Hourly.%i.Time' % (count + 1), get_time(item['observationTime']['timestamp']))
set_property('Hourly.%i.LongDate' % (count + 1), get_date(item['observationTime']['timestamp'], 'long'))
set_property('Hourly.%i.ShortDate' % (count + 1), get_date(item['observationTime']['timestamp'], 'short'))
set_property('Hourly.%i.Temperature' % (count + 1), TEMP(item['temperature']['now']) + TEMPUNIT)
set_property('Hourly.%i.FeelsLike' % (count + 1), TEMP(item['temperature']['feelsLike']) + TEMPUNIT)
set_property('Hourly.%i.Outlook' % (count + 1), str(item['conditionDescription']))
set_property('Hourly.%i.OutlookIcon' % (count + 1), '%s.png' % str(item['conditionCode']))
set_property('Hourly.%i.FanartCode' % (count + 1), str(item['conditionCode']))
set_property('Hourly.%i.Humidity' % (count + 1), str(item['humidity']) + '%')
set_property('Hourly.%i.Precipitation' % (count + 1), str(item['precipitationProbability']) + '%')
set_property('Hourly.%i.WindDirection' % (count + 1), xbmc.getLocalizedString(WIND_DIR(item['windDirection'])))
set_property('Hourly.%i.WindSpeed' % (count + 1), SPEED(item['windSpeed']) + SPEEDUNIT)
set_property('Hourly.%i.WindDegree' % (count + 1), str(item['windDirection']) + u'°')
set_property('Hourly.%i.DewPoint' % (count + 1), TEMP(dewpoint(int(convert_temp(item['temperature']['now'])), item['humidity']), 'C') + TEMPUNIT)
#daily - standard
for count, item in enumerate(data['forecasts']['daily']):
set_property('Day%i.Title' % count, LDAYS[item['observationTime']['weekday']])
set_property('Day%i.HighTemp' % count, convert_temp(item['temperature']['high']))
set_property('Day%i.LowTemp' % count, convert_temp(item['temperature']['low']))
set_property('Day%i.Outlook' % count, item['conditionDescription'])
set_property('Day%i.OutlookIcon' % count, '%s.png' % str(item['conditionCode']))
set_property('Day%i.FanartCode' % count, str(item['conditionCode']))
if count == MAXDAYS:
break
#daily - extended
for count, item in enumerate(data['forecasts']['daily']):
set_property('Daily.%i.ShortDay' % (count + 1), DAYS[item['observationTime']['weekday']])
set_property('Daily.%i.LongDay' % (count + 1), LDAYS[item['observationTime']['weekday']])
set_property('Daily.%i.ShortDate' % (count + 1), get_date(item['observationTime']['timestamp'], 'short'))
set_property('Daily.%i.LongDate' % (count + 1), get_date(item['observationTime']['timestamp'], 'short'))
set_property('Daily.%i.HighTemperature' % (count + 1), TEMP(item['temperature']['high']) + TEMPUNIT)
set_property('Daily.%i.LowTemperature' % (count + 1), TEMP(item['temperature']['low']) + TEMPUNIT)
set_property('Daily.%i.Outlook' % (count + 1), str(item['conditionDescription']))
set_property('Daily.%i.OutlookIcon' % (count + 1), '%s.png' % str(item['conditionCode']))
set_property('Daily.%i.FanartCode' % (count + 1), str(item['conditionCode']))
set_property('Daily.%i.Humidity' % (count + 1), str(item['humidity']) + '%')
set_property('Daily.%i.Precipitation' % (count + 1), str(item['precipitationProbability']) + '%')
set_property('Daily.%i.DewPoint' % (count + 1), TEMP(dewpoint(int(convert_temp(item['temperature']['low'])), item['humidity']), 'C') + TEMPUNIT)
class MyMonitor(xbmc.Monitor):
def __init__(self, *args, **kwargs):
xbmc.Monitor.__init__(self)
log('version %s started: %s' % (ADDONVERSION, sys.argv))
MONITOR = MyMonitor()
set_property('Forecast.IsFetched' , 'true')
set_property('Current.IsFetched' , 'true')
set_property('Today.IsFetched' , 'true')
set_property('Daily.IsFetched' , 'true')
set_property('Hourly.IsFetched' , 'true')
set_property('WeatherProvider' , ADDONNAME)
set_property('WeatherProviderLogo', xbmc.translatePath(os.path.join(CWD, 'resources', 'banner.png')))
# Create data path if it doesn't exist
if not xbmcvfs.exists(DATAPATH):
xbmcvfs.mkdir(DATAPATH)
if sys.argv[1].startswith('Location'):
keyboard = xbmc.Keyboard('', xbmc.getLocalizedString(14024), False)
keyboard.doModal()
if (keyboard.isConfirmed() and keyboard.getText()):
text = keyboard.getText()
locs, locids = location(text)
dialog = xbmcgui.Dialog()
if locs != []:
selected = dialog.select(xbmc.getLocalizedString(396), locs)
if selected != -1:
ADDON.setSetting(sys.argv[1], locs[selected])
ADDON.setSetting(sys.argv[1] + 'id', locids[selected])
log('selected location: %s' % locs[selected])
else:
log('no locations found')
dialog.ok(ADDONNAME, xbmc.getLocalizedString(284))
else:
location = ADDON.getSetting('Location%s' % sys.argv[1])
locationid = ADDON.getSetting('Location%sid' % sys.argv[1])
if (not locationid) and (sys.argv[1] != '1'):
location = ADDON.getSetting('Location1')
locationid = ADDON.getSetting('Location1id')
log('trying location 1 instead')
if locationid:
forecast(location, locationid)
else:
log('empty location id')
clear()
refresh_locations()
log('finished')
PK %N_ _ weather.yahoo/fanart.jpg JFIF H H C
C
_" @
P @b J* C *A@D[BP (BT BR P d "K-@ B@ D!J)F!@PR ؐZ %,[QP h(@ @(((
PJ$ B\m@@2BJ bȄ(b@U JT*%c"(*U@ T @*!@ U@ȋ` b
P(HE(D 9 blAR$P R\@
TEdQ*%@ J Y BU@E(ؤe
@)B BEX P$RJ BXTP !( R "ЩD!* @TVHPHR
BŀE(D ! hP F@ BXDR q
QBƄ%BUe( P
X@ %J UA@Ab$ oK(Td PPB B e@ `a*R` JH P
R@ BJ( U P%R oK(*PA )`
Z *ELRP (@ ( !%*
D ,X " , )jXJ a(BY(P(U, %BP @ YIE# ! ED[, `Q a{oi4=Z:Zs@ )@,NߗchXR.niLIXم