onvif-python 0.0.5__tar.gz → 0.0.6__tar.gz

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.
Files changed (120) hide show
  1. {onvif_python-0.0.5/onvif_python.egg-info → onvif_python-0.0.6}/PKG-INFO +11 -8
  2. {onvif_python-0.0.5 → onvif_python-0.0.6}/README.md +6 -5
  3. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/client.py +42 -34
  4. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/operator.py +2 -0
  5. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/accesscontrol.py +5 -0
  6. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/accessrules.py +5 -0
  7. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/actionengine.py +5 -0
  8. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/analytics/analytics.py +5 -0
  9. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/analytics/ruleengine.py +5 -0
  10. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/analyticsdevice.py +4 -3
  11. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/appmgmt.py +5 -0
  12. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/authenticationbehavior.py +5 -0
  13. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/credential.py +5 -0
  14. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/deviceio.py +5 -0
  15. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/devicemgmt.py +5 -0
  16. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/display.py +5 -0
  17. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/doorcontrol.py +5 -0
  18. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/events/events.py +5 -0
  19. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/events/notification.py +4 -0
  20. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/events/pullpoint.py +4 -0
  21. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/events/subscription.py +4 -0
  22. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/imaging.py +6 -1
  23. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/media.py +5 -0
  24. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/media2.py +5 -0
  25. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/provisioning.py +5 -0
  26. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/ptz.py +5 -0
  27. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/receiver.py +5 -0
  28. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/recording.py +5 -0
  29. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/replay.py +5 -0
  30. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/schedule.py +5 -0
  31. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/search.py +5 -0
  32. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/security/advancedsecurity.py +5 -0
  33. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/security/authorizationserver.py +5 -0
  34. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/security/dot1x.py +5 -0
  35. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/security/jwt.py +5 -0
  36. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/security/keystore.py +5 -0
  37. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/security/mediasigning.py +5 -0
  38. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/security/tlsserver.py +5 -0
  39. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/thermal.py +5 -0
  40. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/uplink.py +5 -0
  41. onvif_python-0.0.6/onvif/utils/__init__.py +5 -0
  42. onvif_python-0.0.6/onvif/utils/xml_capture.py +110 -0
  43. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/utils/zeep.py +32 -18
  44. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/schema/onvif.xsd +1 -0
  45. {onvif_python-0.0.5 → onvif_python-0.0.6/onvif_python.egg-info}/PKG-INFO +11 -8
  46. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif_python.egg-info/SOURCES.txt +1 -0
  47. {onvif_python-0.0.5 → onvif_python-0.0.6}/pyproject.toml +5 -3
  48. onvif_python-0.0.5/onvif/utils/__init__.py +0 -4
  49. {onvif_python-0.0.5 → onvif_python-0.0.6}/LICENSE.md +0 -0
  50. {onvif_python-0.0.5 → onvif_python-0.0.6}/MANIFEST.in +0 -0
  51. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/__init__.py +0 -0
  52. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/services/__init__.py +0 -0
  53. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/utils/exceptions.py +0 -0
  54. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/utils/wsdl.py +0 -0
  55. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/accesscontrol/wsdl/index.html +0 -0
  56. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/accessrules/wsdl/accessrules.wsdl +0 -0
  57. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/accessrules/wsdl/index.html +0 -0
  58. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/actionengine.wsdl +0 -0
  59. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/advancedsecurity/wsdl/advancedsecurity.wsdl +0 -0
  60. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/advancedsecurity/wsdl/index.html +0 -0
  61. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/analyticsdevice.wsdl +0 -0
  62. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/appmgmt/wsdl/appmgmt.wsdl +0 -0
  63. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/appmgmt/wsdl/index.html +0 -0
  64. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/authenticationbehavior/wsdl/authenticationbehavior.wsdl +0 -0
  65. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/authenticationbehavior/wsdl/index.html +0 -0
  66. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/credential/wsdl/credential.wsdl +0 -0
  67. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/credential/wsdl/index.html +0 -0
  68. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/device/wsdl/devicemgmt.wsdl +0 -0
  69. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/deviceio.wsdl +0 -0
  70. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/display/display.wsdl +0 -0
  71. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/display/wsdl/index.htm +0 -0
  72. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/display.wsdl +0 -0
  73. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/doorcontrol/wsdl/index.html +0 -0
  74. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/events/wsdl/bw-2-vs-mod.wsdl +0 -0
  75. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/events/wsdl/event-vs.wsdl +0 -0
  76. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/events/wsdl/event.wsdl +0 -0
  77. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/events/wsdl/index.html +0 -0
  78. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/federatedsearch.wsdl +0 -0
  79. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/media/wsdl/media.wsdl +0 -0
  80. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/pacs/accesscontrol.wsdl +0 -0
  81. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/pacs/doorcontrol.wsdl +0 -0
  82. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/pacs/types.xsd +0 -0
  83. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/provisioning/wsdl/provisioning.wsdl +0 -0
  84. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/receiver.wsdl +0 -0
  85. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/recording.wsdl +0 -0
  86. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/replay.wsdl +0 -0
  87. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/schedule/wsdl/index.html +0 -0
  88. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/schedule/wsdl/schedule.wsdl +0 -0
  89. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/schema/common.xsd +0 -0
  90. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/schema/metadatastream.xsd +0 -0
  91. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/search.wsdl +0 -0
  92. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/thermal/wsdl/index.html +0 -0
  93. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/thermal/wsdl/thermal.wsdl +0 -0
  94. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/topics/topicns.xml +0 -0
  95. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/uplink/wsdl/index.html +0 -0
  96. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver10/uplink/wsdl/uplink.wsdl +0 -0
  97. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver20/analytics/humanbody.xsd +0 -0
  98. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver20/analytics/humanface.xsd +0 -0
  99. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver20/analytics/index.html +0 -0
  100. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver20/analytics/radiometry.xsd +0 -0
  101. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver20/analytics/rules.xsd +0 -0
  102. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver20/analytics/wsdl/analytics.wsdl +0 -0
  103. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver20/analytics/wsdl/index.html +0 -0
  104. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver20/imaging/wsdl/imaging.wsdl +0 -0
  105. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver20/media/wsdl/index.html +0 -0
  106. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver20/media/wsdl/media.wsdl +0 -0
  107. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver20/ptz/wsdl/ptz.wsdl +0 -0
  108. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver20/util/federated_search_documentation.html +0 -0
  109. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver20/util/fedsearch-docu-viewer.xsl +0 -0
  110. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver20/util/onvif-wsdl-viewer.xsl +0 -0
  111. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif/wsdl/ver20/util/operationIndex.html +0 -0
  112. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif_python.egg-info/dependency_links.txt +0 -0
  113. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif_python.egg-info/requires.txt +0 -0
  114. {onvif_python-0.0.5 → onvif_python-0.0.6}/onvif_python.egg-info/top_level.txt +0 -0
  115. {onvif_python-0.0.5 → onvif_python-0.0.6}/setup.cfg +0 -0
  116. {onvif_python-0.0.5 → onvif_python-0.0.6}/setup.py +0 -0
  117. {onvif_python-0.0.5 → onvif_python-0.0.6}/tests/test_client.py +0 -0
  118. {onvif_python-0.0.5 → onvif_python-0.0.6}/tests/test_core.py +0 -0
  119. {onvif_python-0.0.5 → onvif_python-0.0.6}/tests/test_exceptions.py +0 -0
  120. {onvif_python-0.0.5 → onvif_python-0.0.6}/tests/test_wsdl_map.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: onvif-python
3
- Version: 0.0.5
3
+ Version: 0.0.6
4
4
  Summary: A comprehensive and developer-friendly Python library for working with ONVIF-compliant devices
5
5
  Author-email: Nirsimetri Technologies® <open@nirsimetri.com>
6
6
  Maintainer: Kaburagi
@@ -10,8 +10,8 @@ Project-URL: Issues, https://github.com/nirsimetri/onvif-python/issues
10
10
  Project-URL: Documentation, https://deepwiki.com/nirsimetri/onvif-python
11
11
  Project-URL: Repository, https://github.com/nirsimetri/onvif-python.git
12
12
  Project-URL: Changelog, https://github.com/nirsimetri/onvif-python/releases
13
- Keywords: ONVIF,onvif,Camera,onvif-python,ip-camera,cctv,soap,surveillance,cctv cameras,soap-client,onvif-client,onvif-library,onvif-specifications
14
- Classifier: Development Status :: 3 - Alpha
13
+ Keywords: onvif,Camera,onvif-python,ip-camera,cctv,soap,surveillance,cctv cameras,soap-client,onvif-client,onvif-library,onvif-specifications
14
+ Classifier: Development Status :: 5 - Production/Stable
15
15
  Classifier: Environment :: Console
16
16
  Classifier: Programming Language :: Python :: 3
17
17
  Classifier: Programming Language :: Python :: 3.9
@@ -25,7 +25,9 @@ Classifier: Topic :: Security
25
25
  Classifier: Topic :: Multimedia :: Video
26
26
  Classifier: Topic :: Multimedia :: Sound/Audio
27
27
  Classifier: Topic :: Communications
28
+ Classifier: Topic :: Text Processing :: Markup :: XML
28
29
  Classifier: Natural Language :: English
30
+ Classifier: Natural Language :: Indonesian
29
31
  Requires-Python: >=3.9
30
32
  Description-Content-Type: text/markdown
31
33
  License-File: LICENSE.md
@@ -41,9 +43,9 @@ Dynamic: license-file
41
43
 
42
44
  [![License](https://img.shields.io/badge/License-MIT-blue)](https://github.com/nirsimetri/onvif-python?tab=MIT-1-ov-file)
43
45
  [![DeepWiki](https://img.shields.io/badge/DeepWiki-AI%20Wiki-orange)](https://deepwiki.com/nirsimetri/onvif-python)
44
- [![Release](https://img.shields.io/badge/Release-v0.0.5-red?logo=archive)](https://github.com/nirsimetri/onvif-python/releases)
46
+ [![Release](https://img.shields.io/badge/Release-v0.0.6-red?logo=archive)](https://github.com/nirsimetri/onvif-python/releases)
45
47
  <br>
46
- [![PyPI](https://img.shields.io/badge/PyPI-0.0.5-yellow?logo=archive)](https://pypi.org/project/onvif-python/)
48
+ [![PyPI](https://img.shields.io/badge/PyPI-0.0.6-yellow?logo=archive)](https://pypi.org/project/onvif-python/)
47
49
  [![Downloads](https://img.shields.io/pypi/dm/onvif-python?label=PyPI%20Downloads)](https://clickpy.clickhouse.com/dashboard/onvif-python)
48
50
 
49
51
  Are you having trouble finding a Python ONVIF library that supports your device?
@@ -358,11 +360,12 @@ Some ONVIF services have multiple bindings in the same WSDL. These typically inc
358
360
 
359
361
  ## Future Improvements (Stay tuned and star ⭐ this repo)
360
362
 
361
- - [ ] Add ONVIF CLI program to interact directly with ONVIF devices via terminal.
363
+ - [x] Add debugging mode with raw xml on SOAP requests and responses. ([c258162](https://github.com/nirsimetri/onvif-python/commit/c258162))
364
+ - [ ] Add functionality for `ONVIFClient` to accept a custom `wsdl_path` service.
365
+ - [ ] Add asynchronous (async/await) support for non-blocking ONVIF operations and concurrent device communication.
366
+ - [ ] Add `ONVIF CLI` program to interact directly with ONVIF devices via terminal.
362
367
  - [ ] Implement structured data models for ONVIF Schemas using [xsdata](https://github.com/tefra/xsdata).
363
368
  - [ ] Integrate [xmltodict](https://github.com/martinblech/xmltodict) for simplified XML parsing and conversion.
364
- - [ ] Add functionality for `ONVIFClient` to accept a custom `wsdl_path` service.
365
- - [ ] Add debugging mode with raw xml on SOAP requests and responses.
366
369
  - [ ] Enhance documentation with API references and diagrams (not from [AI Wiki](https://deepwiki.com/nirsimetri/onvif-python)).
367
370
  - [ ] Add more usage examples for advanced features.
368
371
  - [ ] Add benchmarking and performance metrics.
@@ -2,9 +2,9 @@
2
2
 
3
3
  [![License](https://img.shields.io/badge/License-MIT-blue)](https://github.com/nirsimetri/onvif-python?tab=MIT-1-ov-file)
4
4
  [![DeepWiki](https://img.shields.io/badge/DeepWiki-AI%20Wiki-orange)](https://deepwiki.com/nirsimetri/onvif-python)
5
- [![Release](https://img.shields.io/badge/Release-v0.0.5-red?logo=archive)](https://github.com/nirsimetri/onvif-python/releases)
5
+ [![Release](https://img.shields.io/badge/Release-v0.0.6-red?logo=archive)](https://github.com/nirsimetri/onvif-python/releases)
6
6
  <br>
7
- [![PyPI](https://img.shields.io/badge/PyPI-0.0.5-yellow?logo=archive)](https://pypi.org/project/onvif-python/)
7
+ [![PyPI](https://img.shields.io/badge/PyPI-0.0.6-yellow?logo=archive)](https://pypi.org/project/onvif-python/)
8
8
  [![Downloads](https://img.shields.io/pypi/dm/onvif-python?label=PyPI%20Downloads)](https://clickpy.clickhouse.com/dashboard/onvif-python)
9
9
 
10
10
  Are you having trouble finding a Python ONVIF library that supports your device?
@@ -319,11 +319,12 @@ Some ONVIF services have multiple bindings in the same WSDL. These typically inc
319
319
 
320
320
  ## Future Improvements (Stay tuned and star ⭐ this repo)
321
321
 
322
- - [ ] Add ONVIF CLI program to interact directly with ONVIF devices via terminal.
322
+ - [x] Add debugging mode with raw xml on SOAP requests and responses. ([c258162](https://github.com/nirsimetri/onvif-python/commit/c258162))
323
+ - [ ] Add functionality for `ONVIFClient` to accept a custom `wsdl_path` service.
324
+ - [ ] Add asynchronous (async/await) support for non-blocking ONVIF operations and concurrent device communication.
325
+ - [ ] Add `ONVIF CLI` program to interact directly with ONVIF devices via terminal.
323
326
  - [ ] Implement structured data models for ONVIF Schemas using [xsdata](https://github.com/tefra/xsdata).
324
327
  - [ ] Integrate [xmltodict](https://github.com/martinblech/xmltodict) for simplified XML parsing and conversion.
325
- - [ ] Add functionality for `ONVIFClient` to accept a custom `wsdl_path` service.
326
- - [ ] Add debugging mode with raw xml on SOAP requests and responses.
327
328
  - [ ] Enhance documentation with API references and diagrams (not from [AI Wiki](https://deepwiki.com/nirsimetri/onvif-python)).
328
329
  - [ ] Add more usage examples for advanced features.
329
330
  - [ ] Add benchmarking and performance metrics.
@@ -46,6 +46,7 @@ from .utils.zeep import (
46
46
  remove_patch as _remove_zeep_patch,
47
47
  )
48
48
  from .utils.wsdl import ONVIFWSDL
49
+ from .utils.xml_capture import XMLCapturePlugin
49
50
 
50
51
 
51
52
  class ONVIFClient:
@@ -60,6 +61,7 @@ class ONVIFClient:
60
61
  use_https=False,
61
62
  verify_ssl=True,
62
63
  apply_patch=True,
64
+ capture_xml=False,
63
65
  ):
64
66
  self.apply_patch = apply_patch
65
67
 
@@ -69,6 +71,12 @@ class ONVIFClient:
69
71
  else:
70
72
  _remove_zeep_patch()
71
73
 
74
+ # Initialize XML capture plugin if requested
75
+ self.xml_plugin = None
76
+ if capture_xml:
77
+ self.xml_plugin = XMLCapturePlugin()
78
+
79
+ # Pass to ONVIFOperator
72
80
  self.common_args = {
73
81
  "host": host,
74
82
  "port": port,
@@ -78,7 +86,8 @@ class ONVIFClient:
78
86
  "cache": cache,
79
87
  "use_https": use_https,
80
88
  "verify_ssl": verify_ssl,
81
- "apply_flatten": apply_patch, # Pass to ONVIFOperator
89
+ "apply_flatten": apply_patch,
90
+ "plugins": [self.xml_plugin] if self.xml_plugin else None,
82
91
  }
83
92
 
84
93
  # Device Management (Core) service is always available
@@ -161,15 +170,14 @@ class ONVIFClient:
161
170
  try:
162
171
  # Try to get the service definition from WSDL_MAP
163
172
  # Most services use ver10, some use ver20
164
- service_key = service_name.lower()
165
173
  wsdl_def = None
166
174
 
167
175
  # Try ver10 first, then ver20
168
- if service_key in ONVIFWSDL.WSDL_MAP:
169
- if "ver10" in ONVIFWSDL.WSDL_MAP[service_key]:
170
- wsdl_def = ONVIFWSDL.WSDL_MAP[service_key]["ver10"]
171
- elif "ver20" in ONVIFWSDL.WSDL_MAP[service_key]:
172
- wsdl_def = ONVIFWSDL.WSDL_MAP[service_key]["ver20"]
176
+ if service_name in ONVIFWSDL.WSDL_MAP:
177
+ if "ver10" in ONVIFWSDL.WSDL_MAP[service_name]:
178
+ wsdl_def = ONVIFWSDL.WSDL_MAP[service_name]["ver10"]
179
+ elif "ver20" in ONVIFWSDL.WSDL_MAP[service_name]:
180
+ wsdl_def = ONVIFWSDL.WSDL_MAP[service_name]["ver20"]
173
181
 
174
182
  if wsdl_def:
175
183
  namespace = wsdl_def["namespace"]
@@ -208,7 +216,7 @@ class ONVIFClient:
208
216
  def events(self):
209
217
  if self._events is None:
210
218
  self._events = Events(
211
- xaddr=self._get_xaddr("Events", "Events"), **self.common_args
219
+ xaddr=self._get_xaddr("events", "Events"), **self.common_args
212
220
  )
213
221
  return self._events
214
222
 
@@ -235,7 +243,7 @@ class ONVIFClient:
235
243
  def notification(self):
236
244
  if self._notification is None:
237
245
  self._notification = Notification(
238
- xaddr=self._get_xaddr("Events", "Events"), **self.common_args
246
+ xaddr=self._get_xaddr("notification", "Events"), **self.common_args
239
247
  )
240
248
  return self._notification
241
249
 
@@ -264,7 +272,7 @@ class ONVIFClient:
264
272
  def imaging(self):
265
273
  if self._imaging is None:
266
274
  self._imaging = Imaging(
267
- xaddr=self._get_xaddr("Imaging", "Imaging"), **self.common_args
275
+ xaddr=self._get_xaddr("imaging", "Imaging"), **self.common_args
268
276
  )
269
277
  return self._imaging
270
278
 
@@ -273,14 +281,14 @@ class ONVIFClient:
273
281
  def media(self):
274
282
  if self._media is None:
275
283
  self._media = Media(
276
- xaddr=self._get_xaddr("Media", "Media"), **self.common_args
284
+ xaddr=self._get_xaddr("media", "Media"), **self.common_args
277
285
  )
278
286
  return self._media
279
287
 
280
288
  def media2(self):
281
289
  if self._media2 is None:
282
290
  self._media2 = Media2(
283
- xaddr=self._get_xaddr("Media2", "Media2"), **self.common_args
291
+ xaddr=self._get_xaddr("media2", "Media2"), **self.common_args
284
292
  )
285
293
  return self._media2
286
294
 
@@ -288,7 +296,7 @@ class ONVIFClient:
288
296
 
289
297
  def ptz(self):
290
298
  if self._ptz is None:
291
- self._ptz = PTZ(xaddr=self._get_xaddr("PTZ", "PTZ"), **self.common_args)
299
+ self._ptz = PTZ(xaddr=self._get_xaddr("ptz", "PTZ"), **self.common_args)
292
300
  return self._ptz
293
301
 
294
302
  # DeviceIO
@@ -296,7 +304,7 @@ class ONVIFClient:
296
304
  def deviceio(self):
297
305
  if self._deviceio is None:
298
306
  self._deviceio = DeviceIO(
299
- xaddr=self._get_xaddr("DeviceIO", "DeviceIO"), **self.common_args
307
+ xaddr=self._get_xaddr("deviceio", "DeviceIO"), **self.common_args
300
308
  )
301
309
  return self._deviceio
302
310
 
@@ -305,7 +313,7 @@ class ONVIFClient:
305
313
  def display(self):
306
314
  if self._display is None:
307
315
  self._display = Display(
308
- xaddr=self._get_xaddr("Display", "Display"), **self.common_args
316
+ xaddr=self._get_xaddr("display", "Display"), **self.common_args
309
317
  )
310
318
  return self._display
311
319
 
@@ -314,21 +322,21 @@ class ONVIFClient:
314
322
  def analytics(self):
315
323
  if self._analytics is None:
316
324
  self._analytics = Analytics(
317
- xaddr=self._get_xaddr("Analytics", "Analytics"), **self.common_args
325
+ xaddr=self._get_xaddr("analytics", "Analytics"), **self.common_args
318
326
  )
319
327
  return self._analytics
320
328
 
321
329
  def ruleengine(self):
322
330
  if self._ruleengine is None:
323
331
  self._ruleengine = RuleEngine(
324
- xaddr=self._get_xaddr("Analytics", "Analytics"), **self.common_args
332
+ xaddr=self._get_xaddr("ruleengine", "Analytics"), **self.common_args
325
333
  )
326
334
  return self._ruleengine
327
335
 
328
336
  def analyticsdevice(self):
329
337
  if self._analyticsdevice is None:
330
338
  self._analyticsdevice = AnalyticsDevice(
331
- xaddr=self._get_xaddr("AnalyticsDevice", "AnalyticsDevice"),
339
+ xaddr=self._get_xaddr("analyticsdevice", "AnalyticsDevice"),
332
340
  **self.common_args,
333
341
  )
334
342
  return self._analyticsdevice
@@ -338,7 +346,7 @@ class ONVIFClient:
338
346
  def accesscontrol(self):
339
347
  if self._accesscontrol is None:
340
348
  self._accesscontrol = AccessControl(
341
- xaddr=self._get_xaddr("AccessControl", "AccessControl"),
349
+ xaddr=self._get_xaddr("accesscontrol", "AccessControl"),
342
350
  **self.common_args,
343
351
  )
344
352
  return self._accesscontrol
@@ -346,7 +354,7 @@ class ONVIFClient:
346
354
  def doorcontrol(self):
347
355
  if self._doorcontrol is None:
348
356
  self._doorcontrol = DoorControl(
349
- xaddr=self._get_xaddr("DoorControl", "DoorControl"), **self.common_args
357
+ xaddr=self._get_xaddr("doorcontrol", "DoorControl"), **self.common_args
350
358
  )
351
359
  return self._doorcontrol
352
360
 
@@ -355,7 +363,7 @@ class ONVIFClient:
355
363
  def accessrules(self):
356
364
  if self._accessrules is None:
357
365
  self._accessrules = AccessRules(
358
- xaddr=self._get_xaddr("AccessRules", "AccessRules"), **self.common_args
366
+ xaddr=self._get_xaddr("accessrules", "AccessRules"), **self.common_args
359
367
  )
360
368
  return self._accessrules
361
369
 
@@ -364,7 +372,7 @@ class ONVIFClient:
364
372
  def actionengine(self):
365
373
  if self._actionengine is None:
366
374
  self._actionengine = ActionEngine(
367
- xaddr=self._get_xaddr("ActionEngine", "ActionEngine"),
375
+ xaddr=self._get_xaddr("actionengine", "ActionEngine"),
368
376
  **self.common_args,
369
377
  )
370
378
  return self._actionengine
@@ -374,7 +382,7 @@ class ONVIFClient:
374
382
  def appmanagement(self):
375
383
  if self._appmanagement is None:
376
384
  self._appmanagement = AppManagement(
377
- xaddr=self._get_xaddr("AppManagement", "AppManagement"),
385
+ xaddr=self._get_xaddr("appmgmt", "AppManagement"),
378
386
  **self.common_args,
379
387
  )
380
388
  return self._appmanagement
@@ -385,7 +393,7 @@ class ONVIFClient:
385
393
  if self._authenticationbehavior is None:
386
394
  self._authenticationbehavior = AuthenticationBehavior(
387
395
  xaddr=self._get_xaddr(
388
- "AuthenticationBehavior", "AuthenticationBehavior"
396
+ "authenticationbehavior", "AuthenticationBehavior"
389
397
  ),
390
398
  **self.common_args,
391
399
  )
@@ -396,7 +404,7 @@ class ONVIFClient:
396
404
  def credential(self):
397
405
  if self._credential is None:
398
406
  self._credential = Credential(
399
- xaddr=self._get_xaddr("Credential", "Credential"),
407
+ xaddr=self._get_xaddr("credential", "Credential"),
400
408
  **self.common_args,
401
409
  )
402
410
  return self._credential
@@ -406,7 +414,7 @@ class ONVIFClient:
406
414
  def recording(self):
407
415
  if self._recording is None:
408
416
  self._recording = Recording(
409
- xaddr=self._get_xaddr("Recording", "Recording"),
417
+ xaddr=self._get_xaddr("recording", "Recording"),
410
418
  **self.common_args,
411
419
  )
412
420
  return self._recording
@@ -416,7 +424,7 @@ class ONVIFClient:
416
424
  def replay(self):
417
425
  if self._replay is None:
418
426
  self._replay = Replay(
419
- xaddr=self._get_xaddr("Replay", "Replay"),
427
+ xaddr=self._get_xaddr("replay", "Replay"),
420
428
  **self.common_args,
421
429
  )
422
430
  return self._replay
@@ -426,7 +434,7 @@ class ONVIFClient:
426
434
  def provisioning(self):
427
435
  if self._provisioning is None:
428
436
  self._provisioning = Provisioning(
429
- xaddr=self._get_xaddr("Provisioning", "Provisioning"),
437
+ xaddr=self._get_xaddr("provisioning", "Provisioning"),
430
438
  **self.common_args,
431
439
  )
432
440
  return self._provisioning
@@ -436,7 +444,7 @@ class ONVIFClient:
436
444
  def receiver(self):
437
445
  if self._receiver is None:
438
446
  self._receiver = Receiver(
439
- xaddr=self._get_xaddr("Receiver", "Receiver"),
447
+ xaddr=self._get_xaddr("receiver", "Receiver"),
440
448
  **self.common_args,
441
449
  )
442
450
  return self._receiver
@@ -446,7 +454,7 @@ class ONVIFClient:
446
454
  def schedule(self):
447
455
  if self._schedule is None:
448
456
  self._schedule = Schedule(
449
- xaddr=self._get_xaddr("Schedule", "Schedule"),
457
+ xaddr=self._get_xaddr("schedule", "Schedule"),
450
458
  **self.common_args,
451
459
  )
452
460
  return self._schedule
@@ -456,7 +464,7 @@ class ONVIFClient:
456
464
  def search(self):
457
465
  if self._search is None:
458
466
  self._search = Search(
459
- xaddr=self._get_xaddr("Search", "Search"),
467
+ xaddr=self._get_xaddr("search", "SearchRecording"),
460
468
  **self.common_args,
461
469
  )
462
470
  return self._search
@@ -466,7 +474,7 @@ class ONVIFClient:
466
474
  def thermal(self):
467
475
  if self._thermal is None:
468
476
  self._thermal = Thermal(
469
- xaddr=self._get_xaddr("Thermal", "Thermal"),
477
+ xaddr=self._get_xaddr("thermal", "Thermal"),
470
478
  **self.common_args,
471
479
  )
472
480
  return self._thermal
@@ -476,7 +484,7 @@ class ONVIFClient:
476
484
  def uplink(self):
477
485
  if self._uplink is None:
478
486
  self._uplink = Uplink(
479
- xaddr=self._get_xaddr("Uplink", "Uplink"),
487
+ xaddr=self._get_xaddr("uplink", "Uplink"),
480
488
  **self.common_args,
481
489
  )
482
490
  return self._uplink
@@ -486,7 +494,7 @@ class ONVIFClient:
486
494
  def security(self):
487
495
  if self._security is None:
488
496
  self._security = AdvancedSecurity(
489
- xaddr=self._get_xaddr("Security", "Security"),
497
+ xaddr=self._get_xaddr("advancedsecurity", "Security"),
490
498
  **self.common_args,
491
499
  )
492
500
  return self._security
@@ -53,6 +53,7 @@ class ONVIFOperator:
53
53
  use_https: bool = False,
54
54
  verify_ssl: bool = True,
55
55
  apply_flatten: bool = True,
56
+ plugins: list = None,
56
57
  ):
57
58
  self.wsdl_path = wsdl_path
58
59
  self.host = host
@@ -109,6 +110,7 @@ class ONVIFOperator:
109
110
  transport=transport,
110
111
  settings=settings,
111
112
  wsse=wsse,
113
+ plugins=plugins,
112
114
  )
113
115
 
114
116
  if not binding:
@@ -6,6 +6,11 @@ from ..utils import ONVIFWSDL
6
6
 
7
7
  class AccessControl:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - ONVIF Release 2.3 (May 2013) Release Notes
11
+ # - PACSBinding (ver10/pacs/accesscontrol.wsdl)
12
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/pacs/accesscontrol.wsdl
13
+
9
14
  definition = ONVIFWSDL.get_definition("accesscontrol")
10
15
  self.operator = ONVIFOperator(
11
16
  definition["path"],
@@ -6,6 +6,11 @@ from ..utils import ONVIFWSDL
6
6
 
7
7
  class AccessRules:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - ONVIF Release 2.6 (June 2015) Release Notes
11
+ # - AccessRulesBinding (ver10/accessrules/wsdl/accessrules.wsdl)
12
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/accessrules/wsdl/accessrules.wsdl
13
+
9
14
  definition = ONVIFWSDL.get_definition("accessrules")
10
15
  self.operator = ONVIFOperator(
11
16
  definition["path"],
@@ -6,6 +6,11 @@ from ..utils import ONVIFWSDL
6
6
 
7
7
  class ActionEngine:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - ONVIF Release 2.2 (September 2012) Release Notes
11
+ # - ActionEngineBinding (ver10/actionengine.wsdl)
12
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/actionengine.wsdl
13
+
9
14
  definition = ONVIFWSDL.get_definition("actionengine")
10
15
  self.operator = ONVIFOperator(
11
16
  definition["path"],
@@ -6,6 +6,11 @@ from ...utils import ONVIFWSDL
6
6
 
7
7
  class Analytics:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - ONVIF Release 2.41 (December 2013) Release Notes
11
+ # - AnalyticsEngineBinding (ver20/analytics/wsdl/analytics.wsdl)
12
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver20/analytics/wsdl/analytics.wsdl
13
+
9
14
  definition = ONVIFWSDL.get_definition("analytics", "ver20")
10
15
  self.operator = ONVIFOperator(
11
16
  definition["path"],
@@ -6,6 +6,11 @@ from ...utils import ONVIFWSDL
6
6
 
7
7
  class RuleEngine:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - ONVIF Release 2.41 (December 2013) Release Notes
11
+ # - RuleEngineBinding (ver20/analytics/wsdl/analytics.wsdl)
12
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver20/analytics/wsdl/analytics.wsdl
13
+
9
14
  definition = ONVIFWSDL.get_definition("ruleengine", "ver20")
10
15
  self.operator = ONVIFOperator(
11
16
  definition["path"],
@@ -15,11 +15,12 @@ class AnalyticsDevice:
15
15
  # (pre-2019) that may still expose an AnalyticsDevice XAddr.
16
16
  #
17
17
  # In modern ONVIF-compliant devices, you should prefer using the Analytics
18
- # service (`onvif/services/analytics.py`). If the device does not advertise
19
- # an AnalyticsDevice capability in GetCapabilities → Extension, then calling
20
- # this class will result in SOAP faults.
18
+ # service (`onvif/services/analytics/analytics.py`). If the device does not list
19
+ # AnalyticsDevice in `GetServices` response, then this service is not available
20
+ # on the device and calling this class will result in SOAP faults.
21
21
  #
22
22
  # References:
23
+ # - Introduce in ONVIF Release 2.1 (June 2011) Split from Core 2.0
23
24
  # - ONVIF Release 18.12 (December 2018) Release Notes
24
25
  # - AnalyticsDeviceBinding (ver10/analyticsdevice.wsdl)
25
26
  # - Successor: Analytics Service (ver20/analytics/wsdl/analytics.wsdl)
@@ -6,6 +6,11 @@ from ..utils import ONVIFWSDL
6
6
 
7
7
  class AppManagement:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - ONVIF Release 19.12 (December 2019) Release Notes
11
+ # - AppManagementBinding (ver10/appmgmt/wsdl/appmgmt.wsdl)
12
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/appmgmt/wsdl/appmgmt.wsdl
13
+
9
14
  definition = ONVIFWSDL.get_definition("appmgmt")
10
15
  self.operator = ONVIFOperator(
11
16
  definition["path"],
@@ -6,6 +6,11 @@ from ..utils import ONVIFWSDL
6
6
 
7
7
  class AuthenticationBehavior:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - ONVIF Release 18.06 (June 2018) Release Notes
11
+ # - AuthenticationBehaviorBinding (ver10/authenticationbehavior/wsdl/authenticationbehavior.wsdl)
12
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/authenticationbehavior/wsdl/authenticationbehavior.wsdl
13
+
9
14
  definition = ONVIFWSDL.get_definition("authenticationbehavior")
10
15
  self.operator = ONVIFOperator(
11
16
  definition["path"],
@@ -6,6 +6,11 @@ from ..utils import ONVIFWSDL
6
6
 
7
7
  class Credential:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - ONVIF Release 2.6 (June 2015) Release Notes
11
+ # - CredentialBinding (ver10/credential/wsdl/credential.wsdl)
12
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/credential/wsdl/credential.wsdl
13
+
9
14
  definition = ONVIFWSDL.get_definition("credential")
10
15
  self.operator = ONVIFOperator(
11
16
  definition["path"],
@@ -6,6 +6,11 @@ from ..utils import ONVIFWSDL
6
6
 
7
7
  class DeviceIO:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - ONVIF Release 2.1 (June 2011) Split from Core 2.0
11
+ # - DeviceIOBinding (ver10/deviceio.wsdl)
12
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/deviceio.wsdl
13
+
9
14
  definition = ONVIFWSDL.get_definition("deviceio")
10
15
  self.operator = ONVIFOperator(
11
16
  definition["path"],
@@ -6,6 +6,11 @@ from ..utils import ONVIFWSDL
6
6
 
7
7
  class Device:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - ONVIF Core
11
+ # - DeviceBinding (ver10/device/wsdl/devicemgmt.wsdl)
12
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/device/wsdl/devicemgmt.wsdl
13
+
9
14
  definition = ONVIFWSDL.get_definition("devicemgmt")
10
15
  self.operator = ONVIFOperator(
11
16
  definition["path"],
@@ -6,6 +6,11 @@ from ..utils import ONVIFWSDL
6
6
 
7
7
  class Display:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - ONVIF Release 2.1 (June 2011) Split from Core 2.0
11
+ # - DisplayBinding (ver10/display.wsdl)
12
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/display.wsdl
13
+
9
14
  definition = ONVIFWSDL.get_definition("display")
10
15
  self.operator = ONVIFOperator(
11
16
  definition["path"],
@@ -6,6 +6,11 @@ from ..utils import ONVIFWSDL
6
6
 
7
7
  class DoorControl:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - ONVIF Release 2.3 (May 2013) Release Notes
11
+ # - DoorControlBinding (ver10/pacs/doorcontrol.wsdl)
12
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/pacs/doorcontrol.wsdl
13
+
9
14
  definition = ONVIFWSDL.get_definition("doorcontrol")
10
15
  self.operator = ONVIFOperator(
11
16
  definition["path"],
@@ -6,6 +6,11 @@ from ...utils import ONVIFWSDL
6
6
 
7
7
  class Events:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - ONVIF Core
11
+ # - EventBinding (ver10/events/wsdl/event-vs.wsdl)
12
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/events/wsdl/event.wsdl
13
+
9
14
  definition = ONVIFWSDL.get_definition("events")
10
15
  self.operator = ONVIFOperator(
11
16
  definition["path"],
@@ -6,6 +6,10 @@ from ...utils import ONVIFWSDL
6
6
 
7
7
  class Notification:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - NotificationProducerBinding (ver10/events/wsdl/event-vs.wsdl)
11
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/events/wsdl/event.wsdl
12
+
9
13
  definition = ONVIFWSDL.get_definition("notification")
10
14
  self.operator = ONVIFOperator(
11
15
  definition["path"],
@@ -6,6 +6,10 @@ from ...utils import ONVIFWSDL
6
6
 
7
7
  class PullPoint:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - PullPointSubscriptionBinding (ver10/events/wsdl/event-vs.wsdl)
11
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/events/wsdl/event.wsdl
12
+
9
13
  definition = ONVIFWSDL.get_definition("pullpoint")
10
14
  self.operator = ONVIFOperator(
11
15
  definition["path"],
@@ -6,6 +6,10 @@ from ...utils import ONVIFWSDL
6
6
 
7
7
  class Subscription:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - SubscriptionManagerBinding (ver10/events/wsdl/event-vs.wsdl)
11
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/events/wsdl/event.wsdl
12
+
9
13
  definition = ONVIFWSDL.get_definition("subscription")
10
14
  self.operator = ONVIFOperator(
11
15
  definition["path"],
@@ -6,6 +6,11 @@ from ..utils import ONVIFWSDL
6
6
 
7
7
  class Imaging:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - ONVIF Release 2.1 (June 2011) Split from Core 2.0
11
+ # - ImagingBinding (ver20/imaging/wsdl/imaging.wsdl)
12
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver20/imaging/wsdl/imaging.wsdl
13
+
9
14
  definition = ONVIFWSDL.get_definition("imaging", "ver20")
10
15
  self.operator = ONVIFOperator(
11
16
  definition["path"],
@@ -23,7 +28,7 @@ class Imaging:
23
28
  "GetImagingSettings", VideoSourceToken=VideoSourceToken
24
29
  )
25
30
 
26
- def SetImagingSettings(self, VideoSourceToken, ImagingSettings, ForcePersistence):
31
+ def SetImagingSettings(self, VideoSourceToken, ImagingSettings, ForcePersistence=None):
27
32
  return self.operator.call(
28
33
  "SetImagingSettings",
29
34
  VideoSourceToken=VideoSourceToken,
@@ -6,6 +6,11 @@ from ..utils import ONVIFWSDL
6
6
 
7
7
  class Media:
8
8
  def __init__(self, xaddr=None, **kwargs):
9
+ # References:
10
+ # - ONVIF Release 2.1 (June 2011) Split from Core 2.0
11
+ # - MediaBinding (ver10/media/wsdl/media.wsdl)
12
+ # - Operations: https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/media/wsdl/media.wsdl
13
+
9
14
  definition = ONVIFWSDL.get_definition("media")
10
15
  self.operator = ONVIFOperator(
11
16
  definition["path"],