Skip to content

v0.3.0

Latest

Choose a tag to compare

@MarcSchlichting MarcSchlichting released this 09 Aug 00:58
3975060

v0.3.0

New Features

  • Audio capture — Sunshine's Opus stream is decoded to 48 kHz float32 PCM and
    exposed through client.audio() (iterator) and client.latest_audio()
    (latest-chunk buffer), mirroring the video frame APIs. On by default via
    record_audio=True on start_stream() / stream().
  • Audio in recordings — record() and start_recording() now include audio
    automatically: a synced AAC track inside video files, or a companion audio.wav
    next to image-directory captures. Pass with_audio=False to skip it for a
    given recording.
  • New public types — AudioChunk (PCM + timing metadata), AudioDecoder
    (PyAV/Opus, stereo and surround), and WavRecorder (16-bit PCM output).
  • VideoRecorder(audio=True) — Adds an AAC track to the same container, fed by
    a thread-safe write_audio(), for direct use of the recorder classes.
  • version — The package now exposes its installed version.

Bug Fixes

  • Fixed stretched video timelines — Video PTS moved from a 1/fps time base to
    90 kHz, and from the local clock to the host's capture timestamps. Frames
    arriving in bursts are no longer pushed forward a full frame period each,
    which previously stretched recordings past wall clock.
  • Audio loss no longer shifts the timeline — Audio is positioned at
    frame_index × samples_per_frame rather than appended, so packets lost on the
    network, dropped by a full queue, or corrupt leave a gap of silence instead of
    pulling all later audio earlier.
  • No truncated audio tail — On stop, in-flight audio gets a bounded drain
    window and any remaining deficit is padded with silence, so both tracks end
    together.

Breaking Changes

  • VideoRecorder.write(frame, pts=) is now write(frame,
    pts_us=). This only affects direct use of the recorder class;
    the MoonlightClient API is unchanged.
  • Audio capture is enabled by default, so streams install audio callbacks and
    run an Opus decode thread, and recordings gain an audio track. Pass
    record_audio=False to start_stream() / stream() for the previous behavior.

Improvements

  • Audio loss diagnostics are logged (packets lost or dropped, silence
    inserted, gaps bridged) — enable logging at INFO to see them.
  • CI: full-history checkouts so setuptools-scm resolves version tags, macOS
    runner pinned to macos-15, and the wheel matrix no longer fails fast.