Merge branch 'master' into master

pull/558/head
Igor Chubin 4 years ago committed by GitHub
commit b2b8d6d17d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -235,7 +235,7 @@ $ cat ~/.config/fontconfig/fonts.conf
(to apply the configuration, run `fc-cache -f -v`)
## Data-rich output format
## Data-rich output format (v2)
In the experimental data-rich output format, that is available under the view code `v2`,
a lot of additional weather and astronomical information is available:
@ -287,6 +287,50 @@ The result, should look like:
![URXVT Emoji line](https://user-images.githubusercontent.com/24360204/63842949-1d36d480-c975-11e9-81dd-998d1329bd8a.png)
## Map view (v3)
In the experimental map view, that is available under the view code `v3`,
weather information about a geographical region is available:
```
$ curl v3.wttr.in/Bayern.sxl
```
![v3.wttr.in/Bayern](https://v3.wttr.in/Bayern.png)
or directly in browser:
* https://v3.wttr.in/Bayern
The map view currently supports three formats:
* PNG (for browser and messangers);
* Sixel (terminal inline images support);
* IIP (terminal with iterm2 inline images protocol support).
Terminal with inline images protocols support:
⟶ *Detailed article: [Images in terminal](doc/terminal-images.md)*
| Terminal | Environment | Images support | Protocol |
| --------------------- | --------- | ------------- | --------- |
| uxterm | X11 | yes | Sixel |
| mlterm | X11 | yes | Sixel |
| kitty | X11 | yes | Kitty |
| wezterm | X11 | yes | IIP |
| aminal | X11 | yes | Sixel |
| Jexer | X11 | yes | Sixel |
| GNOME Terminal | X11 | [in-progress](https://gitlab.gnome.org/GNOME/vte/-/issues/253) | Sixel |
| alacritty | X11 | [in-progress](https://github.com/alacritty/alacritty/issues/910) | Sixel |
| foot | Wayland | yes | Sixel |
| DomTerm | Web | yes | Sixel |
| Yaft | FB | yes | Sixel |
| iTerm2 | Mac OS X| yes | IIP |
| mintty | Windows | yes | Sixel |
| Windows Terminal | Windows | [in-progress](https://github.com/microsoft/terminal/issues/448) | Sixel |
| [RLogin](http://nanno.dip.jp/softlib/man/rlogin/) | Windows | yes | Sixel | |
## Different output formats
### JSON output

@ -10,7 +10,7 @@ import sys
import os
import jinja2
from flask import Flask, request, send_from_directory
from flask import Flask, request, send_from_directory, send_file
APP = Flask(__name__)
MYDIR = os.path.abspath(
@ -21,6 +21,7 @@ import wttr_srv
from globals import TEMPLATES, STATIC, LISTEN_HOST, LISTEN_PORT
# pylint: enable=wrong-import-position,wrong-import-order
from view.v3 import v3_file
MY_LOADER = jinja2.ChoiceLoader([
APP.jinja_loader,
@ -29,6 +30,13 @@ MY_LOADER = jinja2.ChoiceLoader([
APP.jinja_loader = MY_LOADER
@APP.route('/v3/<string:location>')
def send_v3(location):
filepath = v3_file(location)
if filepath.startswith("ERROR"):
return filepath.rstrip("\n") + "\n"
return send_file(filepath)
@APP.route('/files/<path:path>')
def send_static(path):
"Send any static file located in /files/"

@ -0,0 +1,63 @@
## Map view (v3)
In the experimental map view, that is available under the view code `v3`,
weather information about a geographical region is available:
```
$ curl v3.wttr.in/Bayern.sxl
```
![v3.wttr.in/Bayern](https://v3.wttr.in/Bayern.png)
or directly in browser:
* https://v3.wttr.in/Bayern
The map view currently supports three formats:
* PNG (for browser and messangers);
* Sixel (terminal inline images support);
* IIP (terminal with iterm2 inline images protocol support).
## Terminal with images support
| Terminal | Environment | Images support | Protocol |
| --------------------- | --------- | ------------- | --------- |
| uxterm | X11 | yes | Sixel |
| mlterm | X11 | yes | Sixel |
| kitty | X11 | yes | Kitty |
| wezterm | X11 | yes | IIP |
| aminal | X11 | yes | Sixel |
| Jexer | X11 | yes | Sixel |
| GNOME Terminal | X11 | [in-progress](https://gitlab.gnome.org/GNOME/vte/-/issues/253) | Sixel |
| alacritty | X11 | [in-progress](https://github.com/alacritty/alacritty/issues/910) | Sixel |
| st | X11 | [stixel](https://github.com/vizs/stixel) or [st-sixel](https://github.com/galatolofederico/st-sixel) | Sixel |
| Konsole | X11 | [requested](https://bugs.kde.org/show_bug.cgi?id=391781) | Sixel |
| DomTerm | Web | yes | Sixel |
| Yaft | FB | yes | Sixel |
| iTerm2 | Mac OS X| yes | IIP |
| mintty | Windows | yes | Sixel |
| Windows Terminal | Windows | [in-progress](https://github.com/microsoft/terminal/issues/448) | Sixel |
| [RLogin](http://nanno.dip.jp/softlib/man/rlogin/) | Windows | yes | Sixel | |
Support in all VTE-based terminals: termite, terminator, etc is more or less the same as in the GNOME Terminal
## Notes
### xterm/uxterm
To start xterm/uxterm with Sixel support:
```
uxterm -ti vt340
```
### Kitty
To view images in kitty:
```
curl -ks v3.wttr.in/Tabasco.png | kitty icat --align=left
```

@ -21,6 +21,10 @@ from globals import GEOLITE, GEOLOCATOR_SERVICE, IP2LCACHE, IP2LOCATION_KEY, NOT
GEOIP_READER = geoip2.database.Reader(GEOLITE)
def _debug_log(s):
with open("/tmp/debug.log", "a") as f:
f.write(s+"\n")
def ascii_only(string):
"Check if `string` contains only ASCII symbols"
@ -94,7 +98,7 @@ def ipcachewrite(ip_addr, location):
if not os.path.exists(IP2LCACHE):
os.makedirs(IP2LCACHE)
with open(cached, 'w') as file:
file.write(location[0] + ';' + location[1])
file.write(location) # location[0] + ';' + location[1])
def ipcache(ip_addr):
cached = os.path.join(IP2LCACHE, ip_addr)
@ -118,22 +122,23 @@ def ip2location(ip_addr):
"Convert IP address `ip_addr` to a location name"
location = ipcache(ip_addr)
if location:
if location[0]:
return location
# if IP2LOCATION_KEY is not set, do not the query,
# because the query wont be processed anyway
location_string = None
if IP2LOCATION_KEY:
try:
location = requests\
location_string = requests\
.get('http://api.ip2location.com/?ip=%s&key=%s&package=WS3' \
% (ip_addr, IP2LOCATION_KEY)).text
except requests.exceptions.ConnectionError:
pass
if location and ';' in location:
ipcachewrite(ip_addr, location)
location = location.split(';')[3], location.split(';')[1]
if location_string and ';' in location_string:
ipcachewrite(ip_addr, location_string)
location = location_string.split(';')[3], location_string.split(';')[1]
else:
location = location, None

@ -98,7 +98,7 @@ Wir hoffen, dass Sie besseres Wetter haben!
""",
'es': u"""
No hemos logrado encontrar tu ubicación,
asi que hemos decidido enseñarte el tiempo en Oymyakon,
así que hemos decidido enseñarte el tiempo en Oimiakón,
uno de los sitios más fríos y permanentemente deshabitados del planeta.
""",
'eu': u"""
@ -693,7 +693,7 @@ Bạn có thể theo dõi https://twitter.com/igor_chubin để cập nhật th
'bg': u'Нова функционалност: многоезични имена на места\033[92mwttr.in/станция+Восток\033[0m (в UTF-8) и в търсенето \033[92mwttr.in/~Kilimanjaro\033[0m (добавете ~ преди)',
'bs': u'XXXXXXXXXXXXXXXXXXXX: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX\033[92mwttr.in/станция+Восток\033[0m (XX UTF-8) XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
'ca': u'Noves funcionalitats: noms d\'ubicació multilingües \033[92mwttr.in/станция+Восток\033[0m (en UTF-8) i la ubicació de recerca \033[92mwttr.in/~Kilimanjaro\033[0m (només cal afegir ~ abans)',
'es': u'Nuevas funcionalidades: los nombres de las ubicaciones en varios idiomas \033[92mwttr.in/станция+Восток\033[0m (em UTF-8) y la búsqueda por ubicaciones \033[92mwttr.in/~Kilimanjaro\033[0m (tan solo inserte ~ en frente)',
'es': u'Nuevas funcionalidades: los nombres de las ubicaciones en varios idiomas \033[92mwttr.in/станция+Восток\033[0m (em UTF-8) y la búsqueda por ubicaciones \033[92mwttr.in/~Kilimanjaro\033[0m (tan solo inserte ~ al principio)',
'fa': u'قابلیت جدید: پشتیبانی از نام چند زبانه مکانها \033[92mwttr.in/станция+Восток\033[0m (در فرمت UTF-8) و جسجتوی مکان ها \033[92mwttr.in/~Kilimanjaro\033[0m (فقط قبل از اون ~ اضافه کنید)',
'fr': u'Nouvelles fonctionnalités: noms d\'emplacements multilingues \033[92mwttr.in/станция+Восток\033[0m (en UTF-8) et recherche d\'emplacement \033[92mwttr.in/~Kilimanjaro\033[0m (ajouter ~ devant)',
'mk': u'Нова функција: повеќе јазично локациски имиња \033[92mwttr.in/станция+Восток\033[0m (во UTF-8) и локациско пребарување \033[92mwttr.in/~Kilimanjaro\033[0m (just add ~ before)',
@ -737,7 +737,7 @@ Bạn có thể theo dõi https://twitter.com/igor_chubin để cập nhật th
'bg': u'Последвай \033[46m\033[30m@igor_chubin\033[0m за обновления свързани с wttr.in',
'bs': u'XXXXXX \033[46m\033[30m@igor_chubin\033[0m XXXXXXXXXXXXXXXXXXX',
'ca': u'Segueix \033[46m\033[30m@igor_chubin\033[0m per actualitzacions de wttr.in',
'es': u'Seguir \033[46m\033[30m@igor_chubin\033[0m para recibir las novedades de wttr.in',
'es': u'Sigue a \033[46m\033[30m@igor_chubin\033[0m para enterarte de las novedades de wttr.in',
'eu': u'\033[46m\033[30m@igor_chubin\033[0m jarraitu wttr.in berriak jasotzeko',
'cy': u'Dilyner \033[46m\033[30m@igor_Chubin\033[0m am diweddariadau wttr.in',
'fa': u'برای دنبال کردن خبرهای wttr.in شناسه \033[46m\033[30m@igor_chubin\033[0m رو فالو کنید.',
@ -787,9 +787,9 @@ CAPTION = {
"da": u"Vejret i:",
"de": u"Wetterbericht für:",
"el": u"Πρόγνωση καιρού για:",
"en": u"weather report for:",
"en": u"Weather report for:",
"eo": u"Veterprognozo por:",
"es": u"El pronóstico del tiempo en:",
"es": u"Pronóstico del tiempo en:",
"et": u"Ilmaprognoos:",
"eu": u"Eguraldiaren iragarpena:",
"fa": u"گزارش آب و هئا برای شما:",

@ -28,6 +28,7 @@ import pytz
from constants import WWO_CODE, WEATHER_SYMBOL, WIND_DIRECTION, WEATHER_SYMBOL_WIDTH_VTE
from weather_data import get_weather_data
from . import v2
from . import v3
from . import prometheus
PRECONFIGURED_FORMAT = {
@ -341,11 +342,14 @@ def format_weather_data(query, parsed_query, data):
return prometheus.render_prometheus(data['data'])
if format_line[:2] == "v2":
return v2.main(query, parsed_query, data)
if format_line[:2] == "v3":
return v3.main(query, parsed_query, data)
current_condition = data['data']['current_condition'][0]
current_condition['location'] = parsed_query["location"]
current_condition['override_location'] = parsed_query["override_location_name"]
output = render_line(format_line, current_condition, query)
output = output.rstrip("\n").replace(r"\n", "\n")
return output
def wttr_line(query, parsed_query):
@ -358,7 +362,7 @@ def wttr_line(query, parsed_query):
data = get_weather_data(location, lang)
output = format_weather_data(query, parsed_query, data)
return output.rstrip("\n").replace(r"\n", "\n")
return output
def main():
"""

@ -133,7 +133,7 @@ def get_answer_language_and_view(request):
hostname = request.headers['Host']
if hostname != 'wttr.in' and hostname.endswith('.wttr.in'):
lang = hostname[:-8]
if lang.startswith("v2"):
if lang.startswith("v2") or lang.startswith("v3"):
view_name = lang
lang = None
@ -155,7 +155,9 @@ def get_output_format(query, parsed_query):
Return new location (can be rewritten)
"""
if ('view' in query and not query["view"].startswith("v2")) \
if ('view' in query
and not query["view"].startswith("v2")
and not query["view"].startswith("v3")) \
or parsed_query.get("png_filename") \
or query.get('force-ansi'):
return False
@ -215,18 +217,19 @@ def _response(parsed_query, query, fast_mode=False):
output = get_wetter(parsed_query)
if parsed_query.get('png_filename'):
# originally it was just a usual function call,
# but it was a blocking call, so it was moved
# to separate threads:
#
# output = fmt.png.render_ansi(
# output, options=parsed_query)
result = TASKS.spawn(fmt.png.render_ansi, cache._update_answer(output), options=parsed_query)
output = result.get()
if parsed_query.get("view") != "v3":
# originally it was just a usual function call,
# but it was a blocking call, so it was moved
# to separate threads:
#
# output = fmt.png.render_ansi(
# output, options=parsed_query)
result = TASKS.spawn(fmt.png.render_ansi, cache._update_answer(output), options=parsed_query)
output = result.get()
else:
if query.get('days', '3') != '0' \
and not query.get('no-follow-line') \
and ((parsed_query.get("view") or "v2")[:2] in ["v2"]):
and ((parsed_query.get("view") or "v2")[:2] in ["v2", "v3"]):
if parsed_query['html_output']:
output = add_buttons(output)
else:

@ -29,6 +29,8 @@ Opciones de visualización:
?0 # Solamente el clima actual
?1 # El clima actual + la previsión del día siguiente
?2 # El clima actual + la previsión de los dos días siguientes
?A # ignora al agente del usuario y fuerza el formato de salida ANSI (terminal)
?F # No muestra la linea de "Seguir"
?n # Versión corta (solo día y noche)
?q # Versión silenciosa (sin el texto de "El tiempo en")
?Q # Versión supersilenciosa (ni "El tiempo en" ni el nombre de la ciudad)

@ -1,16 +1,16 @@
114: Claro: Clear
114: Despejado: Clear
113: Soleado: Sunny
116: Parcialmente nublado: Partly cloudy
119: Nublado: Cloudy
122: Cubierto de nubes: Overcast
143: Bruma: Mist
143: Niebla: Mist
176: Posible lluvia irregular: Patchy rain possible
179: Posible aguanieve irregular: Patchy snow possible
182: Posible aguanieve irregular: Patchy sleet possible
185: Posible llovizna helada irregular: Patchy freezing drizzle possible
200: Posibles brotes de tormentas: Thundery outbreaks possible
227: Nieve tormentosa: Blowing snow
230: Tormenta de nieve: Blizzard
230: Ventisca: Blizzard
248: Niebla: Fog
260: Niebla helada: Freezing fog
263: Llovizna ligera irregular: Patchy light drizzle
@ -21,7 +21,7 @@
296: Lluvia ligera: Light rain
299: Lluvia moderada ocasional: Moderate rain at times
302: Lluvia moderada: Moderate rain
305: LLuvia fuerte ocasional: Heavy rain at times
305: Lluvia fuerte ocasional: Heavy rain at times
308: Lluvia fuerte: Heavy rain
311: Lluvia ligera helada: Light freezing rain
314: Lluvia helada moderada o fuerte: Moderate or heavy freezing rain
@ -39,9 +39,9 @@
359: Aguacero torrencial: Torrential rain shower
362: Aguacero ligero con aguanieve: Light sleet showers
365: Aguacero con aguanieve moderado o fuerte: Moderate or heavy sleet showers
368: Aguacero con nieve ligero: Light snow showers
371: Aguacero con nieve moderado o fuerte: Moderate or heavy snow showers
368: Aguacero con nieve ligera: Light snow showers
371: Aguacero con nieve moderada o fuerte: Moderate or heavy snow showers
386: Lluvia ligera irregular con truenos: Patchy light rain with thunder
389: Lluvia moderada o fuerte con truenos: Moderate or heavy rain with thunder
392: Nieve ligera irregular con truenos: Patchy light snow with thunder
395: Nieve moderada o fuerte con truenos: Moderate or heavy snow with thunder
392: Nevada ligera irregular con truenos: Patchy light snow with thunder
395: Nevada moderada o fuerte con truenos: Moderate or heavy snow with thunder

@ -11,7 +11,7 @@ Desteklenen konum tipleri:
/esb # havalimanı kodu (3 harfli)
/@stackoverflow.com # alan adı
/06800 # posta kodları
/39.925325,32.836987 # Yer belirleme sistemi(GPS) koordinatları
/39.925325,32.836987 # Yer belirleme sistemi (GPS) koordinatları
Özel konumlar:
@ -22,15 +22,15 @@ Desteklenen konum tipleri:
?m # metrik sistem (SI) (ABD dışında her yer için varsayılan)
?u # USCS (ABD için varsayılan)
?M # Rüzgar hızını metre/saniye(m/s) olarak göster
?M # Rüzgar hızını metre/saniye (m/s) olarak göster
Seçenekleri görüntüle:
?0 # sadece bugün için hava durumu
?1 # Bugün ve 1 gün sonrası için hava durumu
?2 # Bugün ve 2 gün sonrası için hava durumu
?A # Kullanıcı aracısı(User-Agent) bilgilerini göz ardı eder ve terminalde ANSI formatında çıktı için zorlar
?F # "Follow(Takip et)" satırını göstermez
?A # Kullanıcı aracısı (User-Agent) bilgilerini göz ardı eder ve terminalde ANSI formatında çıktı için zorlar
?F # "Follow (Takip et)" satırını göstermez
?n # dar görünüm (sadece gece ve gündüz)
?q # sessiz görünüm ("Hava durumu" yazısı yok)
?Q # aşırı sessiz görünüm ("Hava durumu" yazısı ve şehir adı yok)
@ -45,14 +45,14 @@ PNG seçenekleri:
Seçenekler birleştirilebilir:
/Istanbul?0pq
/Istanbul?0pq&lang=fr
/Istanbul_0pq.png # PNG dosya modları _ karakterinden sonra belirtilir
/izmir_0pq_lang=it.png # uzun seçenekler alt çizgi ile ayrılır
/istanbul?0pq
/istanbul?0pq&lang=tr
/istanbul_0pq.png # PNG dosya modları _ karakterinden sonra belirtilir
/izmir_0pq_lang=tr.png # uzun seçenekler alt çizgi ile ayrılır
Yerelleştirme:
$ curl tr.wttr.in/Istanbul
$ curl tr.wttr.in/istanbul
$ curl wttr.in/izmir?lang=tr
$ curl -H "Accept-Language: tr" wttr.in/izmir

@ -1,47 +1,47 @@
113: Açık : Clear
113: Güneşli : Sunny
116: Parçalı bulutlu : Partly cloudy
119: Bulutlu : Cloudy
122: Kapalı : Overcast
143: Puslu : Mist
176: Yer yer yağmur görülebilir : Patchy rain possible
179: Yer yer kar görülebilir : Patchy snow possible
182: Yer yer karla karışık yağmur görülebilir : Patchy sleet possible
185: Yer yer donan çisenti olabilir : Patchy freezing drizzle possible
200: Gök gürültülü fırtına görülebilir : Thundery outbreaks possible
227: Tipi halinde kar yağışı : Blowing snow
230: Kar fırtınası : Blizzard
248: Sisli : Fog
260: Donan sis : Freezing fog
263: Yer yer hafif donan çisenti : Patchy light drizzle
266: Yer yer donan çisenti : Light drizzle
281: Donan çisenti : Freezing drizzle
284: Kuvvetli don : Heavy freezing drizzle
293: Yer yer hafif yağmurlu : Patchy light rain
296: Hafif yağmurlu : Light rain
299: Zaman zaman orta kuvvette yağmur : Moderate rain at times
302: Orta kuvvette yağmur : Moderate rain
305: Zaman zaman şiddetli yağmur : Heavy rain at times
308: Şiddetli yağmur : Heavy rain
311: Ayaz ile hafif yağmur : Light freezing rain
314: Ayaz ile orta kuvvette veya şiddetli yağmur : Moderate or heavy freezing rain
317: Hafif karla karışık yağmur : Light sleet
320: Orta kuvvette veya şiddeli sulu kar : Moderate or heavy sleet
323: Yer yer hafif kar yağışı : Patchy light snow
326: Hafif kar yağışı : Light snow
329: Yer yer orta şiddette kar yağışı : Patchy moderate snow
332: Orta kuvvette kar yağışı : Moderate snow
335: Yer yer kuvvetli kar yağışı : Patchy heavy snow
338: Kuvvetli kar yağışı : Heavy snow
350: Dolu yağışı : Ice pellets
353: Hafif sağanak yağmur : Light rain shower
356: Orta kuvvette veya şiddetli sağanak yağmur : Moderate or heavy rain shower
359: Sel riski olan şiddetli sağanak yağmur : Torrential rain shower
362: Hafif karla karışık sağanak yağmur : Light sleet showers
365: Orta veya şiddetli karla karışık sağanak yağmur : Moderate or heavy sleet showers
368: Hafif sağanak kar yağışı : Light snow showers
371: Orta kuvvette veya şiddetli sağanak kar yağışı : Moderate or heavy snow showers
386: Yer yer gök gürültülü ve yağmurlu : Patchy light rain with thunder
113: Açık : Clear
113: Güneşli : Sunny
116: Parçalı bulutlu : Partly cloudy
119: Bulutlu : Cloudy
122: Kapalı : Overcast
143: Puslu : Mist
176: Yer yer yağmur görülebilir : Patchy rain possible
179: Yer yer kar görülebilir : Patchy snow possible
182: Yer yer karla karışık yağmur görülebilir : Patchy sleet possible
185: Yer yer donan çisenti olabilir : Patchy freezing drizzle possible
200: Gök gürültülü fırtına görülebilir : Thundery outbreaks possible
227: Tipi halinde kar yağışı : Blowing snow
230: Kar fırtınası : Blizzard
248: Sisli : Fog
260: Donan sis : Freezing fog
263: Yer yer hafif donan çisenti : Patchy light drizzle
266: Yer yer donan çisenti : Light drizzle
281: Donan çisenti : Freezing drizzle
284: Kuvvetli don : Heavy freezing drizzle
293: Yer yer hafif yağmurlu : Patchy light rain
296: Hafif yağmurlu : Light rain
299: Zaman zaman orta kuvvette yağmur : Moderate rain at times
302: Orta kuvvette yağmur : Moderate rain
305: Zaman zaman şiddetli yağmur : Heavy rain at times
308: Şiddetli yağmur : Heavy rain
311: Ayaz ile hafif yağmur : Light freezing rain
314: Ayaz ile orta kuvvette veya şiddetli yağmur : Moderate or heavy freezing rain
317: Hafif karla karışık yağmur : Light sleet
320: Orta kuvvette veya şiddetli sulu kar : Moderate or heavy sleet
323: Yer yer hafif kar yağışı : Patchy light snow
326: Hafif kar yağışı : Light snow
329: Yer yer orta şiddette kar yağışı : Patchy moderate snow
332: Orta kuvvette kar yağışı : Moderate snow
335: Yer yer kuvvetli kar yağışı : Patchy heavy snow
338: Kuvvetli kar yağışı : Heavy snow
350: Dolu yağışı : Ice pellets
353: Hafif sağanak yağmur : Light rain shower
356: Orta kuvvette veya şiddetli sağanak yağmur : Moderate or heavy rain shower
359: Sel riski olan şiddetli sağanak yağmur : Torrential rain shower
362: Hafif karla karışık sağanak yağmur : Light sleet showers
365: Orta veya şiddetli karla karışık sağanak yağmur : Moderate or heavy sleet showers
368: Hafif sağanak kar yağışı : Light snow showers
371: Orta kuvvette veya şiddetli sağanak kar yağışı : Moderate or heavy snow showers
386: Yer yer gök gürültülü ve yağmurlu : Patchy light rain with thunder
389: Orta kuvvette veya şiddetli gök gürültülü yağmur : Moderate or heavy rain with thunder
392: Yer yer gök gürültülü ve karlı : Patchy light snow with thunder
395: Orta kuvvette veya şiddetli gök gürültülü kar : Moderate or heavy snow with thunder
392: Yer yer gök gürültülü ve karlı : Patchy light snow with thunder
395: Orta kuvvette veya şiddetli gök gürültülü kar : Moderate or heavy snow with thunder

Loading…
Cancel
Save