Source code for noctua.devices.ipcam

#!/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')