Fixed in dd612fc, shipped in v0.9.0 — on both sides.
Server: channel_shutdown_delay was 0, so Dispatcharr tore down the upstream connection the instant the last viewer left and opened a…
Fixed in dd612fc, shipped in v0.9.0.
- The MediaSession gets an explicit id:
MediaSession.Builder(context, player).setId("castarr").build(), so it no longer collides on the default empty id. -…
Fixed in dd612fc, shipped in v0.9.0 — with unit tests, since the comma logic is easy to get subtly wrong.
- Names with commas survive: the display name is taken after the first unquoted…
Fixed in dd612fc, shipped in v0.9.0.
state.wsis cleared inonclose, and the pair button now checksreadyState <= 1before choosing betweenclose()andconnect()— so a closed socket…
Fixed in dd612fc, shipped in v0.9.0. All three parts:
- No more blind rebuilds. Status pushes go through
renderChannelsIfChanged(), which compares a signature (channel count, search term,…
Fixed in dd612fc, shipped in v0.9.0.
AppState.syncFromPlayer()only hides the player when there is neither an error nor a pending reconnect, so a failure no longer drops the viewer back to…
Fixed in dd612fc, shipped in v0.9.0.
Both methods now act on the intent flag instead of the derived isPlaying:
fun pause() { player.playWhenReady = false }
fun toggle() { if…
Fixed in dd612fc, shipped in v0.9.0.
seekBy() no longer clamps against an unknown duration:
val duration = player.duration
var target = (player.currentPosition + deltaSeconds *…
Fixed in dd612fc, shipped in v0.9.0.
open()now validates the scheme and rejects anything that is nothttp/httpsbefore opening the connection.download()streams into a builder with…
Fixed in dd612fc, shipped in v0.9.0 — with one deliberate exception noted below.
- Backup:
res/xml/backup_rules.xmlandres/xml/data_extraction_rules.xmlexcludepairing.xmland…
Fixed in dd612fc, shipped in v0.9.0. All three weaknesses are addressed:
- Rate limiting is per remote address and counts every failed
hello, whether it carried a token or a code…