From bc1d5ff2babfbe5026996832277b56b4891c221e Mon Sep 17 00:00:00 2001 From: Gigabyte Date: Wed, 25 Nov 2020 03:06:02 -0800 Subject: [PATCH] add digest support for camera 4 note you must define username and password in camerapreview.py and allcameraplayer.py this is just a starting point currently only supports snapshot url, mjpeg support is basicly the same feel free to adapt if I no longer update. --- resources/lib/allcameraplayer.py | 12 ++++++++++-- resources/lib/camerapreview.py | 17 ++++++++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/resources/lib/allcameraplayer.py b/resources/lib/allcameraplayer.py index f51f520..4dda0d9 100644 --- a/resources/lib/allcameraplayer.py +++ b/resources/lib/allcameraplayer.py @@ -9,6 +9,7 @@ import xbmc, xbmcaddon, xbmcvfs, xbmcgui import threading, os, requests#, time from urllib import urlretrieve +from requests.auth import HTTPDigestAuth import settings, monitor, utils from resources.lib.ipcam_api_wrapper import CameraAPIWrapper as Camera import socket @@ -139,8 +140,15 @@ def getImagesSnapshot(self, camera, url, control, prefix): try: filename = os.path.join(_datapath, '%s_%s.%d.jpg') %(prefix, camera.number, x) - urlretrieve(url, filename) - + if '4' in camera.number: #DIGEST IS ONLY ENABLED ON CAMERA 4 + r = requests.get(url, stream = True, timeout = TIMEOUT, auth=HTTPDigestAuth('USERNAME', 'PASSWORD')) #You must define your user and password here!!! + with open(filename, 'wb') as fd: + for chunk in r.iter_content(chunk_size=128): + fd.write(chunk) + + else: + urlretrieve(url, filename) + if os.path.exists(filename): control[0].setImage(filename, useCache = False) xbmcvfs.delete(os.path.join(_datapath, '%s_%s.%d.jpg') %(prefix, camera.number, x - 1)) diff --git a/resources/lib/camerapreview.py b/resources/lib/camerapreview.py index 9ce6409..325f055 100644 --- a/resources/lib/camerapreview.py +++ b/resources/lib/camerapreview.py @@ -10,6 +10,7 @@ import os, requests, time import utils, settings, cameraplayer, allcameraplayer, monitor from urllib import urlretrieve +from requests.auth import HTTPDigestAuth import threading import socket TIMEOUT = settings.getSetting_int('request_timeout') @@ -123,7 +124,6 @@ def start(self): if url == '': url = self.camera.getStreamUrl(2, stream_type) - utils.log(2, 'Camera %s :: Preview Window Opened - Manual: %s; Stream Type: %d; URL: %s' %(self.camera.number, self.monitor.openRequest_manual(self.camera.number), stream_type, url)) if stream_type == 0: @@ -234,8 +234,8 @@ def getImagesMjpeg(self, url): """ Update camera position with mjpeg frames """ try: - stream = requests.get(url, stream = True, timeout = TIMEOUT).raw - +# stream = requests.get(url, stream = True, timeout = TIMEOUT, auth=HTTPDigestAuth('USERNAME', 'PASSWORD')).raw #uncomment if you need digest support for mjpeg + stream = requests.get(url, stream = True, timeout = TIMEOUT).raw except requests.RequestException as e: utils.log(3, e) self.img1.setImage(_error, useCache = False) @@ -265,13 +265,20 @@ def getImagesMjpeg(self, url): def getImagesSnapshot(self, url, *args, **kwargs): """ Update camera position with snapshots """ - + x = 0 while not self.monitor.abortRequested() and not self.monitor.stopped() and self.monitor.previewOpened(self.camera.number): try: filename = os.path.join(_datapath, '%s_%s.%d.jpg') %(self.prefix, self.camera.number, x) - urlretrieve(url, filename) + if '4' in self.camera.number: #DIGEST IS ONLY ENABLED ON CAMERA 4 + r = requests.get(url, stream = True, timeout = TIMEOUT, auth=HTTPDigestAuth('USERNAME', 'PASSWORD')) #You must define your user and password here!!! + with open(filename, 'wb') as fd: + for chunk in r.iter_content(chunk_size=128): + fd.write(chunk) + + else: + urlretrieve(url, filename) if os.path.exists(filename): self.img1.setImage(filename, useCache = False)