PRO1VPN TV — сервер привязки

Модуль tv_pairing.py использует существующие FastAPI и Redis личного кабинета.
Не требуется новый сервис или таблица. Подключайте register_tv перед маршрутами
/api/{name} и страницами /{page:path}; зависимости передаются из pro-lk.
Рабочий пример подготовки и безопасной установки с откатом:
android-tv-20261006/prepare-server.py и server-stage/deploy.py в корне проекта.

POST /api/tv/pair/start — создаёт код и device_secret (только для телевизора).
POST /api/tv/pair/approve — код + сессия кабинета с проверкой Origin или
код + HTTPS-ссылка подписки мобильного клиента. Передача только по явному согласию.
POST /api/tv/pair/poll — device_secret; pending или approved + ссылка подписки.
POST /api/tv/pair/finish — device_secret; удаляет запись и код после импорта.
Записи живут не более 600 секунд. Короткий код однократный. Повторный poll
безопасен при потерянном ответе. Секрет ТВ хранится в Redis только как SHA-256.
Подписка не записывается в URL, журналы или внешние QR-коды.
Успешная привязка не меняет срок, тариф, оплату или лимит устройств подписки.

Страница tv-page.html: /tv. В кабинете «Устройства» размещена ссылка на неё.
QR с ТВ ведёт на страницу с публичным кодом; там есть переход в Android-приложение
pro1vpn://pair-tv?code=ABCD2345. Запросы native и кабинета идут по HTTPS.

Тесты: pip install fastapi httpx 'fakeredis[lua]' pytest
python -m pytest server/test_tv_pairing.py
Проверяются передача, изоляция ТВ, повторная выдача, однократность кода,
конкурентное подтверждение, запрет стороннего Origin, недействительная и
заблокированная подписки, истёкшая запись и некорректные запросы.
