1. Connect (one outbound socket, bearer token):
2. Register once the socket is open:
{"type":"register","device_id":"tv-<android-id>","name":"Living room TV","room":"living room",
"platform":"android-tv","app":{"package":"com.yupptv.scope.tvapp","version":"3.4.1"},
"capabilities":["play_content_id","play_deeplink","control","open_app","now_playing"]}
3. Keep alive: send {"type":"ping"} every 25 s, expect pong.
4. You receive commands like:
{"cmd_id":"c_…","type":"play","content":{"content_id":"ch_tv9_telugu","kind":"live_channel","title":"TV9 Telugu"},
"fallback_deeplink":"yupptvscope://…/channels/tv9-news/live?src=act","issued_at":1791700000,"expires_at":1791700030,"sig":"…"}
5. Ack every command within 1 s, with the real outcome:
{"type":"ack","cmd_id":"c_…","ok":true,"state":"playing","foreground":"com.yupptv.scope.tvapp",
"now_playing":{"content_id":"ch_tv9_telugu","title":"TV9 Telugu","kind":"live_channel"}}
{"type":"ack","cmd_id":"c_…","ok":false,"reason":"not_logged_in"}
6. Push state on change: {"type":"state","foreground":"…","now_playing":{…},"volume":{"level":28,"muted":false},"screen":"player"}
Test from a terminal: