Source code for unifi_video.recording

from __future__ import print_function, unicode_literals

from .single import UnifiVideoSingle
from datetime import datetime

endpoints = {
    'download': lambda x: 'recording/{}/download'.format(x),
    'delete': lambda x: 'recording?recordings[]={}&confirmed=true'.format(x),
    'snapshot': lambda c, d, r, w: \
        'snapshot/recording/{}/{}/{}?width={}'.format(c,
            d.strftime('%Y/%m/%d'), r, w),
    'motion': lambda x: 'recording/{}/motion?alpha=true'.format(x),
}

[docs]class UnifiVideoRecording(UnifiVideoSingle): """Recording container Attributes: _id (str): Recording ID (MongoDB ObjectID as hex string) start_time (datetime): Recording start time and date (local time) end_time (datetime): Recording end time and date (local time) start_time_utc (datetime): Recording start time and date (UTC) end_time_utc (datetime): Recording end time and date (UTC) rec_type (str): Recording type. Either `motionRecording`, or `fullTimeRecording`. locked (bool, NoneType): Whether or not recording is locked in_progress (bool, NoneType): Recording is in progress marked_for_deletion (bool, NoneType): Recording is marked for deletion cameras (list): List of camera IDs """ def _load_data(self, data): if not data: return self._data = data self._id = data['_id'] self.rec_type = data.get('eventType', None) self.locked = data.get('locked', None) self.in_progress = data.get('inProgress', None) self.marked_for_deletion = data.get('markedForDeletion', None) self.cameras = data.get('cameras', []) self.start_time = datetime.fromtimestamp( int(data.get('startTime', 0) / 1000)) self.end_time = datetime.fromtimestamp( int(data.get('endTime', 0) / 1000)) self.start_time_utc = datetime.utcfromtimestamp( int(data.get('startTime', 0) / 1000)) self.end_time_utc = datetime.utcfromtimestamp( int(data.get('endTime', 0) / 1000))
[docs] def download(self, filename=None): """Download recording Arguments: filename (str, NoneType, bool): Filename (`str`) to save the image as or ``True`` (`bool`) if you want the response body as a return value. You can also leave this out or set it to ``None`` or ``False`` and a filename will be generated for you. Return value: Depends on input params. - When ``filename`` is `str`, `NoneType` or ``False``: `True` if write to file was successful, otherwise `NoneType` - When ``filename`` is ``True``: raw response body (`str`) """ return self._api.get(endpoints['download'](self._id), filename if filename else 'recording-{}-{}.mp4'.format( self._id, self.start_time.isoformat()))
[docs] def motion(self, filename=None): """Download recording motion Arguments: filename (str, NoneType, bool): Filename (`str`) to save the image as or ``True`` (`bool`) if you want the response body as a return value. You can also leave this out or set it to ``None`` or ``False`` and a filename will be generated for you. Return value: Depends on input params. - When ``filename`` is `str`, `NoneType` or ``False``: `True` if write to file was successful, otherwise `NoneType` - When ``filename`` is ``True``: raw response body (`str`) """ if self.rec_type == 'fullTimeRecording': return False return self._api.get(endpoints['motion'](self._id), filename if filename else 'motion-{}.png'.format(self._id))
[docs] def snapshot(self, width=600, filename=None): """Download recording thumbnail Arguments: width (int): Image pixel width filename (str, NoneType, bool): Filename (`str`) to save the image as or ``True`` (`bool`) if you want the response body as a return value. You can also leave this out or set it to ``None`` or ``False`` and a filename will be generated for you. Return value: Depends on input params. - When ``filename`` is `str`, `NoneType` or ``False``: `True` if write to file was successful, otherwise `NoneType` - When ``filename`` is ``True``: raw response body (`str`) """ return self._api.get(endpoints['snapshot'](self.cameras[0], self.start_time, self._id, width), filename if filename else \ 'recording-{}-{}.jpg'.format(self._id, self.start_time.isoformat()))
[docs] def delete(self): """Delete recording """ return self._api.delete(endpoints['delete'](self._id))
def __str__(self): return '{}: {}'.format(type(self).__name__, { '_id': self._id, 'rec_type': self.rec_type, 'start_time': self.start_time.isoformat(), 'end_time': self.end_time.isoformat() })