add camsutil
This commit is contained in:
parent
82f12e7083
commit
076d397762
43
README.md
43
README.md
|
@ -1,8 +1,51 @@
|
||||||
# utils
|
# utils
|
||||||
|
|
||||||
|
* [camsutil](https://git.hmp.today/pavel.muhortov/utils#camsutil)
|
||||||
* [ffmpeger.py](https://git.hmp.today/pavel.muhortov/utils#ffmpeger-py)
|
* [ffmpeger.py](https://git.hmp.today/pavel.muhortov/utils#ffmpeger-py)
|
||||||
* [procutil.py](https://git.hmp.today/pavel.muhortov/utils#procutil-py)
|
* [procutil.py](https://git.hmp.today/pavel.muhortov/utils#procutil-py)
|
||||||
* [sendmail.py](https://git.hmp.today/pavel.muhortov/utils#sendmail-py)
|
* [sendmail.py](https://git.hmp.today/pavel.muhortov/utils#sendmail-py)
|
||||||
|
____
|
||||||
|
## camsutil
|
||||||
|
**Description:** Creation of a request to the camera API based on the prepared template
|
||||||
|
**Dependencies:** Python 3 (tested version 3.9.5)
|
||||||
|
|
||||||
|
| PARAMETERS | DESCRIPTION | DEFAULT|
|
||||||
|
|-------------|-------------|--------|
|
||||||
|
|**--host**|hostname or ip address|**REQUIRED**|
|
||||||
|
|**--user**|valid user|**REQUIRED**|
|
||||||
|
|**--password**|valid password|**REQUIRED**|
|
||||||
|
|**--template**|the name of an existing template|**REQUIRED**|
|
||||||
|
|**[-h]**|print help and exit||
|
||||||
|
|**[--protocol]**|http, https, etc.|http|
|
||||||
|
|**[--port]**|port number|80|
|
||||||
|
|**[--channel]**|ptz channel number|101|
|
||||||
|
|**[--vid]**|video channel id|1|
|
||||||
|
|**[--x]**|horizontal positioning: azimuth, pan|0|
|
||||||
|
|**[--y]**|vertical positioning: elevation, tilt|0|
|
||||||
|
|**[--z]**|zoom direction, absolute zoom|0|
|
||||||
|
|**[--speed]**|positioning speed: from 1 to 7|1|
|
||||||
|
|**[--time]**|momentary duration, max 100000ms|100000|
|
||||||
|
|**[--text]**|overlay text content|`None`|
|
||||||
|
|**[--enabled]**|enabled (true) or disabled (false) overlay text|true|
|
||||||
|
|
||||||
|
Example usage in terminal with Python:
|
||||||
|
```shell
|
||||||
|
python3 ./ptz.py --host HOST --user USER --password PASS --template Hikvision_GetCapabilities.html
|
||||||
|
```
|
||||||
|
Example usage in terminal with make the script executable:
|
||||||
|
```shell
|
||||||
|
chmod u+x ./ptz.py
|
||||||
|
ptz.py --host HOST --user USER --password PASS --template Hikvision_PtzPreset.html --vid 2 --speed 5
|
||||||
|
```
|
||||||
|
Example usage in Python:
|
||||||
|
```Python
|
||||||
|
from camsutil import ptz
|
||||||
|
|
||||||
|
data = ptz.API(host='HOST', user='USER', password='PASS', template='Hikvision_GetJPEG.html', x=1920, y=1080).call()
|
||||||
|
with open('img.jpg', 'wb') as output:
|
||||||
|
output.write(data)
|
||||||
|
```
|
||||||
|
|
||||||
____
|
____
|
||||||
## ffmpeger.py
|
## ffmpeger.py
|
||||||
**Description:** FFmpeg management from Python
|
**Description:** FFmpeg management from Python
|
||||||
|
|
288
camsutil/ptz.py
288
camsutil/ptz.py
|
@ -1,144 +1,144 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
|
||||||
import urllib.request
|
import urllib.request
|
||||||
from os import path, sep
|
from os import path, sep
|
||||||
|
|
||||||
|
|
||||||
class API:
|
class API:
|
||||||
"""
|
"""
|
||||||
Creation of a request to the camera API based on the prepared template.
|
Creation of a request to the camera API based on the prepared template.
|
||||||
"""
|
"""
|
||||||
def __init__(self, host: str, user: str, password: str, template: str,
|
def __init__(self, host: str, user: str, password: str, template: str,
|
||||||
protocol: str = 'http', port: int = 80, channel: int = 101, vid: int = 1,
|
protocol: str = 'http', port: int = 80, channel: int = 101, vid: int = 1,
|
||||||
x: int = 0, y: int = 0, z: int = 0, speed: int = 1, time: int = 100000,
|
x: int = 0, y: int = 0, z: int = 0, speed: int = 1, time: int = 100000,
|
||||||
text: str = '', enabled: str = 'true'):
|
text: str = None, enabled: str = 'true'):
|
||||||
"""
|
"""
|
||||||
Object constructor
|
Object constructor
|
||||||
:param host: hostname or ip address
|
:param host: hostname or ip address
|
||||||
:param user: valid user
|
:param user: valid user
|
||||||
:param password: valid password
|
:param password: valid password
|
||||||
:param template: the name of an existing template
|
:param template: the name of an existing template
|
||||||
:param protocol: http, https, etc.
|
:param protocol: http, https, etc.
|
||||||
:param port: port number
|
:param port: port number
|
||||||
:param channel: ptz channel number
|
:param channel: ptz channel number
|
||||||
:param vid: video channel id
|
:param vid: video channel id
|
||||||
:param x: horizontal positioning: azimuth, pan
|
:param x: horizontal positioning: azimuth, pan
|
||||||
:param y: vertical positioning: elevation, tilt
|
:param y: vertical positioning: elevation, tilt
|
||||||
:param z: zoom direction, absolute zoom
|
:param z: zoom direction, absolute zoom
|
||||||
:param speed: positioning speed: from 1 to 7
|
:param speed: positioning speed: from 1 to 7
|
||||||
:param time: momentary duration, max 100000ms
|
:param time: momentary duration, max 100000ms
|
||||||
:param text: overlay text content
|
:param text: overlay text content
|
||||||
:param enabled: enabled (true) or disabled (false) overlay text
|
:param enabled: enabled (true) or disabled (false) overlay text
|
||||||
"""
|
"""
|
||||||
self._host = host
|
self._host = host
|
||||||
self._user = user
|
self._user = user
|
||||||
self._pswd = password
|
self._pswd = password
|
||||||
self._temp = path.dirname(path.abspath(__file__)) + sep + 'templates' + sep + template
|
self._temp = path.dirname(path.abspath(__file__)) + sep + 'templates' + sep + template
|
||||||
self._protocol = protocol
|
self._protocol = protocol
|
||||||
self._port = port
|
self._port = port
|
||||||
self._channel = channel
|
self._channel = channel
|
||||||
self._id = vid
|
self._id = vid
|
||||||
self._x = x
|
self._x = x
|
||||||
self._y = y
|
self._y = y
|
||||||
self._z = z
|
self._z = z
|
||||||
self._speed = speed
|
self._speed = speed
|
||||||
self._time = time
|
self._time = time
|
||||||
self._message = text
|
self._message = text
|
||||||
self._enabledMessage = enabled
|
self._enabledMessage = enabled
|
||||||
self._data = ''
|
self._data = ''
|
||||||
self._type = ''
|
self._type = ''
|
||||||
self._url = self._protocol + '://' + self._host + ':' + str(self._port)
|
self._url = self._protocol + '://' + self._host + ':' + str(self._port)
|
||||||
self._method = ''
|
self._method = ''
|
||||||
|
|
||||||
with open(self._temp) as file:
|
with open(self._temp) as file:
|
||||||
content = file.read() \
|
content = file.read() \
|
||||||
.replace('@CHANNEL@', str(self._channel)) \
|
.replace('@CHANNEL@', str(self._channel)) \
|
||||||
.replace('@ID@', str(self._id)) \
|
.replace('@ID@', str(self._id)) \
|
||||||
.replace('@XXXX@', str(self._x)) \
|
.replace('@XXXX@', str(self._x)) \
|
||||||
.replace('@YYYY@', str(self._y)) \
|
.replace('@YYYY@', str(self._y)) \
|
||||||
.replace('@ZZZZ@', str(self._z)) \
|
.replace('@ZZZZ@', str(self._z)) \
|
||||||
.replace('@TTTT@', str(self._time)) \
|
.replace('@TTTT@', str(self._time)) \
|
||||||
.replace('@SSSS@', str(self._speed)) \
|
.replace('@SSSS@', str(self._speed)) \
|
||||||
.replace('@MSG@', str(self._message)) \
|
.replace('@MSG@', str(self._message)) \
|
||||||
.replace('@ENABLED@', str(self._enabledMessage))
|
.replace('@ENABLED@', str(self._enabledMessage))
|
||||||
for line in content.splitlines():
|
for line in content.splitlines():
|
||||||
if not ('<!--' in line):
|
if not ('<!--' in line):
|
||||||
self._data += line + '\n'
|
self._data += line + '\n'
|
||||||
elif 'PATH:' in line:
|
elif 'PATH:' in line:
|
||||||
self._url += line.split(' ')[2]
|
self._url += line.split(' ')[2]
|
||||||
elif 'METHOD:' in line:
|
elif 'METHOD:' in line:
|
||||||
self._method += line.split(' ')[2]
|
self._method += line.split(' ')[2]
|
||||||
elif 'TYPE:' in line:
|
elif 'TYPE:' in line:
|
||||||
self._type += line.split(' ')[2]
|
self._type += line.split(' ')[2]
|
||||||
|
|
||||||
def call(self):
|
def call(self):
|
||||||
"""
|
"""
|
||||||
Call a request to the camera api
|
Call a request to the camera api
|
||||||
:return: response from the camera api
|
:return: response from the camera api
|
||||||
"""
|
"""
|
||||||
# Preparing authorization
|
# Preparing authorization
|
||||||
pswd = urllib.request.HTTPPasswordMgrWithDefaultRealm()
|
pswd = urllib.request.HTTPPasswordMgrWithDefaultRealm()
|
||||||
pswd.add_password(None, self._url, self._user, self._pswd)
|
pswd.add_password(None, self._url, self._user, self._pswd)
|
||||||
auth = urllib.request.HTTPDigestAuthHandler(pswd)
|
auth = urllib.request.HTTPDigestAuthHandler(pswd)
|
||||||
urllib.request.install_opener(urllib.request.build_opener(auth))
|
urllib.request.install_opener(urllib.request.build_opener(auth))
|
||||||
|
|
||||||
# Request
|
# Request
|
||||||
request = urllib.request.Request(url=self._url, data=bytes(self._data.encode('utf-8')), method=self._method)
|
request = urllib.request.Request(url=self._url, data=bytes(self._data.encode('utf-8')), method=self._method)
|
||||||
request.add_header('Content-Type', self._type)
|
request.add_header('Content-Type', self._type)
|
||||||
|
|
||||||
# Response
|
# Response
|
||||||
response = urllib.request.urlopen(request).read()
|
response = urllib.request.urlopen(request).read()
|
||||||
if response.startswith(b'\xff\xd8'):
|
if response.startswith(b'\xff\xd8'):
|
||||||
return response
|
return response
|
||||||
else:
|
else:
|
||||||
return str(response.decode('utf-8'))
|
return str(response.decode('utf-8'))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
from argparse import ArgumentParser
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
args = ArgumentParser(
|
args = ArgumentParser(
|
||||||
prog='PTZ',
|
prog='PTZ',
|
||||||
description='Creation of a request to the camera API based on the prepared template',
|
description='Creation of a request to the camera API based on the prepared template',
|
||||||
epilog='Dependencies: Python 3 (tested version 3.9.5)'
|
epilog='Dependencies: Python 3 (tested version 3.9.5)'
|
||||||
)
|
)
|
||||||
args.add_argument('--host', type=str, required=True,
|
args.add_argument('--host', type=str, required=True,
|
||||||
help='hostname or ip address')
|
help='hostname or ip address')
|
||||||
args.add_argument('--user', type=str, required=True,
|
args.add_argument('--user', type=str, required=True,
|
||||||
help='valid user')
|
help='valid user')
|
||||||
args.add_argument('--password', type=str, required=True,
|
args.add_argument('--password', type=str, required=True,
|
||||||
help='valid password')
|
help='valid password')
|
||||||
args.add_argument('--template', type=str, required=True,
|
args.add_argument('--template', type=str, required=True,
|
||||||
help='the name of an existing template')
|
help='the name of an existing template')
|
||||||
args.add_argument('--protocol', type=str, default='http', required=False,
|
args.add_argument('--protocol', type=str, default='http', required=False,
|
||||||
help='http, https, etc.')
|
help='http, https, etc.')
|
||||||
args.add_argument('--port', type=int, default=80, required=False,
|
args.add_argument('--port', type=int, default=80, required=False,
|
||||||
help='port number')
|
help='port number')
|
||||||
args.add_argument('--channel', type=int, default=101, required=False,
|
args.add_argument('--channel', type=int, default=101, required=False,
|
||||||
help='ptz channel number')
|
help='ptz channel number')
|
||||||
args.add_argument('--vid', type=int, default=1, required=False,
|
args.add_argument('--vid', type=int, default=1, required=False,
|
||||||
help='video channel id')
|
help='video channel id')
|
||||||
args.add_argument('--x', type=int, default=0, required=False,
|
args.add_argument('--x', type=int, default=0, required=False,
|
||||||
help='horizontal positioning: azimuth, pan')
|
help='horizontal positioning: azimuth, pan')
|
||||||
args.add_argument('--y', type=int, default=0, required=False,
|
args.add_argument('--y', type=int, default=0, required=False,
|
||||||
help='vertical positioning: elevation, tilt')
|
help='vertical positioning: elevation, tilt')
|
||||||
args.add_argument('--z', type=int, default=0, required=False,
|
args.add_argument('--z', type=int, default=0, required=False,
|
||||||
help='zoom direction, absolute zoom')
|
help='zoom direction, absolute zoom')
|
||||||
args.add_argument('--speed', type=int, default=1, required=False,
|
args.add_argument('--speed', type=int, default=1, required=False,
|
||||||
help='positioning speed: from 1 to 7')
|
help='positioning speed: from 1 to 7')
|
||||||
args.add_argument('--time', type=int, default=100000, required=False,
|
args.add_argument('--time', type=int, default=100000, required=False,
|
||||||
help='momentary duration, max 100000ms')
|
help='momentary duration, max 100000ms')
|
||||||
args.add_argument('--text', type=str, default='', required=False,
|
args.add_argument('--text', type=str, default=None, required=False,
|
||||||
help='overlay text content')
|
help='overlay text content')
|
||||||
args.add_argument('--enabled', type=str, default='true', required=False,
|
args.add_argument('--enabled', type=str, default='true', required=False,
|
||||||
help='enabled (true) or disabled (false) overlay text')
|
help='enabled (true) or disabled (false) overlay text')
|
||||||
args = args.parse_args()
|
args = args.parse_args()
|
||||||
|
|
||||||
action = API(
|
action = API(
|
||||||
host=args.host, user=args.user, password=args.password, template=args.template,
|
host=args.host, user=args.user, password=args.password, template=args.template,
|
||||||
protocol=args.protocol, port=args.port, channel=args.channel, vid=args.vid,
|
protocol=args.protocol, port=args.port, channel=args.channel, vid=args.vid,
|
||||||
x=args.x, y=args.y, z=args.z, speed=args.speed, time=args.time,
|
x=args.x, y=args.y, z=args.z, speed=args.speed, time=args.time,
|
||||||
text=args.text, enabled=args.enabled
|
text=args.text, enabled=args.enabled
|
||||||
)
|
)
|
||||||
print(action.call())
|
print(action.call())
|
||||||
|
|
Loading…
Reference in New Issue
Block a user