Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
17515b4
feat(mappings): Add static mappings for ONVIF specifications and serv…
kaburagisec Oct 5, 2026
291258f
refactor(utils): Update ONVIF mappings on utilities module (#156)
kaburagisec Oct 5, 2026
0380bc7
refactor(cli): Update ONVIF mappings on CLI module (#157)
kaburagisec Oct 5, 2026
2d787dd
ci(publish): Add verification for WSDL and database files in release …
kaburagisec Oct 5, 2026
4eb9487
refactor(cli): Optimize ONVIF CLI interactive shell and related modul…
kaburagisec Oct 6, 2026
b64667b
feat(docs): Enhance docs with icons for external links (#160)
kaburagisec Oct 6, 2026
185919d
feat(discovery): Implement concurrent processing for device discovery…
kaburagisec Oct 7, 2026
bf0a574
feat(docs): Improve GitHub releases metadata display (#162)
kaburagisec Oct 7, 2026
aec484d
chore(pylint): Update pylint config and adjust formatting settings (#…
kaburagisec Oct 7, 2026
320c52a
style: Enforce `pylint` standard and miscellaneous style (#164)
kaburagisec Oct 7, 2026
afa1d11
docs: Update docstrings to include version tracking (#165)
kaburagisec Oct 8, 2026
739412a
feat(docs): Add hook to exclude mkdocstrings source blocks from searc…
kaburagisec Oct 8, 2026
05d421e
ci: Update fetch-depth in documentation preview workflow (#168)
kaburagisec Oct 12, 2026
b637277
ci: Update python ver in docs workflow and install docs dependencies …
kaburagisec Oct 17, 2026
169b1e0
chore: Improve formatting and grammar in NOTICE file
kaburagisec Oct 17, 2026
f566fc1
docs: Documentation overhaul (#167)
kaburagisec Oct 17, 2026
5306359
feat(docs): Enhance GitHub releases page navigation and styling (#181)
kaburagisec Oct 18, 2026
83619af
docs: Move documentation deployment to Cloudflare Workers (#183)
kaburagisec Oct 18, 2026
21b5371
feat(docs): Add conventions, abbreviations, and logging page + update…
kaburagisec Oct 18, 2026
a460a8d
feat(docs): Add Cloudflare Web Analytics script and update site name …
kaburagisec Oct 18, 2026
5ede562
revert(docs): Update site name for clarity
kaburagisec Oct 18, 2026
5515257
feat(config): Add not_found_handling option to assets in wrangler.jsonc
kaburagisec Oct 18, 2026
1078c38
feat(docs): Add favicon and apple-touch-icon assets with updates to m…
kaburagisec Oct 18, 2026
a34465e
docs: Migrate to CF Pages
kaburagisec Oct 18, 2026
cdae3b3
docs: Change fallback site_url to CF Pages
kaburagisec Oct 18, 2026
de38f3d
fix(docs): Update documentation URLs to point to the new site
kaburagisec Oct 18, 2026
5a16f81
fix(docs): Update RELEASE_ENDPOINT to use a relative path
kaburagisec Oct 18, 2026
66bf4cc
chore: Bump version 0.4.4 → 0.4.5
kaburagisec Oct 18, 2026
1915ff5
feat(docs): Add glossary of terms and update navigation (#187)
kaburagisec Oct 19, 2026
a9b753e
fix(docs): Update release links to use relative paths in documentatio…
kaburagisec Oct 19, 2026
2ab6407
feat(docs): Enhance documentation with release announcement and roadm…
kaburagisec Oct 19, 2026
dc680c8
feat(docs): Add WSDL generator and input/output schemas to the docume…
kaburagisec Oct 20, 2026
872f2bb
docs: Add prebuilt binaries section and installation instructions to …
kaburagisec Oct 20, 2026
0cf3ef9
ci: Add GitHub Actions workflow for building Python binaries
kaburagisec Oct 20, 2026
d6326fa
docs: Update descriptions to add CLI
kaburagisec Oct 20, 2026
ac1084c
chore: Exclude non-module folders
kaburagisec Oct 20, 2026
c97ec28
code: Update example codes (#192)
kaburagisec Oct 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 0 additions & 56 deletions .github/workflows/documentation-preview.yml

This file was deleted.

37 changes: 0 additions & 37 deletions .github/workflows/documentation.yml

This file was deleted.

2 changes: 1 addition & 1 deletion .github/workflows/python-app.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ jobs:
- name: Install project
run: |
python -m pip install --upgrade pip
pip install ".[dev]"
pip install ".[dev,docs]"

- name: Check formatting with black
run: black --check .
Expand Down
124 changes: 124 additions & 0 deletions .github/workflows/python-binary.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
name: Python Binary

on:
release:
types: [published]

permissions:
contents: read

jobs:
binary-build:
name: Build ${{ matrix.asset_name }}
runs-on: ${{ matrix.runner }}

permissions:
contents: write

strategy:
fail-fast: true
matrix:
include:
- runner: ubuntu-26.04
python_arch: x64
asset_name: onvif-linux-amd64
executable_name: onvif

- runner: ubuntu-26.04
python_arch: x86
asset_name: onvif-linux-i386
executable_name: onvif

- runner: ubuntu-26.04-arm
python_arch: arm64
asset_name: onvif-linux-arm64
executable_name: onvif

- runner: windows-latest
python_arch: x64
asset_name: onvif-windows-win64
executable_name: onvif.exe

- runner: windows-latest
python_arch: x86
asset_name: onvif-windows-win32
executable_name: onvif.exe

- runner: windows-11-arm
python_arch: arm64
asset_name: onvif-windows-arm64
executable_name: onvif.exe

- runner: macos-15-intel
python_arch: x64
asset_name: onvif-macos-amd64
executable_name: onvif

- runner: macos-latest
python_arch: arm64
asset_name: onvif-macos-arm64
executable_name: onvif

steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.13"
architecture: ${{ matrix.python_arch }}

- name: Verify Python architecture ${{ matrix.python_arch }} | ${{ matrix.runner }}
env:
EXPECTED_ARCH: ${{ matrix.python_arch }}
run: |
python -c "import os, platform, struct, sys; actual = struct.calcsize('P') * 8; expected = {'x86': 32, 'x64': 64, 'arm64': 64}[os.environ['EXPECTED_ARCH']]; print(f'Python: {platform.python_version()}'); print(f'Architecture: {platform.machine()} ({actual}-bit)'); sys.exit(0 if actual == expected else f'Expected {expected}-bit Python, got {actual}-bit')"

- name: Install project and PyInstaller ${{ matrix.python_arch }} | ${{ matrix.runner }}
run: |
python -m pip install --upgrade pip
python -m pip install . pyinstaller pillow

- name: Build executable (${{ matrix.asset_name }})
run: >
pyinstaller
--clean
--noconfirm
--onedir
--collect-all onvif
--icon docs/assets/onvif.png
--name onvif
onvif/cli/__main__.py

- name: Include license and notice (${{ matrix.asset_name }})
shell: bash
run: |
cp LICENSE dist/onvif/LICENSE
if [ -f NOTICE ]; then
cp NOTICE dist/onvif/NOTICE
fi

- name: Test executable (${{ matrix.asset_name }})
env:
EXECUTABLE_NAME: ${{ matrix.executable_name }}
run: |
python -c "import os, subprocess; from pathlib import Path; p = (Path('dist/onvif') / os.environ['EXECUTABLE_NAME']).resolve(); print(f'Testing: {p}'); result = subprocess.run([str(p), '--help'], capture_output=True, text=True, timeout=60); print(result.stdout); print(result.stderr); raise SystemExit(result.returncode)"

- name: Package distribution (${{ matrix.asset_name }})
env:
ASSET_NAME: ${{ matrix.asset_name }}
run: |
python -c "import os, shutil; from pathlib import Path; src = Path('dist/onvif'); dst = Path('dist') / os.environ['ASSET_NAME']; shutil.make_archive(str(dst), 'zip', root_dir=src.parent, base_dir=src.name); print(f'Created {dst}.zip')"

- name: Verify archive (${{ matrix.asset_name }})
env:
ASSET_NAME: ${{ matrix.asset_name }}
run: |
python -c "import os, sys, zipfile; from pathlib import Path; p = Path('dist') / (os.environ['ASSET_NAME'] + '.zip'); valid = p.is_file() and p.stat().st_size > 0 and zipfile.is_zipfile(p); print(f'Archive: {p} ({p.stat().st_size if p.exists() else 0} bytes)'); sys.exit(0 if valid else f'Invalid archive: {p}')"

- name: Upload to GitHub Release (${{ matrix.asset_name }})
env:
GH_TOKEN: ${{ github.token }}
run: gh release upload "$GITHUB_REF_NAME" "dist/${{ matrix.asset_name }}.zip" --clobber
shell: bash
79 changes: 79 additions & 0 deletions .github/workflows/python-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,85 @@ jobs:
python -m pip install build
python -m build

- name: Verify WSDL files are included
run: |
python - <<'PY'
import sys
import zipfile
from pathlib import Path

expected = {
path.relative_to(".").as_posix()
for path in Path("onvif/wsdl").rglob("*.wsdl")
}

wheels = list(Path("dist").glob("*.whl"))

if not wheels:
print("ERROR: No wheel was produced.")
sys.exit(1)

for wheel in wheels:
with zipfile.ZipFile(wheel) as archive:
included = set(archive.namelist())

missing = expected - included

if missing:
print(f"ERROR: Missing WSDL files in {wheel.name}:")
for path in sorted(missing):
print(f" - {path}")
sys.exit(1)

print(
f"{wheel.name}: all {len(expected)} WSDL files are included."
)

print("WSDL package contents verified successfully.")
PY

- name: Verify database files are included
run: |
python - <<'PY'
import sys
import zipfile
from pathlib import Path

expected = {
path.relative_to(".").as_posix()
for path in Path("onvif/db").rglob("*.db")
}

wheels = list(Path("dist").glob("*.whl"))

if not wheels:
print("ERROR: No wheel was produced.")
sys.exit(1)

if not expected:
print("ERROR: No database files found in onvif/db.")
sys.exit(1)

for wheel in wheels:
with zipfile.ZipFile(wheel) as archive:
included = set(archive.namelist())

missing = expected - included

if missing:
print(f"ERROR: Missing database files in {wheel.name}:")
for path in sorted(missing):
print(f" - {path}")
sys.exit(1)

print(
f"{wheel.name}: all {len(expected)} "
f"database files are included."
)

print("Database package contents verified successfully.")
PY

- name: Upload distributions
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ Your feedback, code, documentation, and ideas help make this project better for

## How to contribute?

Please check the [Contributing](https://nirsimetri.github.io/onvif-python/project/contributing) guide page, that page explains step-by-step how to contribute to the project correctly.
Please check the [Contributing Guide](https://onvif-python.pages.dev/project/contributing) page, that page explains step-by-step how to contribute to the project correctly.
21 changes: 15 additions & 6 deletions NOTICE
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
This project is an independent open-source implementation of the ONVIF (https://www.onvif.org) specifications. It is not affiliated with, endorsed by, or sponsored by ONVIF or its member companies.
This project is an independent open-source implementation of the
ONVIF (https://www.onvif.org) specifications. It is not affiliated with,
endorsed by, or sponsored by ONVIF or its member companies.

- The name “ONVIF” and the ONVIF logo are registered trademarks of the ONVIF organization.
- Any references to ONVIF within this project are made strictly for the purpose of describing interoperability with ONVIF-compliant devices and services.
- Use of the ONVIF trademark in this repository is solely nominative and does not imply any partnership, certification, or official status.
- The name “ONVIF” is a registered trademarks of the ONVIF organization.
- Any references to ONVIF within this project are made strictly for the purpose of
describing interoperability with ONVIF-compliant devices and services.
- Use of the ONVIF trademark in this repository is solely nominative and does not imply
any partnership, certification, or official status.
- This project includes WSDL/XSD/HTML files from the official ONVIF specifications.
- These files are © ONVIF and are redistributed here for interoperability purposes.
- The WSDL files in the https://github.com/nirsimetri/onvif-python/tree/main/onvif/wsdl folder are distributed under the ONVIF Contributor License Agreement and Apache License 2.0. See https://github.com/nirsimetri/onvif-python/tree/main/onvif/wsdl/LICENSE for details.
- The WSDL files in the https://github.com/nirsimetri/onvif-python/tree/main/onvif/wsdl
folder are distributed under the Apache License 2.0. See
https://github.com/nirsimetri/onvif-python/tree/main/onvif/wsdl/LICENSE for details.
- All rights to the ONVIF specifications are reserved by ONVIF.

If you require certified ONVIF-compliant devices or clients, please refer to the official https://www.onvif.org/conformant-products. For authoritative reference and the latest official ONVIF specifications, please consult the https://www.onvif.org/profiles/specifications/specification-history.
If you require certified ONVIF-compliant devices or clients, please refer to
the official https://www.onvif.org/conformant-products. For authoritative
reference and the latest official ONVIF specifications, please consult the
https://www.onvif.org/profiles/specifications/specification-history.
Loading
Loading