# Changelog Все значимые изменения фиксируются в этом файле. Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.0.0/). ## [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//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+