Каталог Поиск 0 Сравнить 0 Закладки 0 Корзина Войти
Каталог
105082, Москва, ул. Фридриха Энгельса, 75с21, БЦ Бауманский ИТКОЛ
Пн - Пт: с 09-00 до 18-00 Сб: с 10-00 до 18-00 Вс: выходной
   RSS
Инструмент для скачивания видео с UniFi Protect, UniFi Protect
 
Всем привет! Пока я пытался вручную скачать три недели видеозаписей через веб-интерфейс, мне быстро надоело кликать по одному дню и одной камере, поэтому я решил сделать это своим проектом на выходные — написать инструмент, который автоматизирует весь процесс. Через два дня и более 300 строк кода результат готов, его можно найти здесь: https://github.com/danielfernau/unifi-protect-video-downloader

Поскольку UniFi Protect хранит файлы в виде контейнеров .ubv на своём жёстком диске, просто скачать их через SSH/SFTP не получится. К счастью, есть API, который позволяет скачивать сегменты в формате .mp4.

В процессе исследования для этого проекта я наткнулся на несколько других обсуждений по поводу резервного копирования и массового скачивания видео:

https://community.ui.com/questions/Download-Footage-from-Protect/5928d23c-27ee-4e42-a698-0e7182cdf8d9  
https://community.ui.com/questions/-ubv-playback-conversion-tools/55f0dd34-f66e-4242-a3da-f5683d75a32d?page=2  
https://community.ui.com/questions/How-to-backup-recordings-with-protect/0b431ca1-68cc-4da8-9125-2d9bdc326bd4  
https://community.ui.com/questions/Archiving-Unifi-Protect-Video/f91ff83b-e37a-462e-9f92-54a50803c2e0

Именно поэтому я решил сделать свой проект публичным, чтобы все, кому нужно экспортировать записи из 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. Чтобы автоматически перезапускать процессы с ненулевым кодом выхода, посмотрите https://stackoverflow.com/a/697064 — задержка в 120 секунд перед рестартом даёт времени Protect на Cloud Key перезапуститься самостоятельно.

Если хотите использовать этот инструмент в скрипте или автоматизированной среде, коды выхода такие:  
1 — если папка для скачивания не существует  
2 — ошибка логина или пароль неверен  
3 — не удалось получить API access key  
4 — сбой скачивания из-за кода ответа, не равного 200, и не установлен флаг --ignore-failed-downloads  
5 — сбой скачивания по проблеме с API, описанной выше (или по другой причине)  
0 — если все файлы за заданный период успешно скачаны (результат зависит от переданных параметров)

Буду рад вашим идеям, предложениям по функциям, комментариям и вопросам — пишите ниже, постараюсь помочь.

Приятного пользования! Надеюсь, этот инструмент сэкономит вам немало времени 😀
Страницы: Пред. 1 2
Ответы
 
@randomxt --snapshot не принимает никаких дополнительных аргументов. В документации сказано только «Сделать и скачать снимок с указанной(ых) камеры(м)». Это булевый параметр, и он только подходит для получения снимка с выбранной(ых) камеры(м) в момент запуска команды. Его нельзя использовать для получения снимков из конкретного момента времени, хотя я могу добавить такую функцию позже. Также параметры --start и --end игнорируются при использовании --snapshot. Будут скачиваться только снимки, видеофайлы не сохраняются. Ваша команда должна выглядеть так: python3 main.py --address=192.168.69.69 --port=7443 --username="exporter" --password="exporter9" --cameras="5d0569bc00c18903e700067a" --dest=./download --snapshot
Страницы: Пред. 1 2
Читают тему (гостей: 1)