Поддержка Novicam V3.4.96 рядом с Hikvision, изолировано через IP-whitelist
_NOVICAM_IPS_TEMP. Cam 2/3/4 работают (live + playback с шифрованием), cam 1
остаётся открытым вопросом — Linux libPlayCtrl.so не декодит её mainstream
несмотря на идентичный wire-формат плагину.
Инфраструктура Novicam:
- _novicam_session_login() — sessionID из <SessionUserCheck>, используется
как Cookie WebSession (Novicam не выставляет Set-Cookie)
- _sdk_http_live_reader_novicam() — отдельный reader для live stream
- _sdk_http_playback_reader_encrypted(_novicam=True) — ветка в encrypted
playback для Novicam (без /ISAPI/Security/token, свой HB pattern)
- _fetch_channels_inline fallback на /ContentMgmt/InputProxy/channels
при 403 от /Streaming/channels (маппинг id=N → N01)
- Pre-activation probes перед /SDK/play (security=1 + PTZ endpoints) —
активируют канал в сессии после Spy DLL анализа плагина
- HTTP-заголовки (Accept/Accept-Language/Accept-Charset) идентичны
эталонному плагину — влияет на формат потока
Playback fixes:
- PlayM4_GetSourceBufferRemain throttle перед InputData — фикс 15-сек
прыжков при ×1 воспроизведении. DVR заливает архив в scan-режиме
(~10× быстрее реалтайма), без троттлинга libPlayCtrl захлёбывается.
TCP flow control естественно замедляет DVR до темпа декодера.
- PTS-based current_start через buf.video_ms при reconnect — защита от
прыжков вперёд на неотыгранный интервал
Инфраструктура для cam 1 (готова, отключена):
- _NovMuxWine singleton — wine + Windows PlayCtrl.dll (Novicam 194 exp)
- wine_playm4_nov/ с mux server без SetStreamOpenMode (file mode) —
плагин использует default stream mode
- Включается через _use_nov_wine = (cam_num == 1), сейчас False
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Linux libPlayCtrl.so не может декодировать encrypted H.265+ (pm4err=2).
Решение: wine subprocess (playm4_pb_server.exe) с DecCallBackMend для
получения полных кадров без tearing. Push-based архитектура через pipe.
Скорость ×2/×4 работает (PlayM4_Fast + PlayBackControl PLAYFAST).
×8/×16 ограничение DVR — не ускоряет data feed для encrypted.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Первая волна: live preview / main view / playback archive для Hikvision
DVR с user-заданным Encryption Key (Live View Parameters). Работает на
нативной libPlayCtrl.so без wine в runtime.
### Добавлено
- Live 16-канальный грид (2 fps), main view (12 fps), playback archive
через `/SDK/play` / `/SDK/playback` HTTP protocol + libPlayCtrl.so
- Pull-модель PlayM4_GetJPEG вместо SetDecCallBack (callback'и крашили
под нагрузкой из-за GIL race в 16 native decoder threads)
- Session reconnect loop (DVR рвёт /SDK/play ~30 сек) + heartbeat
/ISAPI/Security/sessionHeartbeat + auto-recovery на 401
- UI sync часов к видео-PTS через PlayM4_GetSystemTime + /pos endpoint,
_pbWall re-peg каждые 2 сек. Оба template'а (fullscreen + modal)
- Pure Python KDF `_hik_stream_kdf_128(user_key)` — реверс NetStream.dll
через Ghidra headless. K1=6a68a361bf6eb567, K2=cd7afe68ca6fde75,
cipher D(K1)-swap-E(K2)-swap-D(K1) на 16-байт блоки. Финальная формула
`user_key_ascii + derived16 × 7` (константа для любого ключа)
- Spy DLL под wine + Ghidra reverse engineering workflow
### Исправлено
- UI часы в архиве тикают на всех скоростях (убрано `if(_pbRate!==1)`
в _startSeekTimer + добавлено обновление m-status в модальном template)
- Сервер больше не падает в 16-канальном гриде encrypted (убраны
per-frame ffmpeg forks, pull-модель JPEG)
### TODO (остаются в testing до фикса)
- Playback speed ×2/×4/×8 — протокол захвачен, код применён
(PlayM4_Fast + dynamic GETJPEG_INTERVAL), ожидает теста
- Clip download encrypted — NET_DVR_SetPlayBackSecretKey returns FALSE,
план B: post-factum decrypt через pure Python cipher
### Docker
- gunicorn --workers 1 --threads 16 (single worker обязательно для
libPlayCtrl thread safety)
- _DVR_LD_SET=1 env чтобы skip self-exec в контейнере
- Archive player: loading spinner on stream start/seek/timeline click
- Archive player: live clock updates every second during playback
- Timeline: removed segment overlays, hourly labels (0–24)
- Clip download: split time inputs into separate HH/MM/SS fields
- Clip download: cancel button aborts fetch and kills ffmpeg on server
- Security: CSRF protection, HttpOnly/SameSite cookies, XSS escaping,
parameter validation, access control on ping endpoint
- Dashboard: user-specific DVR cards, live clock and version widgets
- Preview channels resume after closing fullscreen player
- Docker: moved SDK libs into dvr_admin/, cleaned up dvr_admin_docker/
- Flask-приложение управления DVR Hikvision
- Предпросмотр каналов, архив, скачивание клипов
- Управление пользователями с правами доступа
- Docker-контейнер с Gunicorn