Skip to content

[Feature]: True audio-only mode for YouTube playback #401

Description

@nathanrtracey1

Is there an existing feature request for this?

  • I have searched the existing issues

Problem or Motivation

I listen to music through YouTube playlists that aren't available in YouTube
Music, so I rely on YouTube mode. I only want the audio — I don't need the
video surface at all.

Today, even when the video isn't visible (window closed, or popped out and
hidden), YouTube mode still loads and decodes the full video stream via
movie_player. Per docs/youtube.md, playback runs through
YouTubeWatchWebView loading the real watch page. Multiple users have
reported the app running hot / draining battery during YouTube playback,
which this explains. There's no way to just listen.

Proposed Solution

Add a setting (Settings → YouTube) such as "Always play audio-only" that
plays regular YouTube content as audio-only, avoiding video decode.

  • Prefer requesting an audio-only stream (e.g. itag 140) through the
    existing player path.
  • Keep audio playing with the window closed, matching current Background
    Audio behavior.
  • In audio-only mode, the YouTube player bar still shows
    title/channel/progress + transport, but hides video-only affordances
    (PiP, quality, fullscreen).

Benefits: lower bandwidth, less CPU/GPU load and heat, better battery on
laptops.

Alternatives Considered

  • Popping out the video and hiding the window: works for hiding the picture,
    but the video stream is still decoded, so it doesn't fix the heat/battery
    cost.
  • Using YouTube Music mode instead: not viable, since the tracks I want
    aren't all available in YTM — that's why I'm in YouTube mode.

Feature Area

Playback / Audio

How important is this feature to you?

Would improve my experience

Mockups or Examples

Metrolist has the same well-received request:
MetrolistGroup/Metrolist#948
("Force audio-only mode (prevent video loading entirely)")

Additional Context

Per the AI-Assisted Contributions guidance in CONTRIBUTING.md, here's a
prompt describing the intended implementation (sharing intent before code):

Prompt: In the Kaset macOS app, add a "true audio-only" mode for YouTube
playback (YouTube source, not YouTube Music).

Context from docs/youtube.md: playback runs through YouTubePlayerService

  • a singleton YouTubeWatchWebView loading www.youtube.com/watch?v={id};
    an extraction user script reveals #movie_player video via a
    .kaset-visible ancestor chain; surfaceLocation is .inline/.floating/.none.

Goal:

  1. Add a youtubeAudioOnly boolean to SettingsManager, surfaced in
    Settings → YouTube as "Always play audio-only."
  2. When enabled, avoid presenting/decoding the video surface; keep audio
    playing with the window closed (like existing Background Audio). Prefer
    an audio-only stream (itag 140) if feasible; if a pure audio stream isn't
    practical in the WKWebView, fall back to keeping the video element hidden
    and paused-visually while still routing audio, and document the limitation.
  3. YouTube player bar keeps title/channel/progress + transport, hides
    video-only affordances (PiP, quality, fullscreen) in audio-only mode.
  4. Don't change the YouTube Music side or shared PlayerBar music behavior.
  5. Respect the PlaybackArbiter "one audio source at a time" rule.

Add/extend tests with MockYouTubeClient and the injectable
YouTubeWatchPlaybackControlling. Update docs/youtube.md.

Non-goals: ad blocking, YouTube Music, Shorts.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions