From 5525d206dc2b8b888efbd0a51b89a07cff7df97e Mon Sep 17 00:00:00 2001 From: AbsurdlyLongUsername <22662897+absurdlylongusername@users.noreply.github.com> Date: Thu, 5 Feb 2026 04:28:00 +0000 Subject: [PATCH 1/4] Small refactor getPlayQueueFromCache --- app/src/main/java/org/schabi/newpipe/player/Player.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index e18ead89992..124f56c2d80 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -567,11 +567,7 @@ private static PlayQueue getPlayQueueFromCache(@NonNull final Intent intent) { if (queueCache == null) { return null; } - final PlayQueue newQueue = SerializedCache.getInstance().take(queueCache, PlayQueue.class); - if (newQueue == null) { - return null; - } - return newQueue; + return SerializedCache.getInstance().take(queueCache, PlayQueue.class); } private void initUIsForCurrentPlayerType() { From 725cb70cbd20d6346bce784eb3100f904fd0955c Mon Sep 17 00:00:00 2001 From: AbsurdlyLongUsername <22662897+absurdlylongusername@users.noreply.github.com> Date: Thu, 5 Feb 2026 04:28:49 +0000 Subject: [PATCH 2/4] Update useVideoAndSubtitles rename in comment --- app/src/main/java/org/schabi/newpipe/player/Player.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 124f56c2d80..078e4b344ea 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -2037,7 +2037,7 @@ public MediaSource sourceOf(final PlayQueueItem item, final StreamInfo info) { // resolver was called when the app was in background, the app will only stream audio when // the user come back to the app and will never fetch the video stream. // Note that the video is not fetched when the app is in background because the video - // renderer is fully disabled (see useVideoSource method), except for HLS streams + // renderer is fully disabled (see useVideoAndSubtitles method), except for HLS streams // (see https://github.com/google/ExoPlayer/issues/9282). return videoResolver.resolve(info); } From 118def08b4a583de6569c54ae43853bbf81024ff Mon Sep 17 00:00:00 2001 From: AbsurdlyLongUsername <22662897+absurdlylongusername@users.noreply.github.com> Date: Thu, 5 Feb 2026 04:36:53 +0000 Subject: [PATCH 3/4] Add conditional guard to prevent useVideoAndSubtitles overwriting recovery position that was set in Player.handleIntent for RESUME_PLAYBACK when resuming playback --- .../java/org/schabi/newpipe/player/Player.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 078e4b344ea..fa1aaa2b67d 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -2210,6 +2210,13 @@ public void useVideoAndSubtitles(final boolean videoAndSubtitlesEnabled) { isAudioOnly = !videoAndSubtitlesEnabled; + final var item = playQueue.getItem(); + final boolean hasPendingRecovery = + item != null && item.getRecoveryPosition() != PlayQueueItem.RECOVERY_UNSET; + final boolean hasTimeline = + !exoPlayerIsNull() && !simpleExoPlayer.getCurrentTimeline().isEmpty(); + + getCurrentStreamInfo().ifPresentOrElse(info -> { // In case we don't know the source type, fall back to either video-with-audio, or // audio-only source type @@ -2217,6 +2224,10 @@ public void useVideoAndSubtitles(final boolean videoAndSubtitlesEnabled) { .orElse(SourceType.VIDEO_WITH_AUDIO_OR_AUDIO_ONLY); setRecovery(); // making sure to save playback position before reloadPlayQueueManager() + if (hasTimeline || !hasPendingRecovery) { + // making sure to save playback position before reloadPlayQueueManager() + setRecovery(); + } if (playQueueManagerReloadingNeeded(sourceType, info, getVideoRendererIndex())) { reloadPlayQueueManager(); @@ -2230,6 +2241,10 @@ The current metadata may be null sometimes (for e.g. when using an unstable conn index of the video renderer or playQueueManagerReloadingNeeded returns true */ setRecovery(); // making sure to save playback position before reloadPlayQueueManager() + if (hasTimeline || !hasPendingRecovery) { + // making sure to save playback position before reloadPlayQueueManager() + setRecovery(); + } reloadPlayQueueManager(); }); From 1554f777629cc8170c3ac51a882b2044d226c847 Mon Sep 17 00:00:00 2001 From: AbsurdlyLongUsername <22662897+absurdlylongusername@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:17:30 +0000 Subject: [PATCH 4/4] Fix additional setRecovery from rebase errors --- app/src/main/java/org/schabi/newpipe/player/Player.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index fa1aaa2b67d..b07b15a4585 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -2223,7 +2223,6 @@ public void useVideoAndSubtitles(final boolean videoAndSubtitlesEnabled) { final SourceType sourceType = videoResolver.getStreamSourceType() .orElse(SourceType.VIDEO_WITH_AUDIO_OR_AUDIO_ONLY); - setRecovery(); // making sure to save playback position before reloadPlayQueueManager() if (hasTimeline || !hasPendingRecovery) { // making sure to save playback position before reloadPlayQueueManager() setRecovery(); @@ -2240,7 +2239,6 @@ The current metadata may be null sometimes (for e.g. when using an unstable conn Reload the play queue manager in this case, which is the behavior when we don't know the index of the video renderer or playQueueManagerReloadingNeeded returns true */ - setRecovery(); // making sure to save playback position before reloadPlayQueueManager() if (hasTimeline || !hasPendingRecovery) { // making sure to save playback position before reloadPlayQueueManager() setRecovery();