forked from sq6jnx/sr0wx.py
/
prospect_mp.py
222 lines (176 loc) · 7.28 KB
/
prospect_mp.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
#!/usr/env/python -tt
# -*- encoding=utf8 -*-
#
# Copyright 2009-2012 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.
#
import re
import urllib
from config import prospect_mp as config
import datetime
import debug
import json
import os
lang=None
def bezpiecznaNazwa(s):
"""Zwraca "bezpieczną" nazwę dla nazwy danej rzeki/danego
wodowskazu. Ze względu na to, że w Polsce zarówno płynie
rzeka Ślęza jak i Ślęża oznaczany jest każdy niełaciński
znak"""
if str(s.__class__)=="<type 'str'>":
s=unicode(s, 'utf-8')
return s.lower().replace(u'ą',u'a_').replace(u'ć',u'c_').\
replace(u'ę',u'e_').replace(u'ł',u'l_').\
replace(u'ń',u'n_').replace(u'ó',u'o_').\
replace(u'ś',u's_').replace(u'ź',u'x_').\
replace(u'ż',u'z_').replace(u' ',u'_').\
replace(u'-',u'_').replace(u'(',u'').\
replace(u')',u'')
def downloadFile(url):
webFile = urllib.urlopen(url)
return webFile.read()
def my_import(name):
mod = __import__(name)
components = name.split('.')
for comp in components[1:]:
mod = getattr(mod, comp)
return mod
_przekroczenie = re.compile('(Delta)(?:(?:.{1,}?)Przekroczony\ stan\ (ostrzegawczy|alarmowy))?')
def pobierzOstrzezenia(domena,stacja):
global przekroczenie,debug
domena,stacja = (domena.lower(), stacja.upper())
# testowe -- nie używać na produkcji! nie siać zamętu!
#url = "http://www.biala.prospect.pl/wizualizacja/punkt_pomiarowy.php?"+\
# "prze=TUBI&rok=2010&miesiac=06&dzien=04&godzina=19&minuta=-3"
#url = "http://www.biala.prospect.pl/wizualizacja/punkt_pomiarowy.php?"+\
# "prze=TUBI&rok=2010&miesiac=06&dzien=03&godzina=23&minuta=27"
try:
url = "http://www.%s.prospect.pl/wizualizacja/punkt_pomiarowy.php?prze=%s"%(domena,stacja)
plik = downloadFile(url)
wynik = _przekroczenie.findall(plik)
if wynik[0]==('Delta', ''):
return None
elif wynik[0][1] in ('ostrzegawczy','alarmowy'):
return wynik[0][1]
else:
debug.log('PROSPECT-MP', u'Regex nie zwrócił oczekiwanych danych',\
buglevel=5)
return None
except:
debug.log('PROSPECT-MP', u'Regex nie zwrócił oczekiwanych danych',\
buglevel=5)
pass
return None
def getData(l):
data = {"data":"", "needCTCSS":False, "allOK":True,
"source":"rwd_prospect"}
if not os.path.exists('prospect_mp.json'):
stany = generuj_json(nie_zapisuj=True)
else:
stany = json.loads(unicode(open('prospect_mp.json','r').read(),'utf-8'))
if stany['ostrzegawczy']!={} or stany['alarmowy']!={}:
data['data'] += 'lokalny_komunikat_hydrologiczny '
if stany['alarmowy']:
# Sprawdzenie dla których wodowskazów mamy przekroczone
# stany alarmowe -- włącz ctcss
data['needCTCSS']=True
data['data']+=' przekroczenia_stanow_alarmowych '
for rzeka in sorted(stany['alarmowy'].keys()):
data['data']+='rzeka %s wodowskaz %s '%(bezpiecznaNazwa(rzeka), \
" wodowskaz ".join(bezpiecznaNazwa(r) for r in sorted(stany['alarmowy'][rzeka])),)
if stany['ostrzegawczy']:
data['data']+='_ przekroczenia_stanow_ostrzegawczych '
for rzeka in sorted(stany['ostrzegawczy'].keys()):
data['data']+='rzeka %s wodowskaz %s '%(bezpiecznaNazwa(rzeka), \
" wodowskaz ".join(bezpiecznaNazwa(r) for r in sorted(stany['ostrzegawczy'][rzeka])),)
if os.path.exists('prospect_mp.json'):
os.remove('prospect_mp.json')
debug.log("PODEST_MP", "finished...")
return data
def show_help():
print u"""
Uruchamiając ten skrypt z linii komend możesz wygenerować w łatwy sposób
fragment słownika sr0wx dla rzek i wodowskazów wskazanych w pliku config.py
Należy uruchomić prospect_mp podając jako parametr gen, np.
python prospect_mp.py gen > pl_google/prospect_mp_dict.py
a następnie
python google_tts_downloader.py prospect_mp_dict.py
aby dociągnąć niezbędne pliki."""
def generuj_slownik():
# generowanie listy słów słownika; ostatnie słowo (rozielone spacją)
# jest nazwą pliku docelowego
print """#!/usr/bin/python
# -*- coding: utf-8 -*-
# Caution! I am not responsible for using these samples. Use at your own risk
# Google, Inc. is the copyright holder of samples downloaded with this tool.
# Generated automatically by prospect_mp.py. Feel free to modify it SLIGHTLY.
LANGUAGE = 'pl'
START_MARKER = 'ę. '
END_MARKER = ' k'
CUT_START = 0.9
CUT_END=0.7
download_list = [ """
frazy = []
for wpis in config.wodowskazy:
frazy.append(wpis[1])
frazy.append(wpis[2])
for fraza in set(frazy):
print "\t['ę. %s', '%s'],"%(fraza, str(bezpiecznaNazwa(fraza)),)
print """['lokalny komunikat hydrologiczny]',
['przekroczenia stanów ostrzegawczych'],
['przekroczenia stanów alarmowych'], ['rzeka'], ['wodowskaz'],
['err wu de prospekt','rwd_prospect']
]"""
def generuj_json(nie_zapisuj=False):
"""Generuje plik prospect_mp.json oraz zwraca jego zawartość. Plik te
zawiera informacje o przekroczeniach stanów ostrzegawczych i/lub
alarmowych"""
#json_file = open('prospect_mp.json','w')
stany = {'ostrzegawczy':{}, 'alarmowy':{}}
for w in config.wodowskazy:
try:
domena, rzeka, wodowskaz, stacja = w
debug.log('PROSPECT-MP', ', '.join((domena,stacja,)))
stan = pobierzOstrzezenia(domena,stacja)
# Chłyt debugowy sprawdzający, czy mamy wszystkie sample: wszystkie
# rzeki przełączamy na stan ostrzegawczy -- nie zapomnij wyłączyć!
#stan='alarmowy'
# Koniec chłytu
if stan in ('ostrzegawczy','alarmowy'):
if not stany[stan].has_key(rzeka):
stany[stan][rzeka]=[]
stany[stan][rzeka].append(wodowskaz)
except:
raise
debug.log('PROSPECT-MP', u'Pobieranie danych zakończyło się '+\
u'błędem', buglevel=5)
pass
if nie_zapisuj==False:
json.dump(stany, open('prospect_mp.json','w'))
return stany
if __name__ == '__main__':
from config import prospect_mp as config
class DummyDebug:
def log(self,module,message,buglevel=None):
pass
debug = DummyDebug()
import sys
# tak, wiem, że można to zrobić bardziej elegancko (getopt), ale dla 2
# opcji nie ma chyba sensu...
if len(sys.argv)==2 and sys.argv[1]=='gen':
generuj_slownik()
elif len(sys.argv)==2 and sys.argv[1]=='json':
generuj_json()
else:
show_help()