Apply intial changes to make repo perform better as a Python module

This commit is contained in:
Bobrock
2020-12-13 12:41:46 -06:00
parent 1792d47d4c
commit 91c92b0fcb
26 changed files with 158 additions and 406 deletions

16
Pipfile
View File

@@ -1,16 +0,0 @@
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
[packages]
pillow = "*"
pyyaml = "*"
requests = "*"
numpy = "*"
opencv-python = "*"
pysocks = "*"
[requires]

169
Pipfile.lock generated
View File

@@ -1,169 +0,0 @@
{
"_meta": {
"hash": {
"sha256": "6700bce6ed08db166eff9d3105158923ffd2ffbf35c814a4d0133552bda03b5a"
},
"pipfile-spec": 6,
"requires": {},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"certifi": {
"hashes": [
"sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3",
"sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"
],
"version": "==2019.11.28"
},
"chardet": {
"hashes": [
"sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
"sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
],
"version": "==3.0.4"
},
"idna": {
"hashes": [
"sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb",
"sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"
],
"version": "==2.9"
},
"numpy": {
"hashes": [
"sha256:1786a08236f2c92ae0e70423c45e1e62788ed33028f94ca99c4df03f5be6b3c6",
"sha256:17aa7a81fe7599a10f2b7d95856dc5cf84a4eefa45bc96123cbbc3ebc568994e",
"sha256:20b26aaa5b3da029942cdcce719b363dbe58696ad182aff0e5dcb1687ec946dc",
"sha256:2d75908ab3ced4223ccba595b48e538afa5ecc37405923d1fea6906d7c3a50bc",
"sha256:39d2c685af15d3ce682c99ce5925cc66efc824652e10990d2462dfe9b8918c6a",
"sha256:56bc8ded6fcd9adea90f65377438f9fea8c05fcf7c5ba766bef258d0da1554aa",
"sha256:590355aeade1a2eaba17617c19edccb7db8d78760175256e3cf94590a1a964f3",
"sha256:70a840a26f4e61defa7bdf811d7498a284ced303dfbc35acb7be12a39b2aa121",
"sha256:77c3bfe65d8560487052ad55c6998a04b654c2fbc36d546aef2b2e511e760971",
"sha256:9537eecf179f566fd1c160a2e912ca0b8e02d773af0a7a1120ad4f7507cd0d26",
"sha256:9acdf933c1fd263c513a2df3dceecea6f3ff4419d80bf238510976bf9bcb26cd",
"sha256:ae0975f42ab1f28364dcda3dde3cf6c1ddab3e1d4b2909da0cb0191fa9ca0480",
"sha256:b3af02ecc999c8003e538e60c89a2b37646b39b688d4e44d7373e11c2debabec",
"sha256:b6ff59cee96b454516e47e7721098e6ceebef435e3e21ac2d6c3b8b02628eb77",
"sha256:b765ed3930b92812aa698a455847141869ef755a87e099fddd4ccf9d81fffb57",
"sha256:c98c5ffd7d41611407a1103ae11c8b634ad6a43606eca3e2a5a269e5d6e8eb07",
"sha256:cf7eb6b1025d3e169989416b1adcd676624c2dbed9e3bcb7137f51bfc8cc2572",
"sha256:d92350c22b150c1cae7ebb0ee8b5670cc84848f6359cf6b5d8f86617098a9b73",
"sha256:e422c3152921cece8b6a2fb6b0b4d73b6579bd20ae075e7d15143e711f3ca2ca",
"sha256:e840f552a509e3380b0f0ec977e8124d0dc34dc0e68289ca28f4d7c1d0d79474",
"sha256:f3d0a94ad151870978fb93538e95411c83899c9dc63e6fb65542f769568ecfa5"
],
"index": "pypi",
"version": "==1.18.1"
},
"opencv-python": {
"hashes": [
"sha256:0f2e739c582e8c5e432130648bc6d66a56bc65f4cd9ff0bc7033033d2130c7a3",
"sha256:0f3d159ad6cb9cbd188c726f87485f0799a067a0a15f34c25d7b5c8db3cb2e50",
"sha256:167a6aff9bd124a3a67e0ec25d0da5ecdc8d96a56405e3e5e7d586c4105eb1bb",
"sha256:1b90d50bc7a31e9573a8da1b80fcd1e4d9c86c0e5f76387858e1b87eb8b0332b",
"sha256:2baf1213ae2fd678991f905d7b2b94eddfdfb5f75757db0f0b31eebd48ca200d",
"sha256:312dda54c7e809c20d7409418060ae0e9cdbe82975e7ced429eb3c234ffc0d4a",
"sha256:32384e675f7cefe707cac40a95eeb142d6869065e39c5500374116297cd8ca6d",
"sha256:5c50634dd8f2f866fd99fd939292ce10e52bef82804ebc4e7f915221c3b7e951",
"sha256:6841bb9cc24751dbdf94e7eefc4e6d70ec297952501954471299fd12ab67391c",
"sha256:68c1c846dd267cd7e293d3fc0bb238db0a744aa1f2e721e327598f00cb982098",
"sha256:703910aaa1dcd25a412f78a190fb7a352d9a64ee7d9a35566d786f3cc66ebf20",
"sha256:8002959146ed21959e3118c60c8e94ceac02eea15b691da6c62cff4787c63f7f",
"sha256:889eef049d38488b5b4646c48a831feed37c0fd44f3d83c05cff80f4baded145",
"sha256:8c76983c9ec3e4cf3a4c1d172ec4285332d9fb1c7194d724aff0c518437471ee",
"sha256:9cd9bd72f4a9743ef6f11f0f96784bd215a542e996db1717d4c2d3d03eb81a1b",
"sha256:a1a5517301dc8d56243a14253d231ec755b94486b4fff2ae68269bc941bb1f2e",
"sha256:a2b08aec2eacae868723136383d9eb84a33062a7a7ec5ec3bd2c423bd1355946",
"sha256:a8529a79233f3581a66984acd16bce52ab0163f6f77568dd69e9ee4956d2e1db",
"sha256:afbc81a3870739610a9f9a1197374d6a45892cf1933c90fc5617d39790991ed3",
"sha256:baeb5dd8b21c718580687f5b4efd03f8139b1c56239cdf6b9805c6946e80f268",
"sha256:db1d49b753e6e6c76585f21d09c7e9812176732baa9bddb64bc2fc6cd24d4179",
"sha256:e242ed419aeb2488e0f9ee6410a34917f0f8d62b3ae96aa3170d83bae75004e2",
"sha256:e36a8857be2c849e54009f1bee25e8c34fbc683fcd38c6c700af4cba5f8d57c2",
"sha256:e699232fd033ef0053efec2cba0a7505514f374ba7b18c732a77cb5304311ef9",
"sha256:eae3da9231d87980f8082d181c276a04f7a6fdac130cebd467390b96dd05f944",
"sha256:ee6814c94dbf1cae569302afef9dd29efafc52373e8770ded0db549a3b6e0c00",
"sha256:f01a87a015227d8af407161eb48222fc3c8b01661cdc841e2b86eee4f1a7a417"
],
"index": "pypi",
"version": "==4.2.0.32"
},
"pillow": {
"hashes": [
"sha256:0a628977ac2e01ca96aaae247ec2bd38e729631ddf2221b4b715446fd45505be",
"sha256:4d9ed9a64095e031435af120d3c910148067087541131e82b3e8db302f4c8946",
"sha256:54ebae163e8412aff0b9df1e88adab65788f5f5b58e625dc5c7f51eaf14a6837",
"sha256:5bfef0b1cdde9f33881c913af14e43db69815c7e8df429ceda4c70a5e529210f",
"sha256:5f3546ceb08089cedb9e8ff7e3f6a7042bb5b37c2a95d392fb027c3e53a2da00",
"sha256:5f7ae9126d16194f114435ebb79cc536b5682002a4fa57fa7bb2cbcde65f2f4d",
"sha256:62a889aeb0a79e50ecf5af272e9e3c164148f4bd9636cc6bcfa182a52c8b0533",
"sha256:7406f5a9b2fd966e79e6abdaf700585a4522e98d6559ce37fc52e5c955fade0a",
"sha256:8453f914f4e5a3d828281a6628cf517832abfa13ff50679a4848926dac7c0358",
"sha256:87269cc6ce1e3dee11f23fa515e4249ae678dbbe2704598a51cee76c52e19cda",
"sha256:875358310ed7abd5320f21dd97351d62de4929b0426cdb1eaa904b64ac36b435",
"sha256:8ac6ce7ff3892e5deaab7abaec763538ffd011f74dc1801d93d3c5fc541feee2",
"sha256:91b710e3353aea6fc758cdb7136d9bbdcb26b53cefe43e2cba953ac3ee1d3313",
"sha256:9d2ba4ed13af381233e2d810ff3bab84ef9f18430a9b336ab69eaf3cd24299ff",
"sha256:a62ec5e13e227399be73303ff301f2865bf68657d15ea50b038d25fc41097317",
"sha256:ab76e5580b0ed647a8d8d2d2daee170e8e9f8aad225ede314f684e297e3643c2",
"sha256:bf4003aa538af3f4205c5fac56eacaa67a6dd81e454ffd9e9f055fff9f1bc614",
"sha256:bf598d2e37cf8edb1a2f26ed3fb255191f5232badea4003c16301cb94ac5bdd0",
"sha256:c18f70dc27cc5d236f10e7834236aff60aadc71346a5bc1f4f83a4b3abee6386",
"sha256:c5ed816632204a2fc9486d784d8e0d0ae754347aba99c811458d69fcdfd2a2f9",
"sha256:dc058b7833184970d1248135b8b0ab702e6daa833be14035179f2acb78ff5636",
"sha256:ff3797f2f16bf9d17d53257612da84dd0758db33935777149b3334c01ff68865"
],
"index": "pypi",
"version": "==7.0.0"
},
"pysocks": {
"hashes": [
"sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299",
"sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5",
"sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"
],
"index": "pypi",
"version": "==1.7.1"
},
"pyyaml": {
"hashes": [
"sha256:059b2ee3194d718896c0ad077dd8c043e5e909d9180f387ce42012662a4946d6",
"sha256:1cf708e2ac57f3aabc87405f04b86354f66799c8e62c28c5fc5f88b5521b2dbf",
"sha256:24521fa2890642614558b492b473bee0ac1f8057a7263156b02e8b14c88ce6f5",
"sha256:4fee71aa5bc6ed9d5f116327c04273e25ae31a3020386916905767ec4fc5317e",
"sha256:70024e02197337533eef7b85b068212420f950319cc8c580261963aefc75f811",
"sha256:74782fbd4d4f87ff04159e986886931456a1894c61229be9eaf4de6f6e44b99e",
"sha256:940532b111b1952befd7db542c370887a8611660d2b9becff75d39355303d82d",
"sha256:cb1f2f5e426dc9f07a7681419fe39cee823bb74f723f36f70399123f439e9b20",
"sha256:dbbb2379c19ed6042e8f11f2a2c66d39cceb8aeace421bfc29d085d93eda3689",
"sha256:e3a057b7a64f1222b56e47bcff5e4b94c4f61faac04c7c4ecb1985e18caa3994",
"sha256:e9f45bd5b92c7974e59bcd2dcc8631a6b6cc380a904725fce7bc08872e691615"
],
"index": "pypi",
"version": "==5.3"
},
"requests": {
"hashes": [
"sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee",
"sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"
],
"index": "pypi",
"version": "==2.23.0"
},
"urllib3": {
"hashes": [
"sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc",
"sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc"
],
"version": "==1.25.8"
}
},
"develop": {}
}

113
README.md
View File

@@ -1,114 +1,15 @@
<h1 align="center"> Reolink Python Api Client </h1> # (Forked) Reolink Python Api Client
<p align="center">
<img alt="GitHub" src="https://img.shields.io/github/license/ReolinkCameraApi/reolink-python-api?style=flat-square">
<img alt="GitHub tag (latest SemVer)" src="https://img.shields.io/github/v/tag/ReolinkCameraApi/reolink-python-api?style=flat-square">
<img alt="PyPI" src="https://img.shields.io/pypi/v/reolink-api?style=flat-square">
</p>
---
A Reolink Camera client written in Python. A Reolink Camera client written in Python.
Other Supported Languages: _NB! for the original API client of this fork, go [here](https://github.com/ReolinkCameraAPI/reolink-python-api)_
- Go: [reolink-go-api](https://github.com/ReolinkCameraAPI/reolink-go-api)
### Join us on Discord
https://discord.gg/8z3fdAmZJP
### Purpose ### Purpose
This repository's purpose is to deliver a complete API for the Reolink Camera's, ( TESTED on RLC-411WS ) This repository's purpose is to deliver a complete API for the Reolink Camera's, (tested on RLC-522)
### Installation
### But Reolink gives an API in their documentation ```bash
python3 -m pip install git+https://github.com/barretobrock/reolink-python-api.git
```
Not really. They only deliver a really basic API to retrieve Image data and Video data.
### How?
You can get the Restful API calls by looking through the HTTP Requests made the camera web console. I use Google Chrome developer mode (ctr + shift + i) -> Network.
### Get started
Implement a "Camera" object by passing it an IP address, Username and Password. By instantiating the object, it will try retrieve a login token from the Reolink Camera. This token is necessary to interact with the Camera using other commands.
See the `examples` directory.
### Using the library as a Python Module
Install the package via Pip
pip install reolink-api==0.0.5
## Contributors
---
### Styling and Standards
This project intends to stick with [PEP8](https://www.python.org/dev/peps/pep-0008/)
### API Requests Implementation Plan:
Stream:
- [X] Blocking RTSP stream
- [X] Non-Blocking RTSP stream
GET:
- [X] Login
- [X] Logout
- [X] Display -> OSD
- [X] Recording -> Encode (Clear and Fluent Stream)
- [X] Recording -> Advance (Scheduling)
- [X] Network -> General
- [X] Network -> Advanced
- [X] Network -> DDNS
- [X] Network -> NTP
- [X] Network -> E-mail
- [X] Network -> FTP
- [X] Network -> Push
- [X] Network -> WIFI
- [X] Alarm -> Motion
- [X] System -> General
- [X] System -> DST
- [X] System -> Information
- [ ] System -> Maintenance
- [X] System -> Performance
- [ ] System -> Reboot
- [X] User -> Online User
- [X] User -> Add User
- [X] User -> Manage User
- [X] Device -> HDD/SD Card
- [ ] Zoom
- [ ] Focus
- [ ] Image (Brightness, Contrast, Saturation, Hue, Sharp, Mirror, Rotate)
- [ ] Advanced Image (Anti-flicker, Exposure, White Balance, DayNight, Backlight, LED light, 3D-NR)
- [X] Image Data -> "Snap" Frame from Video Stream
SET:
- [X] Display -> OSD
- [X] Recording -> Encode (Clear and Fluent Stream)
- [ ] Recording -> Advance (Scheduling)
- [X] Network -> General
- [X] Network -> Advanced
- [ ] Network -> DDNS
- [ ] Network -> NTP
- [ ] Network -> E-mail
- [ ] Network -> FTP
- [ ] Network -> Push
- [X] Network -> WIFI
- [ ] Alarm -> Motion
- [ ] System -> General
- [ ] System -> DST
- [X] System -> Reboot
- [X] User -> Online User
- [X] User -> Add User
- [X] User -> Manage User
- [X] Device -> HDD/SD Card (Format)
- [x] PTZ
- [x] Zoom
- [x] Focus
- [X] Image (Brightness, Contrast, Saturation, Hue, Sharp, Mirror, Rotate)
- [X] Advanced Image (Anti-flicker, Exposure, White Balance, DayNight, Backlight, LED light, 3D-NR)

View File

@@ -1,4 +0,0 @@
from .APIHandler import APIHandler
__version__ = "0.0.5"
VERSION = __version__

View File

@@ -1,26 +1,30 @@
from .recording import RecordingAPIMixin from reolink_api.resthandle import Request
from .zoom import ZoomAPIMixin from .alarm import AlarmAPIMixin
from .device import DeviceAPIMixin from .device import DeviceAPIMixin
from .display import DisplayAPIMixin from .display import DisplayAPIMixin
from .download import DownloadAPIMixin
from .image import ImageAPIMixin
from .motion import MotionAPIMixin
from .network import NetworkAPIMixin from .network import NetworkAPIMixin
from .ptz import PtzAPIMixin
from .recording import RecordingAPIMixin
from .system import SystemAPIMixin from .system import SystemAPIMixin
from .user import UserAPIMixin from .user import UserAPIMixin
from .ptz import PtzAPIMixin from .zoom import ZoomAPIMixin
from .alarm import AlarmAPIMixin
from .image import ImageAPIMixin
from resthandle import Request
class APIHandler(SystemAPIMixin, class APIHandler(AlarmAPIMixin,
NetworkAPIMixin,
UserAPIMixin,
DeviceAPIMixin, DeviceAPIMixin,
DisplayAPIMixin, DisplayAPIMixin,
RecordingAPIMixin, DownloadAPIMixin,
ZoomAPIMixin, ImageAPIMixin,
MotionAPIMixin,
NetworkAPIMixin,
PtzAPIMixin, PtzAPIMixin,
AlarmAPIMixin, RecordingAPIMixin,
ImageAPIMixin): SystemAPIMixin,
UserAPIMixin,
ZoomAPIMixin):
""" """
The APIHandler class is the backend part of the API, the actual API calls The APIHandler class is the backend part of the API, the actual API calls
are implemented in Mixins. are implemented in Mixins.

View File

@@ -1,9 +1,9 @@
from api import APIHandler from reolink_api import APIHandler
class Camera(APIHandler): class Camera(APIHandler):
def __init__(self, ip, username="admin", password="", https=False): def __init__(self, ip: str, username: str = "admin", password: str = "", https: bool = False):
""" """
Initialise the Camera object by passing the ip address. Initialise the Camera object by passing the ip address.
The default details {"username":"admin", "password":""} will be used if nothing passed The default details {"username":"admin", "password":""} will be used if nothing passed

View File

@@ -1,5 +1,4 @@
import io import io
import yaml import yaml

View File

@@ -1,9 +1,7 @@
import os import os
from threading import ThreadError from threading import ThreadError
import cv2 import cv2
from reolink_api.util import threaded
from util import threaded
class RtspClient: class RtspClient:
@@ -91,9 +89,6 @@ class RtspClient:
""" """
Opens OpenCV Video stream and returns the result according to the OpenCV documentation Opens OpenCV Video stream and returns the result according to the OpenCV documentation
https://docs.opencv.org/3.4/d8/dfe/classcv_1_1VideoCapture.html#a473055e77dd7faa4d26d686226b292c1 https://docs.opencv.org/3.4/d8/dfe/classcv_1_1VideoCapture.html#a473055e77dd7faa4d26d686226b292c1
:param callback: The function to callback the cv::mat frame to if required to be non-blocking. If this is left
as None, then the function returns a generator which is blocking.
""" """
# Reset the capture object # Reset the capture object

4
reolink_api/__init__.py Normal file
View File

@@ -0,0 +1,4 @@
from .APIHandler import APIHandler
from .Camera import Camera
__version__ = "0.1.0"

View File

@@ -1,5 +1,10 @@
from typing import List
class DeviceAPIMixin: class DeviceAPIMixin:
"""API calls for getting device information.""" """API calls for getting device information."""
DEFAULT_HDD_ID = [0]
def get_hdd_info(self) -> object: def get_hdd_info(self) -> object:
""" """
Gets all HDD and SD card information from Camera Gets all HDD and SD card information from Camera
@@ -9,12 +14,14 @@ class DeviceAPIMixin:
body = [{"cmd": "GetHddInfo", "action": 0, "param": {}}] body = [{"cmd": "GetHddInfo", "action": 0, "param": {}}]
return self._execute_command('GetHddInfo', body) return self._execute_command('GetHddInfo', body)
def format_hdd(self, hdd_id: [int] = [0]) -> bool: def format_hdd(self, hdd_id: List[int] = None) -> bool:
""" """
Format specified HDD/SD cards with their id's Format specified HDD/SD cards with their id's
:param hdd_id: List of id's specified by the camera with get_hdd_info api. Default is 0 (SD card) :param hdd_id: List of id's specified by the camera with get_hdd_info api. Default is 0 (SD card)
:return: bool :return: bool
""" """
if hdd_id is None:
hdd_id = self.DEFAULT_HDD_ID
body = [{"cmd": "Format", "action": 0, "param": {"HddInfo": {"id": hdd_id}}}] body = [{"cmd": "Format", "action": 0, "param": {"HddInfo": {"id": hdd_id}}}]
r_data = self._execute_command('Format', body)[0] r_data = self._execute_command('Format', body)[0]
if r_data["value"]["rspCode"] == 200: if r_data["value"]["rspCode"] == 200:

15
reolink_api/download.py Normal file
View File

@@ -0,0 +1,15 @@
class DownloadAPIMixin:
"""API calls for downloading video files."""
def get_file(self, filename: str) -> object:
"""
Download the selected video file
:return: response json
"""
body = [
{
"cmd": "Download",
"source": filename,
"output": filename
}
]
return self._execute_command('Download', body)

View File

@@ -3,22 +3,22 @@ class ImageAPIMixin:
"""API calls for image settings.""" """API calls for image settings."""
def set_adv_image_settings(self, def set_adv_image_settings(self,
anti_flicker='Outdoor', anti_flicker: str = 'Outdoor',
exposure='Auto', exposure: str = 'Auto',
gain_min=1, gain_min: int = 1,
gain_max=62, gain_max: int = 62,
shutter_min=1, shutter_min: int = 1,
shutter_max=125, shutter_max: int = 125,
blue_gain=128, blue_gain: int = 128,
red_gain=128, red_gain: int = 128,
white_balance='Auto', white_balance: str = 'Auto',
day_night='Auto', day_night: str = 'Auto',
back_light='DynamicRangeControl', back_light: str = 'DynamicRangeControl',
blc=128, blc: int = 128,
drc=128, drc: int = 128,
rotation=0, rotation: int = 0,
mirroring=0, mirroring: int = 0,
nr3d=1) -> object: nr3d: int = 1) -> object:
""" """
Sets the advanced camera settings. Sets the advanced camera settings.
@@ -66,11 +66,11 @@ class ImageAPIMixin:
return self._execute_command('SetIsp', body) return self._execute_command('SetIsp', body)
def set_image_settings(self, def set_image_settings(self,
brightness=128, brightness: int = 128,
contrast=62, contrast: int = 62,
hue=1, hue: int = 1,
saturation=125, saturation: int = 125,
sharpness=128) -> object: sharpness: int = 128) -> object:
""" """
Sets the camera image settings. Sets the camera image settings.

41
reolink_api/motion.py Normal file
View File

@@ -0,0 +1,41 @@
from datetime import datetime as dt
class MotionAPIMixin:
"""API calls for past motion alerts."""
def get_motion_files(self, start: dt, end: dt = dt.now(),
streamtype: str = 'main') -> object:
"""
Get the timestamps and filenames of motion detection events for the time range provided.
Args:
start: the starting time range to examine
end: the end time of the time range to examine
streamtype: 'main' or 'sub' - the stream to examine
:return: response json
"""
search_params = {
'Search': {
'channel': 0,
'streamType': streamtype,
'onlyStatus': 0,
'StartTime': {
'year': start.year,
'mon': start.month,
'day': start.day,
'hour': start.hour,
'min': start.minute,
'sec': start.second
},
'EndTime': {
'year': end.year,
'mon': end.month,
'day': end.day,
'hour': end.hour,
'min': end.minute,
'sec': end.second
}
}
}
body = [{"cmd": "Search", "action": 1, "param": search_params}]
return self._execute_command('Search', body)

View File

@@ -1,7 +1,7 @@
class NetworkAPIMixin: class NetworkAPIMixin:
"""API calls for network settings.""" """API calls for network settings."""
def set_net_port(self, http_port=80, https_port=443, media_port=9000, onvif_port=8000, rtmp_port=1935, def set_net_port(self, http_port: int = 80, https_port: int = 443, media_port: int = 9000,
rtsp_port=554) -> bool: onvif_port: int = 8000, rtmp_port: int = 1935, rtsp_port: int = 554) -> bool:
""" """
Set network ports Set network ports
If nothing is specified, the default values will be used If nothing is specified, the default values will be used
@@ -25,7 +25,7 @@ class NetworkAPIMixin:
print("Successfully Set Network Ports") print("Successfully Set Network Ports")
return True return True
def set_wifi(self, ssid, password) -> object: def set_wifi(self, ssid: str, password: str) -> object:
body = [{"cmd": "SetWifi", "action": 0, "param": { body = [{"cmd": "SetWifi", "action": 0, "param": {
"Wifi": { "Wifi": {
"ssid": ssid, "ssid": ssid,

View File

@@ -4,7 +4,7 @@ import string
from urllib import parse from urllib import parse
from io import BytesIO from io import BytesIO
from PIL import Image from PIL import Image
from RtspClient import RtspClient from reolink_api.RtspClient import RtspClient
class RecordingAPIMixin: class RecordingAPIMixin:

View File

@@ -1,5 +1,4 @@
import json import json
import requests import requests
@@ -17,7 +16,8 @@ class Request:
""" """
try: try:
headers = {'content-type': 'application/json'} headers = {'content-type': 'application/json'}
r = requests.post(url, verify=False, params=params, json=data, headers=headers, proxies=Request.proxies) r = requests.post(url, verify=False, params=params, json=data, headers=headers,
proxies=Request.proxies)
# if params is not None: # if params is not None:
# r = requests.post(url, params=params, json=data, headers=headers, proxies=proxies) # r = requests.post(url, params=params, json=data, headers=headers, proxies=proxies)
# else: # else:

View File

@@ -1,4 +0,0 @@
requests
opencv-python
numpy
socks

View File

@@ -1,32 +1,9 @@
#!/usr/bin/python3 #!/usr/bin/python3
import os import os
import re import re
import codecs import codecs
from setuptools import setup from setuptools import setup
# Package meta-data.
NAME = 'reolink-api'
DESCRIPTION = 'Reolink Camera API written in Python 3.6'
URL = 'https://github.com/Benehiko/ReolinkCameraAPI'
AUTHOR_EMAIL = ''
AUTHOR = 'Benehiko'
LICENSE = 'GPL-3.0'
INSTALL_REQUIRES = [
'pillow',
'pyyaml',
'requests>=2.18.4',
'numpy',
'opencv-python',
'pysocks'
]
here = os.path.abspath(os.path.dirname(__file__))
# read the contents of your README file
with open(os.path.join(here, 'README.md'), encoding='utf-8') as f:
long_description = f.read()
def read(*parts): def read(*parts):
with codecs.open(os.path.join(here, *parts), 'r') as fp: with codecs.open(os.path.join(here, *parts), 'r') as fp:
@@ -41,9 +18,33 @@ def find_version(*file_paths):
raise RuntimeError("Unable to find version string.") raise RuntimeError("Unable to find version string.")
setup(name=NAME, here = os.path.abspath(os.path.dirname(__file__))
# read the contents of your README file
with open(os.path.join(here, 'README.md'), encoding='utf-8') as f:
long_description = f.read()
# Package meta-data.
NAME = 'reolink_api'
DESCRIPTION = 'Reolink Camera API written in Python 3.6'
URL = 'https://github.com/Benehiko/ReolinkCameraAPI'
AUTHOR_EMAIL = ''
AUTHOR = 'Benehiko'
LICENSE = 'GPL-3.0'
INSTALL_REQUIRES = [
'numpy==1.19.4',
'opencv-python==4.4.0.46',
'Pillow==8.0.1',
'PySocks==1.7.1',
'PyYaml==5.3.1',
'requests>=2.18.4',
]
setup(
name=NAME,
python_requires='>=3.6.0', python_requires='>=3.6.0',
version=find_version('api', '__init__.py'), version=find_version('reolink_api', '__init__.py'),
description=DESCRIPTION, description=DESCRIPTION,
long_description=long_description, long_description=long_description,
long_description_content_type='text/markdown', long_description_content_type='text/markdown',
@@ -51,22 +52,5 @@ setup(name=NAME,
author_email=AUTHOR_EMAIL, author_email=AUTHOR_EMAIL,
url=URL, url=URL,
license=LICENSE, license=LICENSE,
install_requires=INSTALL_REQUIRES, install_requires=INSTALL_REQUIRES
py_modules=[
'Camera',
'ConfigHandler',
'RtspClient',
'resthandle',
'api.APIHandler',
'api.device',
'api.display',
'api.network',
'api.ptz',
'api.recording',
'api.system',
'api.user',
'api.zoom',
'api.alarm',
'api.image'
]
) )

View File

@@ -1,5 +0,0 @@
from Camera import Camera
c = Camera("192.168.1.112", "admin", "jUa2kUzi")
# print("Getting information", c.get_information())
c.open_video_stream()