Каталог Поиск 0 Сравнить 0 Закладки 0 Корзина Войти
Каталог
105082, Москва, ул. Фридриха Энгельса, 75с21, БЦ Бауманский ИТКОЛ
Пн - Пт: с 09-00 до 18-00 Сб: с 10-00 до 18-00 Вс: выходной
Страницы: 1 2 След.
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 — если все файлы за заданный период успешно скачаны (результат зависит от переданных параметров)

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

Приятного пользования! Надеюсь, этот инструмент сэкономит вам немало времени 😀
 
@torsion13 У меня нет UDM Pro, но учти, что UDM Pro работает на UniFi OS, а UCKG2+ пока нет. Это может объяснять неожиданное поведение этого скрипта на UDM Pro.
 
У меня тоже есть UDM Pro, и я тоже не смог скачать видео ни одним из доступных вариантов (ни с помощью python-скрипта danielfernau, ни через powershell-метод от majerus123 здесь: https://community.ui.com/questions/Download-more-than-10-min/10e8db5c-06e2-48ed-8127-234a3630494e). Я настроил ssh на UDM Pro и обнаружил, что для каждого временного интервала, который я пытался скачать безуспешно, создаётся mp4-файл.

Эти mp4 хранятся в папке на UDM Pro: /mnt/data_ext/unifi-os/unifi-protect/

Исходя из этого, я просто скопировал нужный файл на свой компьютер с помощью scp. Вот пример:

scp <user>@<UDM Pro IP>:/mnt/data_ext/unifi-os/unifi-protect/video/<clip name>.mp4 <clip name>.mp4

Надеюсь, это поможет таким же людям, как я, которые хотят скачать всего *одно* видео!
 
Одно, что меня действительно тормозило в Windows, — это необходимость запускать CMD от имени администратора.
 
@danielfernau У меня такая же проблема, как и у ещё одного парня, и я никак не могу найти решение! Можешь помочь? У меня ошибка 500. Ниже прикрепил свою ошибку. Спасибо!!

AV4U9G:unifi-protect-video-downloader-1.1.1 jrlane$ python3 main.py --address=IPchanged --username=UNchanged --password=PWchanged --cameras=5cc47a550188d003e7000400 --start="2019-03-14 23:00:00+0200" --end="2019-03-15 2:00:00+0200" --dest=./download --skip-existing-files --touch-files --use-subfolders  
Успешная аутентификация как пользователь video  
Успешный запрос API Access Key  
Успешное получение данных с /api/bootstrap  
Найдены камеры:  
Alley West (5cc47a72027fd003e7000403)  
South Bar (5cc47ac20314d003e700040c)  
Alley East (5cc47a9a02f5d003e7000409)  
Back Parking Lot (5cc47a550170d003e70003ff)  
Bar #2 (5cc47a550188d003e7000400)  
Front South (5cc47a6803d2d003e7000401)  
Tables (5cc47a72029fd003e7000405)  
Pool Tables #2 (5cc47a7d0085d003e7000406)  
Front Door (5cc47acd00e4d003e700040e)  
Dance Floor #2 (5cc47a8602f6d003e7000407)  
Bar #1 (5cc47a9100a7d003e7000408)  
Dance Floor #1 (5cc47ac2035cd003e700040d)  
Pool Tables #3 (5cc47a72028fd003e7000404)  
Pool Tables #1 (5cc47aa5009bd003e700040a)  
Скачиваю видео с 2019-03-14 23:00:00+02:00 по 2019-03-15 02:00:00+02:00 с 'https://IPchanged/api/video/export'

Скачиваю материал с камеры 'Bar #2' (5cc47a550188d003e7000400)  
Создан путь /Users/jrlane/Desktop/unifi-protect-video-downloader-1.1.1/download/2019/03/14/Bar_2_0400  
Скачиваю видео за период 2019-03-14 23:00:00+02:00 - 2019-03-14 23:59:59+02:00 в /Users/jrlane/Desktop/unifi-protect-video-downloader-1.1.1/download/2019/03/14/Bar_2_0400/Bar_2_0400_2019-03-14--23-00-00+0200_2019-03-14--23-59-59+0200.mp4  
Аргумент '--touch-files' активен. Создаю файл по адресу /Users/jrlane/Desktop/unifi-protect-video-downloader-1.1.1/download/2019/03/14/Bar_2_0400/Bar_2_0400_2019-03-14--23-00-00+0200_2019-03-14--23-59-59+0200.mp4  
Скачивание завершилось неудачей со статусом 500 Internal Server Error

Чтобы пропускать неудачные загрузки и продолжать с следующим файлом, добавь аргумент '--ignore-failed-downloads'  
0 файлов загружено, 0 файлов пропущено, всего 0 файлов
 
Почему это ещё не прикреплено?
 
@mehulchaudhari В таком случае, скорее всего, в вашей команде используется путь с пробелом, который не экранирован. Например, ./Protect Videos/ вместо ./Protect\ Videos или './Protect Videos'. Тогда ваша оболочка воспринимает части этой строки как отдельные команды, из-за чего и возникает такая ошибка.
 
@denimatica Я скоро добавлю документацию по использованию v2 и сообщу, где её можно будет найти, как только она появится. А пока можешь попробовать использовать Планировщик заданий Windows (инструкция здесь), чтобы настроить задачу, которая будет запускаться ежедневно. Параметры начала и конца нужно сделать динамическими с помощью PowerShell: начало — «сейчас минус 1 день», конец — «сейчас». В PowerShell, чтобы получить формат, с которым сможет работать скрипт загрузки, это будет так: (get-date).AddDays(-1).ToString("yyyy-MM-dd hh:mm:sszzzz") для «сейчас минус 1 день» (start) и (get-date).ToString("yyyy-MM-dd hh:mm:sszzzz") для «сейчас» (end).
 
У меня ошибка: команда "Video" не найдена.
 
Спасибо, Дэниел. Я не программист и не знаю, как написать тот скрипт, который вы упомянули, чтобы каждый раз копировать предыдущий день, извините. Хотелось бы попробовать новую версию, чтобы посмотреть, смогу ли настроить синхронизацию, но я не вижу описанного синтаксиса и примеров (все связано с версией 1.x). Учтите, что я работаю на Windows.

Сейчас, с версией 1.1.0, моя команда запуска выглядит так:  
-C:\Users\Usuario\AppData\Local\Programs\Python\Python38\python­.exe C:\DENIMATICA\unifi-protect-video-downloader\main.py --address=192.168.0.200 --username="XXXX" --password="XXXX" --cameras="all" --start="2020-01-01 00:00:00+0100" --end="2020-04-31 00:00:00+0100" --dest="F:" --skip-existing-files --use-subfolders --ignore-failed-downloads

— А чтобы удалить пустые папки, использую:  
@echo off  
CD F:  
FOR /R /D %%a IN (*.*) DO ECHO RD "%%a" >> Lista_1.bat  
SORT /R <Lista_1.bat >Lista_2.bat  
CALL Lista_2.bat  
DEL Lista_1.bat  
DEL Lista_2.bat

Если дадите инструкции по установке и параметры для версии 2, я могу попробовать. Спасибо!
 
@denimatica Да, эта функция включена в новой версии. Она работает так: пытается скачать всё между первой доступной записью каждой камеры и текущим временем, при этом отслеживая, что уже синхронизировано. Код и детали: https://github.com/unifi-toolbox/unifi-protect-video-downloader/pull/18. Для версии 1.x.x я бы рекомендовал запускать это вместе с cron-задачей или каким-нибудь скриптом, который загружает файлы за период с 00:00 до 23:59 предыдущего дня, например, в 1 час ночи следующего дня. Именно так я сейчас настроил это у себя.
 
Спасибо за сообщение, заметил это. Попробую без этого параметра, но боюсь, что тогда папки между датами создадутся, только пустые. Жду новую версию с документацией, чтобы проверить. А текущая бета уже умеет то, что было запрошено — синхронизировать содержимое? Ещё раз спасибо за информацию и особенно за вашу отличную помощь.
 
@danielfernau Все равно не могу избавиться от ошибки 404. У меня ограниченная учётная запись администратора на уровне UDMPro, в Protect она отображается точно так же, как и учётка CloudKey с правами только на просмотр. Но когда я пытаюсь запустить python3 main.py --address=192.168.69.1 --username="name" --password="pass" --cameras="guid" --snapshot, выдает ошибку Authentication as user name failed with status 404 Not Found. Интересно, может быть, есть ещё какие-то проблемы с доступом — есть идеи по отладке?
 
@denimatica Спасибо, приятно слышать, что вам нравится пользоваться этим инструментом! Поведение, которое вы описываете, соответствует ожиданиям для текущей версии 1.x. Однако в вашем случае стоит попробовать запуск без аргумента --touch-files, чтобы избежать создания всех этих пустых заглушек. Загляните в документацию, чтобы узнать больше о флагах и возможностях, которыми можно воспользоваться.

Сейчас мы уже работаем над версией 2.x, в которой будет функция «sync», работающая почти так, как вы описали в своем вопросе. Документация для нового интерфейса командной строки пока недоступна, и он может не всегда работать идеально, но если интересно и хотите попробовать сами, вот ссылка: https://github.com/unifi-toolbox/unifi-protect-video-downloader/tree/v2.0.0

Как только новая версия будет готова к выпуску, я обязательно сообщу здесь.
 
@randomxt Понял. Всё равно интересно, почему Protect ведёт себя по-разному на UDM и на CloudKey... Если что-то полезное найдусь, дам знать.
 
@danielfernau Спасибо за эту отличную утилиту. Установил на Windows 10 Pro, всё работает, но иногда (не знаю почему) программа не скачивает видео со всех камер. Их 13, и порой скачиваются только с 2 на определённые дни, остальные 11 — нет. Хотелось бы автоматизировать процесс резервного копирования так, чтобы всегда сохранялись последние 30 дней со всех камер (или вообще весь контент с DVR — было бы ещё лучше), без необходимости указывать дату начала и окончания при каждом запуске. Пробовал убрать все даты и поставить начало сегодняшнего дня, а конец — 2050 год, но тогда создаётся куча пустых папок и видео с нулевым размером на каждый день между датами. Если бы можно было пропускать создание папок и видео, если их нет на источнике, было бы здорово — тогда всё бы решилось. Как думаешь, это реально сделать? Заранее спасибо и извиняюсь, если перевод не совсем точный.
 
Спасибо, @danielfernau. Я следовал этим инструкциям (нашёл их тоже вчера), создал пользователя с ограниченными правами администратора и дал ему права на просмотр защищённых данных. Ошибка, которую я получаю: "Аутентификация как пользователь <username> не удалась с кодом 404 — не найдено". Буду продолжать пробовать разные варианты :)
 
@randomxt Без проблем. Я не знал, что ты пытаешься запустить это на новом UDM Pro. У меня нет такого устройства для тестов, но я нашёл этот пост о том, как добавить аккаунт с ограниченными правами администратора и доступом только для чтения к сервису Protect: https://community.ui.com/questions/UDM-Pro-Adding-Users-from-local-portal-page/458d0297-029c-4e57-b7e5-74664f9125ed Порт тот же самый. На каком этапе у тебя возникает ошибка 404? Не уверен, что это сработает, так как проверить сейчас не могу — но дай знать, что получилось. Если не получится, можешь написать мне, попробуем разобраться вместе. (В таком случае я обновлю информацию здесь, как только поймём, как всё работает.)
 
Похоже, что можно создавать локальные аккаунты, но делать это нужно через UDMPRO, а не через Protect — немного по-другому, но должно работать. У меня всё равно выходит 404 — может, у UDMPro порт поменялся?
 
@danielfernau Спасибо, понял, извиняюсь за это. Кто-нибудь пробовал это на UDM Pro? Я использовал этот инструмент со скриптом, который каждую полчаса делает снимок всех моих фото, и всё отлично работало. Сегодня переключился на UDMP Pro, и не могу запустить. На UDMPRO один и тот же IP для protect и controller, но это не должно быть проблемой. Думаю, что там нет локальных пользователей, и в этом может быть загвоздка.
Страницы: 1 2 След.
Читают тему (гостей: 1)