Move streaming dependancies to their own "extra"

This commit is contained in:
jdiamond
2021-03-30 23:04:18 +00:00
parent 5ac45d8b20
commit 8cd3405378
2 changed files with 58 additions and 42 deletions

View File

@@ -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]"''')

View File

@@ -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
) )