Skip to content

Commit

Permalink
Merge pull request #439 from fronzbot/dev
Browse files Browse the repository at this point in the history
0.17.1
  • Loading branch information
fronzbot authored Feb 18, 2021
2 parents 1ced64d + 9d9d3aa commit ff306b8
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 10 deletions.
7 changes: 7 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@ Changelog

A list of changes between each release

0.17.1 (2021-02-18)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Add delay parameter to Blink.download_videos method in order to throttle API during video retrieval (`#437 <https://github.com/fronzbot/blinkpy/pull/437>`__)
- Bump pylint to 2.6.2


0.17.0 (2021-02-15)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Expand Down
6 changes: 3 additions & 3 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -174,13 +174,13 @@ Similar methods exist for individual cameras:
Download videos
----------------
You can also use this library to download all videos from the server. In order to do this, you must specify a ``path``. You may also specifiy a how far back in time to go to retrieve videos via the ``since=`` variable (a simple string such as ``"2017/09/21"`` is sufficient), as well as how many pages to traverse via the ``stop=`` variable. Note that by default, the library will search the first ten pages which is sufficient in most use cases. Additionally, you can specify one or more cameras via the ``camera=`` property. This can be a single string indicating the name of the camera, or a list of camera names. By default, it is set to the string ``'all'`` to grab videos from all cameras.
You can also use this library to download all videos from the server. In order to do this, you must specify a ``path``. You may also specifiy a how far back in time to go to retrieve videos via the ``since=`` variable (a simple string such as ``"2017/09/21"`` is sufficient), as well as how many pages to traverse via the ``stop=`` variable. Note that by default, the library will search the first ten pages which is sufficient in most use cases. Additionally, you can specify one or more cameras via the ``camera=`` property. This can be a single string indicating the name of the camera, or a list of camera names. By default, it is set to the string ``'all'`` to grab videos from all cameras. If you are downloading many items, setting the ``delay`` parameter is advised in order to throttle sequential calls to the API. By default this is set to ``1`` but can be any integer representing the number of seconds to delay between calls.

Example usage, which downloads all videos recorded since July 4th, 2018 at 9:34am to the ``/home/blink`` directory:
Example usage, which downloads all videos recorded since July 4th, 2018 at 9:34am to the ``/home/blink`` directory with a 2s delay between calls:

.. code:: python
blink.download_videos('/home/blink', since='2018/07/04 09:34')
blink.download_videos('/home/blink', since='2018/07/04 09:34', delay=2)
.. |Build Status| image:: https://github.com/fronzbot/blinkpy/workflows/build/badge.svg
Expand Down
11 changes: 8 additions & 3 deletions blinkpy/blinkpy.py
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,9 @@ def save(self, file_name):
"""Save login data to file."""
util.json_save(self.auth.login_attributes, file_name)

def download_videos(self, path, since=None, camera="all", stop=10, debug=False):
def download_videos(
self, path, since=None, camera="all", stop=10, delay=1, debug=False
):
"""
Download all videos from server since specified time.
Expand All @@ -275,6 +277,7 @@ def download_videos(self, path, since=None, camera="all", stop=10, debug=False):
: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 delay: Number of seconds to wait in between subsequent video downloads.
:param debug: Set to TRUE to prevent downloading of items.
Instead of downloading, entries will be printed to log.
"""
Expand All @@ -301,9 +304,9 @@ def download_videos(self, path, since=None, camera="all", stop=10, debug=False):
_LOGGER.info("No videos found on page %s. Exiting.", page)
break

self._parse_downloaded_items(result, camera, path, debug)
self._parse_downloaded_items(result, camera, path, delay, debug)

def _parse_downloaded_items(self, result, camera, path, debug):
def _parse_downloaded_items(self, result, camera, path, delay, debug):
"""Parse downloaded videos."""
for item in result:
try:
Expand Down Expand Up @@ -351,6 +354,8 @@ def _parse_downloaded_items(self, result, camera, path, debug):
"Address: {address}, Filename: {filename}"
)
)
if delay > 0:
time.sleep(delay)


class BlinkSetupError(Exception):
Expand Down
2 changes: 1 addition & 1 deletion blinkpy/helpers/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

MAJOR_VERSION = 0
MINOR_VERSION = 17
PATCH_VERSION = 0
PATCH_VERSION = 1

__version__ = f"{MAJOR_VERSION}.{MINOR_VERSION}.{PATCH_VERSION}"

Expand Down
2 changes: 1 addition & 1 deletion requirements_test.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ coverage==5.4
flake8==3.8.4
flake8-docstrings==1.5.0
pre-commit==2.10.1
pylint==2.6.0
pylint==2.6.2
pydocstyle==5.1.1
pytest==6.2.2
pytest-cov==2.11.1
Expand Down
29 changes: 27 additions & 2 deletions tests/test_blink_functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import unittest
from unittest import mock
import logging
import time

from blinkpy import blinkpy
from blinkpy.sync_module import BlinkSyncModule
Expand Down Expand Up @@ -88,9 +89,33 @@ def test_parse_downloaded_items(self, mock_req):
"DEBUG:blinkpy.blinkpy:foo: /bar.mp4 is marked as deleted.",
]
with self.assertLogs() as dl_log:
blink.download_videos("/tmp", stop=2)
blink.download_videos("/tmp", stop=2, delay=0)
self.assertEqual(dl_log.output, expected_log)

@mock.patch("blinkpy.blinkpy.api.request_videos")
def test_parse_downloaded_throttle(self, mock_req):
"""Test ability to parse downloaded items list."""
generic_entry = {
"created_at": "1970",
"device_name": "foo",
"deleted": False,
"media": "/bar.mp4",
}
result = [generic_entry]
mock_req.return_value = {"media": result}
self.blink.last_refresh = 0
start = time.time()
self.blink.download_videos("/tmp", stop=2, delay=0, debug=True)
now = time.time()
delta = now - start
self.assertTrue(delta < 0.1)

start = time.time()
self.blink.download_videos("/tmp", stop=2, delay=0.1, debug=True)
now = time.time()
delta = now - start
self.assertTrue(delta >= 0.1)

@mock.patch("blinkpy.blinkpy.api.request_videos")
def test_parse_camera_not_in_list(self, mock_req):
"""Test ability to parse downloaded items list."""
Expand All @@ -113,7 +138,7 @@ def test_parse_camera_not_in_list(self, mock_req):
"DEBUG:blinkpy.blinkpy:Skipping videos for foo.",
]
with self.assertLogs() as dl_log:
blink.download_videos("/tmp", camera="bar", stop=2)
blink.download_videos("/tmp", camera="bar", stop=2, delay=0)
self.assertEqual(dl_log.output, expected_log)

@mock.patch("blinkpy.blinkpy.api.request_network_update")
Expand Down

0 comments on commit ff306b8

Please sign in to comment.