82
class BlitzortungDataUrl(object):
83
default_host_name = 'data'
86
target_url = 'http://%(host_name)s.blitzortung.org/Data_%(region)d/Protected/'
88
def build_url(self, url_path, **kwargs):
89
url_parameters = kwargs
91
if 'host_name' not in url_parameters:
92
url_parameters['host_name'] = self.default_host_name
94
if 'region' not in url_parameters:
95
url_parameters['region'] = self.default_region
97
return os.path.join(self.target_url, url_path) % url_parameters
81
100
class BlitzortungDataProvider(object):
82
host = 'http://data.blitzortung.org'
83
target_url = host + '/Data_%(region)d/Protected/%(url_path)s'
84
101
logger = logging.getLogger(__name__)
86
def __init__(self, http_data_transport, data_transformer, url_path=None):
103
@inject(http_data_transport=HttpDataTransport, data_transformer=BlitzortungDataTransformer)
104
def __init__(self, http_data_transport, data_transformer):
87
105
self.http_data_transport = http_data_transport
88
106
self.data_transformer = data_transformer
89
self.url_parameters = {
91
'url_path': url_path if url_path else '',
94
def read_data(self, **kwargs):
95
url_parameters = self.url_parameters.copy()
96
url_parameters.update(kwargs)
98
target_url = self.target_url % url_parameters
100
response = self.http_data_transport.read_from_url(target_url)
108
def read_text(self, target_url):
110
return self.http_data_transport.read_from_url(target_url)
112
def read_data(self, target_url, post_process=None):
113
response = self.read_text(target_url)
105
response = self.process(response)
119
response = post_process(response)
107
121
for entry_text in response.split('\n'):
108
122
entry_text = entry_text.strip()
118
def process(self, data):
122
class BlitzortungStrokeUrlGenerator(object):
134
class BlitzortungHistoryUrlGenerator(object):
123
135
url_path_minute_increment = 10
124
url_path_format = 'Strokes/%Y/%m/%d/%H/%M.log'
136
url_path_format = '%Y/%m/%d/%H/%M.log'
126
138
def __init__(self):
127
139
self.duration = datetime.timedelta(minutes=self.url_path_minute_increment)
135
class StrokesBlitzortungDataProvider(BlitzortungDataProvider):
147
class StrokesBlitzortungDataProvider(object):
136
148
logger = logging.getLogger(__name__)
138
@inject(data_transport=HttpDataTransport, data_transformer=BlitzortungDataTransformer,
139
url_path_generator=BlitzortungStrokeUrlGenerator, stroke_builder=blitzortung.builder.Stroke)
140
def __init__(self, data_transport, data_transformer, url_path_generator, stroke_builder):
141
super(StrokesBlitzortungDataProvider, self).__init__(data_transport, data_transformer, None)
150
@inject(data_provider=BlitzortungDataProvider, data_url=BlitzortungDataUrl,
151
url_path_generator=BlitzortungHistoryUrlGenerator, stroke_builder=blitzortung.builder.Stroke)
152
def __init__(self, data_provider, data_url, url_path_generator, stroke_builder):
153
self.data_provider = data_provider
154
self.data_url = data_url
142
155
self.url_path_generator = url_path_generator
143
156
self.stroke_builder = stroke_builder
149
162
for url_path in self.url_path_generator.get_url_paths(latest_stroke):
150
163
initial_stroke_count = len(strokes_since)
151
164
start_time = time.time()
152
for stroke_data in self.read_data(region=region, url_path=url_path):
165
target_url = self.data_url.build_url(os.path.join('Strokes', url_path), region=region)
166
for stroke_data in self.data_provider.read_data(target_url):
154
168
stroke = self.stroke_builder.from_data(stroke_data).build()
155
169
except blitzortung.builder.BuilderError as e:
163
177
if latest_stroke < timestamp:
164
178
strokes_since.append(stroke)
165
179
end_time = time.time()
166
self.logger.debug("imported %d strokes in %.2fs from %s", len(strokes_since) - initial_stroke_count,
167
end_time - start_time, url_path)
180
self.logger.debug("imported %d strokes for region %d in %.2fs from %s", len(strokes_since) - initial_stroke_count,
181
region, end_time - start_time, url_path)
168
182
return strokes_since
178
class StationsBlitzortungDataProvider(BlitzortungDataProvider):
192
class StationsBlitzortungDataProvider(object):
179
193
logger = logging.getLogger(__name__)
181
@inject(data_transport=HttpDataTransport, data_transformer=BlitzortungDataTransformer,
195
@inject(data_provider=BlitzortungDataProvider, data_url=BlitzortungDataUrl,
182
196
station_builder=blitzortung.builder.Station)
183
def __init__(self, data_transport, data_transformer, station_builder):
184
super(StationsBlitzortungDataProvider, self).__init__(data_transport, data_transformer, 'stations.txt.gz')
197
def __init__(self, data_provider, data_url, station_builder):
198
self.data_provider = data_provider
199
self.data_url = data_url
185
200
self.station_builder = station_builder
187
202
def get_stations(self, region=1):
188
203
current_stations = []
189
for station_data in self.read_data(region=region):
204
target_url = self.data_url.build_url('stations.txt.gz', region=region)
205
for station_data in self.data_provider.read_data(target_url, post_process=self.post_process):
191
207
current_stations.append(self.station_builder.from_data(station_data).build())
192
208
except blitzortung.builder.BuilderError:
193
209
self.logger.debug("error parsing station data '%s'" % station_data)
194
210
return current_stations
196
def process(self, data):
212
def post_process(self, data):
197
213
data = cStringIO.StringIO(data)
198
214
return gzip.GzipFile(fileobj=data).read()
208
224
class RawSignalsBlitzortungDataProvider(BlitzortungDataProvider):
209
@inject(data_transport=HttpDataTransport, data_transformer=BlitzortungDataTransformer)
210
def __init__(self, data_transport, data_transformer):
211
super(RawSignalsBlitzortungDataProvider, self).__init__(data_transport, data_transformer,
212
'raw_data/%(station_id)s/%(hour)02d.log')
213
# http://signals.blitzortung.org/Data_1/<station_id>/2013/09/28/20/00.log
225
@inject(data_transport=HttpDataTransport, data_transformer=BlitzortungDataTransformer,
226
waveform_builder=blitzortung.builder.RawWaveformEvent)
227
def __init__(self, data_transport, data_transformer, waveform_builder):
228
super(RawSignalsBlitzortungDataProvider, self).__init__(
231
base_url='http://signals.blitzortung.org/Data_%(region)d/%(station_id)'
233
self.waveform_builder = waveform_builder
215
235
def set_station_id(self, station_id):
216
236
self.set_url_parameter('station_id', station_id)
218
238
def set_hour(self, hour):
219
239
self.set_url_parameter('hour', hour)
241
def get_raw_data_since(self, latest_data, region, station_id):
242
self.logger.debug("import raw data since %s" % latest_data)
246
for url_path in self.url_path_generator.get_url_paths(latest_data):
247
data = self.read_data(url_path, region=region, station_id=station_id)
248
for line in data.split('\n'):
249
self.waveform_builder.from_string(line.strip())
250
raw_data.append(self.waveform_builder.build())
223
256
from __init__ import INJECTOR