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
-
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"]
-
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)
-
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
-
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
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
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"]
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)
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
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