-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathsearch.py
More file actions
410 lines (350 loc) · 16 KB
/
Copy pathsearch.py
File metadata and controls
410 lines (350 loc) · 16 KB
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
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
"""Search service implementation."""
from onvif.operator import ONVIFOperator
from onvif.utils.service import ONVIFService
from onvif.utils.wsdl import ONVIFWSDL
# pylint: disable=invalid-name
class Search(ONVIFService):
"""Search service client.
| Property | Details |
| --- | --- |
| **First introduced** | ONVIF Release 2.1 (June 2011) Split from Core 2.0 |
| **Binding name** | `SearchBinding` (`ver10/search.wsdl`) |
| **Operations** | [search.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/search.wsdl) |
| **Specification** | [RecordingSearch.xml](https://developer.onvif.org/pub/specs/branches/development/doc/RecordingSearch.xml) |
"""
def __init__(self, xaddr=None, **kwargs):
definition = ONVIFWSDL.get_definition("search")
self.operator = ONVIFOperator(
definition["path"],
binding=f"{{{definition['namespace']}}}{definition['binding']}",
service_path="SearchRecording", # fallback
xaddr=xaddr,
**kwargs,
)
def GetServiceCapabilities(self):
"""Returns the capabilities of the search service.
The result is returned in a typed answer.
"""
return self.operator.call("GetServiceCapabilities")
def GetRecordingSummary(self):
"""GetRecordingSummary is used to get a summary description of all recorded
data.
This operation is mandatory to support for a device implementing the recording
search service.
"""
return self.operator.call("GetRecordingSummary")
def GetRecordingInformation(self, RecordingToken):
"""Returns information about a single Recording specified by a RecordingToken.
This operation is mandatory to support for a device implementing the recording
search service.
"""
return self.operator.call(
"GetRecordingInformation", RecordingToken=RecordingToken
)
def GetMediaAttributes(self, Time, RecordingTokens=None):
"""Returns a set of media attributes for all tracks of the specified recordings
at a specified point in time.
Clients using this operation shall be able to use it as a non blocking
operation. A device shall set the starttime and endtime of the MediaAttributes
structure to equal values if calculating this range would causes this operation
to block. See MediaAttributes structure for more information. This operation is
mandatory to support for a device implementing the recording search service.
"""
return self.operator.call(
"GetMediaAttributes", RecordingTokens=RecordingTokens, Time=Time
)
def FindRecordings(self, Scope, KeepAliveTime, MaxMatches=None):
"""FindRecordings starts a search session, looking for recordings that matches
the scope (See 20.2.4) defined in the request.
Results from the search are acquired using the GetRecordingSearchResults
request, specifying the search token returned from this request. The device
shall continue searching until one of the following occurs:
- The entire time range from StartPoint to EndPoint has been searched through.
- The total number of matches has been found, defined by the MaxMatches parameter.
- The session has been ended by a client EndSession request.
- The session has been ended because KeepAliveTime since the last request related
to this session has expired.
The order of the results is undefined, to allow the device to return results in
any order they are found. This operation is mandatory to support for a device
implementing the recording search service.
"""
return self.operator.call(
"FindRecordings",
Scope=Scope,
MaxMatches=MaxMatches,
KeepAliveTime=KeepAliveTime,
)
def GetRecordingSearchResults(
self, SearchToken, MinResults=None, MaxResults=None, WaitTime=None
):
"""GetRecordingSearchResults acquires the results from a recording search
session previously initiated by a FindRecordings operation.
The response shall not include results already returned in previous requests for
the same session. If MaxResults is specified, the response shall not contain
more than MaxResults results. The number of results relates to the number of
recordings. For viewing individual recorded data for a signal track use the
FindEvents method.
GetRecordingSearchResults shall block until:
- MaxResults results are available for the response if MaxResults is specified.
- MinResults results are available for the response if MinResults is specified.
- WaitTime has expired.
- Search is completed or stopped.
This operation is mandatory to support for a device implementing the recording
search service.
"""
return self.operator.call(
"GetRecordingSearchResults",
SearchToken=SearchToken,
MinResults=MinResults,
MaxResults=MaxResults,
WaitTime=WaitTime,
)
def FindEvents(
self,
StartPoint,
Scope,
SearchFilter,
IncludeStartState,
KeepAliveTime,
EndPoint=None,
MaxMatches=None,
):
"""FindEvents starts a search session, looking for recording events (in the
scope that matches the search filter defined in the request.
Results from the search are acquired using the GetEventSearchResults request,
specifying the search token returned from this request.
The device shall continue searching until one of the following occurs:
- The entire time range from StartPoint to EndPoint has been searched through.
- The total number of matches has been found, defined by the MaxMatches parameter.
- The session has been ended by a client EndSession request.
- The session has been ended because KeepAliveTime since the last request related
to this session has expired.
Results shall be ordered by time, ascending in case of forward search, or
descending in case of backward search. This operation is mandatory to support
for a device implementing the recording search service.
"""
return self.operator.call(
"FindEvents",
StartPoint=StartPoint,
EndPoint=EndPoint,
Scope=Scope,
SearchFilter=SearchFilter,
IncludeStartState=IncludeStartState,
MaxMatches=MaxMatches,
KeepAliveTime=KeepAliveTime,
)
def GetEventSearchResults(
self, SearchToken, MinResults=None, MaxResults=None, WaitTime=None
):
"""GetEventSearchResults acquires the results from a recording event search
session previously initiated by a FindEvents operation.
The response shall not include results already returned in previous requests for
the same session. If MaxResults is specified, the response shall not contain
more than MaxResults results.
GetEventSearchResults shall block until:
- MaxResults results are available for the response if MaxResults is specified.
- MinResults results are available for the response if MinResults is specified.
- WaitTime has expired.
- Search is completed or stopped.
This operation is mandatory to support for a device implementing the recording
search service.
"""
return self.operator.call(
"GetEventSearchResults",
SearchToken=SearchToken,
MinResults=MinResults,
MaxResults=MaxResults,
WaitTime=WaitTime,
)
def FindPTZPosition(
self,
StartPoint,
Scope,
SearchFilter,
KeepAliveTime,
EndPoint=None,
MaxMatches=None,
):
"""FindPTZPosition starts a search session, looking for ptz positions in the
scope (See 20.2.4) that matches the search filter defined in the request.
Results from the search are acquired using the GetPTZPositionSearchResults
request, specifying the search token returned from this request.
The device shall continue searching until one of the following occurs:
- The entire time range from StartPoint to EndPoint has been searched through.
- The total number of matches has been found, defined by the MaxMatches parameter.
- The session has been ended by a client EndSession request.
- The session has been ended because KeepAliveTime since the last request related
to this session has expired.
This operation is mandatory to support whenever CanContainPTZ is true for any
metadata track in any recording on the device.
"""
return self.operator.call(
"FindPTZPosition",
StartPoint=StartPoint,
EndPoint=EndPoint,
Scope=Scope,
SearchFilter=SearchFilter,
MaxMatches=MaxMatches,
KeepAliveTime=KeepAliveTime,
)
def GetPTZPositionSearchResults(
self, SearchToken, MinResults=None, MaxResults=None, WaitTime=None
):
"""GetPTZPositionSearchResults acquires the results from a ptz position search
session previously initiated by a FindPTZPosition operation.
The response shall not include results already returned in previous requests for
the same session. If MaxResults is specified, the response shall not contain
more than MaxResults results.
GetPTZPositionSearchResults shall block until:
- MaxResults results are available for the response if MaxResults is specified.
- MinResults results are available for the response if MinResults is specified.
- WaitTime has expired.
- Search is completed or stopped.
This operation is mandatory to support whenever CanContainPTZ is true for any
metadata track in any recording on the device.
"""
return self.operator.call(
"GetPTZPositionSearchResults",
SearchToken=SearchToken,
MinResults=MinResults,
MaxResults=MaxResults,
WaitTime=WaitTime,
)
def GetSearchState(self, SearchToken):
"""GetSearchState returns the current state of the specified search session.
This command is deprecated .
"""
return self.operator.call("GetSearchState", SearchToken=SearchToken)
def EndSearch(self, SearchToken):
"""EndSearch stops and ongoing search session, causing any blocking result
request to return and the SearchToken to become invalid.
If the search was interrupted before completion, the point in time that the
search had reached shall be returned. If the search had not yet begun, the
StartPoint shall be returned. If the search was completed the original EndPoint
supplied by the Find operation shall be returned. When issuing EndSearch on a
FindRecordings request the EndPoint is undefined and shall not be used since the
FindRecordings request doesn't have StartPoint/EndPoint. This operation is
mandatory to support for a device implementing the recording search service.
"""
return self.operator.call("EndSearch", SearchToken=SearchToken)
def FindMetadata(
self,
StartPoint,
Scope,
MetadataFilter,
KeepAliveTime,
EndPoint=None,
MaxMatches=None,
):
"""FindMetadata starts a search session, looking for metadata in the scope (See
20.2.4) that matches the search filter defined in the request.
Results from the search are acquired using the GetMetadataSearchResults request,
specifying the search token returned from this request.
The device shall continue searching until one of the following occurs:
- The entire time range from StartPoint to EndPoint has been searched through.
- The total number of matches has been found, defined by the MaxMatches parameter.
- The session has been ended by a client EndSession request.
- The session has been ended because KeepAliveTime since the last request related
to this session has expired.
This operation is mandatory to support if the MetaDataSearch capability is set
to true in the SearchCapabilities structure return by the GetCapabilities
command in the Device service.
"""
return self.operator.call(
"FindMetadata",
StartPoint=StartPoint,
EndPoint=EndPoint,
Scope=Scope,
MetadataFilter=MetadataFilter,
MaxMatches=MaxMatches,
KeepAliveTime=KeepAliveTime,
)
def GetMetadataSearchResults(
self, SearchToken, MinResults=None, MaxResults=None, WaitTime=None
):
"""GetMetadataSearchResults acquires the results from a recording search session
previously initiated by a FindMetadata operation.
The response shall not include results already returned in previous requests for
the same session. If MaxResults is specified, the response shall not contain
more than MaxResults results.
GetMetadataSearchResults shall block until:
- MaxResults results are available for the response if MaxResults is specified.
- MinResults results are available for the response if MinResults is specified.
- WaitTime has expired.
- Search is completed or stopped.
This operation is mandatory to support if the MetaDataSearch capability is set
to true in the SearchCapabilities structure return by the GetCapabilities
command in the Device service.
"""
return self.operator.call(
"GetMetadataSearchResults",
SearchToken=SearchToken,
MinResults=MinResults,
MaxResults=MaxResults,
WaitTime=WaitTime,
)
def SearchImageByNL(
self,
StartPoint,
Text,
KeepAliveTime,
EndPoint=None,
RecordingToken=None,
Similarity=None,
MaxMatches=None,
):
"""Starts a natural language search session and specifies the search
parameters."""
return self.operator.call(
"SearchImageByNL",
StartPoint=StartPoint,
EndPoint=EndPoint,
RecordingToken=RecordingToken,
Text=Text,
Similarity=Similarity,
MaxMatches=MaxMatches,
KeepAliveTime=KeepAliveTime,
)
def GetNLSearchResults(
self, SearchToken, MinResults=None, MaxResults=None, WaitTime=None
):
"""Gets results from a natural language search session."""
return self.operator.call(
"GetNLSearchResults",
SearchToken=SearchToken,
MinResults=MinResults,
MaxResults=MaxResults,
WaitTime=WaitTime,
)
def SearchImageByImage(
self,
StartPoint,
KeepAliveTime,
EndPoint=None,
RecordingToken=None,
TargetImageURI=None,
TargetImageData=None,
MaxMatches=None,
):
"""Starts an image-based search session and specifies the search parameters."""
return self.operator.call(
"SearchImageByImage",
StartPoint=StartPoint,
EndPoint=EndPoint,
RecordingToken=RecordingToken,
TargetImageURI=TargetImageURI,
TargetImageData=TargetImageData,
MaxMatches=MaxMatches,
KeepAliveTime=KeepAliveTime,
)
def GetImageSearchResults(
self, SearchToken, MinResults=None, MaxResults=None, WaitTime=None
):
"""Gets results from an image-based search session."""
return self.operator.call(
"GetImageSearchResults",
SearchToken=SearchToken,
MinResults=MinResults,
MaxResults=MaxResults,
WaitTime=WaitTime,
)