onvif-python 0.2.4__py3-none-any.whl → 0.2.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
onvif/__init__.py CHANGED
@@ -1,7 +1,7 @@
1
1
  # onvif/__init__.py
2
2
 
3
3
  from .client import ONVIFClient
4
- from .operator import ONVIFOperator, CacheMode
4
+ from .operator import CacheMode
5
5
  from .utils import (
6
6
  ONVIFWSDL,
7
7
  ONVIFOperationException,
@@ -14,7 +14,6 @@ from .cli import main as ONVIFCLI
14
14
 
15
15
  __all__ = [
16
16
  "ONVIFClient",
17
- "ONVIFOperator",
18
17
  "CacheMode",
19
18
  "ONVIFWSDL",
20
19
  "ONVIFOperationException",
onvif/cli/interactive.py CHANGED
@@ -194,7 +194,7 @@ class InteractiveShell(cmd.Cmd):
194
194
  " / __ \\/ | / / | / / _/ ____/",
195
195
  " / / / / |/ /| | / // // /_ ",
196
196
  "/ /_/ / /| / | |/ // // __/ ",
197
- "\\____/_/ |_/ |___/___/_/ v0.2.4",
197
+ "\\____/_/ |_/ |___/___/_/ v0.2.6",
198
198
  " ",
199
199
  ]
200
200
 
@@ -1400,7 +1400,7 @@ class InteractiveShell(cmd.Cmd):
1400
1400
  super().do_help(line)
1401
1401
  else:
1402
1402
  help_text = f"""
1403
- {colorize('ONVIF Interactive Shell — v0.2.4', 'cyan')}\n{colorize('https://github.com/nirsimetri/onvif-python', 'white')}
1403
+ {colorize('ONVIF Interactive Shell — v0.2.6', 'cyan')}\n{colorize('https://github.com/nirsimetri/onvif-python', 'white')}
1404
1404
 
1405
1405
  {colorize('Basic Commands:', 'yellow')}
1406
1406
  capabilities, caps - Show device capabilities
onvif/cli/main.py CHANGED
@@ -7,6 +7,7 @@ import getpass
7
7
  import sqlite3
8
8
  import os
9
9
  import shutil
10
+ import json
10
11
  from datetime import datetime
11
12
  from typing import Any, Optional, Tuple
12
13
 
@@ -21,7 +22,7 @@ def create_parser():
21
22
  """Create argument parser for ONVIF CLI"""
22
23
  parser = argparse.ArgumentParser(
23
24
  prog="onvif",
24
- description=f"{colorize('ONVIF Terminal Client', 'yellow')} — v0.2.4\nhttps://github.com/nirsimetri/onvif-python",
25
+ description=f"{colorize('ONVIF Terminal Client', 'yellow')} — v0.2.6\nhttps://github.com/nirsimetri/onvif-python",
25
26
  formatter_class=argparse.RawDescriptionHelpFormatter,
26
27
  epilog=f"""
27
28
  Examples:
@@ -42,7 +43,12 @@ Examples:
42
43
 
43
44
  # Direct command execution
44
45
  {colorize('onvif', 'yellow')} devicemgmt GetCapabilities Category=All --host 192.168.1.17 --port 8000 --username admin --password admin123
45
- {colorize('onvif', 'yellow')} ptz ContinuousMove ProfileToken=Profile_1 Velocity={{"PanTilt": {{"x": -0.1, "y": 0}}}} --host 192.168.1.17 --port 8000 --username admin --password admin123
46
+ {colorize('onvif', 'yellow')} ptz ContinuousMove ProfileToken=Profile_1 Velocity={{'PanTilt': {{'x': -0.1, 'y': 0}}}} -H 192.168.1.17 -P 8000 -u admin -p admin123
47
+
48
+ # Save output to file
49
+ {colorize('onvif', 'yellow')} devicemgmt GetDeviceInformation --host 192.168.1.17 --port 8000 --username admin --password admin123 --output device_info.json
50
+ {colorize('onvif', 'yellow')} media GetProfiles --host 192.168.1.17 --port 8000 --username admin --password admin123 --output profiles.xml
51
+ {colorize('onvif', 'yellow')} ptz GetConfigurations --host 192.168.1.17 --port 8000 --username admin --password admin123 --output ptz_config.txt --debug
46
52
 
47
53
  # Interactive mode
48
54
  {colorize('onvif', 'yellow')} --host 192.168.1.17 --port 8000 --username admin --password admin123 --interactive
@@ -139,6 +145,11 @@ Examples:
139
145
  default=10,
140
146
  help="Health check interval in seconds for interactive mode (default: 10)",
141
147
  )
148
+ parser.add_argument(
149
+ "--output",
150
+ "-o",
151
+ help="Save command output to file. Supports .json, .xml extensions for format detection, or plain text. XML format automatically enables debug mode for SOAP capture.",
152
+ )
142
153
 
143
154
  # Service and method (for direct command execution)
144
155
  parser.add_argument(
@@ -177,7 +188,7 @@ def main():
177
188
 
178
189
  # Show ONVIF CLI version
179
190
  if args.version:
180
- print(colorize("0.2.4", "yellow"))
191
+ print(colorize("0.2.6", "yellow"))
181
192
  sys.exit(0)
182
193
 
183
194
  # Handle product search
@@ -196,6 +207,12 @@ def main():
196
207
  f"Either {colorize('--interactive', 'white')}/{colorize('-i', 'white')} mode or {colorize('service/method', 'white')} must be specified"
197
208
  )
198
209
 
210
+ # Validate output argument
211
+ if args.output and args.interactive:
212
+ parser.error(
213
+ f"{colorize('--output', 'white')} cannot be used with {colorize('--interactive', 'white')} mode"
214
+ )
215
+
199
216
  # Handle discovery mode
200
217
  if args.discover:
201
218
  if args.host:
@@ -260,6 +277,11 @@ def main():
260
277
 
261
278
  try:
262
279
  # Create ONVIF client
280
+ # Auto-enable debug mode if output format is XML
281
+ auto_debug = args.debug or (
282
+ args.output and args.output.lower().endswith(".xml")
283
+ )
284
+
263
285
  client = ONVIFClient(
264
286
  host=args.host,
265
287
  port=args.port,
@@ -270,7 +292,7 @@ def main():
270
292
  use_https=args.https,
271
293
  verify_ssl=not args.no_verify,
272
294
  apply_patch=not args.no_patch,
273
- capture_xml=args.debug,
295
+ capture_xml=auto_debug,
274
296
  wsdl_dir=args.wsdl,
275
297
  )
276
298
 
@@ -298,7 +320,17 @@ def main():
298
320
  # Execute direct command
299
321
  params_str = " ".join(args.params) if args.params else None
300
322
  result = execute_command(client, args.service, args.method, params_str)
301
- print(str(result))
323
+
324
+ # Save output to file if specified
325
+ if args.output:
326
+ # Auto-enable debug mode for XML output
327
+ effective_debug = args.debug or args.output.lower().endswith(".xml")
328
+ save_output_to_file(result, args.output, effective_debug, client)
329
+ print(
330
+ f"{colorize('Output saved to:', 'green')} {colorize(args.output, 'white')}"
331
+ )
332
+ else:
333
+ print(str(result))
302
334
 
303
335
  except KeyboardInterrupt:
304
336
  print("\nOperation cancelled by user")
@@ -337,6 +369,182 @@ def execute_command(
337
369
  return method(**params)
338
370
 
339
371
 
372
+ def save_output_to_file(
373
+ result: Any, output_path: str, debug_mode: bool, client: ONVIFClient
374
+ ) -> None:
375
+ """Save command output to file in appropriate format based on file extension.
376
+
377
+ Args:
378
+ result: The ONVIF command result
379
+ output_path: Path to output file
380
+ debug_mode: Whether debug mode is enabled (for XML capture)
381
+ client: ONVIFClient instance (for accessing XML plugin)
382
+ """
383
+ try:
384
+ # Determine output format based on file extension
385
+ _, ext = os.path.splitext(output_path.lower())
386
+
387
+ if ext == ".json":
388
+ # Prepare output data
389
+ output_data = {}
390
+
391
+ # JSON format
392
+ output_data["result"] = _serialize_for_json(result)
393
+ output_data["timestamp"] = datetime.now().isoformat()
394
+ output_data["raw_result"] = str(result) # Add raw string as fallback
395
+
396
+ # Add XML data if debug mode is enabled and XML plugin is available
397
+ if debug_mode and client.xml_plugin:
398
+ output_data["debug"] = {
399
+ "last_request_xml": client.xml_plugin.last_sent_xml,
400
+ "last_response_xml": client.xml_plugin.last_received_xml,
401
+ "last_operation": client.xml_plugin.last_operation,
402
+ }
403
+
404
+ with open(output_path, "w", encoding="utf-8") as f:
405
+ json.dump(output_data, f, indent=2, ensure_ascii=False)
406
+
407
+ elif ext == ".xml":
408
+ # XML format - prioritize raw SOAP XML over parsed result
409
+ if client.xml_plugin and client.xml_plugin.last_received_xml:
410
+ # Save the raw SOAP response XML with minimal wrapper
411
+ content = f"""<?xml version="1.0" encoding="UTF-8"?>
412
+ <!-- ONVIF SOAP Response -->
413
+ <!-- Timestamp: {datetime.now().isoformat()} -->
414
+ <!-- Operation: {client.xml_plugin.last_operation or 'Unknown'} -->
415
+
416
+ {client.xml_plugin.last_received_xml}
417
+ """
418
+ else:
419
+ # Fallback: Simple XML wrapper for the parsed result
420
+ content = f"""<?xml version="1.0" encoding="UTF-8"?>
421
+ <!-- ONVIF Command Output (Parsed Result) -->
422
+ <!-- Timestamp: {datetime.now().isoformat()} -->
423
+ <!-- Note: Raw SOAP XML not available. Enable --debug for full SOAP capture. -->
424
+ <onvif_result>
425
+ <![CDATA[
426
+ {str(result)}
427
+ ]]>
428
+ </onvif_result>
429
+ """
430
+
431
+ with open(output_path, "w", encoding="utf-8") as f:
432
+ f.write(content)
433
+
434
+ else:
435
+ # Plain text format (default)
436
+ content = "ONVIF Command Output\n"
437
+ content += f"Timestamp: {datetime.now().isoformat()}\n"
438
+ content += f"{'='*50}\n\n"
439
+ content += str(result)
440
+
441
+ # Add debug information if available
442
+ if debug_mode and client.xml_plugin:
443
+ content += f"\n\n{'='*50}\n"
444
+ content += "DEBUG INFORMATION\n"
445
+ content += f"{'='*50}\n"
446
+ if client.xml_plugin.last_operation:
447
+ content += f"Operation: {client.xml_plugin.last_operation}\n\n"
448
+ if client.xml_plugin.last_sent_xml:
449
+ content += "SOAP Request:\n"
450
+ content += client.xml_plugin.last_sent_xml + "\n\n"
451
+ if client.xml_plugin.last_received_xml:
452
+ content += "SOAP Response:\n"
453
+ content += client.xml_plugin.last_received_xml + "\n"
454
+
455
+ with open(output_path, "w", encoding="utf-8") as f:
456
+ f.write(content)
457
+
458
+ except Exception as e:
459
+ print(f"{colorize('Error saving output:', 'red')} {e}", file=sys.stderr)
460
+ # Still print the result to console if file save fails
461
+ print(str(result))
462
+
463
+
464
+ def _serialize_for_json(obj: Any) -> Any:
465
+ """Recursively serialize ONVIF objects for JSON output.
466
+
467
+ Args:
468
+ obj: Object to serialize
469
+
470
+ Returns:
471
+ JSON-serializable representation of the object
472
+ """
473
+ if obj is None:
474
+ return None
475
+ elif isinstance(obj, (str, int, float, bool)):
476
+ return obj
477
+ elif isinstance(obj, datetime):
478
+ return obj.isoformat()
479
+ elif isinstance(obj, (list, tuple)):
480
+ return [_serialize_for_json(item) for item in obj]
481
+ elif isinstance(obj, dict):
482
+ return {key: _serialize_for_json(value) for key, value in obj.items()}
483
+
484
+ # Check if this is a Zeep object (has _xsd_type attribute)
485
+ elif hasattr(obj, "_xsd_type"):
486
+ result = {}
487
+ # Try to get all elements from XSD type
488
+ if hasattr(obj._xsd_type, "elements"):
489
+ for elem_name, elem_obj in obj._xsd_type.elements:
490
+ try:
491
+ value = getattr(obj, elem_name, None)
492
+ if value is not None:
493
+ result[elem_name] = _serialize_for_json(value)
494
+ except (AttributeError, TypeError):
495
+ # Skip elements that can't be accessed or have type issues
496
+ pass
497
+
498
+ # Also try regular attributes
499
+ for attr_name in dir(obj):
500
+ if not attr_name.startswith("_") and not callable(
501
+ getattr(obj, attr_name, None)
502
+ ):
503
+ try:
504
+ attr_value = getattr(obj, attr_name)
505
+ if attr_value is not None and attr_name not in result:
506
+ result[attr_name] = _serialize_for_json(attr_value)
507
+ except (AttributeError, TypeError):
508
+ # Skip attributes that can't be accessed or have type issues
509
+ pass
510
+
511
+ return result
512
+
513
+ elif hasattr(obj, "__dict__"):
514
+ # Handle regular objects with attributes
515
+ result = {}
516
+ for key, value in obj.__dict__.items():
517
+ if not key.startswith("_"): # Skip private attributes
518
+ result[key] = _serialize_for_json(value)
519
+
520
+ # If result is empty, try to get attributes using dir()
521
+ if not result:
522
+ for attr_name in dir(obj):
523
+ if not attr_name.startswith("_") and not callable(
524
+ getattr(obj, attr_name, None)
525
+ ):
526
+ try:
527
+ attr_value = getattr(obj, attr_name)
528
+ if attr_value is not None:
529
+ result[attr_name] = _serialize_for_json(attr_value)
530
+ except (AttributeError, TypeError):
531
+ # Skip attributes that can't be accessed or have type issues
532
+ pass
533
+
534
+ return result
535
+ elif hasattr(obj, "_value_1"):
536
+ # Handle zeep objects with special structure
537
+ return _serialize_for_json(obj._value_1)
538
+ else:
539
+ # Try to convert to dict using vars() if available
540
+ try:
541
+ obj_dict = vars(obj)
542
+ return _serialize_for_json(obj_dict)
543
+ except TypeError:
544
+ # Fallback to string representation
545
+ return str(obj)
546
+
547
+
340
548
  def discover_devices(
341
549
  timeout: int = 4, prefer_https: bool = False, filter_term: Optional[str] = None
342
550
  ) -> list:
@@ -411,3 +411,6 @@ class Device(ONVIFService):
411
411
 
412
412
  def SetHashingAlgorithm(self, Algorithm):
413
413
  return self.operator.call("SetHashingAlgorithm", Algorithm=Algorithm)
414
+
415
+ def UpgradeFirmware(self, Version):
416
+ return self.operator.call("UpgradeFirmware", Version=Version)
onvif/services/media2.py CHANGED
@@ -313,3 +313,20 @@ class Media2(ONVIFService):
313
313
 
314
314
  def GetPlayingAudioClips(self):
315
315
  return self.operator.call("GetPlayingAudioClips")
316
+
317
+ def GetMulticastAudioDecoderConfigurationOptions(self, ConfigurationToken=None):
318
+ return self.operator.call(
319
+ "GetMulticastAudioDecoderConfigurationOptions",
320
+ ConfigurationToken=ConfigurationToken,
321
+ )
322
+
323
+ def GetMulticastAudioDecoderConfigurations(self, ConfigurationToken=None):
324
+ return self.operator.call(
325
+ "GetMulticastAudioDecoderConfigurations",
326
+ ConfigurationToken=ConfigurationToken,
327
+ )
328
+
329
+ def SetMulticastAudioDecoderConfiguration(self, Configuration):
330
+ return self.operator.call(
331
+ "SetMulticastAudioDecoderConfiguration", Configuration=Configuration
332
+ )
@@ -82,7 +82,7 @@
82
82
  </xs:enumeration>
83
83
  </xs:restriction>
84
84
  </xs:simpleType>
85
- <xs:simpleType name="KeyAlgorithm">
85
+ <xs:simpleType name="KeyPairAlgorithm">
86
86
  <xs:restriction base="xs:string">
87
87
  <xs:enumeration value="RSA"/>
88
88
  <xs:enumeration value="ECC"/>
@@ -740,12 +740,12 @@
740
740
  </xs:attribute>
741
741
  <xs:attribute name="RSAKeyPairGeneration" type="xs:boolean">
742
742
  <xs:annotation>
743
- <xs:documentation>Indication that the device supports on-board RSA key pair generation.</xs:documentation>
743
+ <xs:documentation>Deprecated - Indication that the device supports on-board ECC key pair generation.</xs:documentation>
744
744
  </xs:annotation>
745
745
  </xs:attribute>
746
746
  <xs:attribute name="ECCKeyPairGeneration" type="xs:boolean">
747
747
  <xs:annotation>
748
- <xs:documentation>Indication that the device supports on-board ECC key pair generation.</xs:documentation>
748
+ <xs:documentation>Deprecated - Indication that the device supports on-board ECC key pair generation.</xs:documentation>
749
749
  </xs:annotation>
750
750
  </xs:attribute>
751
751
  <xs:attribute name="KeyPairGeneration" type="tt:StringList">
@@ -760,12 +760,12 @@
760
760
  </xs:attribute>
761
761
  <xs:attribute name="EllipticCurves" type="tas:EllipticCurves">
762
762
  <xs:annotation>
763
- <xs:documentation>Indicates which elliptic curves are supported by the device.</xs:documentation>
763
+ <xs:documentation>Indicates which elliptic curves are supported by the device. Supported curve names can be found in the IANA TLS Supported Groups section, under the Description field.</xs:documentation>
764
764
  </xs:annotation>
765
765
  </xs:attribute>
766
766
  <xs:attribute name="PKCS10ExternalCertificationWithRSA" type="xs:boolean">
767
767
  <xs:annotation>
768
- <xs:documentation>Indicates support for creating PKCS#10 requests for RSA keys and uploading the certificate obtained from a CA..</xs:documentation>
768
+ <xs:documentation>Deprecated - Indicates support for creating PKCS#10 requests for RSA keys and uploading the certificate obtained from a CA..</xs:documentation>
769
769
  </xs:annotation>
770
770
  </xs:attribute>
771
771
  <xs:attribute name="PKCS10" type="xs:boolean">
@@ -775,7 +775,7 @@
775
775
  </xs:attribute>
776
776
  <xs:attribute name="SelfSignedCertificateCreationWithRSA" type="xs:boolean">
777
777
  <xs:annotation>
778
- <xs:documentation>Indicates support for creating self-signed certificates for RSA keys.</xs:documentation>
778
+ <xs:documentation>Deprecated - Indicates support for creating self-signed certificates for RSA keys.</xs:documentation>
779
779
  </xs:annotation>
780
780
  </xs:attribute>
781
781
  <xs:attribute name="SelfSignedCertificateCreation" type="xs:boolean">
@@ -795,7 +795,7 @@
795
795
  </xs:attribute>
796
796
  <xs:attribute name="PKCS8RSAKeyPairUpload" type="xs:boolean">
797
797
  <xs:annotation>
798
- <xs:documentation>Indicates support for uploading an RSA key pair in a PKCS#8 data structure.</xs:documentation>
798
+ <xs:documentation>Deprecated - Indicates support for uploading an RSA key pair in a PKCS#8 data structure.</xs:documentation>
799
799
  </xs:annotation>
800
800
  </xs:attribute>
801
801
  <xs:attribute name="PKCS8" type="xs:boolean">
@@ -805,7 +805,7 @@
805
805
  </xs:attribute>
806
806
  <xs:attribute name="PKCS12CertificateWithRSAPrivateKeyUpload" type="xs:boolean">
807
807
  <xs:annotation>
808
- <xs:documentation>Indicates support for uploading a certificate along with an RSA private key in a PKCS#12 data structure.</xs:documentation>
808
+ <xs:documentation>Deprecated - Indicates support for uploading a certificate along with an RSA private key in a PKCS#12 data structure.</xs:documentation>
809
809
  </xs:annotation>
810
810
  </xs:attribute>
811
811
  <xs:attribute name="PKCS12" type="xs:boolean">
@@ -2967,7 +2967,7 @@
2967
2967
  </wsdl:operation>
2968
2968
  <wsdl:operation name="UploadKeyPairInPKCS8">
2969
2969
  <wsdl:documentation>
2970
- This operation uploads a key pair in a PKCS#8 data structure as specified in [RFC 5958, RFC 5959].<br/>
2970
+ Deprecated method for uploading a key pair in a PKCS#8 data structure as specified in [RFC 5958, RFC 5959].<br/>
2971
2971
  If an encryption passphrase ID is supplied in the request, the device shall assume that the KeyPair parameter contains an EncryptedPrivateKeyInfo ASN.1
2972
2972
  structure that is encrypted under the passphrase in the keystore that corresponds to the supplied ID, where the EncryptedPrivateKeyInfo structure contains
2973
2973
  both the private key and the corresponding public key. If no encryption passphrase ID is supplied, the device shall assume that the KeyPair parameter contains a
@@ -306,6 +306,11 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO
306
306
  <xs:documentation>Indicates support for firmware upgrade through MTOM.</xs:documentation>
307
307
  </xs:annotation>
308
308
  </xs:attribute>
309
+ <xs:attribute name="CloudFirmwareUpgrade" type="xs:boolean">
310
+ <xs:annotation>
311
+ <xs:documentation>Indicates support for firmware upgrade through the cloud.</xs:documentation>
312
+ </xs:annotation>
313
+ </xs:attribute>
309
314
  <xs:attribute name="HttpFirmwareUpgrade" type="xs:boolean">
310
315
  <xs:annotation>
311
316
  <xs:documentation>Indicates support for firmware upgrade through HTTP.</xs:documentation>
@@ -2118,6 +2123,21 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO
2118
2123
  </xs:complexType>
2119
2124
  </xs:element>
2120
2125
  <!--===============================-->
2126
+ <xs:element name="UpgradeFirmware">
2127
+ <xs:complexType>
2128
+ <xs:sequence>
2129
+ <xs:element name="Version" type="xs:string"/>
2130
+ </xs:sequence>
2131
+ </xs:complexType>
2132
+ </xs:element>
2133
+ <xs:element name="UpgradeFirmwareResponse">
2134
+ <xs:complexType>
2135
+ <xs:sequence>
2136
+ <xs:element name="ExpectedDownTime" type="xs:duration"/>
2137
+ </xs:sequence>
2138
+ </xs:complexType>
2139
+ </xs:element>
2140
+ <!--===============================-->
2121
2141
  <xs:element name="StartSystemRestore">
2122
2142
  <xs:complexType>
2123
2143
  <xs:sequence/>
@@ -2959,6 +2979,12 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO
2959
2979
  <wsdl:message name="StartFirmwareUpgradeResponse">
2960
2980
  <wsdl:part name="parameters" element="tds:StartFirmwareUpgradeResponse"/>
2961
2981
  </wsdl:message>
2982
+ <wsdl:message name="UpgradeFirmwareRequest">
2983
+ <wsdl:part name="parameters" element="tds:UpgradeFirmware"/>
2984
+ </wsdl:message>
2985
+ <wsdl:message name="UpgradeFirmwareResponse">
2986
+ <wsdl:part name="parameters" element="tds:UpgradeFirmwareResponse"/>
2987
+ </wsdl:message>
2962
2988
  <wsdl:message name="StartSystemRestoreRequest">
2963
2989
  <wsdl:part name="parameters" element="tds:StartSystemRestore"/>
2964
2990
  </wsdl:message>
@@ -3553,6 +3579,24 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO
3553
3579
  <wsdl:input message="tds:StartFirmwareUpgradeRequest"/>
3554
3580
  <wsdl:output message="tds:StartFirmwareUpgradeResponse"/>
3555
3581
  </wsdl:operation>
3582
+ <wsdl:operation name="UpgradeFirmware">
3583
+ <wsdl:documentation>This operation initiates a firmware upgrade using between the device
3584
+ and the MCS, without further actions from the client. Cloud firmware upgrade may be
3585
+ achieved using the following steps:
3586
+ <ol>
3587
+ <li>Client retrieves the list of available firmware versions from the MCS.</li>
3588
+ <li>Client calls UpgradeFirmware, selecting the desired FW version.</li>
3589
+ <li>Device service responds with a downtime value.</li>
3590
+ <li>Device and MCS perform the firmware upgrade procedure without further interaction from the Client</li>
3591
+ <li>Device notifies the Client of the result by emitting the appropriate CloudFirmwareUpgrade event</li>
3592
+ </ol>
3593
+ After applying a firmware upgrade the device shall keep the basic network configuration
3594
+ like IP address, subnet mask and gateway or DHCP settings, as well as all the parameters
3595
+ of the Uplink and Security service unchanged, so that it can connect to the cloud.
3596
+ Additionally a firmware upgrade shall not change user credentials.</wsdl:documentation>
3597
+ <wsdl:input message="tds:UpgradeFirmwareRequest"/>
3598
+ <wsdl:output message="tds:UpgradeFirmwareResponse"/>
3599
+ </wsdl:operation>
3556
3600
  <wsdl:operation name="StartSystemRestore">
3557
3601
  <wsdl:documentation>This operation initiates a system restore from backed up configuration data using the HTTP
3558
3602
  POST mechanism. The response to the command includes an HTTP URL to which the backup
@@ -4523,6 +4567,15 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO
4523
4567
  <soap:body use="literal"/>
4524
4568
  </wsdl:output>
4525
4569
  </wsdl:operation>
4570
+ <wsdl:operation name="UpgradeFirmware">
4571
+ <soap:operation soapAction="http://www.onvif.org/ver10/device/wsdl/UpgradeFirmware"/>
4572
+ <wsdl:input>
4573
+ <soap:body use="literal"/>
4574
+ </wsdl:input>
4575
+ <wsdl:output>
4576
+ <soap:body use="literal"/>
4577
+ </wsdl:output>
4578
+ </wsdl:operation>
4526
4579
  <wsdl:operation name="StartSystemRestore">
4527
4580
  <soap:operation soapAction="http://www.onvif.org/ver10/device/wsdl/StartSystemRestore"/>
4528
4581
  <wsdl:input>
@@ -194,6 +194,8 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO
194
194
  <xs:enumeration value="LicensePlate"/>
195
195
  <xs:enumeration value="Bike"/> <!-- any of bicycle, motorcycle, motorbike -->
196
196
  <xs:enumeration value="Barcode"/>
197
+ <xs:enumeration value="Fire"/>
198
+ <xs:enumeration value="Smoke"/>
197
199
  </xs:restriction>
198
200
  </xs:simpleType>
199
201
  <xs:simpleType name="ClassType">
@@ -2042,6 +2042,230 @@ decoding .A decoder shall decode every data it receives (according to its capabi
2042
2042
  </xs:sequence>
2043
2043
  </xs:complexType>
2044
2044
  <!--===============================-->
2045
+ <!-- MulticastAudioDecoder -->
2046
+ <!--===============================-->
2047
+ <xs:complexType name="MulticastAudioDecoderConfiguration">
2048
+ <xs:annotation>
2049
+ <xs:documentation>
2050
+ Configuration for the Multicast Audio Decoder.
2051
+ </xs:documentation>
2052
+ </xs:annotation>
2053
+ <xs:complexContent>
2054
+ <xs:extension base="tt:ConfigurationEntity">
2055
+ <xs:sequence>
2056
+ <xs:element name="Enable" type="xs:boolean">
2057
+ <xs:annotation>
2058
+ <xs:documentation>
2059
+ Indicates whether the Multicast Audio Decoder is enabled or disabled.
2060
+ </xs:documentation>
2061
+ </xs:annotation>
2062
+ </xs:element>
2063
+ <xs:element name="AudioOutputToken" type="tt:ReferenceToken" minOccurs="0" maxOccurs="unbounded">
2064
+ <xs:annotation>
2065
+ <xs:documentation>
2066
+ Token of the physical Audio output. This element is optional and can occur multiple times.
2067
+ </xs:documentation>
2068
+ </xs:annotation>
2069
+ </xs:element>
2070
+ <xs:element name="Encoding" type="xs:string">
2071
+ <xs:annotation>
2072
+ <xs:documentation>
2073
+ Specifies the encoding type according to IANA media types.
2074
+ </xs:documentation>
2075
+ </xs:annotation>
2076
+ </xs:element>
2077
+ <xs:element name="Bitrate" type="xs:int">
2078
+ <xs:annotation>
2079
+ <xs:documentation>
2080
+ The bitrate of the audio stream in bits per second.
2081
+ </xs:documentation>
2082
+ </xs:annotation>
2083
+ </xs:element>
2084
+ <xs:element name="SamplingRate" type="xs:int">
2085
+ <xs:annotation>
2086
+ <xs:documentation>
2087
+ The sampling rate of the audio stream in kHz.
2088
+ </xs:documentation>
2089
+ </xs:annotation>
2090
+ </xs:element>
2091
+ <xs:element name="Multicast" type="tt:MulticastReceiverConfiguration">
2092
+ <xs:annotation>
2093
+ <xs:documentation>
2094
+ Contains configuration details for multicast settings.
2095
+ </xs:documentation>
2096
+ </xs:annotation>
2097
+ </xs:element>
2098
+ <xs:element name="RTPPayloadType" type="xs:int">
2099
+ <xs:annotation>
2100
+ <xs:documentation>
2101
+ Defines the RTP payload type used for the audio stream.
2102
+ To ensure compatibility, it is recommended to use dynamic payload types (96 and above), as specified in RFC 3551.
2103
+ Standard payload types (0-95) should only be used for predefined audio formats matching the audio encoding as defined in
2104
+ <a href="https://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml#rtp-parameters-1">IANA RTP Payload Types</a>,
2105
+ as using them for non-standard media may lead to unexpected errors or interoperability issues.
2106
+ </xs:documentation>
2107
+ </xs:annotation>
2108
+ </xs:element>
2109
+ <xs:element name="Priority" type="xs:int">
2110
+ <xs:annotation>
2111
+ <xs:documentation>
2112
+ Indicates the priority level when multiple configurations are active.
2113
+ A higher value signifies a higher priority. If several configurations have the same priority value the order between those configurations is undefined.
2114
+ </xs:documentation>
2115
+ </xs:annotation>
2116
+ </xs:element>
2117
+ <xs:element name="MediaFormatParameters" type="xs:string" minOccurs="0">
2118
+ <xs:annotation>
2119
+ <xs:documentation>
2120
+ Optional media format parameters as specified in SDP, such as:
2121
+ a=fmtp:101 stereo=1; sprop-stereo=1.
2122
+ </xs:documentation>
2123
+ </xs:annotation>
2124
+ </xs:element>
2125
+ <xs:element name="SRTPPreSharedParameters" type="tt:SRTPPreShared" minOccurs="0">
2126
+ <xs:annotation>
2127
+ <xs:documentation>
2128
+ Optional configuration parameters for SRTP pre-shared key usage, applicable when SRTP is supported. When this configuration is present, RTP packets shall be encrypted.
2129
+ </xs:documentation>
2130
+ </xs:annotation>
2131
+ </xs:element>
2132
+ <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> <!-- first Vendor then ONVIF -->
2133
+ </xs:sequence>
2134
+ <xs:anyAttribute processContents="lax"/>
2135
+ </xs:extension>
2136
+ </xs:complexContent>
2137
+ </xs:complexType>
2138
+ <!--===============================-->
2139
+ <xs:complexType name="SRTPPreShared">
2140
+ <xs:sequence>
2141
+ <xs:element name="SRTPPSK" type="xs:string">
2142
+ <xs:annotation>
2143
+ <xs:documentation>
2144
+ An optional SRTP Pre-Shared Key (PSK) represented as a hexadecimal string.
2145
+ This includes both the SRTP master key, followed by the master salt.
2146
+ The sizes of the key and salt depend on the specified SRTPCryptoPolicy.
2147
+ When this element is specified, RTP packets shall be encrypted.
2148
+ The SRTPPSK shall never be returned on a get method.
2149
+ </xs:documentation>
2150
+ </xs:annotation>
2151
+ </xs:element>
2152
+ <xs:element name="SecureStreamingProtocolAlgorithm" type="xs:string">
2153
+ <xs:annotation>
2154
+ <xs:documentation>
2155
+ Specifies the cryptographic algorithm when using SRTP,
2156
+ selecting from predefined values provided in the GetMulticastAudioDecoderConfigurationOptions response.
2157
+ </xs:documentation>
2158
+ </xs:annotation>
2159
+ </xs:element>
2160
+ <xs:element name="ROCExtMapID" type="xs:int">
2161
+ <xs:annotation>
2162
+ <xs:documentation>
2163
+ The RTP header extension ID (ExtMapID) used to identify the ROC extension, as defined in RFC 8285.
2164
+ Valid values are 1 to 14 for one-byte header extensions.
2165
+ </xs:documentation>
2166
+ </xs:annotation>
2167
+ </xs:element>
2168
+ <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> <!-- first Vendor then ONVIF -->
2169
+ </xs:sequence>
2170
+ <xs:anyAttribute processContents="lax"/>
2171
+ </xs:complexType>
2172
+ <!--===============================-->
2173
+ <xs:complexType name="MulticastReceiverConfiguration">
2174
+ <xs:sequence>
2175
+ <xs:element name="Address" type="tt:IPAddress">
2176
+ <xs:annotation>
2177
+ <xs:documentation>The multicast address (if this address is set to 0 no multicast streaming is enabled)</xs:documentation>
2178
+ </xs:annotation>
2179
+ </xs:element>
2180
+ <xs:element name="Port" type="xs:int">
2181
+ <xs:annotation>
2182
+ <xs:documentation>The RTP multicast destination port. A device may support RTCP. In this case the port value shall be even to allow the corresponding RTCP stream to be mapped to the next higher (odd) destination port number as defined in the RTSP specification.</xs:documentation>
2183
+ </xs:annotation>
2184
+ </xs:element>
2185
+ <xs:element name="TTL" type="xs:int">
2186
+ <xs:annotation>
2187
+ <xs:documentation>In case of IPv6 the TTL value is assumed as the hop limit. Note that for IPV6 and administratively scoped IPv4 multicast the primary use for hop limit / TTL is to prevent packets from (endlessly) circulating and not limiting scope. In these cases the address contains the scope.</xs:documentation>
2188
+ </xs:annotation>
2189
+ </xs:element>
2190
+ <xs:element name="InterfaceToken" type="tt:ReferenceToken" minOccurs="0" maxOccurs="unbounded">
2191
+ <xs:annotation>
2192
+ <xs:documentation>Unique identifier of the network interface on the device. If not specified, all available interfaces will be used for listening. </xs:documentation>
2193
+ </xs:annotation>
2194
+ </xs:element>
2195
+ <xs:element name="SourceSpecificMulticast" type="tt:IPAddress" minOccurs="0">
2196
+ <xs:annotation>
2197
+ <xs:documentation>When a source-specific multicast address is configured, the device will process multicast data only from the specified source, in accordance with SSM principles defined in RFC 4607.</xs:documentation>
2198
+ </xs:annotation>
2199
+ </xs:element>
2200
+ <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> <!-- first Vendor then ONVIF -->
2201
+ </xs:sequence>
2202
+ <xs:anyAttribute processContents="lax"/>
2203
+ </xs:complexType>
2204
+ <!--===============================-->
2205
+ <xs:complexType name="MulticastAudioDecoderConfigurationOptions">
2206
+ <xs:sequence>
2207
+ <xs:element name="EncodingOptions" type="tt:AudioDecoder2Options">
2208
+ <xs:annotation>
2209
+ <xs:documentation>Supported encoding options for the multicast audio decoder.</xs:documentation>
2210
+ </xs:annotation>
2211
+ </xs:element>
2212
+ <xs:element name="PriorityRange" type="tt:IntRange">
2213
+ <xs:annotation>
2214
+ <xs:documentation>
2215
+ Specifies the priority range as an integer. This indicates the priority level for audio configuration.
2216
+ </xs:documentation>
2217
+ </xs:annotation>
2218
+ </xs:element>
2219
+ <xs:element name="SecureStreamingProtocolAlgorithms" type="tt:StringList" minOccurs="0">
2220
+ <xs:annotation>
2221
+ <xs:documentation>
2222
+ An optional parameter specifies the list of supported cryptographic algorithms when SRTP support is signaled as 'true' in the GetServiceCapabilitiesResponse.
2223
+ Refer to tt:SrtpSecurityAlgorithms for the acceptable values.
2224
+ </xs:documentation>
2225
+ </xs:annotation>
2226
+ </xs:element>
2227
+ <xs:element name="AudioOutputTokens" type="tt:StringList" minOccurs="0">
2228
+ <xs:annotation>
2229
+ <xs:documentation>
2230
+ Optional list of physical Audio output tokens. This element is used when only certain audio outputs can be configured for this token.
2231
+ </xs:documentation>
2232
+ </xs:annotation>
2233
+ </xs:element>
2234
+ <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> <!-- first ONVIF then Vendor -->
2235
+ </xs:sequence>
2236
+ <xs:anyAttribute processContents="lax"/>
2237
+ </xs:complexType>
2238
+ <!--===============================-->
2239
+ <xs:complexType name="AudioDecoder2Options">
2240
+ <xs:sequence>
2241
+ <xs:element name="Encoding" type="xs:string">
2242
+ <xs:annotation>
2243
+ <xs:documentation>Audio Media Subtype for the audio format. For definitions see tt:AudioEncodingMimeNames and <a href="https://www.iana.org/assignments/media-types/media-types.xhtml#audio"> IANA Media Types</a>.</xs:documentation>
2244
+ </xs:annotation>
2245
+ </xs:element>
2246
+ <xs:element name="BitrateList" type="tt:IntItems">
2247
+ <xs:annotation>
2248
+ <xs:documentation>List of supported bitrates in kbps for the specified Encoding</xs:documentation>
2249
+ </xs:annotation>
2250
+ </xs:element>
2251
+ <xs:element name="SampleRateList" type="tt:IntItems">
2252
+ <xs:annotation>
2253
+ <xs:documentation>List of supported Sample Rates in kHz for the specified Encoding</xs:documentation>
2254
+ </xs:annotation>
2255
+ </xs:element>
2256
+ <xs:element name="RTPPayloadType" type="xs:int" minOccurs="0">
2257
+ <xs:annotation>
2258
+ <xs:documentation>
2259
+ Optional element for specifying the RTP payload type,
2260
+ particularly when it is fixed for a specific audio encoding as defined in <a href="https://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml#rtp-parameters-1">IANA RTP Payload Types</a>.
2261
+ </xs:documentation>
2262
+ </xs:annotation>
2263
+ </xs:element>
2264
+ <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> <!-- first ONVIF then Vendor -->
2265
+ </xs:sequence>
2266
+ <xs:anyAttribute processContents="lax"/>
2267
+ </xs:complexType>
2268
+ <!--===============================-->
2045
2269
  <!-- Streaming -->
2046
2270
  <!--===============================-->
2047
2271
  <xs:complexType name="MulticastConfiguration">
@@ -53,6 +53,11 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO
53
53
  <xs:documentation>Audio clip capabilities.</xs:documentation>
54
54
  </xs:annotation>
55
55
  </xs:element>
56
+ <xs:element name="MulticastAudioDecoderCapabilities" type="tr2:MulticastAudioDecoderCapabilities" minOccurs="0" >
57
+ <xs:annotation>
58
+ <xs:documentation>MulticastAudioDecoder capabilities.</xs:documentation>
59
+ </xs:annotation>
60
+ </xs:element>
56
61
  <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> <!-- first ONVIF then Vendor -->
57
62
  </xs:sequence>
58
63
  <xs:attribute name="SnapshotUri" type="xs:boolean">
@@ -159,6 +164,29 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO
159
164
  </xs:attribute>
160
165
  <xs:anyAttribute processContents="lax"/>
161
166
  </xs:complexType>
167
+
168
+ <!--===============================-->
169
+ <xs:complexType name="MulticastAudioDecoderCapabilities">
170
+ <xs:sequence>
171
+ <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> <!-- first ONVIF then Vendor -->
172
+ </xs:sequence>
173
+ <xs:attribute name="MulticastAudioDecoder" type="xs:boolean">
174
+ <xs:annotation>
175
+ <xs:documentation>Indicates support for multicast audio decoder.</xs:documentation>
176
+ </xs:annotation>
177
+ </xs:attribute>
178
+ <xs:attribute name="SRTP" type="xs:boolean">
179
+ <xs:annotation>
180
+ <xs:documentation>Indicates whether the SRTP is supported in MulticastAudioDecoder or not.</xs:documentation>
181
+ </xs:annotation>
182
+ </xs:attribute>
183
+ <xs:attribute name="IPv6" type="xs:boolean">
184
+ <xs:annotation>
185
+ <xs:documentation>Indicates whether the IPv6 is supported in MulticastAudioDecoder or not.</xs:documentation>
186
+ </xs:annotation>
187
+ </xs:attribute>
188
+ <xs:anyAttribute processContents="lax"/>
189
+ </xs:complexType>
162
190
  <!--===============================-->
163
191
  <xs:complexType name="MediaSigningCapabilities">
164
192
  <xs:sequence>
@@ -1621,6 +1649,62 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO
1621
1649
  </xs:complexType>
1622
1650
  </xs:element>
1623
1651
  <!--===============================-->
1652
+
1653
+ <xs:element name="GetMulticastAudioDecoderConfigurations">
1654
+ <xs:complexType>
1655
+ <xs:sequence>
1656
+ <xs:element name="ConfigurationToken" type="tt:ReferenceToken" minOccurs="0">
1657
+ <xs:annotation>
1658
+ <xs:documentation>Unique token of the multicast audio decoder configuration. If not passed, device shall respond with all configurations.</xs:documentation>
1659
+ </xs:annotation>
1660
+ </xs:element>
1661
+ </xs:sequence>
1662
+ </xs:complexType>
1663
+ </xs:element>
1664
+ <xs:element name="GetMulticastAudioDecoderConfigurationsResponse">
1665
+ <xs:complexType>
1666
+ <xs:sequence>
1667
+ <xs:element name="Configurations" type="tt:MulticastAudioDecoderConfiguration" minOccurs="0" maxOccurs="unbounded" >
1668
+ <xs:annotation>
1669
+ <xs:documentation>This message contains the list of multicast audio decoder configurations.</xs:documentation>
1670
+ </xs:annotation>
1671
+ </xs:element>
1672
+ </xs:sequence>
1673
+ </xs:complexType>
1674
+ </xs:element>
1675
+
1676
+ <xs:element name="GetMulticastAudioDecoderConfigurationOptions">
1677
+ <xs:complexType>
1678
+ <xs:sequence>
1679
+ <xs:element name="ConfigurationToken" type="tt:ReferenceToken" minOccurs="0">
1680
+ <xs:annotation>
1681
+ <xs:documentation>This response contains the available MulticastAudioDecoderConfigurationOptions. If a multicast audio decoder configuration is specified, the options shall concern that particular configuration.</xs:documentation>
1682
+ </xs:annotation>
1683
+ </xs:element>
1684
+ </xs:sequence>
1685
+ </xs:complexType>
1686
+ </xs:element>
1687
+ <xs:element name="GetMulticastAudioDecoderConfigurationOptionsResponse">
1688
+ <xs:complexType>
1689
+ <xs:sequence>
1690
+ <xs:element name="Options" type="tt:MulticastAudioDecoderConfigurationOptions" maxOccurs="unbounded"/>
1691
+ </xs:sequence>
1692
+ </xs:complexType>
1693
+ </xs:element>
1694
+
1695
+ <xs:element name="SetMulticastAudioDecoderConfiguration">
1696
+ <xs:complexType>
1697
+ <xs:sequence>
1698
+ <xs:element name="Configuration" type="tt:MulticastAudioDecoderConfiguration">
1699
+ <xs:annotation>
1700
+ <xs:documentation>Contains the modified multicast audio decoder configuration. The configuration shall exist in the device.</xs:documentation>
1701
+ </xs:annotation>
1702
+ </xs:element>
1703
+ </xs:sequence>
1704
+ </xs:complexType>
1705
+ </xs:element>
1706
+ <xs:element name="SetMulticastAudioDecoderConfigurationResponse" type="tr2:SetConfigurationResponse"/>
1707
+
1624
1708
  <!--============ Schema End================-->
1625
1709
  </xs:schema>
1626
1710
  </wsdl:types>
@@ -1958,6 +2042,24 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO
1958
2042
  <wsdl:message name="GetPlayingAudioClipsResponse">
1959
2043
  <wsdl:part name="parameters" element="tr2:GetPlayingAudioClipsResponse"/>
1960
2044
  </wsdl:message>
2045
+ <wsdl:message name="GetMulticastAudioDecoderConfigurationsRequest">
2046
+ <wsdl:part name="parameters" element="tr2:GetMulticastAudioDecoderConfigurations"/>
2047
+ </wsdl:message>
2048
+ <wsdl:message name="GetMulticastAudioDecoderConfigurationsResponse">
2049
+ <wsdl:part name="parameters" element="tr2:GetMulticastAudioDecoderConfigurationsResponse"/>
2050
+ </wsdl:message>
2051
+ <wsdl:message name="GetMulticastAudioDecoderConfigurationOptionsRequest">
2052
+ <wsdl:part name="parameters" element="tr2:GetMulticastAudioDecoderConfigurationOptions"/>
2053
+ </wsdl:message>
2054
+ <wsdl:message name="GetMulticastAudioDecoderConfigurationOptionsResponse">
2055
+ <wsdl:part name="parameters" element="tr2:GetMulticastAudioDecoderConfigurationOptionsResponse"/>
2056
+ </wsdl:message>
2057
+ <wsdl:message name="SetMulticastAudioDecoderConfigurationRequest">
2058
+ <wsdl:part name="parameters" element="tr2:SetMulticastAudioDecoderConfiguration"/>
2059
+ </wsdl:message>
2060
+ <wsdl:message name="SetMulticastAudioDecoderConfigurationResponse">
2061
+ <wsdl:part name="parameters" element="tr2:SetMulticastAudioDecoderConfigurationResponse"/>
2062
+ </wsdl:message>
1961
2063
  <wsdl:portType name="Media2">
1962
2064
  <!--===============================-->
1963
2065
  <!--===============================-->
@@ -2331,6 +2433,23 @@ image will be updated automatically and independent from calls to GetSnapshotUri
2331
2433
  <wsdl:output message="tr2:GetPlayingAudioClipsResponse"/>
2332
2434
  </wsdl:operation>
2333
2435
  <!--==============AudioClipManagement Operation End=================-->
2436
+ <!--==============MulticastAudioDecoder Operation=================-->
2437
+ <wsdl:operation name="GetMulticastAudioDecoderConfigurations">
2438
+ <wsdl:documentation>This operation gets the list of multicast audio decoder configurations.</wsdl:documentation>
2439
+ <wsdl:input message="tr2:GetMulticastAudioDecoderConfigurationsRequest"/>
2440
+ <wsdl:output message="tr2:GetMulticastAudioDecoderConfigurationsResponse"/>
2441
+ </wsdl:operation>
2442
+ <wsdl:operation name="GetMulticastAudioDecoderConfigurationOptions">
2443
+ <wsdl:documentation>This operation gets the available options for the MulticastAudioDecoder configuration.</wsdl:documentation>
2444
+ <wsdl:input message="tr2:GetMulticastAudioDecoderConfigurationOptionsRequest"/>
2445
+ <wsdl:output message="tr2:GetMulticastAudioDecoderConfigurationOptionsResponse"/>
2446
+ </wsdl:operation>
2447
+ <wsdl:operation name="SetMulticastAudioDecoderConfiguration">
2448
+ <wsdl:documentation>This operation sets the MulticastAudioDecoderConfiguration.</wsdl:documentation>
2449
+ <wsdl:input message="tr2:SetMulticastAudioDecoderConfigurationRequest"/>
2450
+ <wsdl:output message="tr2:SetMulticastAudioDecoderConfigurationResponse"/>
2451
+ </wsdl:operation>
2452
+ <!--===========MulticastAudioDecoder Operation End ===============-->
2334
2453
  </wsdl:portType>
2335
2454
  <wsdl:binding name="Media2Binding" type="tr2:Media2">
2336
2455
  <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
@@ -2858,5 +2977,34 @@ image will be updated automatically and independent from calls to GetSnapshotUri
2858
2977
  </wsdl:output>
2859
2978
  </wsdl:operation>
2860
2979
  <!--==============AudioClipManagement End=================-->
2980
+ <!--==============Multicast Audio Decoder Configuration =================-->
2981
+ <wsdl:operation name="GetMulticastAudioDecoderConfigurations">
2982
+ <soap:operation soapAction="http://www.onvif.org/ver20/media/wsdl/GetMulticastAudioDecoderConfigurations"/>
2983
+ <wsdl:input>
2984
+ <soap:body use="literal"/>
2985
+ </wsdl:input>
2986
+ <wsdl:output>
2987
+ <soap:body use="literal"/>
2988
+ </wsdl:output>
2989
+ </wsdl:operation>
2990
+ <wsdl:operation name="GetMulticastAudioDecoderConfigurationOptions">
2991
+ <soap:operation soapAction="http://www.onvif.org/ver20/media/wsdl/GetMulticastAudioDecoderConfigurationOptions"/>
2992
+ <wsdl:input>
2993
+ <soap:body use="literal"/>
2994
+ </wsdl:input>
2995
+ <wsdl:output>
2996
+ <soap:body use="literal"/>
2997
+ </wsdl:output>
2998
+ </wsdl:operation>
2999
+ <wsdl:operation name="SetMulticastAudioDecoderConfiguration">
3000
+ <soap:operation soapAction="http://www.onvif.org/ver20/media/wsdl/SetMulticastAudioDecoderConfiguration"/>
3001
+ <wsdl:input>
3002
+ <soap:body use="literal"/>
3003
+ </wsdl:input>
3004
+ <wsdl:output>
3005
+ <soap:body use="literal"/>
3006
+ </wsdl:output>
3007
+ </wsdl:operation>
3008
+ <!--==============Multicast Audio Decoder Configuration End =================-->
2861
3009
  </wsdl:binding>
2862
3010
  </wsdl:definitions>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: onvif-python
3
- Version: 0.2.4
3
+ Version: 0.2.6
4
4
  Summary: A modern Python library for ONVIF-compliant devices
5
5
  Author-email: Nirsimetri Technologies® <open@nirsimetri.com>
6
6
  Maintainer: Kaburagi
@@ -44,13 +44,13 @@ Dynamic: license-file
44
44
  <h1 align="center">ONVIF Python</h1>
45
45
 
46
46
  <div align="center">
47
- <img alt="Codacy grade" src="https://img.shields.io/codacy/grade/bff08a94e4d447b690cea49c6594826d?label=Code%20Quality&logo=codacy" href="https://app.codacy.com/gh/nirsimetri/onvif-python/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade">
48
- <img alt="Ask DeepWiki" src="https://deepwiki.com/badge.svg" href="https://deepwiki.com/nirsimetri/onvif-python">
49
- <img alt="PyPI Version" src="https://img.shields.io/badge/PyPI-0.2.4-orange?logo=archive&color=yellow" href="https://pypi.org/project/onvif-python/">
50
- <img alt="Pepy Total Downloads" src="https://img.shields.io/pepy/dt/onvif-python?label=Downloads&color=red" href="https://pepy.tech/projects/onvif-python">
47
+ <a href="https://app.codacy.com/gh/nirsimetri/onvif-python/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade"><img src="https://app.codacy.com/project/badge/Grade/bff08a94e4d447b690cea49c6594826d"/></a>
48
+ <a href="https://deepwiki.com/nirsimetri/onvif-python"><img alt="Ask DeepWiki" src="https://deepwiki.com/badge.svg"></a>
49
+ <a href="https://pypi.org/project/onvif-python/"><img alt="PyPI Version" src="https://img.shields.io/badge/PyPI-0.2.6-orange?logo=archive&color=yellow"></a>
50
+ <a href="https://pepy.tech/projects/onvif-python"><img alt="Pepy Total Downloads" src="https://img.shields.io/pepy/dt/onvif-python?label=Downloads&color=red"></a>
51
51
  <br>
52
- <img alt="Build" src="https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml/badge.svg?branch=main" href="https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml">
53
- <img alt="Upload Python Package" src="https://github.com/nirsimetri/onvif-python/actions/workflows/python-publish.yml/badge.svg" href="https://github.com/nirsimetri/onvif-python/actions/workflows/python-publish.yml">
52
+ <a href="https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml"><img alt="Build" src="https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml/badge.svg?branch=main"></a>
53
+ <a href="https://github.com/nirsimetri/onvif-python/actions/workflows/python-publish.yml"><img alt="Upload Python Package" src="https://github.com/nirsimetri/onvif-python/actions/workflows/python-publish.yml/badge.svg"></a>
54
54
  </div>
55
55
 
56
56
  <h1 align="center">
@@ -64,15 +64,21 @@ Dynamic: license-file
64
64
 
65
65
  Behind the scenes, ONVIF communication relies on **[SOAP](https://en.wikipedia.org/wiki/SOAP) (Simple Object Access Protocol)** — an [XML](https://en.wikipedia.org/wiki/XML)-based messaging protocol with strict schema definitions ([WSDL](https://en.wikipedia.org/wiki/Web_Services_Description_Language)/[XSD](https://en.wikipedia.org/wiki/XML_Schema_(W3C))). SOAP ensures interoperability, but when used directly it can be verbose, complex, and error-prone.
66
66
 
67
- This library simplifies that process by wrapping SOAP communication into a clean, Pythonic API. You no longer need to handle low-level XML parsing, namespaces, or security tokens manually — the library takes care of it, letting you focus on building functionality.
67
+ This library simplifies that process by wrapping SOAP communication into a clean, Pythonic API. You no longer need to handle low-level XML parsing, namespaces, or security tokens manually — the library takes care of it, letting you focus on building functionality.
68
68
 
69
- ## Key Features
70
- - Full implementation of ONVIF core services and profiles
71
- - Support for device discovery, media streaming, PTZ control, event management, and more
72
- - Pythonic abstraction over SOAP requests and responses (no need to handcraft XML)
73
- - Extensible architecture for custom ONVIF extensions
74
- - Compatible with multiple ONVIF specification versions
75
- - Example scripts and tests included
69
+ ## Library Philosophy
70
+ > [!NOTE]
71
+ > This library will be continuously updated as ONVIF versions are updated. It uses a built-in WSDL that will always follow changes to the [ONVIF WSDL Specifications](https://github.com/onvif/specs). You can also use your own ONVIF WSDL file by adding the `wsdl_dir` argument; see [ONVIFClient Parameters](#onvifclient-parameters).
72
+
73
+ - **WYSIWYG (What You See is What You Get)**: Every ONVIF operation in the library mirrors the official ONVIF specification exactly. Method names, parameter structures, and response formats follow ONVIF standards without abstraction layers or renamed interfaces. What you see in the ONVIF documentation is exactly what you get in Python.
74
+
75
+ - **Device Variety Interoperability**: Built to handle the real-world diversity of ONVIF implementations across manufacturers. The library gracefully handles missing features, optional operations, and vendor-specific behaviors through comprehensive error handling and fallback mechanisms. Whether you're working with high-end enterprise cameras or budget IP cameras, the library adapts.
76
+
77
+ - **Official Specifications Accuracy**: All service implementations are generated and validated against official `ONVIF WSDL Specifications`. The library includes comprehensive test suites that verify compliance with ONVIF standards, ensuring that method signatures, parameter types, and behavior match the official specifications precisely.
78
+
79
+ - **Modern Python Approach**: Designed for excellent IDE support with full type hints, auto-completion, and immediate error detection. You'll get `TypeError` exceptions upfront when accessing ONVIF operations with wrong arguments, instead of cryptic `SOAP faults` later. Clean, Pythonic API that feels natural to Python developers while maintaining ONVIF compatibility.
80
+
81
+ - **Minimal Dependencies**: Only depends on essential, well-maintained libraries (`zeep` for SOAP, `requests` for HTTP). No bloated framework dependencies or custom XML parsers. The library stays lightweight while providing full ONVIF functionality, making it easy to integrate into any project without dependency conflicts.
76
82
 
77
83
  ## Who Is It For?
78
84
  - **Individual developers** exploring ONVIF or building hobby projects
@@ -351,11 +357,12 @@ This library includes a powerful command-line interface (CLI) for interacting wi
351
357
  <summary><b>1. Direct CLI</b></summary>
352
358
 
353
359
  ```bash
354
- usage: onvif [-h] [--host HOST] [--port PORT] [--username USERNAME] [--password PASSWORD] [--discover] [--filter FILTER] [--search SEARCH] [--page PAGE] [--per-page PER_PAGE] [--timeout TIMEOUT] [--https]
355
- [--no-verify] [--no-patch] [--interactive] [--debug] [--wsdl WSDL] [--cache {all,db,mem,none}] [--health-check-interval HEALTH_CHECK_INTERVAL] [--version]
360
+ usage: onvif [-h] [--host HOST] [--port PORT] [--username USERNAME] [--password PASSWORD] [--discover] [--filter FILTER] [--search SEARCH] [--page PAGE]
361
+ [--per-page PER_PAGE] [--timeout TIMEOUT] [--https] [--no-verify] [--no-patch] [--interactive] [--debug] [--wsdl WSDL]
362
+ [--cache {all,db,mem,none}] [--health-check-interval HEALTH_CHECK_INTERVAL] [--output OUTPUT] [--version]
356
363
  [service] [method] [params ...]
357
364
 
358
- ONVIF Terminal Client — v0.2.4
365
+ ONVIF Terminal Client — v0.2.6
359
366
  https://github.com/nirsimetri/onvif-python
360
367
 
361
368
  positional arguments:
@@ -389,6 +396,9 @@ options:
389
396
  Caching mode for ONVIFClient (default: all). 'all': memory+disk, 'db': disk-only, 'mem': memory-only, 'none': disabled.
390
397
  --health-check-interval HEALTH_CHECK_INTERVAL, -hci HEALTH_CHECK_INTERVAL
391
398
  Health check interval in seconds for interactive mode (default: 10)
399
+ --output OUTPUT, -o OUTPUT
400
+ Save command output to file. Supports .json, .xml extensions for format detection, or plain text. XML format automatically enables
401
+ debug mode for SOAP capture.
392
402
  --version, -v Show ONVIF CLI version and exit
393
403
 
394
404
  Examples:
@@ -409,7 +419,12 @@ Examples:
409
419
 
410
420
  # Direct command execution
411
421
  onvif devicemgmt GetCapabilities Category=All --host 192.168.1.17 --port 8000 --username admin --password admin123
412
- onvif ptz ContinuousMove ProfileToken=Profile_1 Velocity={"PanTilt": {"x": -0.1, "y": 0}} --host 192.168.1.17 --port 8000 --username admin --password admin123
422
+ onvif ptz ContinuousMove ProfileToken=Profile_1 Velocity={'PanTilt': {'x': -0.1, 'y': 0}} -H 192.168.1.17 -P 8000 -u admin -p admin123
423
+
424
+ # Save output to file
425
+ onvif devicemgmt GetDeviceInformation --host 192.168.1.17 --port 8000 --username admin --password admin123 --output device_info.json
426
+ onvif media GetProfiles --host 192.168.1.17 --port 8000 --username admin --password admin123 --output profiles.xml
427
+ onvif ptz GetConfigurations --host 192.168.1.17 --port 8000 --username admin --password admin123 --output ptz_config.txt --debug
413
428
 
414
429
  # Interactive mode
415
430
  onvif --host 192.168.1.17 --port 8000 --username admin --password admin123 --interactive
@@ -428,7 +443,7 @@ Examples:
428
443
  <summary><b>2. Interactive Shell</b></summary>
429
444
 
430
445
  ```bash
431
- ONVIF Interactive Shell — v0.2.4
446
+ ONVIF Interactive Shell — v0.2.6
432
447
  https://github.com/nirsimetri/onvif-python
433
448
 
434
449
  Basic Commands:
@@ -636,7 +651,11 @@ onvif <service> <method> [parameters...] -H <host> -P <port> -u <user> -p <pass>
636
651
  onvif devicemgmt GetCapabilities Category=All -H 192.168.1.17 -P 8000 -u admin -p admin123
637
652
 
638
653
  # Move a PTZ camera
639
- onvif ptz ContinuousMove ProfileToken=Profile_1 Velocity='{"PanTilt": {"x": 0.1}}' -H 192.168.1.17 -P 8000 -u admin -p admin123
654
+ onvif ptz ContinuousMove ProfileToken=Profile_1 Velocity='{"PanTilt": {"x": 0.1, "y": 0}}' -H 192.168.1.17 -P 8000 -u admin -p admin123
655
+
656
+ # Save output to file
657
+ onvif devicemgmt GetDeviceInformation --host 192.168.1.17 --port 8000 --username admin --password admin123 --output device_info.json
658
+ onvif media GetProfiles -H 192.168.1.17 -P 8000 -u admin -p admin123 -o profiles.xml
640
659
  ```
641
660
 
642
661
  **4. ONVIF Product Search**
@@ -1152,13 +1171,11 @@ Some ONVIF services have multiple bindings in the same WSDL. These typically inc
1152
1171
  - [ ] Add more usage examples for advanced features.
1153
1172
  - [ ] Add benchmarking and performance metrics.
1154
1173
  - [ ] Add community-contributed device configuration templates.
1155
- - [ ] Implement missing or partial ONVIF services.
1156
- - [ ] Add function to expose ONVIF devices (for debugging purposes by the community).
1157
1174
 
1158
1175
  ## Related Projects
1159
1176
 
1160
1177
  - [onvif-products-directory](https://github.com/nirsimetri/onvif-products-directory):
1161
- This project is a comprehensive ONVIF data aggregation and management suite, designed to help developers explore, analyze, and process ONVIF-compliant product information from hundreds of manufacturers worldwide. It provides a unified structure for device, client, and company data, making it easier to perform research, build integrations, and generate statistics for ONVIF ecosystem analysis.
1178
+ This project is a comprehensive ONVIF data aggregation and management suite, designed to help developers explore, analyze, and process ONVIF-compliant product information from hundreds of manufacturers worldwide.
1162
1179
 
1163
1180
  - (soon) [onvif-rest-server](https://github.com/nirsimetri/onvif-rest-server):
1164
1181
  A RESTful API server for ONVIF devices, enabling easy integration of ONVIF device management, media streaming, and other capabilities into web applications and services.
@@ -1,10 +1,10 @@
1
- onvif/__init__.py,sha256=JYjHyKme5ou0I63dBnArAwN1rAIFalHXv_AgIgLgT-Y,499
1
+ onvif/__init__.py,sha256=0wZNZnISPA9kZQ0J2UIDHCTvfHKDPgupHM32WTJeKLw,463
2
2
  onvif/client.py,sha256=_G00dKSvRkLKq5tDGm4XS_3fhSE3WJtYckK9WVzNj9c,27703
3
3
  onvif/operator.py,sha256=fBaoWYC3ZVFdgd2S_cmztWiLAA-HaWwSflq278YNlTs,13970
4
4
  onvif/cli/__init__.py,sha256=y3hc-mo-Iwwxf8m5vo9P_0m2ISzGuOy-jaRPkdRY05A,68
5
5
  onvif/cli/__main__.py,sha256=IZyZcevWVKE1BzdFY53a3MjOOfybncGVVXQ_7lZ3TOQ,165
6
- onvif/cli/interactive.py,sha256=wCRoqf0zqitxMiy7Qgrf_7fg7PD5tFk71zLnvMsvcxA,59756
7
- onvif/cli/main.py,sha256=atXPXrRif_FMg4RFf4GYeYx-POX4xYs4hFLGZU9l50s,27312
6
+ onvif/cli/interactive.py,sha256=8_B-IQ-0Sf7c08gTxqMH1JAhcdCp2mOAq1Sdh7xP4iU,59756
7
+ onvif/cli/main.py,sha256=sxJz2IgACnqxh0l3fJDQ0W65Cu2Ju1EDusip87-CHW4,35751
8
8
  onvif/cli/utils.py,sha256=o3lGeJ3yCgaINgXiq7wF0wB9KlR1qpvhNrW92onP4B4,60477
9
9
  onvif/db/companies.db,sha256=yJ8bSHfGpxNnA5NRBhYOFS_1Pix-KgH8GnUFV3ytzPo,270336
10
10
  onvif/db/products.db,sha256=4BVPfy6i6pLMLQyfue238uRp6_NIDodu4QXd9iCoooY,81559552
@@ -17,12 +17,12 @@ onvif/services/appmgmt.py,sha256=x4T5H0jJCScCuVCN8fyVdZyg1cnBKpRnVdo9eaPY2sg,155
17
17
  onvif/services/authenticationbehavior.py,sha256=sxyy23VuVbyp6eIMQAqirVRzjszaZ6S8J7yHoD6IT6U,3560
18
18
  onvif/services/credential.py,sha256=0FdumDUdF5ztlNYXRTLb4b8B1-82F2Hk98spm37igV8,5734
19
19
  onvif/services/deviceio.py,sha256=BZd3mlGhApFuj8jSpsjCvKdN0V2dknYs7kVL6p5QR-A,6028
20
- onvif/services/devicemgmt.py,sha256=5XGRcsYjGfA36F6NgrT1CSw6TZPaVbkgLeQprtcG0rw,14358
20
+ onvif/services/devicemgmt.py,sha256=71mrQ7V8I4Ysemg9cOGZdqALgLNS5rab7LYR1r5NRi0,14469
21
21
  onvif/services/display.py,sha256=1XNTj1Gjq_9H7QWJqsilZNVaW4EIPdEAMmM4cXzh4bQ,2424
22
22
  onvif/services/doorcontrol.py,sha256=krx5R_iS-YKTvTDilp-3IQExPo3y5WdcVe9k0AXLsLo,3171
23
23
  onvif/services/imaging.py,sha256=LZcpDpDvVGQjYz14pcIfju2RIq23l3Fl-1C9OOYvubI,2519
24
24
  onvif/services/media.py,sha256=uhY2jLvbh1ewYMAGRNv_jXS7Y-k7wHsEgHIKo1D0x2k,15513
25
- onvif/services/media2.py,sha256=byFdwDkfoV2wKgTaT3ujKiac8h_qWO-5kRiATkKwK4U,11070
25
+ onvif/services/media2.py,sha256=zHVWhyRMa2b56Ii4VLCQYtE5I-3FSmsZyC3d61rF_u0,11737
26
26
  onvif/services/provisioning.py,sha256=SAK-TWBjhvQsadgN1ykt41UXU7fIXF2refcWOjVAjY4,2087
27
27
  onvif/services/ptz.py,sha256=6TxdD-g0EKSczLoLK-y0GO5XZ4-ax03Q8lFolS9RH9w,6342
28
28
  onvif/services/receiver.py,sha256=xyVmnPpGKHxenTcAGYkGm7bApP7hkVAc6JW-32mUQv8,1820
@@ -68,7 +68,7 @@ onvif/wsdl/ver10/search.wsdl,sha256=XryLMEVa4MwbDBbMDYcDkJ5HpSQe8HZAOo5XZ-FE1Qw,
68
68
  onvif/wsdl/ver10/accesscontrol/wsdl/index.html,sha256=Z_UrJjF4N239VPl7waRb1eTGyk5i5-aFLbbKNjSYwd8,126
69
69
  onvif/wsdl/ver10/accessrules/wsdl/accessrules.wsdl,sha256=0S5zNwrYrVrzEDVwPjE6l1Uwt9ps1nOl2cOypocHpng,30010
70
70
  onvif/wsdl/ver10/accessrules/wsdl/index.html,sha256=5lqKqf1y9W0B5zNuWsN1y8x_V2nAV8l5ytdDNfs56Do,113
71
- onvif/wsdl/ver10/advancedsecurity/wsdl/advancedsecurity.wsdl,sha256=I82XYAuhMRNwGpAeOl7gdTbQ5MoNqcSB7ndD7Wuix8I,197690
71
+ onvif/wsdl/ver10/advancedsecurity/wsdl/advancedsecurity.wsdl,sha256=HuFCKCSAhflRTlWoZRlSpK2_GpQ8GwysFIAkxZfVfEc,197887
72
72
  onvif/wsdl/ver10/advancedsecurity/wsdl/index.html,sha256=MA1CUtes6XUvYfsVGpmslKSENeSiEgqUHMwOsLt9fck,118
73
73
  onvif/wsdl/ver10/appmgmt/wsdl/appmgmt.wsdl,sha256=hFkm8zMgLBy3XpXNQM1R8wPecFoKSmW3sFncFlPyDHM,24676
74
74
  onvif/wsdl/ver10/appmgmt/wsdl/index.html,sha256=TiH4sPOslNi2H-5XSmMWcNItjsevyhuTrQO-I_CC4WM,109
@@ -76,7 +76,7 @@ onvif/wsdl/ver10/authenticationbehavior/wsdl/authenticationbehavior.wsdl,sha256=
76
76
  onvif/wsdl/ver10/authenticationbehavior/wsdl/index.html,sha256=bJLmkfHuSuQHjIm3UIkMaJJ0tkT5ZsM8QBwhB6u57H0,124
77
77
  onvif/wsdl/ver10/credential/wsdl/credential.wsdl,sha256=WGAjT4x6iNykOJyCqrAFzavmxBcCbSZsp0BnyP24tg8,85719
78
78
  onvif/wsdl/ver10/credential/wsdl/index.html,sha256=idxTLpugvoWrJDS9B2tN27g66ZsdPoWaXYynlpql0EQ,112
79
- onvif/wsdl/ver10/device/wsdl/devicemgmt.wsdl,sha256=i67llntHj9tKJrGt29FHGdVl4o-GsCaWtcNboRCVW9o,188428
79
+ onvif/wsdl/ver10/device/wsdl/devicemgmt.wsdl,sha256=uOoJ9lKSW4z8NZ2zf4FOKr2w5NhkMKt3gmQDgg72bPc,190861
80
80
  onvif/wsdl/ver10/display/display.wsdl,sha256=Ac4MKiBhskPVIh3HvaPA0wUcaZojyDuye62h9TdG0_M,20747
81
81
  onvif/wsdl/ver10/display/wsdl/index.htm,sha256=Ac4MKiBhskPVIh3HvaPA0wUcaZojyDuye62h9TdG0_M,20747
82
82
  onvif/wsdl/ver10/doorcontrol/wsdl/index.html,sha256=OBz9e4EiEJDDBri1bgppnxhREN1-Um7Q9QhdSGLdiJI,124
@@ -92,8 +92,8 @@ onvif/wsdl/ver10/provisioning/wsdl/provisioning.wsdl,sha256=l5gElFQQp7nLPDZ9Zkjj
92
92
  onvif/wsdl/ver10/schedule/wsdl/index.html,sha256=PoHypOFmhjvH8OkZUzWwl_IEBMCrVtXm-y_dKJ0cKog,110
93
93
  onvif/wsdl/ver10/schedule/wsdl/schedule.wsdl,sha256=nAkZMKIImsUp6uK5_Vc53VC4sTrUsaU88BNNdQTaXR8,56036
94
94
  onvif/wsdl/ver10/schema/common.xsd,sha256=4uMtegaEf6PGeG29C_Ifm3a3ef-scDJbXsh7ry0Nb9k,18659
95
- onvif/wsdl/ver10/schema/metadatastream.xsd,sha256=DyHIDS_MLZpr4MRCiJ7e7MrLVpfx8zQGi8f-N9dhV_E,25772
96
- onvif/wsdl/ver10/schema/onvif.xsd,sha256=lCzajbbHhM350D3Hw4RLvf71Zj8tpecjVOZZgOmrBsU,397467
95
+ onvif/wsdl/ver10/schema/metadatastream.xsd,sha256=jFVg0SNDHUBa48fLG0DpwcOo2SGf9Xf6u0JCfp_icuQ,25841
96
+ onvif/wsdl/ver10/schema/onvif.xsd,sha256=8MJRH1IdsfKtXs5G0qe-eVDzLlzeYxbgR1q3_EeIA6w,408061
97
97
  onvif/wsdl/ver10/thermal/wsdl/index.html,sha256=_IdT_ariTD2VNurydgZw88LwB6pxLalZ6eU6yg0bYKU,109
98
98
  onvif/wsdl/ver10/thermal/wsdl/thermal.wsdl,sha256=gGv4JTEYwtXW7RS2JEq2t73o26j-dvdfrRis_RlQBGE,33353
99
99
  onvif/wsdl/ver10/topics/topicns.xml,sha256=W8fnvV5MgGUehItXxNbMAQnkzQfUdLMe79uF9FqEq9U,2008
@@ -108,15 +108,15 @@ onvif/wsdl/ver20/analytics/wsdl/analytics.wsdl,sha256=zAkRc3HJR5Gy0brmEJcPdqdkv3
108
108
  onvif/wsdl/ver20/analytics/wsdl/index.html,sha256=1ylR91EUE7Rls3WsEZiJSVl7vQcu0N5rsrcHvS6B32E,111
109
109
  onvif/wsdl/ver20/imaging/wsdl/imaging.wsdl,sha256=gbNeJbtLYzA0RAoNY0kr2T8G4rnPDsQA9LFFwRvZRKg,26153
110
110
  onvif/wsdl/ver20/media/wsdl/index.html,sha256=Brecp_D7gpnotiLYNZeEb9mSHr9IXDFFNY2XY8Djefg,107
111
- onvif/wsdl/ver20/media/wsdl/media.wsdl,sha256=ZkQPSYRqfRYqR5NVnVaIy_Efcz85XSmC1s9GGW9Es_U,135176
111
+ onvif/wsdl/ver20/media/wsdl/media.wsdl,sha256=DQItUaVekLRkrceB1jTsVo-Omqaz4QIYSbs0LaemKbM,142353
112
112
  onvif/wsdl/ver20/ptz/wsdl/ptz.wsdl,sha256=jkS0UPSv0znv2zcCV0QC73OPt3KHpoDKIcBSnd4snqQ,60601
113
113
  onvif/wsdl/ver20/util/federated_search_documentation.html,sha256=GR6a4SPBsRDisaWRoajGLMJOd6LCjyyeghMyy7ebcyQ,86523
114
114
  onvif/wsdl/ver20/util/fedsearch-docu-viewer.xsl,sha256=8eP-uMZgsTtuU5WaVyCzs_DJZqWIFD7iRz_5-3ComPg,325
115
115
  onvif/wsdl/ver20/util/onvif-wsdl-viewer.xsl,sha256=Emauxs6rh69IxlxlU3k_LEH_i3SsRbwIKUk-VcMlVgk,94525
116
116
  onvif/wsdl/ver20/util/operationIndex.html,sha256=mUsAGgNUFCIQjVV9Rx_O5YUNW3EdWNhUkAbBY-xVMhQ,39290
117
- onvif_python-0.2.4.dist-info/licenses/LICENSE.md,sha256=ya8FumJeUkFWwCMkG9KdMxHWRWMNhtI3vHzzAWPQS8s,1091
118
- onvif_python-0.2.4.dist-info/METADATA,sha256=BL1P0TDO26TwYU0a0qyzYSs2a19lGy61GVZo4jKYwvQ,59944
119
- onvif_python-0.2.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
120
- onvif_python-0.2.4.dist-info/entry_points.txt,sha256=7xUdI64yzWh7YfNPQDKCW9cT8XIgWuNCloikP9-yjqY,46
121
- onvif_python-0.2.4.dist-info/top_level.txt,sha256=MqCi1uJmIvtVFJDz2IxLbpwq6FwDtWhqrWQtKwLaQg4,6
122
- onvif_python-0.2.4.dist-info/RECORD,,
117
+ onvif_python-0.2.6.dist-info/licenses/LICENSE.md,sha256=ya8FumJeUkFWwCMkG9KdMxHWRWMNhtI3vHzzAWPQS8s,1091
118
+ onvif_python-0.2.6.dist-info/METADATA,sha256=xqtYGkn1MjrjEarbJaN8TH57rJDmfUNAnJuYpqfVfpg,62247
119
+ onvif_python-0.2.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
120
+ onvif_python-0.2.6.dist-info/entry_points.txt,sha256=7xUdI64yzWh7YfNPQDKCW9cT8XIgWuNCloikP9-yjqY,46
121
+ onvif_python-0.2.6.dist-info/top_level.txt,sha256=MqCi1uJmIvtVFJDz2IxLbpwq6FwDtWhqrWQtKwLaQg4,6
122
+ onvif_python-0.2.6.dist-info/RECORD,,