From 1f936abc3d4d2b91586a89c474acf43c4842ed6d 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 (cherry picked from commit 10fc6bf2a33f6a64199f92450bf02506cd7fe468) --- 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 e18ead899..124f56c2d 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 @@ public final class Player implements PlaybackListener, Listener { 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 e3ae7f551f2297183cc7fcd6542eb6c41eb90140 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 (cherry picked from commit b7d69682f7a030e967416cd44f15c43005b042c1) --- 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 124f56c2d..078e4b344 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 final class Player implements PlaybackListener, Listener { // 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 cef11703f1f3ade36587a89206a2581080c47807 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 (cherry picked from commit bd255606d6ea5069fac0adc0ad24ccdb162d0aba) --- .../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 078e4b344..fa1aaa2b6 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 final class Player implements PlaybackListener, Listener { 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 final class Player implements PlaybackListener, Listener { .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 @@ public final class Player implements PlaybackListener, Listener { 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 3aeada866f0375844b39ed1244390ec1f7a3a0fd 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 (cherry picked from commit b5b6b6bdc4ed8902aa79eb429ae694552ea013e7) --- 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 fa1aaa2b6..b07b15a45 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 final class Player implements PlaybackListener, Listener { 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 @@ public final class Player implements PlaybackListener, Listener { 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();