~/wiki / новости / codex-connected-to-tv-fixed-ivi-black-screen

Попросил Codex починить телевизор. Он подключился к нему по сети и сделал это

Основной чат

Чат для вайбкодеров: новости, гайды, поиск исполнителей, маркетплейс и разбор реальных кейсов.

$ cd раздел/ $ join vibe dev

Ребёнок хотел мультики. Телевизор показывал чёрный экран — звук шёл, субтитры шли, картинки не было. Конкретная серия в Иви, конкретный телевизор, воспроизводится стабильно. Классическая задача для техподдержки, которую те всё равно не решат.

Вместо звонка в сервисный центр я открыл Codex и написал: «Разберись, что с телевизором».

Дальше произошло то, что я не ожидал.

Задача: чёрный экран в Иви

Телевизор — Hyundai H-LED55BU7003 на YandexOS. Симптом: при воспроизведении одной из серий Иви — звук есть, изображение чёрное. Другие серии работают. Другие приложения работают. Перезагрузка не помогает.

Первая мысль — зайти через ADB и посмотреть логи. Стандартный путь для Android-устройств. Оказалось — ADB на этом телевизоре закрыт: сервисное меню есть, но пункта ADB Mode нет. Bluetooth не даёт доступ к системе. USB — только зарядка и флешки. Прямого доступа к логам нет никакого.

Codex выслушал это всё и сказал: «Погоди, у тебя открыт порт 1961».

Что Codex нашёл: секретный порт телевизора

Агент самостоятельно просканировал локальную сеть и обнаружил, что телевизор слушает wss://192.168.0.113:1961. Это не ADB. Это Yandex Glagol — внутренний WebSocket-протокол, через который Яндекс-экосистема общается со своими устройствами.

Через него работают:

  • Яндекс Станция, когда управляет телевизором
  • Home Assistant интеграция через HACS
  • Node-RED автоматизации

Нигде в официальной документации этот протокол толком не описан. Codex нашёл его в исходниках AlexxIT/YandexStation на GitHub.

code
TLS-сертификат: O=Yandex, CN=localhost
HTTP 426: Upgrade Required
WebSocket 101: Switching Protocols ✓
Первое сообщение: ping server_ping

Порт открыт. Соединение установлено. Нужен только токен.

Как получить доступ: OAuth без взлома

Codex объяснил схему авторизации и написал, что нужно сделать:

  1. Получить OAuth-токен Яндекса от аккаунта, к которому привязан телевизор — через официальный OAuth Яндекса.
  2. Через API Яндекс.Квазара получить список устройств и найти телевизор.
  3. Запросить Glagol device-token для конкретного устройства.
  4. Подключиться к WebSocket и начать отправлять команды.

Токен я никуда не вставлял в чат — Codex сам создал папку .secrets/, попросил положить файл туда, и читал из файловой системы локально.

python копировать
# Codex написал этот скрипт самостоятельно
import asyncio, aiohttp, json, pathlib, ssl, websockets

TOKEN = pathlib.Path(".secrets/yandex_token").read_text().strip()

async def get_device_token(oauth_token, device_id):
    headers = {"Authorization": f"OAuth {oauth_token}"}
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://quasar.yandex.net/glagol/device_list",
            headers=headers
        ) as r:
            devices = await r.json()
        async with session.get(
            f"https://quasar.yandex.net/glagol/token?device_id={device_id}",
            headers=headers
        ) as r:
            return (await r.json())["token"]

Через несколько секунд после запуска:

code
✓ OAuth-токен принят
✓ Яндекс API ответил: найдено устройство cea2fdaaca88b3e30579
✓ Модель: yandex_tv_mt9632_cv
✓ Glagol device-token получен
✓ Подключён к wss://192.168.0.113:1961
✓ softwareVersion: 3.306.12
✓ appState: ru.ivi.client — Иви установлена

Codex подключился к телевизору.

Диагностика в реальном времени

Следующий шаг — снять состояние телевизора именно в момент проблемы. Я запустил ту самую серию в Иви и написал агенту: «запустил».

Codex начал каждые 30 секунд снимать getState с телевизора и записывать в diagnostics/ivi-black-screen-state.json:

json копировать
{
  "status": "SUCCESS",
  "state": {
    "aliceState": "IDLE",
    "playing": false,
    "volume": 18
  },
  "playerState": {},
  "watchedVideoState": null,
  "appState": "base64encoded..."
}

Ключевая находка: playing: false — телевизор сообщает Яндекс-слою, что воспроизведения нет, хотя звук идёт. Это значит, что видеодекодер завис, но аудиодекодер продолжает работать. Иви не отдаёт playback-state наружу — то есть само приложение считает, что что-то воспроизводится, а системный слой этого не видит.

Это не проблема настроек. Это несовместимость кодека конкретного видеоряда с декодером в YandexOS 3.306.12.

Что в итоге починило мультики

Зная точную причину, Codex предложил три рабочих варианта:

1. Очистить данные Иви (не кэш, а именно данные). Это сбрасывает авторизацию DRM-клиента и заставляет Иви заново согласовать сессию с сервером. В ряде случаев это меняет поведение декодера при следующем воспроизведении.

2. Принудительно перезапустить Иви через Glagol. Codex написал команду sendAction для выхода из приложения и повторного запуска — телевизор её принял.

3. Переключить качество видео. Через playerState агент определил, что серия запускалась в 4K HDR. Снижение до 1080p меняет используемый декодер.

После принудительного перезапуска Иви через Glagol и снижения качества с 4K HDR до 1080p — мультики включились. Проблема воспроизводилась только в 4K на этой конкретной серии из-за поведения HDR-декодера в YandexOS.

Почему это важно для вайбкодеров

Этот кейс — не про телевизор. Он про то, как ведёт себя современный ИИ-агент, когда ему дают реальную задачу без очевидного решения.

Что сделал Codex самостоятельно:

  • Просканировал сеть и нашёл открытый порт
  • Нашёл нужный протокол в open-source репозиториях на GitHub
  • Написал рабочий WebSocket-клиент с нуля
  • Организовал безопасное хранение секретов
  • Снял диагностические данные в реальном времени
  • Предложил и применил рабочее решение

Это не автодополнение кода. Это агент, который взял задачу, придумал подход, написал инструменты и дошёл до ответа.

Граница, которую важно понимать: Glagol — это протокол управления, не отладки. Без ADB нельзя получить logcat, системные логи или залезть в файловую систему. Если бы декодер просто крашился без каких-либо сигналов наружу, этот подход не сработал бы. Нам повезло, что playing: false при звуке — уже достаточно диагностической информации.

Технический итог

Что использовали Зачем
wss://[tv_ip]:1961 Yandex Glagol WebSocket — единственный открытый интерфейс
Яндекс OAuth Авторизация без взлома, через официальный API
quasar.yandex.net/glagol/token Device token для телевизора
getState команда Снять playerState / appState в реальном времени
sendAction команда Принудительный перезапуск Иви
Python + websockets + aiohttp Скрипт, который Codex написал с нуля

Весь скрипт glagol_probe.py — ~200 строк Python, написанных агентом с нуля за один сеанс.

Попробовать самому

Если у вас Яндекс-телевизор с YandexOS и похожая проблема — вот минимальная схема:

bash копировать
# Проверить, открыт ли порт Glagol
python -c "
import socket
s = socket.socket()
s.settimeout(2)
result = s.connect_ex(('192.168.0.ВАШ_TV', 1961))
print('порт открыт' if result == 0 else 'порт закрыт')
s.close()
"

Если порт открыт — дальше всё описано выше. Токен получаете через официальный OAuth, скрипт пишет Codex по аналогии с этим кейсом.

Если порт закрыт — ваш телевизор не на YandexOS, или Яндекс-интеграция отключена в настройках.


Мультики работают. Ребёнок доволен. Сервисный центр не понадобился.

$ cd ../ ← назад к Новости