#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# System modules
from datetime import datetime
from urllib.parse import urlencode
# Third-party modules
import requests
# Other templates
from ..utils import check
from ..utils.logger import log
from .basedevice import BaseDevice
[docs]
class DlinkDCSCamera(BaseDevice):
'''Base wrapper class for Dlink DCS 5020l cameras.'''
def __init__(self, url):
'''Constructor.'''
self.url = url
self.addr = self.url
self.timeout = 3
self.error = []
@check.request_errors
def get(self, method, params=[], text=True):
'''Send a HTTP GET request to the device address.'''
res = requests.get(f"{self.addr}/{method}.cgi",
params=params,
timeout=self.timeout)
if text:
res_list = res.text.split("\r\n")[:-1]
try:
return dict([r.split("=", 1) for r in res_list])
except ValueError as e:
log.error(e)
self.error.append(e)
return res
else:
try:
return res.content
except AttributeError as e:
log.error(e)
self.error.append(e)
return None
@check.request_errors
def put(self, method, params={}):
'''Send a HTTP GET request to the device address.'''
res = requests.get(f"{self.addr}/{method}.cgi",
params=params,
timeout=self.timeout)
value = res
return value
# def time_to_string(self, time):
# '''Convert a datetime into the HH:MM:SS string format.'''
# return datetime.strftime(time, '%H:%M:%S')
[docs]
class Webcam(DlinkDCSCamera):
'''Implementation of the Telescope commands mocking my Alpaca
Telescope wrapper.'''
@property
def description(self):
'''Get IP Camera Information.'''
res = self.get('common/info')
return res
@property
def stream_info(self):
'''Get the IP Camera Video stream info.'''
return self.get('config/stream_info')
@property
def altaz(self):
'''Get the IP Camera Network Pan Tilt Zoom.'''
res = self.get('config/ptz_move')
if not res:
return res
self._altaz = list(map(int, [res["t"], res["p"]]))
return self._altaz
@altaz.setter
def altaz(self, a):
params = {"p": int(a[1]), "t": int(a[0])}
res = self.put("config/ptz_move", params=params)
self._altaz = self.altaz
@property
def is_moving(self):
'''Get the IP Camera Motion Detection settings.'''
return self.get('config/motion')
@property
def clock(self):
'''Get IP Camera Data Time settings.'''
return self.get('config/datetime')
@property
def image(self):
'''Get IP Camera image in raw format.'''
res = self.get('image/jpeg', text=False)
return res
@property
def video(self):
'''Get IP Camera video as mjpeg stream.'''
res = self.get('video/mjpg', text=False)
return res
@property
def save_image(self, filename="temp.jpeg"):
'''Save a IP Camera image snapshot.'''
res = self.image
if not res:
return res
with open(filename, 'wb') as f:
f.write(res)
return filename
@property
def network(self):
'''Get the IP Camera Network settings.'''
return self.get('config/network')
@property
def wireless(self):
'''Get the IP Camera Wireless information.'''
return self.get('config/wireless')
@property
def ptzpresets(self):
'''Get the IP Camera Network Pan Tilt Zoom Preset List'''
return self.get('config/ptz_preset_list')
# stream = requests.get(url, stream=True)
# if stream.ok:
# chunk_size = 1024
# for chunk in stream.iter_content(chunk_size=chunk_size):
# interpret_video_and_write_to_socket_somehow(chunk, blocking=True)
# NOT OK
@property
def version(self):
'''Get IP Camera CGI version.'''
return self.get('cgiversion')
@property
def inetwork(self):
'''Get the IP Camera Network information.'''
return self.get('inetwork')
@property
def isystem(self):
'''Get the IP Camera System information.'''
return self.get('isystem')
@property
def user(self):
'''Get the IP Camera user setttings.'''
return self.get('user')
@property
def user_list(self):
'''Get the list of IP Camera users.'''
return self.get('userlist')
@property
def upload(self):
'''Get the IP Camera FTP Upload settings.'''
return self.get('upload')
@property
def daynight(self):
'''Get the IP Camera Day Night Mode settings.'''
return self.get('daynight')
@property
def email(self):
'''Get the IP Camera Email notification settings.'''
return self.get('email')
@property
def sound_detection(self):
'''Get the IP Camera Sound Detection settings.'''
return self.get('sdbdetection')