Summary
An Android app so the phone is the remote and the media server — discover DLNA/Chromecast/AirPlay on Wi-Fi and cast files, web video (YouTube/Rutube/VK/any site), and radio with cover art, including multi-room. This is the ideal form factor (it's how BubbleUPnP / Web Video Cast / AllCast work), and Android — unlike a browser — can do the raw networking needed.
Why Android fits
Android apps have raw sockets (SSDP discovery + /24 scan), plus mature native pieces:
- DLNA:
jUPnP / Cling (device discovery + AVTransport control).
- Chromecast: Google Cast SDK — first-class on Android.
- ffmpeg:
ffmpeg-kit (transcode to dongle-safe baseline H.264, the same approach as the desktop app).
- yt-dlp:
youtubedl-android (yt-dlp bundled via Chaquopy).
- The phone runs a small HTTP server and streams to the TVs (same model as the desktop
HTTPServerThread/streamers).
Approaches
Primary — native Kotlin (recommended): Kotlin + jUPnP + Cast SDK + ffmpeg-kit + youtubedl-android. Fully standalone on the phone, best UX; ground-up rewrite (no Python reuse) but mirrors the proven cast apps. Port the logic (re-encode rules, play-once, DLNA OP/headers, radio cover-art compositing) from cast_to_tv.py.
Alt 1 — Python-on-Android: Kivy/BeeWare + Chaquopy reuses the existing engine, but packaging ffmpeg/yt-dlp and the native cast SDKs is rough (pychromecast/pyatv on Android are unreliable). Max code reuse, lower polish.
Alt 2 — thin client: a WebView/native shell over the web local-agent (#); fastest MVP but needs the backend running somewhere.
Scope (native path)
Acceptance
Shares design with the desktop engine; the headless CastingController (#) is reusable if the Python-on-Android path is chosen.
Summary
An Android app so the phone is the remote and the media server — discover DLNA/Chromecast/AirPlay on Wi-Fi and cast files, web video (YouTube/Rutube/VK/any site), and radio with cover art, including multi-room. This is the ideal form factor (it's how BubbleUPnP / Web Video Cast / AllCast work), and Android — unlike a browser — can do the raw networking needed.
Why Android fits
Android apps have raw sockets (SSDP discovery +
/24scan), plus mature native pieces:jUPnP/ Cling (device discovery + AVTransport control).ffmpeg-kit(transcode to dongle-safe baseline H.264, the same approach as the desktop app).youtubedl-android(yt-dlp bundled via Chaquopy).HTTPServerThread/streamers).Approaches
Primary — native Kotlin (recommended): Kotlin + jUPnP + Cast SDK + ffmpeg-kit + youtubedl-android. Fully standalone on the phone, best UX; ground-up rewrite (no Python reuse) but mirrors the proven cast apps. Port the logic (re-encode rules, play-once, DLNA OP/headers, radio cover-art compositing) from
cast_to_tv.py.Alt 1 — Python-on-Android: Kivy/BeeWare + Chaquopy reuses the existing engine, but packaging ffmpeg/yt-dlp and the native cast SDKs is rough (pychromecast/pyatv on Android are unreliable). Max code reuse, lower polish.
Alt 2 — thin client: a WebView/native shell over the web local-agent (#); fastest MVP but needs the backend running somewhere.
Scope (native path)
Acceptance
Shares design with the desktop engine; the headless CastingController (#) is reusable if the Python-on-Android path is chosen.