Всем привет! Пока я пытался вручную скачать три недели видеозаписей через веб-интерфейс, мне быстро надоело кликать по одному дню и одной камере, поэтому я решил сделать это своим проектом на выходные — написать инструмент, который автоматизирует весь процесс. Через два дня и более 300 строк кода результат готов, его можно найти здесь:
Поскольку UniFi Protect хранит файлы в виде контейнеров .ubv на своём жёстком диске, просто скачать их через SSH/SFTP не получится. К счастью, есть API, который позволяет скачивать сегменты в формате .mp4.
В процессе исследования для этого проекта я наткнулся на несколько других обсуждений по поводу резервного копирования и массового скачивания видео:
Именно поэтому я решил сделать свой проект публичным, чтобы все, кому нужно экспортировать записи из UniFi Protect для резервного копирования или архивирования, могли сделать это проще и быстрее. Я также оставлю ссылку на этот пост в комментариях к связанным темам, включая перечисленные выше.
Инструмент умеет скачивать видеозаписи, хранящиеся на Cloud Key, в заданном временном диапазоне. Вы можете скачать видео со всех камер, подключённых к системе, или указать список ID камер. Чтобы узнать ID камеры, откройте Protect web UI, перейдите в раздел «Cameras», выберите нужную камеру и скопируйте её ID из адресной строки браузера (например: https://<ip_address>:7443/cameras/a1b2c3d4e5f6a7b8c9d0e1f2).
Инструкция по установке и использованию инструмента есть в репозитории на GitHub.
Важно: API для скачивания пока работает нестабильно (тестировалось на CK Gen. 2+, версия 1.12.3), и в процессе скачивания Protect может зависать и перезагружаться. Для некоторых сегментов в логах сервера появляются ошибки:
==> service.log <==
2019-10-13T10:42:09.185Z - error: uncaughtException, shutting down...
2019-10-13T10:42:09.187Z - error: TypeError: Cannot set property 'requestOpts' of null
at requestOpts (/usr/share/unifi-protect/app/webpack:/node_modules/@ubnt/ubv/src/processMedia.js:9:12)
==> app.log <==
2019-10-13T10:42:09.186Z - error: uncaughtException, shutting down...
==> errors.log <==
2019-10-13T10:42:09.186Z - error: uncaughtException, shutting down...
и через несколько секунд сервис Protect перезапускается. Почему так происходит — я не понял, и скачать посты с этих проблемных сегментов не удалось. Та же проблема иногда возникает при ручном скачивании через веб-интерфейс. Если с этим столкнётесь, рекомендую использовать флаг --touch-files вместе с --skip-existing-files. Тогда для недоступных сегментов будут создаваться пустые заглушки, и при перезапуске загрузчика они будут пропускаться, не вызывая повторных сбоев на одних и тех же фрагментах.
Советы:
Если инструмент останавливается из-за описанной проблемы с API, он завершится с кодом 5. Чтобы автоматически перезапускать процессы с ненулевым кодом выхода, посмотрите — задержка в 120 секунд перед рестартом даёт времени Protect на Cloud Key перезапуститься самостоятельно.
Если хотите использовать этот инструмент в скрипте или автоматизированной среде, коды выхода такие:
1 — если папка для скачивания не существует
2 — ошибка логина или пароль неверен
3 — не удалось получить API access key
4 — сбой скачивания из-за кода ответа, не равного 200, и не установлен флаг --ignore-failed-downloads
5 — сбой скачивания по проблеме с API, описанной выше (или по другой причине)
0 — если все файлы за заданный период успешно скачаны (результат зависит от переданных параметров)
Буду рад вашим идеям, предложениям по функциям, комментариям и вопросам — пишите ниже, постараюсь помочь.
Приятного пользования! Надеюсь, этот инструмент сэкономит вам немало времени 😀
Поскольку UniFi Protect хранит файлы в виде контейнеров .ubv на своём жёстком диске, просто скачать их через SSH/SFTP не получится. К счастью, есть API, который позволяет скачивать сегменты в формате .mp4.
В процессе исследования для этого проекта я наткнулся на несколько других обсуждений по поводу резервного копирования и массового скачивания видео:
Именно поэтому я решил сделать свой проект публичным, чтобы все, кому нужно экспортировать записи из UniFi Protect для резервного копирования или архивирования, могли сделать это проще и быстрее. Я также оставлю ссылку на этот пост в комментариях к связанным темам, включая перечисленные выше.
Инструмент умеет скачивать видеозаписи, хранящиеся на Cloud Key, в заданном временном диапазоне. Вы можете скачать видео со всех камер, подключённых к системе, или указать список ID камер. Чтобы узнать ID камеры, откройте Protect web UI, перейдите в раздел «Cameras», выберите нужную камеру и скопируйте её ID из адресной строки браузера (например: https://<ip_address>:7443/cameras/a1b2c3d4e5f6a7b8c9d0e1f2).
Инструкция по установке и использованию инструмента есть в репозитории на GitHub.
Важно: API для скачивания пока работает нестабильно (тестировалось на CK Gen. 2+, версия 1.12.3), и в процессе скачивания Protect может зависать и перезагружаться. Для некоторых сегментов в логах сервера появляются ошибки:
==> service.log <==
2019-10-13T10:42:09.185Z - error: uncaughtException, shutting down...
2019-10-13T10:42:09.187Z - error: TypeError: Cannot set property 'requestOpts' of null
at requestOpts (/usr/share/unifi-protect/app/webpack:/node_modules/@ubnt/ubv/src/processMedia.js:9:12)
==> app.log <==
2019-10-13T10:42:09.186Z - error: uncaughtException, shutting down...
==> errors.log <==
2019-10-13T10:42:09.186Z - error: uncaughtException, shutting down...
и через несколько секунд сервис Protect перезапускается. Почему так происходит — я не понял, и скачать посты с этих проблемных сегментов не удалось. Та же проблема иногда возникает при ручном скачивании через веб-интерфейс. Если с этим столкнётесь, рекомендую использовать флаг --touch-files вместе с --skip-existing-files. Тогда для недоступных сегментов будут создаваться пустые заглушки, и при перезапуске загрузчика они будут пропускаться, не вызывая повторных сбоев на одних и тех же фрагментах.
Советы:
Если инструмент останавливается из-за описанной проблемы с API, он завершится с кодом 5. Чтобы автоматически перезапускать процессы с ненулевым кодом выхода, посмотрите — задержка в 120 секунд перед рестартом даёт времени Protect на Cloud Key перезапуститься самостоятельно.
Если хотите использовать этот инструмент в скрипте или автоматизированной среде, коды выхода такие:
1 — если папка для скачивания не существует
2 — ошибка логина или пароль неверен
3 — не удалось получить API access key
4 — сбой скачивания из-за кода ответа, не равного 200, и не установлен флаг --ignore-failed-downloads
5 — сбой скачивания по проблеме с API, описанной выше (или по другой причине)
0 — если все файлы за заданный период успешно скачаны (результат зависит от переданных параметров)
Буду рад вашим идеям, предложениям по функциям, комментариям и вопросам — пишите ниже, постараюсь помочь.
Приятного пользования! Надеюсь, этот инструмент сэкономит вам немало времени 😀
