Compare commits
39
Commits
v0.17.0-rc1
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dff0a66c05 | ||
|
|
849b3e060f | ||
|
|
29c6d269a2 | ||
|
|
725debaebe | ||
|
|
7507163422 | ||
|
|
4cb9893fd9 | ||
|
|
6b4fba902b | ||
|
|
c1dc538627 | ||
|
|
6f262c8522 | ||
|
|
d8cf932672 | ||
|
|
42422b3462 | ||
|
|
c51f723133 | ||
|
|
7270a1c1ee | ||
|
|
67b9fe0555 | ||
|
|
887e4288ae | ||
|
|
1c59b34ac4 | ||
|
|
ea2ba8dfcf | ||
|
|
78a1b9b74d | ||
|
|
b99cfc74e9 | ||
|
|
3d6efa4b0a | ||
|
|
b998c47ac7 | ||
|
|
fc7848f00b | ||
|
|
125c562df5 | ||
|
|
f748147dcc | ||
|
|
77c23f8109 | ||
|
|
b98c56938f | ||
|
|
23308cd5db | ||
|
|
9d9d3aa7a3 | ||
|
|
3ddfd10678 | ||
|
|
7c75ffa815 | ||
|
|
4e4b22314a | ||
|
|
4e6b570cba | ||
|
|
b12d9ba969 | ||
|
|
83df95f0da | ||
|
|
3c5caae93f | ||
|
|
b41460c569 | ||
|
|
9ff02de48b | ||
|
|
14cbbacc1b | ||
|
|
1cadf3488d |
@@ -0,0 +1,9 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: pip
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: daily
|
||||||
|
open-pull-requests-limit: 10
|
||||||
|
reviewers:
|
||||||
|
- fronzbot
|
||||||
+30
@@ -4,6 +4,36 @@ Changelog
|
|||||||
|
|
||||||
A list of changes between each release
|
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)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
**Bugfixes:**
|
||||||
|
- Fix video downloading bug (`#424 <https://github.com/fronzbot/blinkpy/pull/424>`__)
|
||||||
|
- Fix repeated authorization email bug (`#432 <https://github.com/fronzbot/blinkpy/pull/432>`__ and `#428 <https://github.com/fronzbot/blinkpy/pull/428>`__)
|
||||||
|
|
||||||
|
**New Features:**
|
||||||
|
- Add logout method (`#429 <https://github.com/fronzbot/blinkpy/pull/429>`__)
|
||||||
|
- Add camera record method (`#430 <https://github.com/fronzbot/blinkpy/pull/430>`__)
|
||||||
|
|
||||||
|
**Other:**
|
||||||
|
- Add debug script to main repo to help with general debug
|
||||||
|
- Upgrade login endpoint from v4 to v5
|
||||||
|
- Add python 3.9 support
|
||||||
|
- Bump coverage to 5.4
|
||||||
|
- Bump pytest to 6.2.2
|
||||||
|
- Bump pytest-cov to 2.11.1
|
||||||
|
- Bump pygments to 2.8.0
|
||||||
|
- Bump pre-commit to 2.10.1
|
||||||
|
- Bump restructuredtext-lint to 1.3.2
|
||||||
|
|
||||||
|
|
||||||
0.16.4 (2020-11-22)
|
0.16.4 (2020-11-22)
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -174,13 +174,13 @@ Similar methods exist for individual cameras:
|
|||||||
|
|
||||||
Download videos
|
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
|
.. 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
|
.. |Build Status| image:: https://github.com/fronzbot/blinkpy/workflows/build/badge.svg
|
||||||
|
|||||||
+8
-3
@@ -264,7 +264,9 @@ class Blink:
|
|||||||
"""Save login data to file."""
|
"""Save login data to file."""
|
||||||
util.json_save(self.auth.login_attributes, file_name)
|
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.
|
Download all videos from server since specified time.
|
||||||
|
|
||||||
@@ -275,6 +277,7 @@ class Blink:
|
|||||||
:param camera: Camera name to retrieve. Defaults to "all".
|
:param camera: Camera name to retrieve. Defaults to "all".
|
||||||
Use a list for multiple cameras.
|
Use a list for multiple cameras.
|
||||||
:param stop: Page to stop on (~25 items per page. Default page 10).
|
: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.
|
:param debug: Set to TRUE to prevent downloading of items.
|
||||||
Instead of downloading, entries will be printed to log.
|
Instead of downloading, entries will be printed to log.
|
||||||
"""
|
"""
|
||||||
@@ -301,9 +304,9 @@ class Blink:
|
|||||||
_LOGGER.info("No videos found on page %s. Exiting.", page)
|
_LOGGER.info("No videos found on page %s. Exiting.", page)
|
||||||
break
|
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."""
|
"""Parse downloaded videos."""
|
||||||
for item in result:
|
for item in result:
|
||||||
try:
|
try:
|
||||||
@@ -351,6 +354,8 @@ class Blink:
|
|||||||
"Address: {address}, Filename: {filename}"
|
"Address: {address}, Filename: {filename}"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
if delay > 0:
|
||||||
|
time.sleep(delay)
|
||||||
|
|
||||||
|
|
||||||
class BlinkSetupError(Exception):
|
class BlinkSetupError(Exception):
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
MAJOR_VERSION = 0
|
MAJOR_VERSION = 0
|
||||||
MINOR_VERSION = 17
|
MINOR_VERSION = 18
|
||||||
PATCH_VERSION = "0.rc1"
|
PATCH_VERSION = "0.dev0"
|
||||||
|
|
||||||
__version__ = f"{MAJOR_VERSION}.{MINOR_VERSION}.{PATCH_VERSION}"
|
__version__ = f"{MAJOR_VERSION}.{MINOR_VERSION}.{PATCH_VERSION}"
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
black==19.10b0
|
black==19.10b0
|
||||||
coverage==5.4
|
coverage==5.5
|
||||||
flake8==3.8.4
|
flake8==3.9.1
|
||||||
flake8-docstrings==1.5.0
|
flake8-docstrings==1.6.0
|
||||||
pre-commit==2.10.1
|
pre-commit==2.12.1
|
||||||
pylint==2.6.0
|
pylint==2.8.2
|
||||||
pydocstyle==5.1.1
|
pydocstyle==6.0.0
|
||||||
pytest==6.2.2
|
pytest==6.2.4
|
||||||
pytest-cov==2.11.1
|
pytest-cov==2.11.1
|
||||||
pytest-sugar==0.9.4
|
pytest-sugar==0.9.4
|
||||||
pytest-timeout==1.4.2
|
pytest-timeout==1.4.2
|
||||||
restructuredtext-lint==1.3.2
|
restructuredtext-lint==1.3.2
|
||||||
pygments==2.7.4
|
pygments==2.9.0
|
||||||
testtools>=2.4.0
|
testtools>=2.4.0
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
import unittest
|
import unittest
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
import logging
|
import logging
|
||||||
|
import time
|
||||||
|
|
||||||
from blinkpy import blinkpy
|
from blinkpy import blinkpy
|
||||||
from blinkpy.sync_module import BlinkSyncModule
|
from blinkpy.sync_module import BlinkSyncModule
|
||||||
@@ -88,9 +89,33 @@ class TestBlinkFunctions(unittest.TestCase):
|
|||||||
"DEBUG:blinkpy.blinkpy:foo: /bar.mp4 is marked as deleted.",
|
"DEBUG:blinkpy.blinkpy:foo: /bar.mp4 is marked as deleted.",
|
||||||
]
|
]
|
||||||
with self.assertLogs() as dl_log:
|
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)
|
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")
|
@mock.patch("blinkpy.blinkpy.api.request_videos")
|
||||||
def test_parse_camera_not_in_list(self, mock_req):
|
def test_parse_camera_not_in_list(self, mock_req):
|
||||||
"""Test ability to parse downloaded items list."""
|
"""Test ability to parse downloaded items list."""
|
||||||
@@ -113,7 +138,7 @@ class TestBlinkFunctions(unittest.TestCase):
|
|||||||
"DEBUG:blinkpy.blinkpy:Skipping videos for foo.",
|
"DEBUG:blinkpy.blinkpy:Skipping videos for foo.",
|
||||||
]
|
]
|
||||||
with self.assertLogs() as dl_log:
|
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)
|
self.assertEqual(dl_log.output, expected_log)
|
||||||
|
|
||||||
@mock.patch("blinkpy.blinkpy.api.request_network_update")
|
@mock.patch("blinkpy.blinkpy.api.request_network_update")
|
||||||
|
|||||||
Reference in New Issue
Block a user