Releases: serrebidev/Caster
Release list
Caster v0.5.13
Full Changelog: v0.5.12...v0.5.13
Caster v0.5.12
Full Changelog: v0.5.11...v0.5.12
Caster v0.5.11
Full Changelog: v0.5.10...v0.5.11
Caster v0.5.10
Full Changelog: v0.5.9...v0.5.10
Caster v0.5.9
Caster v0.5.8
Caster v0.5.7
Caster 0.5.5 — Cast connection stability
Fixes HLS restart continuity errors that can disconnect Chromecast receivers such as RB Room. Preserves segment numbering across source restarts, removes duplicate restart markers, and preserves timeline IDs as playlists advance. Also normalizes Windows WAV detection. Validation: 286 offline tests passed, five consecutive real ffmpeg runs preserved segment and timeline identities, and the portable archive passed integrity checks. Physical TV playback has not yet been verified.
v0.5.1 — Bug fix release
v0.5.1 — Bug fix release
Fixed
- AirPlay pause now works correctly. Previously, pausing a video/IPTV stream on AirPlay killed the RAOP session entirely (heard as "Paused." then "Finished."), and pausing a direct-audio stream kept playing silently. The runner now waits on wake when paused, and pause cancels the stream task for non-ffmpeg sources.
- Sleep timer and auto-reconnect now fire for URL and file casts. They previously only worked for screen/window captures because
_cast_startedwas only set in_cast_capture. - Multi-room relay teardown no longer kills every relay when one device fails. Error paths now pass their specific relay to
_stop_relay(only=)instead of calling the blanket teardown. - Multi-device Stop now disconnects all Chromecasts and AirPlay sessions, not just the most recent one. Added per-device tracking via
_castsand_atvsdicts. - Endless WAV stream RIFF size no longer overflows signed 32-bit.
ENDLESS_WAV_BYTESis now 44 bytes short of the signed ceiling so the RIFF field and Content-Length header both stay non-negative for receivers that parse sizes as signed int32 (Sonos). - Codec probing now happens once per relay instead of on every ffmpeg spawn.
_make_relayprobes once; supervisor restarts reuse the cached answer. - Unknown content types are no longer classified as audio.
probe_medialeavesis_audio=Nonewhen nothing identifies the type. - live.m3u8 query strings no longer bypass the trailing-edge playlist view.
- Missing
do_HEADon HlsFileHandler caused playlist Content-Length mismatch with GET body. - Supervisor race after stop() guarded:
_spawn_ffmpegbails ifself.root is None. - Dead branch
head.startswith(b"ftyp")removed (ftyp is always at offset 4). - Two Cast devices sharing a name no longer collapse into one entry (appends IP to disambiguate).
Caster 0.5.0
First public release.
Caster sends a file, a URL, your screen, one app window, or just this PC's sound to whatever is on your network — Chromecast, AirPlay, UPnP/DLNA, Sonos, Roku, or Kodi. Tick several devices and they all play at once.
Built to be used without seeing it: every control carries a real accessible name, the device list is a checklist rather than a multi-select, and status is spoken through NVDA directly instead of sitting in a status bar.
What's in it
- Six protocols, discovered in parallel — a full scan takes about five seconds.
- Screen, single-window, and system-audio casting. System audio goes out as uncompressed PCM with no encoder in the path.
- MPEG-TS remuxed to HLS for receivers that won't take it raw; video is only transcoded when the codec leaves no choice.
- Yamaha MusicCast: powers the receiver on to cast, selects the right input, restores the input it was showing when you stop, and controls volume on the receiver's own scale in real dB.
- UPnP renderers are asked what they accept, so a stereo amplifier is never sent a picture it will refuse.
- Microphone mixing, A/V offset, quality presets, sleep timer, tray controls, favourites, and six system-wide hotkeys.
Notable fixes
Playback jumping backwards on live IPTV. ffmpeg reconnected to dropped streams by asking for Range: bytes=<offset>. A live stream has no such position, so the server replied with its current live edge and ffmpeg spliced it in as though it followed on — the overlap was audio you had already heard. Measured on a real channel: 1.88x of real time was being produced, meaning most of it arrived twice. Now 0.89x, with zero byte-offset resumes and zero corrupt packets.
Connecting took 20-30 seconds. Now a few seconds. The screen-grabber probe burned a hard 10s on every launch and is now cached to settings and warmed in the background; a throwaway encoder was being run and discarded before the receiver ever connected; the Cast receiver was relaunched even when already running, then slept a flat 2.5s; and the "Playing" announcement was gated behind a 1.5s poll that made an instant cast sound stuck.
Casts reported as failed while actually playing. The Cast media status keeps describing the previous session until the receiver sends one for the new load, and INTERRUPTED is what it says when a session is replaced — which is what loading something else does. Loads issued shortly after a stop were read as rejections.
Also fixed: a modal error dialog that froze the window when another program owned a hotkey, several leaks (HLS relay ports and threads, per-play Zeroconf, temp directories), a relay that could never play a local file, and unreliable device discovery over Wi-Fi — SSDP is lossy, so the search is now repeated across the window.
Install
Download Caster-portable.zip, extract it anywhere, run Caster.exe. ffmpeg.exe ships beside it, so there is nothing else to install. Settings live in %APPDATA%\Caster\settings.json.
Windows only. MIT licensed.