From 045e91df1c4c73618d01db5335ce60cc75a19ecb 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 5525d206dc2b8b888efbd0a51b89a07cff7df97e) --- 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 90d5d5f4de2a1953f617fb77ccd016d5335c7f66 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 725cb70cbd20d6346bce784eb3100f904fd0955c) --- 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 2027b6dbc7a4da13c1c310bc41f5efe9debf0ac4 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 118def08b4a583de6569c54ae43853bbf81024ff) --- .../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 fcb77fed93ece3aa0478724eff6433b327fc6e95 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 1554f777629cc8170c3ac51a882b2044d226c847) --- 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();