Merge pull request #46 from axlan/streaming-dependancy-extra
Move streaming dependencies to their own "extra"
This commit is contained in:
@@ -48,6 +48,10 @@ Install the package via PyPi
|
|||||||
Install from GitHub
|
Install from GitHub
|
||||||
|
|
||||||
pip install git+https://github.com/ReolinkCameraAPI/reolinkapipy.git
|
pip install git+https://github.com/ReolinkCameraAPI/reolinkapipy.git
|
||||||
|
|
||||||
|
If you want to include the video streaming functionality you need to include the streaming "extra" dependencies
|
||||||
|
|
||||||
|
pip install 'reolinkapi[streaming]'
|
||||||
|
|
||||||
## Contributors
|
## Contributors
|
||||||
|
|
||||||
|
|||||||
@@ -5,48 +5,59 @@ from urllib import parse
|
|||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
from PIL.Image import Image, open as open_image
|
|
||||||
|
|
||||||
from reolinkapi.utils.rtsp_client import RtspClient
|
try:
|
||||||
|
from PIL.Image import Image, open as open_image
|
||||||
|
|
||||||
|
from reolinkapi.utils.rtsp_client import RtspClient
|
||||||
|
|
||||||
|
|
||||||
class StreamAPIMixin:
|
class StreamAPIMixin:
|
||||||
""" API calls for opening a video stream or capturing an image from the camera."""
|
""" API calls for opening a video stream or capturing an image from the camera."""
|
||||||
|
|
||||||
def open_video_stream(self, callback: Any = None, proxies: Any = None) -> Any:
|
def open_video_stream(self, callback: Any = None, proxies: Any = None) -> Any:
|
||||||
"""
|
"""
|
||||||
'https://support.reolink.com/hc/en-us/articles/360007010473-How-to-Live-View-Reolink-Cameras-via-VLC-Media-Player'
|
'https://support.reolink.com/hc/en-us/articles/360007010473-How-to-Live-View-Reolink-Cameras-via-VLC-Media-Player'
|
||||||
Blocking function creates a generator and returns the frames as it is spawned
|
Blocking function creates a generator and returns the frames as it is spawned
|
||||||
:param callback:
|
:param callback:
|
||||||
:param proxies: Default is none, example: {"host": "localhost", "port": 8000}
|
:param proxies: Default is none, example: {"host": "localhost", "port": 8000}
|
||||||
"""
|
"""
|
||||||
rtsp_client = RtspClient(
|
rtsp_client = RtspClient(
|
||||||
ip=self.ip, username=self.username, password=self.password, proxies=proxies, callback=callback)
|
ip=self.ip, username=self.username, password=self.password, proxies=proxies, callback=callback)
|
||||||
return rtsp_client.open_stream()
|
return rtsp_client.open_stream()
|
||||||
|
|
||||||
def get_snap(self, timeout: float = 3, proxies: Any = None) -> Optional[Image]:
|
def get_snap(self, timeout: float = 3, proxies: Any = None) -> Optional[Image]:
|
||||||
"""
|
"""
|
||||||
Gets a "snap" of the current camera video data and returns a Pillow Image or None
|
Gets a "snap" of the current camera video data and returns a Pillow Image or None
|
||||||
:param timeout: Request timeout to camera in seconds
|
:param timeout: Request timeout to camera in seconds
|
||||||
:param proxies: http/https proxies to pass to the request object.
|
:param proxies: http/https proxies to pass to the request object.
|
||||||
:return: Image or None
|
:return: Image or None
|
||||||
"""
|
"""
|
||||||
data = {
|
data = {
|
||||||
'cmd': 'Snap',
|
'cmd': 'Snap',
|
||||||
'channel': 0,
|
'channel': 0,
|
||||||
'rs': ''.join(random.choices(string.ascii_uppercase + string.digits, k=10)),
|
'rs': ''.join(random.choices(string.ascii_uppercase + string.digits, k=10)),
|
||||||
'user': self.username,
|
'user': self.username,
|
||||||
'password': self.password,
|
'password': self.password,
|
||||||
}
|
}
|
||||||
parms = parse.urlencode(data).encode("utf-8")
|
parms = parse.urlencode(data).encode("utf-8")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
response = requests.get(self.url, proxies=proxies, params=parms, timeout=timeout)
|
response = requests.get(self.url, proxies=proxies, params=parms, timeout=timeout)
|
||||||
if response.status_code == 200:
|
if response.status_code == 200:
|
||||||
return open_image(BytesIO(response.content))
|
return open_image(BytesIO(response.content))
|
||||||
print("Could not retrieve data from camera successfully. Status:", response.status_code)
|
print("Could not retrieve data from camera successfully. Status:", response.status_code)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("Could not get Image data\n", e)
|
print("Could not get Image data\n", e)
|
||||||
raise
|
raise
|
||||||
|
except ImportError:
|
||||||
|
class StreamAPIMixin:
|
||||||
|
""" API calls for opening a video stream or capturing an image from the camera."""
|
||||||
|
|
||||||
|
def open_video_stream(self, callback: Any = None, proxies: Any = None) -> Any:
|
||||||
|
raise ImportError('''open_video_stream requires streaming extra dependencies\nFor instance "pip install reolinkapi[streaming]"''')
|
||||||
|
|
||||||
|
def get_snap(self, timeout: float = 3, proxies: Any = None) -> Optional['Image']:
|
||||||
|
raise ImportError('''open_video_stream requires streaming extra dependencies\nFor instance "pip install reolinkapi[streaming]"''')
|
||||||
|
|||||||
13
setup.py
13
setup.py
@@ -26,13 +26,17 @@ AUTHOR_EMAIL = 'alanoterblanche@gmail.com'
|
|||||||
AUTHOR = 'Benehiko'
|
AUTHOR = 'Benehiko'
|
||||||
LICENSE = 'GPL-3.0'
|
LICENSE = 'GPL-3.0'
|
||||||
INSTALL_REQUIRES = [
|
INSTALL_REQUIRES = [
|
||||||
'numpy==1.19.4',
|
|
||||||
'opencv-python==4.4.0.46',
|
|
||||||
'Pillow==8.0.1',
|
|
||||||
'PySocks==1.7.1',
|
'PySocks==1.7.1',
|
||||||
'PyYaml==5.3.1',
|
'PyYaml==5.3.1',
|
||||||
'requests>=2.18.4',
|
'requests>=2.18.4',
|
||||||
]
|
]
|
||||||
|
EXTRAS_REQUIRE = {
|
||||||
|
'streaming': [
|
||||||
|
'numpy==1.19.4',
|
||||||
|
'opencv-python==4.4.0.46',
|
||||||
|
'Pillow==8.0.1',
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
here = os.path.abspath(os.path.dirname(__file__))
|
here = os.path.abspath(os.path.dirname(__file__))
|
||||||
@@ -53,5 +57,6 @@ setup(
|
|||||||
url=URL,
|
url=URL,
|
||||||
license=LICENSE,
|
license=LICENSE,
|
||||||
install_requires=INSTALL_REQUIRES,
|
install_requires=INSTALL_REQUIRES,
|
||||||
packages=find_packages(exclude=['examples', 'tests'])
|
packages=find_packages(exclude=['examples', 'tests']),
|
||||||
|
extras_require=EXTRAS_REQUIRE
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user