Skip to content

YouTube Player Quality Selection Not Working - setPlaybackQuality Doesn't Change Video Quality #1298

Description

@leomani51214

Question / Problem

YouTube Player Quality Selection Not Working - setPlaybackQuality Doesn't Change Video Quality

Summary

The setPlaybackQuality method in the YouTube player library doesn't actually change the video playback quality. When users select a different quality from the quality selection menu, the video continues playing at the same quality despite the method being called successfully.

Issue Details
Library: android-youtube-player (core library)
Problem: setPlaybackQuality() method doesn't change video quality
Expected: Video quality should change when user selects different quality
Actual: Video quality remains unchanged despite successful method calls

What I've tried

  1. Initial Implementation
    Added requestVideoQuality() method to retrieve available quality levels
    Added onVideoQuality callback to receive quality data from YouTube IFrame API
    ✅ Working: Successfully receives available quality levels: ["hd1080","hd720","large","medium","small","tiny","auto"]

  2. Quality Selection Implementation
    Created quality selection UI with proper mapping (144p → tiny, 720p → hd720, etc.)
    ✅ Working: User can select quality and setPlaybackQuality() is called
    ✅ Working: Logs show correct quality code being sent: User selected quality: 144p (code=tiny)

  3. JavaScript Bridge Fix
    Modified WebViewYouTubePlayer.kt to properly call JavaScript sendVideoQuality(player)
    ✅ Working: onVideoQuality callback now triggers correctly
    ✅ Working: Quality levels are parsed and displayed in UI

  4. HTML JavaScript Modifications
    Added debug logging to track JavaScript execution
    ❌ Not Working: Quality still doesn't change despite all calls succeeding

Current Code State

JavaScript (ayp_youtube_player.html)

javascript

function setPlaybackQuality(playbackQuality) {
console.log("leolog setPlaybackQuality called with:", playbackQuality);

if (playbackQuality == "auto") {
localStorage.removeItem("yt-player-quality");
} else {
var now = Date.now();
localStorage.setItem("yt-player-quality", JSON.stringify({
data: playbackQuality,
creation: now,
expiration: now + 2419200000
}));
}

if (player) {
player.setPlaybackQuality(playbackQuality);
var currentTime = player.getCurrentTime();
player.loadVideoById(player.getVideoData().video_id, currentTime);
}
}

Android (WebViewYouTubePlayer.kt)

kotlin

override fun requestVideoQuality() {
mainThread.post {
webView.loadUrl("javascript:sendVideoQuality(player)")
}
}

override fun setPlaybackQuality(quality: String) = webView.invoke("setPlaybackQuality", quality)

Log Output

User selected quality: 144p (code=tiny)
onStateChange Paused
Playback quality changed: LARGE (360p) // Should be SMALL (144p)
onStateChange Playing

Key Observations

All method calls are executing successfully
JavaScript setPlaybackQuality is being called with correct parameters
YouTube IFrame API's player.setPlaybackQuality() is being invoked
Video reloads at correct timestamp
Quality change doesn't take effect despite successful API calls

Possible Root Causes

Timing Issue: setPlaybackQuality() might need to be called after video fully loads
API Limitation: YouTube IFrame API might not support manual quality changes in certain contexts
Player State: Quality changes might only work in specific player states
Video Format: Some videos might not support all quality levels

Request for Help

Looking for guidance on:
Correct implementation of setPlaybackQuality in YouTube IFrame API
Timing requirements for quality changes
Alternative approaches for manual quality control
Whether this is a known limitation of YouTube IFrame API

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions