final
isn't final
#4138Remove SubtitlesStream#getURL(). Use SubtitlesStream#getUrl() instead #386
Fix crash on empty YouTube comments
NewPipe_v0.20.0RC7.zip
Corresponding PR: #4333
I found an issue with rotation (didn't notice it before):
To fix this I'd suggest resetting rotation when minimizing to background or to popup @avently
open a video and make it fullscreen
With this step the phone will rotate to landscape (when orientation is locked) which is expected.
close the player via the notification
With this step the player will be "unfullscreened" but stays in landscape. And I think it's how it should work in this case. It's much better than to see unexpected rotation of the UI when you don't asked for it.
but the orientation is landscape instead of portrait
It shouldn't be portrait because the orientation is locked to landscape. I (and believe me, you too) don't want to see the rotation happened here and there just because the player is closed. Same action happens when you scroll down the player in fullscreen (by long pressing on arrow down
button) and choose open in popup or background, or press on close button in mini player.
And it much better (like in your example) to return back from Recents, to tap on a thumbnail and to continue playing without rotation happened multiple times. Don't you agree?
the original video details are opened, but the orientation is landscape instead of portrait
I see this as expected behaviour. When you view the video in the main player in landscape mode, and close the player from the notification, the video details stay in landscape. Your steps are just the long way of getting to this same place.
This is what happens on my phone. After I press the home button, I am automatically brought back to the original orientation, which is portrait. If I then start to navigate other apps in portait, I would not expect NewPipe to be landscape when opening it, and there also is no way to bring it back to portrait unless I enable auto-rotate or open the video. Maybe the issue here is how EMUI handles these things, since your statement "the phone will rotate to landscape" does not hold true as soon as I exit NewPipe.
there also is no way to bring it back to portrait unless I enable auto-rotate or open the video
Yeah this is a downside I see as well. Not sure what a better flow would be.
@Stypox
Maybe the issue here is how EMUI handles these things
Orientation is applied to an activity so when you change the activity (I.e. going to another app) the orientation will be global or overrided by another app. If you have a locked global portrait orientation it's expected to see it after leaving the app. It's not only for EMUI.
and there also is no way to bring it back to portrait unless I enable auto-rotate or open the video
This is true for every situation with locked orientation. I mean if you locked orientation globally you can turn on autorotation to exit from this locked mode. Same here. You have locked into landscape, you can exit from this mode, like you said, with autorotation or via button after playback is started. Don't see a problem here but a useful thing that allows to browse in landscape mode.
@avently ok, if you say this is expected behaviour then ok. It does not feel right to me, but I didn't take part in earlier conversations, so now it surely shouldn't be changed. I'm hiding the offtopic comments ;-)
It should not be possible to select the same buttons multiple times.
Also for whatever reason the notification is blue.
@XiangRongLin It takes the colour theme from the thumbnail. See the blue bar at the top of your video's thumbnail.
The option to not show the thumbnail on the lockscreen during background play is gone from the "player" section. Was it removed in purpose or what happened to it?
This was discussed somewhere very recently. I think the idea was that the option was added because showing the thumbnail was buggy with the earlier notification, but now that we've shifted to MediaStyle notification, it's not needed anymore.
Not sure if it is intended or not:
But when switching between popup player and main player, the video would reload instead of continue playing. Original youtube app or twitch would continue playing when switching to and from popup player.
Are you sure you're testing the RC? The switch happens properly for me, resuming instead of restarting.
i have had this glitch when switching to and back from fullscreen video, the screen flashes black for a second. it was happening on previous debug versions and on this current one as well. i will probably make a gif about it, unless someone else also has the same issue
That's not a glitch, just slow player code, @test2a. It will improve a lot after avently's performance PR is merged. Test the RC again after that happens.
@opusforlife2 Sorry I didn't state it clearly enough. When I say "reload", I did not mean the video would restart, it was more like the video pauses for 2-3 seconds, with a circling animation playing, before resuming to play. It just feels laggy switching between main and popup player, whereas other apps like twitch would do it seamlessly.
I think @test2a was describing something different.
This was discussed somewhere very recently. I think the idea was that the option was added because showing the thumbnail was buggy with the earlier notification, but now that we've shifted to MediaStyle notification, it's not needed anymore.
@opusforlife2 How do i now not show the thumbnail on the lockscreen? I have the Android feature active to hide sensitive content, so it is just a blurry image. And i like my own wallpaper.
@XiangRongLin It takes the colour theme from the thumbnail. See the blue bar at the top of your video's thumbnail.
@opusforlife2 Is there an option to disable it? I really dislike having everything be darkmode and then newpipe sometimes displaying bright yellow/blue/white notifications.
Is there an option to disable it?
"Starting at Android O any notification that has a media session attached with setMediaSession(android.media.session.MediaSession.Token) will be colorized. You can opt-out of this behavior by using Notification.Builder#setColorized(boolean)."
https://developer.android.com/reference/android/app/Notification.MediaStyle
@XiangRongLin Maybe this can be added as an option in Notification settings?
How do i now not show the thumbnail on the lockscreen? I have the Android feature active to hide sensitive content, so it is just a blurry image. And i like my own wallpaper.
@XiangRongLin I suppose the option would have to be added back, or rewritten, maybe, since the related code has changed.
it was more like the video pauses for 2-3 seconds, with a circling animation playing, before resuming to play.
@terrytw That's because you have the possibility of having different default resolutions for popup and main player. The app would need to load a different stream URL and then seek to that timestamp.
@opusforlife2 You are right, the resolution is part of the problem. After making sure main player and popup player has the same default resolution, the lag reduced to about 0.5 seconds, but it is definitely there, whenever I switched between players, the video paused for a short period of time, it is obvious because sound stopped and resumed. But switching from portrait and landscape did not invoke this behavior.
That's because there is no scope of the resolution changing there, and the player isn't changing either. The stream continues to play in the main player.
@test2a @terrytw For seamless switching (the stream doesn't pause at all) between players, follow #2863.
I wanted to comment on how the Unified Player handles video previews while playing in the background. As it is now, when a video is playing in the background, the video, when autoplay is on, takes priority over the background video. I think we should arrange this so NewPipe doesn't autoplay when clicking a video if there is already one in the background. When I exit out of the video, the background video is also closed out. I believe this is a side effect of the media notification.
For clarification, I queued a playlist in the background, and selecting a new video caused NewPipe to exit out of the playlist. I can imagine this might be troublesome for others.
@snappyapple632 You're supposed to get a warning dialogue when that happens. Under Video and Audio settings, check if "Ask before clearing queue" is toggled on.
Ah, nevermind then.
I have noticed two bugs so far:
the buffer bar does not update buffer position unless you interact with the player such as skipping (meaning even if the video is already 20s buffered ahead, the buffer bar will not show it unless you tab one of the player buttons such as skipping backwards) edit: please see #4343 @opusforlife2
open a playlist in full-screen mode. while playing, tab the top-right button to show the queue. the bug: although the queue window is on top, you can still accidentally press the player ui buttons such as the video quality menu . I think the queue window should block player buttons until dismissed.
hay guys ... I know this is a dumb question but if I'm playing a queue in normal mod, how am I supposed to switch to pop-up mode without losing my queue?
the buffer bar does not update buffer position unless you interact with the player such as skipping
@MD77MD That is true for the release version as well. Nothing to do with this RC. You can open a new issue if one doesn't already exist.
although the queue window is on top, you can still accidentally press the player ui buttons such as the video quality menu
Confirmed. This should be fixed before release.
but if I'm playing a queue in normal mod, how am I supposed to switch to pop-up mode without losing my queue?
Yeah, you can switch from popup or background to the others, but the 2 buttons for this in the main player are gone. What was the reason, @avently? Can they be restored?
@MD77MD you have a buttons under the player named Popup and Background. After pressing on any of them you'll not lose you queue but instead open current queue in popup or in background players.
@opusforlife2
What was the reason, can they be restored?
They are useless and take space without a need. No, they will not be restored. You have the same buttons under a video
android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1881)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
@Redirion could you provide more details? Can it be reproduced?
I found this, btw, so this is probably my fault and I will look into it
@Redirion that's most probably not caused by NewPipe's code, but by an AOSP "intended bug". I applied a workaroud from here and there do not seem to be any side effects (i.e. adding createNotificationAndStartForeground
, which in turn calls startForeground
, in MainPlayer.onCreate()
). Does this apk fix the issue? app-debug.zip
Edit: removed, this was an issue on my end.
I have a different error now tho, this isn't rc specific as it happens on 0.19.8 too
Crash log
org.schabi.newpipe.local.feed.service.FeedLoadService$RequestException: 0:https://www.youtube.com/channel/UC150TvgRnAE8qtZUWS68tWw
at org.schabi.newpipe.local.feed.service.FeedLoadService$RequestException$Companion.wrapList(FeedLoadService.kt:165)
at org.schabi.newpipe.local.feed.service.FeedLoadService$databaseConsumer$1$1.run(FeedLoadService.kt:314)
at androidx.room.RoomDatabase.runInTransaction(RoomDatabase.java:410)
at org.schabi.newpipe.local.feed.service.FeedLoadService$databaseConsumer$1.accept(FeedLoadService.kt:303)
at org.schabi.newpipe.local.feed.service.FeedLoadService$databaseConsumer$1.accept(FeedLoadService.kt:66)
at io.reactivex.internal.operators.flowable.FlowableDoOnEach$DoOnEachSubscriber.onNext(FlowableDoOnEach.java:86)
at io.reactivex.internal.operators.flowable.FlowableBuffer$PublisherBufferExactSubscriber.onComplete(FlowableBuffer.java:152)
at io.reactivex.internal.operators.flowable.FlowableObserveOn$BaseObserveOnSubscriber.checkTerminated(FlowableObserveOn.java:215)
at io.reactivex.internal.operators.flowable.FlowableObserveOn$ObserveOnSubscriber.runAsync(FlowableObserveOn.java:399)
at io.reactivex.internal.operators.flowable.FlowableObserveOn$BaseObserveOnSubscriber.run(FlowableObserveOn.java:176)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
Caused by: org.schabi.newpipe.extractor.exceptions.ParsingException: Could not get duration
at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamInfoItemExtractor.getDuration(YoutubeStreamInfoItemExtractor.java:117)
at org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector.extract(StreamInfoItemsCollector.java:54)
at org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector.commit(StreamInfoItemsCollector.java:94)
at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeChannelExtractor.collectStreamsFrom(YoutubeChannelExtractor.java:289)
at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeChannelExtractor.getInitialPage(YoutubeChannelExtractor.java:239)
at org.schabi.newpipe.extractor.utils.ExtractorHelper.getItemsPageOrLogError(ExtractorHelper.java:19)
at org.schabi.newpipe.extractor.channel.ChannelInfo.getInfo(ChannelInfo.java:83)
at org.schabi.newpipe.extractor.channel.ChannelInfo.getInfo(ChannelInfo.java:48)
at org.schabi.newpipe.util.ExtractorHelper.lambda$getChannelInfo$4(ExtractorHelper.java:124)
at org.schabi.newpipe.util.-$$Lambda$ExtractorHelper$u5W7VszTe8AoEexIsFM9huQfbkM.call(Unknown Source:4)
at io.reactivex.internal.operators.single.SingleFromCallable.subscribeActual(SingleFromCallable.java:44)
at io.reactivex.Single.subscribe(Single.java:3666)
at io.reactivex.internal.operators.single.SingleDoOnSuccess.subscribeActual(SingleDoOnSuccess.java:35)
at io.reactivex.Single.subscribe(Single.java:3666)
at io.reactivex.Single.blockingGet(Single.java:2869)
at org.schabi.newpipe.local.feed.service.FeedLoadService$startLoading$7.apply(FeedLoadService.kt:217)
at org.schabi.newpipe.local.feed.service.FeedLoadService$startLoading$7.apply(FeedLoadService.kt:66)
at io.reactivex.internal.operators.parallel.ParallelMap$ParallelMapSubscriber.onNext(ParallelMap.java:113)
at io.reactivex.internal.operators.parallel.ParallelFilter$ParallelFilterSubscriber.tryOnNext(ParallelFilter.java:130)
at io.reactivex.internal.operators.parallel.ParallelRunOn$RunOnConditionalSubscriber.run(ParallelRunOn.java:397)
... 7 more
You have the same buttons under a video
@avently Oh. I didn't know that. That is cool that they retain the queue! Thanks!
this isn't rc specific as it happens on 0.19.8 too
@FireMasterK Then you should check for duplicates and create a new issue. No need to do that here, though. It is a known issue with Youtube adding old abandoned livestreams to the channel page or something.
Release candidate 2 contains performance improvements (#4288)
NewPipe_v0.20.0RC2.zip
@avently thank you for your help.. your implementation is very neat..
@opusforlife2 i don't think we need restore those buttons because we already have a better alternative. however they can not be accessed in landscape mode unless we have the auto rotation off, which is a bummer.. in my opinion the swipe up feature for video description should be universal and enabled, regardless of auto rotation states.
another two potential bugs (a 2 in 1 😁):
I'm not sure if this is bug or by design.
a. open a playlist
b. tap the play all but in background mode button
c. it would start playing but without the mini player. the bug: inconsistency
this is a direct result of bug (1) above... but the "ask for confirmation before clearing queue" most be enabled:
a. do all the steps above (a, b, and c)
b. now open any video (called video B) but do not clear queue (click cancel)
c. now minimize to mini player
the bug: the mini player would display info of video (B) and not the actual video playing...
this only happens with playlist started in background mode. however this does not happen if you start a single video in background mode...
extract clarification: that is to say if you open video (A) in background mode and minimized you can still view the info of other videos but if you minimize them it will always display info if video (A).
another potential bug: while video is paused, enqueueing a another video will unintentionally cause the player to resume playback.
I guess this was fixed in 19.8... now its back again.
Mhh... I have tried RC2, and I think that background button should be removed. For 2 reasons:
1) Is redundant. When NewPipe is minimized, audio playback still keep active.
2) Breaks UI unification. After tapping on minimize button, and after tapping also on notification, old audio player appear again.
But if you want to keep it to have more choice, point 2 must be fixed.
newPipe 0.20 Rc2 keeps crashing but don't now why?
Crash log 1
org.schabi.newpipe.local.feed.service.FeedLoadService$RequestException: 0:https://www.youtube.com/channel/UCkZC9CNC1E5YVpbH03ejMqA
at org.schabi.newpipe.local.feed.service.FeedLoadService$RequestException$Companion.wrapList(FeedLoadService.kt:165)
at org.schabi.newpipe.local.feed.service.FeedLoadService$databaseConsumer$1$1.run(FeedLoadService.kt:314)
at androidx.room.RoomDatabase.runInTransaction(RoomDatabase.java:410)
at org.schabi.newpipe.local.feed.service.FeedLoadService$databaseConsumer$1.accept(FeedLoadService.kt:303)
at org.schabi.newpipe.local.feed.service.FeedLoadService$databaseConsumer$1.accept(FeedLoadService.kt:66)
at io.reactivex.internal.operators.flowable.FlowableDoOnEach$DoOnEachSubscriber.onNext(FlowableDoOnEach.java:86)
at io.reactivex.internal.operators.flowable.FlowableBuffer$PublisherBufferExactSubscriber.onNext(FlowableBuffer.java:126)
at io.reactivex.internal.operators.flowable.FlowableObserveOn$ObserveOnSubscriber.runAsync(FlowableObserveOn.java:407)
at io.reactivex.internal.operators.flowable.FlowableObserveOn$BaseObserveOnSubscriber.run(FlowableObserveOn.java:176)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:762)
Caused by: org.schabi.newpipe.extractor.exceptions.ParsingException: Could not get duration
at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamInfoItemExtractor.getDuration(YoutubeStreamInfoItemExtractor.java:117)
at org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector.extract(StreamInfoItemsCollector.java:54)
at org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector.commit(StreamInfoItemsCollector.java:94)
at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeChannelExtractor.collectStreamsFrom(YoutubeChannelExtractor.java:289)
at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeChannelExtractor.getInitialPage(YoutubeChannelExtractor.java:239)
at org.schabi.newpipe.extractor.utils.ExtractorHelper.getItemsPageOrLogError(ExtractorHelper.java:19)
at org.schabi.newpipe.extractor.channel.ChannelInfo.getInfo(ChannelInfo.java:83)
at org.schabi.newpipe.extractor.channel.ChannelInfo.getInfo(ChannelInfo.java:48)
at org.schabi.newpipe.util.ExtractorHelper.lambda$getChannelInfo$4(ExtractorHelper.java:124)
at org.schabi.newpipe.util.-$$Lambda$ExtractorHelper$u5W7VszTe8AoEexIsFM9huQfbkM.call(lambda)
at io.reactivex.internal.operators.single.SingleFromCallable.subscribeActual(SingleFromCallable.java:44)
at io.reactivex.Single.subscribe(Single.java:3666)
at io.reactivex.internal.operators.single.SingleDoOnSuccess.subscribeActual(SingleDoOnSuccess.java:35)
at io.reactivex.Single.subscribe(Single.java:3666)
at io.reactivex.Single.blockingGet(Single.java:2869)
at org.schabi.newpipe.local.feed.service.FeedLoadService$startLoading$7.apply(FeedLoadService.kt:217)
at org.schabi.newpipe.local.feed.service.FeedLoadService$startLoading$7.apply(FeedLoadService.kt:66)
at io.reactivex.internal.operators.parallel.ParallelMap$ParallelMapSubscriber.onNext(ParallelMap.java:113)
at io.reactivex.internal.operators.parallel.ParallelFilter$ParallelFilterSubscriber.tryOnNext(ParallelFilter.java:130)
at io.reactivex.internal.operators.parallel.ParallelRunOn$RunOnConditionalSubscriber.run(ParallelRunOn.java:397)
... 7 more
Crash log 2
org.schabi.newpipe.local.feed.service.FeedLoadService$RequestException: 0:https://www.youtube.com/channel/UCZDA1kA3y3EIg25BpcHSpwQ
at org.schabi.newpipe.local.feed.service.FeedLoadService$RequestException$Companion.wrapList(FeedLoadService.kt:165)
at org.schabi.newpipe.local.feed.service.FeedLoadService$databaseConsumer$1$1.run(FeedLoadService.kt:314)
at androidx.room.RoomDatabase.runInTransaction(RoomDatabase.java:410)
at org.schabi.newpipe.local.feed.service.FeedLoadService$databaseConsumer$1.accept(FeedLoadService.kt:303)
at org.schabi.newpipe.local.feed.service.FeedLoadService$databaseConsumer$1.accept(FeedLoadService.kt:66)
at io.reactivex.internal.operators.flowable.FlowableDoOnEach$DoOnEachSubscriber.onNext(FlowableDoOnEach.java:86)
at io.reactivex.internal.operators.flowable.FlowableBuffer$PublisherBufferExactSubscriber.onNext(FlowableBuffer.java:126)
at io.reactivex.internal.operators.flowable.FlowableObserveOn$ObserveOnSubscriber.runAsync(FlowableObserveOn.java:407)
at io.reactivex.internal.operators.flowable.FlowableObserveOn$BaseObserveOnSubscriber.run(FlowableObserveOn.java:176)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:762)
Caused by: org.schabi.newpipe.extractor.exceptions.ParsingException: Could not get duration
at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamInfoItemExtractor.getDuration(YoutubeStreamInfoItemExtractor.java:117)
at org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector.extract(StreamInfoItemsCollector.java:54)
at org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector.commit(StreamInfoItemsCollector.java:94)
at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeChannelExtractor.collectStreamsFrom(YoutubeChannelExtractor.java:289)
at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeChannelExtractor.getInitialPage(YoutubeChannelExtractor.java:239)
at org.schabi.newpipe.extractor.utils.ExtractorHelper.getItemsPageOrLogError(ExtractorHelper.java:19)
at org.schabi.newpipe.extractor.channel.ChannelInfo.getInfo(ChannelInfo.java:83)
at org.schabi.newpipe.extractor.channel.ChannelInfo.getInfo(ChannelInfo.java:48)
at org.schabi.newpipe.util.ExtractorHelper.lambda$getChannelInfo$4(ExtractorHelper.java:124)
at org.schabi.newpipe.util.-$$Lambda$ExtractorHelper$u5W7VszTe8AoEexIsFM9huQfbkM.call(lambda)
at io.reactivex.internal.operators.single.SingleFromCallable.subscribeActual(SingleFromCallable.java:44)
at io.reactivex.Single.subscribe(Single.java:3666)
at io.reactivex.internal.operators.single.SingleDoOnSuccess.subscribeActual(SingleDoOnSuccess.java:35)
at io.reactivex.Single.subscribe(Single.java:3666)
at io.reactivex.Single.blockingGet(Single.java:2869)
at org.schabi.newpipe.local.feed.service.FeedLoadService$startLoading$7.apply(FeedLoadService.kt:217)
at org.schabi.newpipe.local.feed.service.FeedLoadService$startLoading$7.apply(FeedLoadService.kt:66)
at io.reactivex.internal.operators.parallel.ParallelMap$ParallelMapSubscriber.onNext(ParallelMap.java:113)
at io.reactivex.internal.operators.parallel.ParallelFilter$ParallelFilterSubscriber.tryOnNext(ParallelFilter.java:130)
at io.reactivex.internal.operators.parallel.ParallelRunOn$RunOnConditionalSubscriber.run(ParallelRunOn.java:397)
... 7 more
Crash log 3
org.schabi.newpipe.local.feed.service.FeedLoadService$RequestException: 0:https://www.youtube.com/channel/UCnRK2VxaCN41SJJg0P6N34w
at org.schabi.newpipe.local.feed.service.FeedLoadService$RequestException$Companion.wrapList(FeedLoadService.kt:165)
at org.schabi.newpipe.local.feed.service.FeedLoadService$databaseConsumer$1$1.run(FeedLoadService.kt:314)
at androidx.room.RoomDatabase.runInTransaction(RoomDatabase.java:410)
at org.schabi.newpipe.local.feed.service.FeedLoadService$databaseConsumer$1.accept(FeedLoadService.kt:303)
at org.schabi.newpipe.local.feed.service.FeedLoadService$databaseConsumer$1.accept(FeedLoadService.kt:66)
at io.reactivex.internal.operators.flowable.FlowableDoOnEach$DoOnEachSubscriber.onNext(FlowableDoOnEach.java:86)
at io.reactivex.internal.operators.flowable.FlowableBuffer$PublisherBufferExactSubscriber.onComplete(FlowableBuffer.java:152)
at io.reactivex.internal.operators.flowable.FlowableObserveOn$BaseObserveOnSubscriber.checkTerminated(FlowableObserveOn.java:215)
at io.reactivex.internal.operators.flowable.FlowableObserveOn$ObserveOnSubscriber.runAsync(FlowableObserveOn.java:399)
at io.reactivex.internal.operators.flowable.FlowableObserveOn$BaseObserveOnSubscriber.run(FlowableObserveOn.java:176)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:762)
Caused by: org.schabi.newpipe.extractor.exceptions.ParsingException: Could not get duration
at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamInfoItemExtractor.getDuration(YoutubeStreamInfoItemExtractor.java:117)
at org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector.extract(StreamInfoItemsCollector.java:54)
at org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector.commit(StreamInfoItemsCollector.java:94)
at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeChannelExtractor.collectStreamsFrom(YoutubeChannelExtractor.java:289)
at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeChannelExtractor.getInitialPage(YoutubeChannelExtractor.java:239)
at org.schabi.newpipe.extractor.utils.ExtractorHelper.getItemsPageOrLogError(ExtractorHelper.java:19)
at org.schabi.newpipe.extractor.channel.ChannelInfo.getInfo(ChannelInfo.java:83)
at org.schabi.newpipe.extractor.channel.ChannelInfo.getInfo(ChannelInfo.java:48)
at org.schabi.newpipe.util.ExtractorHelper.lambda$getChannelInfo$4(ExtractorHelper.java:124)
at org.schabi.newpipe.util.-$$Lambda$ExtractorHelper$u5W7VszTe8AoEexIsFM9huQfbkM.call(lambda)
at io.reactivex.internal.operators.single.SingleFromCallable.subscribeActual(SingleFromCallable.java:44)
at io.reactivex.Single.subscribe(Single.java:3666)
at io.reactivex.internal.operators.single.SingleDoOnSuccess.subscribeActual(SingleDoOnSuccess.java:35)
at io.reactivex.Single.subscribe(Single.java:3666)
at io.reactivex.Single.blockingGet(Single.java:2869)
at org.schabi.newpipe.local.feed.service.FeedLoadService$startLoading$7.apply(FeedLoadService.kt:217)
at org.schabi.newpipe.local.feed.service.FeedLoadService$startLoading$7.apply(FeedLoadService.kt:66)
at io.reactivex.internal.operators.parallel.ParallelMap$ParallelMapSubscriber.onNext(ParallelMap.java:113)
at io.reactivex.internal.operators.parallel.ParallelFilter$ParallelFilterSubscriber.tryOnNext(ParallelFilter.java:130)
at io.reactivex.internal.operators.parallel.ParallelRunOn$RunOnConditionalSubscriber.run(ParallelRunOn.java:397)
... 7 more
Backup import bug on NewPipe_v0.20.0RC2!
Tested on: Xiomi Redmi Note 4(SD625 - Android 7.0 - Miui11)
The bug happens when importing a backup from v0.19.8 (and earlier versions too, I imagine). This bug causes the app to close when trying to watch a video, either in the foreground or background (this after importing the backup, as it works very well before). To fix this I had to delete the "newpipe.settings" file in the backup zip file.
@MD77MD
I'm not sure if this is bug or by design
this is a direct result of bug (1) above... but the "ask for confirmation before clearing queue" most be enabled
another potential bug: while video is paused, enqueueing a another video will unintentionally cause the player to resume playback
@Oizaro
and I think that background button should be removed
Not everyone has background playback enabled (it's not required), without going to background player you'll be unable to see playing queue after tap on notification, without manually going to background player you'll not be able to listen audio without video while browsing inside NewPipe. So, no, the button can't be removed
newPipe 0.20 Rc2 keeps crashing but don't now why?
@MD77MD Same issue as this https://github.com/TeamNewPipe/NewPipe/issues/4332#issuecomment-700191834.
another two potential bugs (a 2 in 1 😁):
Good find!
Mhh... I have tried RC2, and I think that background button should be removed. For 2 reasons:
We're planning to remove "enqueue in the background" and "enqueue in a popup" and change it to just "enqueue", which acts as a temporary video queue that syncs between all of the players (within the app, in a popup or in the background). So the background and popup buttons will be required.
Here's where it was discussed and as you can see TobiGr, Stypox, opusforlife2 and myself would really like the change. One of us just needs to submit a PR for it.
@opusforlife2 Having options for both disabling the colored notification and the thumbnail on the lockscreen would be nice. I really dislike both features and would like to turn them both off.
Sure. Please open an issue for each.
I'm on a pixel 3a phone with android 11 and newpipe 0.20.0 installed.
When playing a video in background, swiping current playing notification get rid of it definitely resulting in being unable to stop, resume or skip video neither from notification tray nor from lockscreen.
@jehutyy This is a known issue, but it won't be fixed in this release.
ok my bad I thought this RC was about that. Thanks for the heads-up.
No problem. It was noted in #3178, but we were getting too late with the release so we decided to postpone this bug fix to the next release.
No problem. It was noted in #3178, but we were getting too late with the release so we decided to postpone this bug fix to the next release.
So, what's the last bug blocking this release?
None so far, unless someone finds one in this RC.
@Pentaphon #4347 contains some fixes. As I know nothing important should be fixed afterwards
Should we consider the second bug here https://github.com/TeamNewPipe/NewPipe/issues/4332#issuecomment-699863945 a release blocker?
4347 contains some fixes. As I know nothing important should be fixed afterwards
I think your fixes are worth including in this release. I hope the devs merge them before releasing .20
Should we consider the second bug here #4332 (comment) a release blocker?
Looking at it now, I would say no. That's something that can wait for 0.20.1
@opusforlife2 I even not considering it as a bug. You have to do unusual things in order to reproduce it. It doesn't cost a minute of developer time. However it can be fixed with one line of code in player.xml
What is that line and where should it be written? I'll open a PR. :3
What is that line and where should it be written? I'll open a PR. :3
after this line:
https://github.com/TeamNewPipe/NewPipe/blob/dev/app/src/main/res/layout/player.xml#L464
add:
android:clickable="true"
android:focusable="true"
even clickable
is enough but IDEA asks the second line too.
If you add the same code to Android TV https://github.com/TeamNewPipe/NewPipe/blob/dev/app/src/main/res/layout-large-land/player.xml it will not work with D-pad since in this case Android don't care about these attributes and still allows to select views under queue. And we can't disallow showing controls while queue is visible because it will break focusability of the whole player. So only work for mouse/taps but not for D-pad.
@RickyM7 could you provide me with the newpipe.settings
file you had to delete in order to get NewPipe to work? This way I would be able to fix the issue. If you don't have that file anymore or you are not comfortable sharing it, could you provide the crash report?
In case someone's wondering why I deleted two comments, I squashed some comments into one, thus deleting the now-squashed parts
All age restricted videos cause the app to crash for me with a ui error.
For example this video: https://www.youtube.com/watch?v=4Veqe0-8k9U
I have restricted content enabled and this doesn't happen in 19.8
java.lang.IndexOutOfBoundsException: Index: 0
at java.util.Collections$EmptyList.get(Collections.java:4511)
at org.schabi.newpipe.player.helper.PlayerHelper.autoQueueOf(PlayerHelper.java:178)
at org.schabi.newpipe.player.BasePlayer.maybeAutoQueueNextStream(BasePlayer.java:1396)
at org.schabi.newpipe.player.BasePlayer.maybeUpdateCurrentMetadata(BasePlayer.java:1380)
at org.schabi.newpipe.player.BasePlayer.onTimelineChanged(BasePlayer.java:731)
at org.schabi.newpipe.player.VideoPlayerImpl.onTimelineChanged(VideoPlayerImpl.java:619)
at com.google.android.exoplayer2.ExoPlayerImpl$PlaybackInfoUpdate.lambda$run$0$ExoPlayerImpl$PlaybackInfoUpdate(ExoPlayerImpl.java:804)
at com.google.android.exoplayer2.-$$Lambda$ExoPlayerImpl$PlaybackInfoUpdate$N_S5kRfhaRTAkH28P5luFgKnFjQ.invokeListener(Unknown Source:2)
at com.google.android.exoplayer2.BasePlayer$ListenerHolder.invoke(BasePlayer.java:182)
at com.google.android.exoplayer2.ExoPlayerImpl.invokeAll(ExoPlayerImpl.java:845)
at com.google.android.exoplayer2.ExoPlayerImpl.access$000(ExoPlayerImpl.java:43)
at com.google.android.exoplayer2.ExoPlayerImpl$PlaybackInfoUpdate.run(ExoPlayerImpl.java:802)
at com.google.android.exoplayer2.ExoPlayerImpl.notifyListeners(ExoPlayerImpl.java:736)
at com.google.android.exoplayer2.ExoPlayerImpl.updatePlaybackInfo(ExoPlayerImpl.java:710)
at com.google.android.exoplayer2.ExoPlayerImpl.handlePlaybackInfo(ExoPlayerImpl.java:652)
at com.google.android.exoplayer2.ExoPlayerImpl.handleEvent(ExoPlayerImpl.java:595)
at com.google.android.exoplayer2.ExoPlayerImpl$1.handleMessage(ExoPlayerImpl.java:127)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:8107)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
@Stypox I'm sorry but I don't have the file anymore, however, to have the same file just do a backup of version v0.19.8, if you want I can do that. Regarding the crash report, there is no one, the app closes before even presenting a report.
if you want I can do that.
@RickyM7 yes, please do that (with your old settings, if you haven't deleted them already), as I can't reproduce with my settings.
All age restricted videos cause the app to crash for me with a ui error.
@TheProgrammingDog see #4112, will be fixed in the next RC apk thanks to #4349
RC3: Fix crash when there are no streams to queue for auto-play #4349
NewPipe_v0.20.0RC3.zip
@Stypox I'm sorry, I couldn't reproduce the bug, unfortunately I no longer have my old settings, but I imagine it is something related to age restriction too, but I'm not sure.
This is kinda hard to describe but if you open and then minimise a video in landscape, when you go to close it if you mis-click to the right of the X you can end up tapping a video in the next up list.
It happens more on my table probably because there's a bigger gap between the X and the edge of the screen.
@test2a
i have had this glitch when switching to and back from fullscreen video, the screen flashes black for a second
did you try the newest apk? What do you say about performance and this glitch?
Only release
apk in the archive can show the real performance. Debug apk adds additional costs so it's not good as a measuring method
Out of curiosity: Is it intended that you can add the same stream multiple times to a single playlist?
For example this flow/loop: A -> B -> C -> A -> B -> ...
@Redirion did you see my comments above? https://github.com/TeamNewPipe/NewPipe/issues/4332#issuecomment-700134989
@vkay94: Out of curiosity: Is it intended that you can add the same stream multiple times to a single playlist?
For example this flow/loop: A -> B -> C -> A -> B -> ...
Yes
If you add the same code to Android TV https://github.com/TeamNewPipe/NewPipe/blob/dev/app/src/main/res/layout-large-land/player.xml it will not work with D-pad since in this case Android don't care about these attributes and still allows to select views under queue. And we can't disallow showing controls while queue is visible because it will break focusability of the whole player. So only work for mouse/taps but not for D-pad.
@avently So I won't touch the Android TV file, then. I'll just edit the player layout file and add those two lines.
RC4 fixes endless loading specific streams.
NewPipe_v0.20.0RC4.zip
Are there any possible dates on the table of when this version may be released?
@Redirion did you see my comments above? #4332 (comment)
I have yet to reproduce the issue. Did only happen once and I didn't want to waste the stacktrace, so I did directly comment it here while I was on the road. I think it can for now be marked as resolved.
0.20.0 RC4 behave smoothly,
there are few memory leaks (and stack and dumps) I've collected from few cases, first is on the very first search after the program starts cold (always returns no results, until you search again I don't think there is a bug for that yet), second is memory leak when trying to refresh an empty subscription list.
please make the 'report bug' persistence and do not make its container disappear so fast, I've missed it twice already.
┬───
│ GC Root: System class
│
├─ leakcanary.internal.InternalLeakCanary class
│ Leaking: NO (MainActivity↓ is not leaking and a class is never leaking)
│ ↓ static InternalLeakCanary.resumedActivity
├─ org.schabi.newpipe.MainActivity instance
│ Leaking: NO (MainFragment↓ is not leaking and Activity#mDestroyed is false)
│ ↓ MainActivity.mFragments
├─ androidx.fragment.app.FragmentController instance
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ FragmentController.mHost
├─ androidx.fragment.app.FragmentActivity$HostCallbacks instance
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ FragmentActivity$HostCallbacks.mFragmentManager
├─ androidx.fragment.app.FragmentManagerImpl instance
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ FragmentManagerImpl.mBackStack
├─ java.util.ArrayList instance
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ ArrayList.array
├─ java.lang.Object[] array
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ Object[].[0]
├─ androidx.fragment.app.BackStackRecord instance
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ BackStackRecord.mOps
├─ java.util.ArrayList instance
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ ArrayList.array
├─ java.lang.Object[] array
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ Object[].[0]
├─ androidx.fragment.app.FragmentTransaction$Op instance
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ FragmentTransaction$Op.mFragment
├─ org.schabi.newpipe.fragments.MainFragment instance
│ Leaking: NO (Fragment#mFragmentManager is not null)
│ ↓ MainFragment.viewPager
│ ~~~~~
├─ androidx.viewpager.widget.ViewPager instance
│ Leaking: YES (View detached and has parent)
│ mContext instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│ View#mParent is set
│ View#mAttachInfo is null (view detached)
│ View.mID = R.id.pager
│ View.mWindowAttachCount = 1
│ ↓ ViewPager.mChildren
├─ android.view.View[] array
│ Leaking: YES (ViewPager↑ is leaking)
│ ↓ View[].[0]
╰→ android.widget.RelativeLayout instance
Leaking: YES (ObjectWatcher was watching this because org.schabi.newpipe.fragments.list.kiosk.DefaultKioskFragment received Fragment#onDestroyView() callback (references to its views should be cleared to prevent leaks) and View detached and has parent)
key = f8c136bb-6f97-4fc3-a880-d65cd45a51a5
watchDurationMillis = 10334
retainedDurationMillis = 330
key = b2b720c0-0582-48a8-bdd1-35e6372e925b
watchDurationMillis = 10331
retainedDurationMillis = 326
mContext instance of org.schabi.newpipe.MainActivity with mDestroyed = false
View#mParent is set
View#mAttachInfo is null (view detached)
View.mWindowAttachCount = 1
METADATA
Build.VERSION.SDK_INT: 21
Build.MANUFACTURER: samsung
LeakCanary version: 2.2
App process name: org.schabi.newpipe.debug.release0200
Analysis duration: 83184 ms
┬───
│ GC Root: System class
│
├─ org.schabi.newpipe.player.helper.PlayerHolder class
│ Leaking: NO (VideoDetailFragment↓ is not leaking and a class is never leaking)
│ ↓ static PlayerHolder.listener
├─ org.schabi.newpipe.fragments.detail.VideoDetailFragment instance
│ Leaking: NO (MainFragment↓ is not leaking and Fragment#mFragmentManager is not null)
│ ↓ VideoDetailFragment.mFragmentManager
├─ androidx.fragment.app.FragmentManagerImpl instance
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ FragmentManagerImpl.mCreatedMenus
├─ java.util.ArrayList instance
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ ArrayList.array
├─ java.lang.Object[] array
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ Object[].[1]
├─ org.schabi.newpipe.fragments.MainFragment instance
│ Leaking: NO (Fragment#mFragmentManager is not null)
│ ↓ MainFragment.pagerAdapter
│ ~~~~
├─ org.schabi.newpipe.fragments.MainFragment$SelectedTabsPagerAdapter instance
│ Leaking: UNKNOWN
│ ↓ MainFragment$SelectedTabsPagerAdapter.mObservable
│ ~~~
├─ android.database.DataSetObservable instance
│ Leaking: UNKNOWN
│ ↓ DataSetObservable.mObservers
│ ~~
├─ java.util.ArrayList instance
│ Leaking: UNKNOWN
│ ↓ ArrayList.array
│ ~
├─ java.lang.Object[] array
│ Leaking: UNKNOWN
│ ↓ Object[].[1]
│ ~~~~
├─ com.google.android.material.tabs.TabLayout$PagerAdapterObserver instance
│ Leaking: UNKNOWN
│ ↓ TabLayout$PagerAdapterObserver.this$0
│ ~
├─ org.schabi.newpipe.views.ScrollableTabLayout instance
│ Leaking: YES (View detached and has parent)
│ mContext instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│ View#mParent is set
│ View#mAttachInfo is null (view detached)
│ View.mID = R.id.main_tab_layout
│ View.mWindowAttachCount = 1
│ ↓ ScrollableTabLayout.mParent
╰→ android.widget.RelativeLayout instance
Leaking: YES (ObjectWatcher was watching this because org.schabi.newpipe.fragments.MainFragment received Fragment#onDestroyView() callback (references to its views should be cleared to prevent leaks))
key = 09e644f6-5db6-429a-a111-382403b925c9
watchDurationMillis = 10315
retainedDurationMillis = 314
key = e41ed238-587d-43a2-95ae-9ff7e707ce88
watchDurationMillis = 10314
retainedDurationMillis = 304
mContext instance of org.schabi.newpipe.MainActivity with mDestroyed = false
View#mParent is null
View#mAttachInfo is null (view detached)
View.mWindowAttachCount = 1
METADATA
Build.VERSION.SDK_INT: 21
Build.MANUFACTURER: samsung
LeakCanary version: 2.2
App process name: org.schabi.newpipe.debug.release0200
Analysis duration: 81132 ms
┬───
│ GC Root: System class
│
├─ leakcanary.internal.InternalLeakCanary class
│ Leaking: NO (MainActivity↓ is not leaking and a class is never leaking)
│ ↓ static InternalLeakCanary.resumedActivity
├─ org.schabi.newpipe.MainActivity instance
│ Leaking: NO (FocusAwareDrawerLayout↓ is not leaking and Activity#mDestroyed is false)
│ ↓ MainActivity.drawer
├─ org.schabi.newpipe.views.FocusAwareDrawerLayout instance
│ Leaking: NO (NewPipeRecyclerView↓ is not leaking and View attached)
│ mContext instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│ View.parent androidx.appcompat.widget.ContentFrameLayout attached as well
│ View#mParent is set
│ View#mAttachInfo is not null (view attached)
│ View.mID = R.id.drawer_layout
│ View.mWindowAttachCount = 1
│ ↓ FocusAwareDrawerLayout.mAttachInfo
├─ android.view.View$AttachInfo instance
│ Leaking: NO (NewPipeRecyclerView↓ is not leaking)
│ ↓ View$AttachInfo.mScrollContainers
├─ java.util.ArrayList instance
│ Leaking: NO (NewPipeRecyclerView↓ is not leaking)
│ ↓ ArrayList.array
├─ java.lang.Object[] array
│ Leaking: NO (NewPipeRecyclerView↓ is not leaking)
│ ↓ Object[].[3]
├─ org.schabi.newpipe.views.NewPipeRecyclerView instance
│ Leaking: NO (View attached)
│ mContext instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│ View.parent android.widget.RelativeLayout attached as well
│ View#mParent is set
│ View#mAttachInfo is not null (view attached)
│ View.mID = R.id.items_list
│ View.mWindowAttachCount = 1
│ ↓ NewPipeRecyclerView.mAdapter
│ ~~
├─ org.schabi.newpipe.info_list.InfoListAdapter instance
│ Leaking: UNKNOWN
│ ↓ InfoListAdapter.mObservable
│ ~~~
├─ androidx.recyclerview.widget.RecyclerView$AdapterDataObservable instance
│ Leaking: UNKNOWN
│ ↓ RecyclerView$AdapterDataObservable.mObservers
│ ~~~~
├─ java.util.ArrayList instance
│ Leaking: UNKNOWN
│ ↓ ArrayList.array
│ ~
├─ java.lang.Object[] array
│ Leaking: UNKNOWN
│ ↓ Object[].[1]
│ ~~~~
├─ androidx.recyclerview.widget.RecyclerView$RecyclerViewDataObserver instance
│ Leaking: UNKNOWN
│ ↓ RecyclerView$RecyclerViewDataObserver.this$0
│ ~
├─ org.schabi.newpipe.views.NewPipeRecyclerView instance
│ Leaking: YES (View detached and has parent)
│ mContext instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│ View#mParent is set
│ View#mAttachInfo is null (view detached)
│ View.mID = R.id.items_list
│ View.mWindowAttachCount = 1
│ ↓ NewPipeRecyclerView.mParent
╰→ android.widget.RelativeLayout instance
Leaking: YES (ObjectWatcher was watching this because org.schabi.newpipe.fragments.list.kiosk.DefaultKioskFragment received Fragment#onDestroyView() callback (references to its views should be cleared to prevent leaks) and View detached and has parent)
key = 0cb93c97-3d08-41c1-8b87-bff07681b7d1
watchDurationMillis = 10323
retainedDurationMillis = 320
key = 746cfdd0-b6b0-416b-829f-85d12f1011e4
watchDurationMillis = 10322
retainedDurationMillis = 319
mContext instance of org.schabi.newpipe.MainActivity with mDestroyed = false
View#mParent is set
View#mAttachInfo is null (view detached)
View.mWindowAttachCount = 1
METADATA
Build.VERSION.SDK_INT: 21
Build.MANUFACTURER: samsung
LeakCanary version: 2.2
App process name: org.schabi.newpipe.debug.release0200
Analysis duration: 81132 ms
┬───
│ GC Root: System class
│
├─ leakcanary.internal.InternalLeakCanary class
│ Leaking: NO (MainActivity↓ is not leaking and a class is never leaking)
│ ↓ static InternalLeakCanary.resumedActivity
├─ org.schabi.newpipe.MainActivity instance
│ Leaking: NO (FocusAwareDrawerLayout↓ is not leaking and Activity#mDestroyed is false)
│ ↓ MainActivity.drawer
├─ org.schabi.newpipe.views.FocusAwareDrawerLayout instance
│ Leaking: NO (RecyclerView↓ is not leaking and View attached)
│ mContext instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│ View.parent androidx.appcompat.widget.ContentFrameLayout attached as well
│ View#mParent is set
│ View#mAttachInfo is not null (view attached)
│ View.mID = R.id.drawer_layout
│ View.mWindowAttachCount = 1
│ ↓ FocusAwareDrawerLayout.mAttachInfo
├─ android.view.View$AttachInfo instance
│ Leaking: NO (RecyclerView↓ is not leaking)
│ ↓ View$AttachInfo.mScrollContainers
├─ java.util.ArrayList instance
│ Leaking: NO (RecyclerView↓ is not leaking)
│ ↓ ArrayList.array
├─ java.lang.Object[] array
│ Leaking: NO (RecyclerView↓ is not leaking)
│ ↓ Object[].[4]
├─ androidx.recyclerview.widget.RecyclerView instance
│ Leaking: NO (View attached)
│ mContext instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│ View.parent android.widget.RelativeLayout attached as well
│ View#mParent is set
│ View#mAttachInfo is not null (view attached)
│ View.mID = R.id.items_list
│ View.mWindowAttachCount = 1
│ ↓ RecyclerView.mAdapter
│ ~~
├─ com.xwray.groupie.GroupAdapter instance
│ Leaking: UNKNOWN
│ ↓ GroupAdapter.mObservable
│ ~~~
├─ androidx.recyclerview.widget.RecyclerView$AdapterDataObservable instance
│ Leaking: UNKNOWN
│ ↓ RecyclerView$AdapterDataObservable.mObservers
│ ~~~~
├─ java.util.ArrayList instance
│ Leaking: UNKNOWN
│ ↓ ArrayList.array
│ ~
├─ java.lang.Object[] array
│ Leaking: UNKNOWN
│ ↓ Object[].[1]
│ ~~~~
├─ androidx.recyclerview.widget.RecyclerView$RecyclerViewDataObserver instance
│ Leaking: UNKNOWN
│ ↓ RecyclerView$RecyclerViewDataObserver.this$0
│ ~
├─ androidx.recyclerview.widget.RecyclerView instance
│ Leaking: YES (View detached and has parent)
│ mContext instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│ View#mParent is set
│ View#mAttachInfo is null (view detached)
│ View.mID = R.id.items_list
│ View.mWindowAttachCount = 1
│ ↓ RecyclerView.mParent
╰→ android.widget.RelativeLayout instance
Leaking: YES (ObjectWatcher was watching this because org.schabi.newpipe.local.subscription.SubscriptionFragment received Fragment#onDestroyView() callback (references to its views should be cleared to prevent leaks) and View detached and has parent)
key = aa1b8692-53dd-4528-9599-8b01db110679
watchDurationMillis = 10319
retainedDurationMillis = 318
key = 175f471b-34eb-44d8-be34-a1d9e367e3c4
mContext instance of org.schabi.newpipe.MainActivity with mDestroyed = false
View#mParent is set
View#mAttachInfo is null (view detached)
View.mWindowAttachCount = 1
METADATA
Build.VERSION.SDK_INT: 21
Build.MANUFACTURER: samsung
LeakCanary version: 2.2
App process name: org.schabi.newpipe.debug.release0200
Analysis duration: 81132 ms
┬───
│ GC Root: System class
│
├─ org.schabi.newpipe.player.helper.PlayerHolder class
│ Leaking: NO (VideoDetailFragment↓ is not leaking and a class is never leaking)
│ ↓ static PlayerHolder.listener
├─ org.schabi.newpipe.fragments.detail.VideoDetailFragment instance
│ Leaking: NO (SearchFragment↓ is not leaking and Fragment#mFragmentManager is not null)
│ ↓ VideoDetailFragment.mFragmentManager
├─ androidx.fragment.app.FragmentManagerImpl instance
│ Leaking: NO (SearchFragment↓ is not leaking)
│ ↓ FragmentManagerImpl.mFragmentStore
├─ androidx.fragment.app.FragmentStore instance
│ Leaking: NO (SearchFragment↓ is not leaking)
│ ↓ FragmentStore.mActive
├─ java.util.HashMap instance
│ Leaking: NO (SearchFragment↓ is not leaking)
│ ↓ HashMap.table
├─ java.util.HashMap$HashMapEntry[] array
│ Leaking: NO (SearchFragment↓ is not leaking)
│ ↓ HashMap$HashMapEntry[].[0]
├─ java.util.HashMap$HashMapEntry instance
│ Leaking: NO (SearchFragment↓ is not leaking)
│ ↓ HashMap$HashMapEntry.value
├─ androidx.fragment.app.FragmentStateManager instance
│ Leaking: NO (SearchFragment↓ is not leaking)
│ ↓ FragmentStateManager.mFragment
├─ org.schabi.newpipe.fragments.list.search.SearchFragment instance
│ Leaking: NO (Fragment#mFragmentManager is not null)
│ ↓ SearchFragment.correctSuggestion
│ ~~~~~
├─ androidx.appcompat.widget.AppCompatTextView instance
│ Leaking: YES (View detached and has parent)
│ mContext instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│ View#mParent is set
│ View#mAttachInfo is null (view detached)
│ View.mID = R.id.correct_suggestion
│ View.mWindowAttachCount = 1
│ ↓ AppCompatTextView.mParent
╰→ android.widget.RelativeLayout instance
Leaking: YES (ObjectWatcher was watching this because org.schabi.newpipe.fragments.list.search.SearchFragment received Fragment#onDestroyView() callback (references to its views should be cleared to prevent leaks))
key = 7030c99e-61e8-4592-a444-0d0df028f8cc
watchDurationMillis = 132065
retainedDurationMillis = 122063
key = 5735c68c-e1ca-44e1-a03c-e5f8861eb90e
retainedDurationMillis = 122062
mContext instance of org.schabi.newpipe.MainActivity with mDestroyed = false
View#mParent is null
View#mAttachInfo is null (view detached)
View.mWindowAttachCount = 1
METADATA
Build.VERSION.SDK_INT: 21
Build.MANUFACTURER: samsung
LeakCanary version: 2.2
App process name: org.schabi.newpipe.debug.release0200
Analysis duration: 138403 ms
┬───
│ GC Root: System class
│
├─ leakcanary.internal.InternalLeakCanary class
│ Leaking: NO (MainActivity↓ is not leaking and a class is never leaking)
│ ↓ static InternalLeakCanary.resumedActivity
├─ org.schabi.newpipe.MainActivity instance
│ Leaking: NO (MainFragment↓ is not leaking and Activity#mDestroyed is false)
│ ↓ MainActivity.mFragments
├─ androidx.fragment.app.FragmentController instance
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ FragmentController.mHost
├─ androidx.fragment.app.FragmentActivity$HostCallbacks instance
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ FragmentActivity$HostCallbacks.mFragmentManager
├─ androidx.fragment.app.FragmentManagerImpl instance
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ FragmentManagerImpl.mBackStack
├─ java.util.ArrayList instance
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ ArrayList.array
├─ java.lang.Object[] array
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ Object[].[0]
├─ androidx.fragment.app.BackStackRecord instance
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ BackStackRecord.mOps
├─ java.util.ArrayList instance
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ ArrayList.array
├─ java.lang.Object[] array
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ Object[].[0]
├─ androidx.fragment.app.FragmentTransaction$Op instance
│ Leaking: NO (MainFragment↓ is not leaking)
│ ↓ FragmentTransaction$Op.mFragment
├─ org.schabi.newpipe.fragments.MainFragment instance
│ Leaking: NO (Fragment#mFragmentManager is not null)
│ ↓ MainFragment.tabLayout
│ ~~~~~
├─ org.schabi.newpipe.views.ScrollableTabLayout instance
│ Leaking: YES (View detached and has parent)
│ mContext instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│ View#mParent is set
│ View#mAttachInfo is null (view detached)
│ View.mID = R.id.main_tab_layout
│ View.mWindowAttachCount = 1
│ ↓ ScrollableTabLayout.mParent
╰→ android.widget.RelativeLayout instance
Leaking: YES (ObjectWatcher was watching this because org.schabi.newpipe.fragments.MainFragment received Fragment#onDestroyView() callback (references to its views should be cleared to prevent leaks))
key = 051d83b3-c1ba-4b43-b4d4-109e817b8806
watchDurationMillis = 10323
retainedDurationMillis = 323
key = d631f182-9aba-445e-aa63-6513198ade38
watchDurationMillis = 10322
retainedDurationMillis = 322
mContext instance of org.schabi.newpipe.MainActivity with mDestroyed = false
View#mParent is null
View#mAttachInfo is null (view detached)
View.mWindowAttachCount = 1
METADATA
Build.VERSION.SDK_INT: 21
Build.MANUFACTURER: samsung
LeakCanary version: 2.2
App process name: org.schabi.newpipe.debug.release0200
Analysis duration: 83184 ms
settings (new not imported)
NewPipeData-20200930_142911.zip
2020-09-30_14-10-01_859.hprof.zip
Modifying play queue while watching not possible, because drag & drop icons are not displayed.
it is not possible to reorder the streams, only to remove them from the queue.
@TobiGr why it happens? Is this caused by me?
Well, 0.19.8 has handles on the right of every entry to drag it. These seem to have disappeared here.
@opusforlife2 they are still there but invisible
ImageView should be replaced with appcompatimageview
Ah, Like the close button Stypox fixed in the video queue.
Is this another thing you would help me make a PR for? 😏
Found another bug:
when the video controls are shown, using gestures can trigger swipe actions when starting the swipes at the position of a button.
See the screencast for more info.
For some reason, Android Studio messed up while recording the screencasts (i don't know why :( I am not able to capture good screencasts anymore)
@TobiGr yeah, you can use this method to go to description :)
Issa feature, not a bug. ᕕ( ᐛ )ᕗ
It's also mentioned in the change log.
Swipe up on full screen button in landscape mode to scroll down the video details
Uh. Nice feature. I didn't know this was intended. however, this felt very buggy to me, because I did not expect the player to do this. I'd suggest to split tablet screens to accept three gestures like this:
(I don't think that the scroll gestures is handy on phones, because phones are just too small / when in landscape only one or two comments can be viewed)
@TobiGr no one will stop you if you implement such feature:)
Also I think such gestures should be available on phones too because it's useful. Center is not used in swipes so it's free place
See the screencast for more info.
Wait I just saw the screencast properly again. @avently I thought only swiping down in the title region was supposed to minimize the player? Why do the track buttons (pause/next/previous) respond to the gesture?
In fact, remember that video jump glitch where swiping up on the seekbar/fullscreen buttom would cause the video to jump down and make space for a red status bar? It happens with the track buttons as well.
I don't think the track buttons should accept swipe gestures at all.
I don't think the track buttons should accept swipe gestures at all.
Cool. Waiting your PR:)
I'm in. B) Tell me what to do.
@opusforlife2 I've no idea. I already told you that this isn't what I implemented but it's how it works without special code. So someone needs to find how to skip interception of such gestures on elements inside the player. Easy way is to add them to the list of blacklisted elements inside custombottomsheet (such list is already exist on top of the file, you can just add more elements in it, like R.id.someOfTheButtonToIgnore but with id of all buttons to ignore like play/prev/next). It's an easy way. Hard way... I don't know.
Why do we need the hard way? Is the easy way not good?
@opusforlife2 try this method, it's ok now
Uh. Nice feature. I didn't know this was intended. however, this felt very buggy to me, because I did not expect the player to do this. I'd suggest to split tablet screens to accept three gestures like this:
(I don't think that the scroll gestures is handy on phones, because phones are just too small / when in landscape only one or two comments can be viewed)
SUGGESTION
the first time the user opens the player should see a scheme like that, so the way gestures work is clear! ;)
Easy way is to add them to the list of blacklisted elements inside custombottomsheet
@avently The only search result for 'custombottomsheet' is this very issue.
skipInterceptionOfElements
to
private final List<Integer> skipInterceptionOfElements = Arrays.asList(
R.id.detail_content_root_layout, R.id.relatedStreamsLayout,
R.id.playQueuePanel, R.id.viewpager, R.id.bottomControls,
R.id.playPreviousButton, R.id.playPauseButton, R.id.playNextButton);
?
Ref:
https://github.com/TeamNewPipe/NewPipe/blob/3a3ecc7775e1e5672ac7e958c0b42833e8ad10a5/app/src/main/res/layout/player.xml#L406
https://github.com/TeamNewPipe/NewPipe/blob/3a3ecc7775e1e5672ac7e958c0b42833e8ad10a5/app/src/main/res/layout-large-land/player.xml#L409
@opusforlife2 if this is working and fixes the problem, then yes. Is this working?
I haven't tried it in Android Studio yet. Just showed it to you in case I was doing something wrong.
@opusforlife2 I think it's incomplete solution and you also have to add a block of code:
So you'll get one block per one id. In your case you should add three blocks in total. Each block with an id of the button you want to skip interception of.
Like this:
final View playPauseButton = child.findViewById(R.id.playPauseButton);
if (playPauseButton != null) {
final boolean visible = playPauseButton.getGlobalVisibleRect(globalRect);
if (visible && globalRect.contains((int) ev.getRawX(), (int) ev.getRawY())) {
allowScroll = false;
return false;
}
}
I'm out of computer so formatting is messed up. Make sure you use final View
instead of final ViewGroup
.
This code denies interception for collapsing view that holds the player.
Since you're adding this code you can also fix invisible button here https://github.com/TeamNewPipe/NewPipe/blob/dev/app/src/main/res/layout/play_queue_item.xml#L15 and here https://github.com/TeamNewPipe/NewPipe/blob/dev/app/src/main/res/layout/play_queue_item.xml#L41
Just replace ImageView
with AppCompatImageView
(android studio will show the whole path from the support library when you enter this)
In your case you should add three blocks in total.
@avently Where? FlingBehavior.java or CustomBottomSheetBehavior.java?
@TobiGr @opusforlife2 #4360
@opusforlife2
Man, learn Android. It's faster to do things than to teach you how to do things:)
Maybe that was secretly my goal all along. ;)
@Redirion could you provide more details? Can it be reproduced?
I found this, btw, so this is probably my fault and I will look into it
it did happen again with RC4. Seems random. I will try your test apk now.
Do not list YouTube's OTF streams
This was already in RC4, no?
You've updated the draft release but the change log up top is outdated.
- #4347
- Prevent tapping behind queue in main player #4353
- updated translations
- improved notification settings #4340
- Disabled commenter image view on LoadThumbnail set to false #4350
- Do not list YouTube's OTF streams TeamNewPipe/NewPipeExtractor#400
I see no thumbnail or image _(on pull down notification)_ when set to "play on the background" on this build? Is it disabled by default? Previous NewPipe_v0.20.0RC4 has it. But when I updated to NewPipe_v0.20.0RC5, it is gone. Only white color.
Did a clean install instead of re-updating the app. Working fine now.
@josephmalonda Works fine for me. Which phone and Android version?
@josephmalonda Works fine for me. Which phone and Android version?
Did a clean install instead of re-updating the app. Working fine now.
settings (new not imported)
@eladkarako for me those settings import without issues, what's the problem?
I found an issue with the fullscreen button on tablets, I'm not sure if this is an emulator issue, but I don't think so.
VideoDetailFragment
loads the layout
layout, i.e. without -large-land
)VideoDetailFragment
loads the layout-large-land
layout as expected, but the player does not switch to fullscreen. In order to make it go fullscreen I had to press on the fullscreen button again.Note that the behaviour obtained after pressing the fullscreen button is exactly the same as rotating the device, but on tablets rotating the device does not mean going into fullscreen mode. So the fullscreen button should in my opinion rotate the device and then go into fullscreen directly. Anyway, this is not release blocking, so unless @avently has a quick solution we can fix this later in 0.20.1 by ourselves.
@N0tsus It's _just_ been fixed. Wait for the next RC.
IRC. Link is on repo's Readme. 👍 You can join through the browser, your IRC client, or a Matrix account.
i am comparing 0.19.8 and the new rc6 and i find the page switcher icon missing at rest, ie, the user is NOT told about the next track, suggested videos
the two page switcher icons are very important because in absence of those, the user unless they know about swiping left will NOT switch left.
The icons do show up in the new version but i am having to first swipe down on the comments a bit and then it shows up. it should show up either at the top always like it was few updates ago or show up like 19.8, aka always
@test2a I made this because no one will need to see this two dots everytime. You only need to see them once to know that there are two pages. So they are useless when you already know about this
@test2a I did not notice that. Thank you!
@avently I agree with @test2a that the indicators should be there. The UI should be consistent and therefore display them always.
@TobiGr the way they worked before makes them appear in fullscreen. So when the player in fullscreen they are visible at the bottom of the screen.
Sorry to hop in, maybe considere tiny "tabbed" design ? Like [comments/suggestions] ? Could be done in a thin way and would be really easier to understand at first
I was like "what why there is a carousel" after some time, and confused on when comments or suggestion where switching, for a long time 😅
Hello, the notification does not display the the current time in the video and how long the video is.
In https://github.com/TeamNewPipe/NewPipe/issues/4332#issuecomment-699675761 is a screenshot with the timebar and the time numbers. I did not use this RC (and haven't found a download for this RC) since my first one which I downloaded was RC03 so I don't know if it was removed in later versions or if the commenter has different settings so that he get the timebar and numbers. I haven't found anything to change it though and so I am still using an older debug version which had the old notifications style. Is it a failure on my side for a wrong setting or were the timebar and numbers removed? I am on Android 9 with the RC6.
@yufin1 could you provide the exact steps to reproduce? Are you on Android 10?
@Stypox I am on android 9. Well it is just the normal notification if I start a video. So I just start playing a video and get the notification. I have used other RCs too and always got this notification without the timebar. But the timebar should be visible i.e. it wasn't removed?
I can't find subscriptions and bookmarked playlists, then, I tried to import my previous database,the tabs name are correct but their contents are missed
Hello, the notification does not display the the current time in the video and how long the video is.
I am on android 9.
@yufin1 That's not a bug. That's just a consequence of switching to MediaStyle notifications. The seekbar only appears on Android 10+ now.
I can't find subscriptions and bookmarked playlists, then, I tried to import my previous database,the tabs name are correct but their contents are missed
That's a known issue also in previous versions. If, after importing, you completely close the app and reopen it, everything should be fine.
I just noticed that notification doesn't contain current time and all time. Why? There is a place for a custom string inside notification. So you can pass 12:34 / 45:55
in it. Also you can pass place of a stream in a playlist too, like 12:34 / 45:55, 1/4
. Can this be added?
@avently that would require updating the notification every second, which is not a good idea in my opinion, as it would increase battery consumption and hurt performance.
Last RC for this release: NewPipe_v0.20.0RC7.zip
@Stypox from my point of view the cost is acceptable. I think the cost of cpu time should be measured before making a decision
One week of adapting the code to release. That's cool. Thank you everyone involved into the process. We did a great job!
I hope new releases will be compared to 0.20.0 and not with 0.19.8 :smile:
@opusforlife2 i'm a bit late but today I read a blog post about changes in this version. The post is so awesome! So detailed, with pictures and comparisons with previous version. Thank you for it.
Comments are great too. Basically we can see that most people like the update but haters can't stop hating. Nice experience
@avently Thanks! Poolitzer and I worked on the blog post, and everyone contributed screenshots and short videos.
Most helpful comment
One week of adapting the code to release. That's cool. Thank you everyone involved into the process. We did a great job!
I hope new releases will be compared to 0.20.0 and not with 0.19.8 :smile: