def request_videos(blink, time=None, page=0): """ Perform a request for videos. :param blink: Blink instance. :param time: Get videos since this time. In epoch seconds. :param page: Page number to get videos from. """ timestamp = get_time(time) url = f"{blink.urls.base_url}/api/v1/accounts/{blink.account_id}/media/changed?since={timestamp}&page={page}" return http_get(blink, url)
def request_videos(blink, time=None, page=0): """ Perform a request for videos. :param blink: Blink instance. :param time: Get videos since this time. In epoch seconds. :param page: Page number to get videos from. """ timestamp = get_time(time) url = "{}/api/v2/videos/changed?since={}&page={}".format( blink.urls.base_url, timestamp, page) return http_get(blink, url)
def test_download_video_exit(self, mock_req): """Test we exit method when provided bad response.""" blink = blinkpy.Blink() # pylint: disable=protected-access blinkpy._LOGGER.setLevel(logging.DEBUG) blink.last_refresh = 0 mock_req.return_value = {} formatted_date = get_time(blink.last_refresh) expected_log = [ "INFO:blinkpy.blinkpy:Retrieving videos since {}".format(formatted_date), "DEBUG:blinkpy.blinkpy:Processing page 1", "INFO:blinkpy.blinkpy:No videos found on page 1. Exiting.", ] with self.assertLogs() as dl_log: blink.download_videos("/tmp") self.assertEqual(dl_log.output, expected_log)
def download_videos(self, path, since=None, camera="all", stop=10, debug=False): """ Download all videos from server since specified time. :param path: Path to write files. /path/<cameraname>_<recorddate>.mp4 :param since: Date and time to get videos from. Ex: "2018/07/28 12:33:00" to retrieve videos since July 28th 2018 at 12:33:00 :param camera: Camera name to retrieve. Defaults to "all". Use a list for multiple cameras. :param stop: Page to stop on (~25 items per page. Default page 10). :param debug: Set to TRUE to prevent downloading of items. Instead of downloading, entries will be printed to log. """ if since is None: since_epochs = self.last_refresh else: parsed_datetime = parse(since, fuzzy=True) since_epochs = parsed_datetime.timestamp() formatted_date = get_time(time_to_convert=since_epochs) _LOGGER.info("Retrieving videos since %s", formatted_date) if not isinstance(camera, list): camera = [camera] for page in range(1, stop): response = api.request_videos(self, time=since_epochs, page=page) _LOGGER.debug("Processing page %s", page) try: result = response["media"] if not result: raise IndexError except (KeyError, IndexError): _LOGGER.info("No videos found on page %s. Exiting.", page) break self._parse_downloaded_items(result, camera, path, debug)
def test_parse_downloaded_items(self, mock_req): """Test ability to parse downloaded items list.""" blink = blinkpy.Blink() # pylint: disable=protected-access blinkpy._LOGGER.setLevel(logging.DEBUG) generic_entry = { "created_at": "1970", "device_name": "foo", "deleted": True, "media": "/bar.mp4", } result = [generic_entry] mock_req.return_value = {"media": result} blink.last_refresh = 0 formatted_date = get_time(blink.last_refresh) expected_log = [ "INFO:blinkpy.blinkpy:Retrieving videos since {}".format(formatted_date), "DEBUG:blinkpy.blinkpy:Processing page 1", "DEBUG:blinkpy.blinkpy:foo: /bar.mp4 is marked as deleted.", ] with self.assertLogs() as dl_log: blink.download_videos("/tmp", stop=2, delay=0) self.assertEqual(dl_log.output, expected_log)
def test_parse_camera_not_in_list(self, mock_req, mock_sess): """Test ability to parse downloaded items list.""" blink = blinkpy.Blink() # pylint: disable=protected-access blinkpy._LOGGER.setLevel(logging.DEBUG) generic_entry = { 'created_at': '1970', 'device_name': 'foo', 'deleted': True, 'media': '/bar.mp4' } result = [generic_entry] mock_req.return_value = {'media': result} blink.last_refresh = 0 formatted_date = get_time(blink.last_refresh) expected_log = [ "INFO:blinkpy.blinkpy:Retrieving videos since {}".format( formatted_date), "DEBUG:blinkpy.blinkpy:Processing page 1", "DEBUG:blinkpy.blinkpy:Skipping videos for foo." ] with self.assertLogs() as dl_log: blink.download_videos('/tmp', camera='bar', stop=2) self.assertEqual(dl_log.output, expected_log)