mirror of
https://github.com/home-assistant/core.git
synced 2025-07-15 09:17:10 +00:00
Adding Digest Auth for webcam image retrieval (#2821)
* Adding Digest Auth for webcam image retrieval * Update generic.py * Update mjpeg.py * Update generic.py * Update mjpeg.py * Update generic.py * Update mjpeg.py
This commit is contained in:
parent
2237189c86
commit
8a3c511a04
@ -7,13 +7,16 @@ https://home-assistant.io/components/camera.generic/
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
from requests.auth import HTTPBasicAuth
|
from requests.auth import HTTPBasicAuth, HTTPDigestAuth
|
||||||
|
|
||||||
from homeassistant.components.camera import DOMAIN, Camera
|
from homeassistant.components.camera import DOMAIN, Camera
|
||||||
from homeassistant.helpers import validate_config
|
from homeassistant.helpers import validate_config
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
BASIC_AUTHENTICATION = 'basic'
|
||||||
|
DIGEST_AUTHENTICATION = 'digest'
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=unused-argument
|
# pylint: disable=unused-argument
|
||||||
def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
||||||
@ -33,6 +36,8 @@ class GenericCamera(Camera):
|
|||||||
"""Initialize a generic camera."""
|
"""Initialize a generic camera."""
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self._name = device_info.get('name', 'Generic Camera')
|
self._name = device_info.get('name', 'Generic Camera')
|
||||||
|
self._authentication = device_info.get('authentication',
|
||||||
|
BASIC_AUTHENTICATION)
|
||||||
self._username = device_info.get('username')
|
self._username = device_info.get('username')
|
||||||
self._password = device_info.get('password')
|
self._password = device_info.get('password')
|
||||||
self._still_image_url = device_info['still_image_url']
|
self._still_image_url = device_info['still_image_url']
|
||||||
@ -40,10 +45,14 @@ class GenericCamera(Camera):
|
|||||||
def camera_image(self):
|
def camera_image(self):
|
||||||
"""Return a still image response from the camera."""
|
"""Return a still image response from the camera."""
|
||||||
if self._username and self._password:
|
if self._username and self._password:
|
||||||
|
if self._authentication == DIGEST_AUTHENTICATION:
|
||||||
|
auth = HTTPDigestAuth(self._username, self._password)
|
||||||
|
else:
|
||||||
|
auth = HTTPBasicAuth(self._username, self._password)
|
||||||
try:
|
try:
|
||||||
response = requests.get(
|
response = requests.get(
|
||||||
self._still_image_url,
|
self._still_image_url,
|
||||||
auth=HTTPBasicAuth(self._username, self._password),
|
auth=auth,
|
||||||
timeout=10)
|
timeout=10)
|
||||||
except requests.exceptions.RequestException as error:
|
except requests.exceptions.RequestException as error:
|
||||||
_LOGGER.error('Error getting camera image: %s', error)
|
_LOGGER.error('Error getting camera image: %s', error)
|
||||||
|
@ -8,7 +8,7 @@ import logging
|
|||||||
from contextlib import closing
|
from contextlib import closing
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
from requests.auth import HTTPBasicAuth
|
from requests.auth import HTTPBasicAuth, HTTPDigestAuth
|
||||||
|
|
||||||
from homeassistant.components.camera import DOMAIN, Camera
|
from homeassistant.components.camera import DOMAIN, Camera
|
||||||
from homeassistant.helpers import validate_config
|
from homeassistant.helpers import validate_config
|
||||||
@ -17,6 +17,9 @@ CONTENT_TYPE_HEADER = 'Content-Type'
|
|||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
BASIC_AUTHENTICATION = 'basic'
|
||||||
|
DIGEST_AUTHENTICATION = 'digest'
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=unused-argument
|
# pylint: disable=unused-argument
|
||||||
def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
||||||
@ -48,6 +51,8 @@ class MjpegCamera(Camera):
|
|||||||
"""Initialize a MJPEG camera."""
|
"""Initialize a MJPEG camera."""
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self._name = device_info.get('name', 'Mjpeg Camera')
|
self._name = device_info.get('name', 'Mjpeg Camera')
|
||||||
|
self._authentication = device_info.get('authentication',
|
||||||
|
BASIC_AUTHENTICATION)
|
||||||
self._username = device_info.get('username')
|
self._username = device_info.get('username')
|
||||||
self._password = device_info.get('password')
|
self._password = device_info.get('password')
|
||||||
self._mjpeg_url = device_info['mjpeg_url']
|
self._mjpeg_url = device_info['mjpeg_url']
|
||||||
@ -55,9 +60,12 @@ class MjpegCamera(Camera):
|
|||||||
def camera_stream(self):
|
def camera_stream(self):
|
||||||
"""Return a MJPEG stream image response directly from the camera."""
|
"""Return a MJPEG stream image response directly from the camera."""
|
||||||
if self._username and self._password:
|
if self._username and self._password:
|
||||||
|
if self._authentication == DIGEST_AUTHENTICATION:
|
||||||
|
auth = HTTPDigestAuth(self._username, self._password)
|
||||||
|
else:
|
||||||
|
auth = HTTPBasicAuth(self._username, self._password)
|
||||||
return requests.get(self._mjpeg_url,
|
return requests.get(self._mjpeg_url,
|
||||||
auth=HTTPBasicAuth(self._username,
|
auth=auth,
|
||||||
self._password),
|
|
||||||
stream=True, timeout=10)
|
stream=True, timeout=10)
|
||||||
else:
|
else:
|
||||||
return requests.get(self._mjpeg_url, stream=True, timeout=10)
|
return requests.get(self._mjpeg_url, stream=True, timeout=10)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user