- Мои виды: создание именованных видов с произвольным набором камер - Переименование каналов (per-user) в «Мои виды» - Полноэкранный плеер доступен из «Мои виды» - Архивный плеер: FPS с DVR через ISAPI, окно 24ч, без параллельных потоков при seek - Исправлен плеер в /view (display:none override) - Версия в APP_VERSION
9.8 KiB
9.8 KiB
Changelog
Все значимые изменения фиксируются в этом файле.
Формат основан на Keep a Changelog.
[1.7] — 2026-04-07
Добавлено
- Мои виды — новый раздел в боковом меню: пользователь создаёт произвольные виды с любым набором камер из разрешённых ему регистраторов
- Камеры в виде перетаскиваются (drag-and-drop), порядок сохраняется
- Редактор вида: модальное окно с переименованием и управлением камерами (выбор по DVR с чекбоксами)
- SSE-эндпоинт
/api/myview/sse— единый поток превью для камер с разных регистраторов - Полноэкранный плеер (прямой эфир + архив + скачивание клипа) доступен из «Мои виды»
- Переименование каналов в «Мои виды»: каждый пользователь задаёт своё название, сохраняется в БД
- Версия приложения вынесена в константу
APP_VERSIONв начале скрипта
Улучшено
- Архивный плеер: окно воспроизведения расширено с 1 до 24 часов — длинные записи больше не обрываются
- Архивный плеер: FPS берётся с регистратора через ISAPI (
maxFrameRate), фоллбэк 20 fps - Архивный плеер: при переключении времени (клик по таймлайну) предыдущий поток явно завершается — нет параллельных соединений
- Архивный плеер: ffmpeg-путь тоже throttle до реального FPS — потребление памяти при просмотре архива снижено
[1.6.1] — 2026-04-07
Улучшено
- Скачивание клипа: прогресс-бар с двумя фазами — «Загрузка с DVR» (байты / процент) и «Конвертация»
- Скачивание клипа: задание выполняется в фоновом потоке, браузер не блокируется
- Кнопка «Отменить» прерывает фоновое задание и сигнализирует SDK прекратить приём данных
[1.6] — 2026-04-07
Исправлено
- Скачивание клипов переведено на Hikvision SDK (
PlayBackByTime_V40+ data callback): точное время начала по часам DVR, без seek-смещения - SDK-библиотеки загружаются корректно: процесс перезапускается с правильным
LD_LIBRARY_PATH, чтобыlibPlayCtrl.soнаходила зависимостьlibAudioRender.so
[1.5] — 2026-04-06
Добавлено
- Дашборд обычного пользователя: карточки «Время» (живые часы) и «Версия»
- Дашборд: обычный пользователь видит только разрешённые ему регистраторы
- IP регистратора в шапке предпросмотра — кликабельная ссылка на веб-интерфейс устройства
Безопасность
- CSRF-защита: все state-changing запросы (POST/PUT/DELETE) проверяют токен сессии; токен автоматически добавляется в формы и fetch-запросы через JavaScript
- Куки сессии: установлены флаги
HttpOnlyиSameSite=Lax— куки недоступны из JS и не отправляются при кросс-сайтовых запросах - Открытый редирект: параметр
nextпосле логина принимается только как относительный путь, исключая редирект на внешние домены - XSS: все пользовательские данные в HTML-шаблонах экранируются через
html.escape()вместо частичногоreplace('"', '"') - Валидация параметров:
channel,year,monthпроверяются на допустимый формат и диапазон до использования в XML-запросах и вычислениях - Контроль доступа:
/api/dvr/<id>/pingтеперь проверяет права пользователя на конкретный DVR - Небезопасный ключ по умолчанию: при запуске без
SECRET_KEYвыводится предупреждение в stderr
Убрано
- Лишние папки и скрипты со старым кодом который уже нигде не используется
Исправлено
- Удаление пользователя не срабатывало — клик всплывал на строку таблицы и перехватывался её
onclick - После добавления CSRF-защиты ломались пинги регистраторов (порядок загрузки скриптов)
- После выхода из просмотра канала предпросмотр не возобновлял поток
Улучшено
- Предпросмотр каналов, плеер, календарь и таймлайн теперь полностью адаптируются к светлой/тёмной теме
- Кнопка «Войти» на странице логина: hover больше не сливается с фоном
- IP регистратора в шапке: обводка-кнопка без подчёркивания, появляется только после выбора DVR
- Архивный плеер: спиннер ожидания при загрузке потока (переключение режима, перемотка, клик по таймлайну)
- Архивный плеер: отображение текущего времени воспроизведения обновляется каждую секунду
- Таймлайн: убраны сегменты записей, метки каждый час (0–24) вместо каждых 3 часов
- Скачивание клипа: поля времени разбиты на отдельные ЧЧ / ММ / СС — каждая часть редактируется независимо
- Скачивание клипа: кнопка «Отменить» прерывает загрузку и завершает ffmpeg-процесс на сервере
[1.4] — 2026-04-05
Добавлено
- Сохранение пользовательского порядка каналов предпросмотра (drag-and-drop, per-user)
[1.2] — 2026-04-05
Добавлено
- Смена пароля веб-пользователей (включая admin)
- Отключение/включение учётных записей (включая admin)
- Docker-контейнер:
dvr_admin_docker/с Gunicorn, инструкция деплояDEPLOY.md - Ключ шифрования Fernet через переменную окружения
FERNET_KEY
Исправлено
- Скачивание клипа всегда начиналось с начала сегмента — теперь с запрошенного времени (byte-range seek)
- Колонки таблицы веб-пользователей съезжали при добавлении колонки «Статус»
[1.1] — 2026-04-03
Добавлено
- Панель сохранения клипа: выбор времени начала/конца, формат mp4/mkv/gif
- Быстрое скачивание клипов через ISAPI HTTP download (~14 MB/s вместо RTSP)
- YouTube-подобный спиннер загрузки для предпросмотра, основного потока и архива
- Адаптивный FPS основного потока и архива (подстраивается под DVR)
Исправлено
- ffmpeg-процессы не завершались при переключении между DVR — утечка CPU
- Предпросмотр не загружался на DVR со спецсимволами в пароле (
;#{}]) - Клипы скачивались с начала сегмента вместо запрошенного времени
Улучшено
- Предпросмотр: 1 fps на канал через
-skip_frame noref(снижение нагрузки на CPU) - SSE-поток предпросмотра ставится на паузу при открытии полноэкранного плеера
[1.0] — 2026-04-01
Добавлено
- Централизованное управление регистраторами Hikvision
- Авторизация с bcrypt, шифрование паролей DVR через Fernet
- Предпросмотр каналов через SSE (Server-Sent Events)
- Просмотр архива с календарём и треком записей
- Управление пользователями и правами доступа к DVR/концепциям
- Поддержка Hikvision SDK (libhcnetsdk, libPlayCtrl) для Hi-Watch HEVC+