resolvePlayableUrl
Resolves the best HLS URL from a LiveStreamPlayData in the same priority order the demo stopgap used: LiveStreamPlayData.videoPlaylistUrl (token-aware, what the iframe uses) ->LiveStreamPlayData.fallbackUrl (CDN edge alternative) -> the list-endpoint LiveStream.playbackUrlHls (often 403s on token-auth libraries; last resort).
Exposed at module level so the ViewModel and tests can call the same function — and so anyone reading the resolver can verify the priority by reading one place.