TeamNewPipe / NewPipe

A libre lightweight streaming front-end for Android.
https://newpipe.net
GNU General Public License v3.0
30.36k stars 2.98k forks source link

[YouTube] All Age-restricted videos unavailable #8102

Closed WesleyTRV closed 2 years ago

WesleyTRV commented 2 years ago

Checklist

Affected version

0.22.1

Steps to reproduce the bug

  1. Enable age-restricted videos in settings.
  2. Look up for an video which is age-restricted.
  3. This message show up.

Expected behavior

Age restricted video will normally load up and proceed.

Actual behavior

This message shows up and it's annoying.

Screenshots/Screen recordings

Screenshot_20220325-035411_NewPipe

Logs

Exception

org.schabi.newpipe.extractor.exceptions.AgeRestrictedContentException: This age-restricted video cannot be watched.
    at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor.checkPlayabilityStatus(YoutubeStreamExtractor.java:760)
    at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor.onFetchPage(YoutubeStreamExtractor.java:715)
    at org.schabi.newpipe.extractor.Extractor.fetchPage(Extractor.java:54)
    at org.schabi.newpipe.extractor.stream.StreamInfo.getInfo(StreamInfo.java:68)
    at org.schabi.newpipe.extractor.stream.StreamInfo.getInfo(StreamInfo.java:64)
    at org.schabi.newpipe.util.ExtractorHelper.lambda$getStreamInfo$3(ExtractorHelper.java:116)
    at org.schabi.newpipe.util.ExtractorHelper.$r8$lambda$YTHJjScxCJNO1LTCqs3IKy35iyY(Unknown Source:0)
    at org.schabi.newpipe.util.ExtractorHelper$$ExternalSyntheticLambda6.call(Unknown Source:4)
    at io.reactivex.rxjava3.internal.operators.single.SingleFromCallable.subscribeActual(SingleFromCallable.java:43)
    at io.reactivex.rxjava3.core.Single.subscribe(Single.java:4813)
    at io.reactivex.rxjava3.internal.operators.single.SingleDoOnSuccess.subscribeActual(SingleDoOnSuccess.java:35)
    at io.reactivex.rxjava3.core.Single.subscribe(Single.java:4813)
    at io.reactivex.rxjava3.internal.operators.maybe.MaybeFromSingle.subscribeActual(MaybeFromSingle.java:41)
    at io.reactivex.rxjava3.core.Maybe.subscribe(Maybe.java:5330)
    at io.reactivex.rxjava3.internal.operators.maybe.MaybeConcatArray$ConcatMaybeObserver.drain(MaybeConcatArray.java:153)
    at io.reactivex.rxjava3.internal.operators.maybe.MaybeConcatArray$ConcatMaybeObserver.request(MaybeConcatArray.java:78)
    at io.reactivex.rxjava3.internal.operators.flowable.FlowableElementAtMaybe$ElementAtSubscriber.onSubscribe(FlowableElementAtMaybe.java:66)
    at io.reactivex.rxjava3.internal.operators.maybe.MaybeConcatArray.subscribeActual(MaybeConcatArray.java:42)
    at io.reactivex.rxjava3.core.Flowable.subscribe(Flowable.java:15868)
    at io.reactivex.rxjava3.internal.operators.flowable.FlowableElementAtMaybe.subscribeActual(FlowableElementAtMaybe.java:36)
    at io.reactivex.rxjava3.core.Maybe.subscribe(Maybe.java:5330)
    at io.reactivex.rxjava3.internal.operators.maybe.MaybeToSingle.subscribeActual(MaybeToSingle.java:46)
    at io.reactivex.rxjava3.core.Single.subscribe(Single.java:4813)
    at io.reactivex.rxjava3.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
    at io.reactivex.rxjava3.core.Scheduler$DisposeTask.run(Scheduler.java:644)
    at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:65)
    at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:56)
    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:1162)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
    at java.lang.Thread.run(Thread.java:764)


Affected Android/Custom ROM version

Android 8

Affected device model

Galaxy S7

Additional information

This bug is in requirement of an immediate fix/patch ASAP.

Amberarch commented 2 years ago

I would like to add that you can still play the audio in the background, and the videos will sometimes be watchable after doing this.

WesleyTRV commented 2 years ago

Still the same issue. Age-restriction is broken.

boognish-rising commented 2 years ago

Not sure if it's terribly relevant but I see that Android 8 is the cited Android OS version for this particular issue. I didn't look for additional issues citing the same problem with age-restricted videos suddenly not playing anymore, as I was really only trying to determine if there was already an open issue for it, which this satisfied. The only noteworthy difference is Android version. The issue is also reproducible using Android 12

Blue166 commented 2 years ago

I'm having the same issue it's part of why I downloaded this app I would really like to see this fixed please 😕😊

WesleyTRV commented 2 years ago

I'm still having the same issue. IDK if this bug also affected other devices but this bug needs to be fixed ASAP.

Screenshot_20220325-135901_NewPipe
litetex commented 2 years ago

Related: https://github.com/TeamNewPipe/NewPipeExtractor/issues/729

coletdjnz commented 2 years ago

Also related: https://github.com/yt-dlp/yt-dlp/issues/3182

WesleyTRV commented 2 years ago

Is the bug fixed already? I'm still getting the issue.

Blue166 commented 2 years ago

I don't think it's been fixed yet as it's still an issue for me too

RiedleroD commented 2 years ago

hint: if the issue is still open, it's not fixed yet. Don't comment that it's still broken either, because that's obvious. Do comment if it fixes itself though.

videomember commented 2 years ago

issue all versions android

Miteirao commented 2 years ago

Not working, Android 11

AudricV commented 2 years ago

For everyone: please stop commenting on the issue unless you have something useful to add.

We know the extraction of YouTube age-restricted videos is broken, so it happens on all devices on every Android version, due to a YouTube change which patched the way we are able to get them.

It seems there is no way to get anonymously streams of age-restricted videos anymore, at least for the same amount.

zerodytrash commented 2 years ago

I've created a bruteforce script that tries thousands of possible combinations between innertube clients and versions. TVHTML5_SIMPLY_EMBEDDED_PLAYER with version 2.0 has currently no age restrictions. So we can access age-restricted videos anonymously again (at least for now).

POST /youtubei/v1/player?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8 HTTP/2
Host: www.youtube.com

{
    "context": {
        "client": {
            "clientName": "TVHTML5_SIMPLY_EMBEDDED_PLAYER",
            "clientVersion": "2.0"
        },
        "thirdParty": {
            "embedUrl": "https://www.youtube.com/",
        }
    },
    "videoId": "dqRZDebPIGs",
    "racyCheckOk": true,
    "contentCheckOk": true
}
Blue166 commented 2 years ago

Fortunately I found a alternate app that allows me too watch and download video and I'll stick with that for now should this never be fixed 👍

ThisIsPaulDaily commented 2 years ago

Fortunately I found a alternate app that allows me too watch and download video and I'll stick with that for now should this never be fixed 👍

You ever read a thread for the exact problem you're looking to solve and the person replies "Thanks guys I solved it myself", but they don't say specifically what they did to solve it? That's how I feel about this comment, respectfully.

I do like the Brute force script mentioned above and I think I will work.

Feel free to collapse my comment as off topic...

Daverpe commented 2 years ago

I've created a bruteforce script

How to add this script to Newpipe?

Mod note: don't paste a giant wall of text. Only quote the part needed for context for your reply.

ilwsm commented 2 years ago

So, newpipe cannot download age restricted videos for now?

rhjdvsgsgks commented 2 years ago

I've created a bruteforce script

Mod note: read https://github.com/TeamNewPipe/NewPipe/issues/8102#issuecomment-1081957057 edit: i will take care about it, thanks

i wrote a simple frida snippet to test that, and it works

Java.perform(function () {
    var JsonBuilder = Java.use("com.grack.nanojson.JsonBuilder");
    JsonBuilder.value.overload("java.lang.String", "java.lang.String").implementation = function (key, s) {
    if (key == "clientName" && s == "ANDROID") {
            s = "TVHTML5_SIMPLY_EMBEDDED_PLAYER"
    } else if (key == "clientVersion" && s == "16.29.38") {
            s = "2.0"
    }
    var ret_value = this.value(key, s);
        return ret_value;
    }
});

https://github.com/TeamNewPipe/NewPipeExtractor/blob/5a1873084526a8f67a9924c32457eb4a0a3101c4/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java#L1043-L1044 https://github.com/mmastrac/nanojson/blob/959842ccc39256f545a96581e78071a27cb83558/src/main/java/com/grack/nanojson/JsonBuilder.java#L122 (these two lines been hooked) but pretty slow, only 50-80kb with 1 connection. it means that not very useful to watch video, unless watch only low resolution video or download (multi thread) video before watch it.

iiSnewoNL commented 2 years ago

but pretty slow, only 50-80kb with 1 connection. it means that not very useful to watch video, unless watch only low resolution video or download (multi thread) video before watch it.

So I guess we are stuck with having no access to watch age-restricted videos? Daim Europe, thanks 😕

AudricV commented 2 years ago

Please test this APK: app-debug.zip

boognish-rising commented 2 years ago

Please test this APK: app-debug.zip

IT WORKS! I obviously haven't tested it extensively yet, as you only posted it 5 minutes ago but I have confirmed that it works to bypass YT's age restriction script. It's a little slow but it appears that when you configure the app to use an external video player things are sped up a bit.

THANK YOU! You and anyone else that contributed are the dude(s)

I'll continue testing and report back...

Not sure if it's at all helpful but see the hidden comment below for a heap analysis (7 leaks)

boognish-rising commented 2 years ago

Not sure if this is helpful at all but here is the heap dump analysis showing 7 leaks. If you've got a bugsnap account or anything similar, I'm happy to upload it there... The preview isn't displaying properly in the code box, hopefully this doesn't come spewing out in one long-ass chunk but if it does, I'll edit accordingly. Mods may feel free to do so as well if I haven't figured it out in a timely fashion

Edit - even using the "add code" function, it was still absurdly long so I just hid the comment as to not take an inordinate amount of space up. Please feel free to alter/adjust this post in an way that's helpful or conducive. Or delete it if it doesn't contribute anything meaningful

<====================================
HEAP ANALYSIS RESULT
====================================
7 APPLICATION LEAKS

References underlined with "~~~" are likely causes.
Learn more at https://squ.re/leaks.

2987 bytes retained by leaking objects
Signature: 4bb989b87242c1f13d563c5196326e4df01ad387
┬───
│ GC Root: Global variable in native code
│
├─ android.database.ContentObserver$Transport instance
│    Leaking: NO (VideoDetailFragment↓ is not leaking)
│    ↓ ContentObserver$Transport.mContentObserver
├─ org.schabi.newpipe.fragments.detail.VideoDetailFragment$1 instance
│    Leaking: NO (VideoDetailFragment↓ is not leaking)
│    Anonymous subclass of android.database.ContentObserver
│    ↓ VideoDetailFragment$1.this$0
├─ org.schabi.newpipe.fragments.detail.VideoDetailFragment instance
│    Leaking: NO (MainFragment↓ is not leaking and Fragment#mFragmentManager is
│    not null)
│    activity instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ VideoDetailFragment.mFragmentManager
├─ androidx.fragment.app.FragmentManagerImpl instance
│    Leaking: NO (MainFragment↓ is not leaking)
│    ↓ FragmentManagerImpl.mFragmentStore
├─ androidx.fragment.app.FragmentStore instance
│    Leaking: NO (MainFragment↓ is not leaking)
│    ↓ FragmentStore.mActive
├─ java.util.HashMap instance
│    Leaking: NO (MainFragment↓ is not leaking)
│    ↓ HashMap.table
├─ java.util.HashMap$Node[] array
│    Leaking: NO (MainFragment↓ is not leaking)
│    ↓ HashMap$Node[].[1]
├─ java.util.HashMap$Node instance
│    Leaking: NO (MainFragment↓ is not leaking)
│    ↓ HashMap$Node.value
├─ androidx.fragment.app.FragmentStateManager instance
│    Leaking: NO (MainFragment↓ is not leaking)
│    ↓ FragmentStateManager.mFragment
├─ org.schabi.newpipe.fragments.MainFragment instance
│    Leaking: NO (Fragment#mFragmentManager is not null)
│    activity instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ MainFragment.binding
│                   ~~~~~~~
├─ org.schabi.newpipe.databinding.FragmentMainBinding instance
│    Leaking: UNKNOWN
│    Retaining 30574 bytes in 623 objects
│    ↓ FragmentMainBinding.rootView
│                          ~~~~~~~~
╰→ 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))
​     Retaining 2987 bytes in 75 objects
​     key = 7b15b76e-435a-41ef-ad16-5e060e8f1c95
​     watchDurationMillis = 509725
​     retainedDurationMillis = 499689
​     View not part of a window view hierarchy
​     View.mAttachInfo is null (view detached)
​     View.mWindowAttachCount = 1
​     mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
​     false

8517 bytes retained by leaking objects
Displaying only 1 leak trace out of 3 with the same signature
Signature: 68fc49bac6716cbec651d5a79eb64683b3e1736
┬───
│ GC Root: Global variable in native code
│
├─ android.database.ContentObserver$Transport instance
│    Leaking: NO (VideoDetailFragment↓ is not leaking)
│    ↓ ContentObserver$Transport.mContentObserver
├─ org.schabi.newpipe.fragments.detail.VideoDetailFragment$1 instance
│    Leaking: NO (VideoDetailFragment↓ is not leaking)
│    Anonymous subclass of android.database.ContentObserver
│    ↓ VideoDetailFragment$1.this$0
├─ org.schabi.newpipe.fragments.detail.VideoDetailFragment instance
│    Leaking: NO (MainFragment↓ is not leaking and Fragment#mFragmentManager is
│    not null)
│    activity instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ VideoDetailFragment.mFragmentManager
├─ androidx.fragment.app.FragmentManagerImpl instance
│    Leaking: NO (MainFragment↓ is not leaking)
│    ↓ FragmentManagerImpl.mFragmentStore
├─ androidx.fragment.app.FragmentStore instance
│    Leaking: NO (MainFragment↓ is not leaking)
│    ↓ FragmentStore.mActive
├─ java.util.HashMap instance
│    Leaking: NO (MainFragment↓ is not leaking)
│    ↓ HashMap.table
├─ java.util.HashMap$Node[] array
│    Leaking: NO (MainFragment↓ is not leaking)
│    ↓ HashMap$Node[].[1]
├─ java.util.HashMap$Node instance
│    Leaking: NO (MainFragment↓ is not leaking)
│    ↓ HashMap$Node.value
├─ androidx.fragment.app.FragmentStateManager instance
│    Leaking: NO (MainFragment↓ is not leaking)
│    ↓ FragmentStateManager.mFragment
├─ org.schabi.newpipe.fragments.MainFragment instance
│    Leaking: NO (Fragment#mFragmentManager is not null)
│    activity instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ MainFragment.pagerAdapter
│                   ~~~~~~~~~~~~
├─ org.schabi.newpipe.fragments.MainFragment$SelectedTabsPagerAdapter instance
│    Leaking: UNKNOWN
│    Retaining 100496 bytes in 2035 objects
│    context instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│    ↓ MainFragment$SelectedTabsPagerAdapter.mObservable
│                                            ~~~~~~~~~~~
├─ android.database.DataSetObservable instance
│    Leaking: UNKNOWN
│    Retaining 100328 bytes in 2029 objects
│    ↓ DataSetObservable.mObservers
│                        ~~~~~~~~~~
├─ java.util.ArrayList instance
│    Leaking: UNKNOWN
│    Retaining 100316 bytes in 2028 objects
│    ↓ ArrayList.elementData
│                ~~~~~~~~~~~
├─ java.lang.Object[] array
│    Leaking: UNKNOWN
│    Retaining 100296 bytes in 2027 objects
│    ↓ Object[].[0]
│               ~~~
├─ com.google.android.material.tabs.TabLayout$PagerAdapterObserver instance
│    Leaking: UNKNOWN
│    Retaining 33962 bytes in 684 objects
│    ↓ TabLayout$PagerAdapterObserver.this$0
│                                     ~~~~~~
├─ org.schabi.newpipe.views.ScrollableTabLayout instance
│    Leaking: UNKNOWN
│    Retaining 33950 bytes in 683 objects
│    View not part of a window view hierarchy
│    View.mAttachInfo is null (view detached)
│    View.mID = R.id.main_tab_layout
│    View.mWindowAttachCount = 1
│    mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ 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))
​     Retaining 2723 bytes in 70 objects
​     key = 03563b3f-3acb-4dd3-81d4-fbf494ad0685
​     watchDurationMillis = 648202
​     retainedDurationMillis = 638201
​     View not part of a window view hierarchy
​     View.mAttachInfo is null (view detached)
​     View.mWindowAttachCount = 1
​     mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
​     false

4573 bytes retained by leaking objects
Signature: e94c1e897038acb8f6a52161df3e9d4993eb6c45
┬───
│ GC Root: Global variable in native code
│
├─ android.view.contentcapture.
│  MainContentCaptureSession$$ExternalSyntheticLambda0 instance
│    Leaking: NO (MainActivity↓ is not leaking)
│    ↓ MainContentCaptureSession$$ExternalSyntheticLambda0.f$0
├─ android.view.contentcapture.MainContentCaptureSession instance
│    Leaking: NO (MainActivity↓ is not leaking)
│    mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ MainContentCaptureSession.mContext
├─ org.schabi.newpipe.MainActivity instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking and Activity#mDestroyed
│    is false)
│    mApplication instance of org.schabi.newpipe.DebugApp
│    mBase instance of androidx.appcompat.view.ContextThemeWrapper, not
│    wrapping known Android context
│    ↓ MainActivity.mActivityResultRegistry
├─ androidx.activity.ComponentActivity$2 instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    Anonymous subclass of androidx.activity.result.ActivityResultRegistry
│    this$0 instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│    ↓ ComponentActivity$2.mKeyToCallback
├─ java.util.HashMap instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    ↓ HashMap.table
├─ java.util.HashMap$Node[] array
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    ↓ HashMap$Node[].[0]
├─ java.util.HashMap$Node instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    ↓ HashMap$Node.value
├─ androidx.activity.result.ActivityResultRegistry$CallbackAndContract instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    ↓ ActivityResultRegistry$CallbackAndContract.mCallback
├─ androidx.fragment.app.FragmentManager$10 instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    Anonymous class implementing androidx.activity.result.
│    ActivityResultCallback
│    ↓ FragmentManager$10.this$0
├─ androidx.fragment.app.FragmentManagerImpl instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    ↓ FragmentManagerImpl.mParent
├─ org.schabi.newpipe.local.subscription.SubscriptionFragment instance
│    Leaking: NO (Fragment#mFragmentManager is not null)
│    activity instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ SubscriptionFragment._binding
│                           ~~~~~~~~
├─ org.schabi.newpipe.databinding.FragmentSubscriptionBinding instance
│    Leaking: UNKNOWN
│    Retaining 68 bytes in 3 objects
│    ↓ FragmentSubscriptionBinding.rootView
│                                  ~~~~~~~~
╰→ 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))
​     Retaining 4573 bytes in 102 objects
​     key = 24cf5b5f-24dc-46e4-81a3-db66f33de290
​     watchDurationMillis = 509727
​     retainedDurationMillis = 499689
​     View not part of a window view hierarchy
​     View.mAttachInfo is null (view detached)
​     View.mWindowAttachCount = 1
​     mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
​     false

96136 bytes retained by leaking objects
Displaying only 1 leak trace out of 3 with the same signature
Signature: 758c83e8d6038ef40c865b5a71b252f19439a34
┬───
│ GC Root: Global variable in native code
│
├─ android.view.contentcapture.
│  MainContentCaptureSession$$ExternalSyntheticLambda0 instance
│    Leaking: NO (MainActivity↓ is not leaking)
│    ↓ MainContentCaptureSession$$ExternalSyntheticLambda0.f$0
├─ android.view.contentcapture.MainContentCaptureSession instance
│    Leaking: NO (MainActivity↓ is not leaking)
│    mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ MainContentCaptureSession.mContext
├─ org.schabi.newpipe.MainActivity instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking and Activity#mDestroyed
│    is false)
│    mApplication instance of org.schabi.newpipe.DebugApp
│    mBase instance of androidx.appcompat.view.ContextThemeWrapper, not
│    wrapping known Android context
│    ↓ MainActivity.mActivityResultRegistry
├─ androidx.activity.ComponentActivity$2 instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    Anonymous subclass of androidx.activity.result.ActivityResultRegistry
│    this$0 instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│    ↓ ComponentActivity$2.mKeyToCallback
├─ java.util.HashMap instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    ↓ HashMap.table
├─ java.util.HashMap$Node[] array
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    ↓ HashMap$Node[].[0]
├─ java.util.HashMap$Node instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    ↓ HashMap$Node.value
├─ androidx.activity.result.ActivityResultRegistry$CallbackAndContract instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    ↓ ActivityResultRegistry$CallbackAndContract.mCallback
├─ androidx.fragment.app.FragmentManager$10 instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    Anonymous class implementing androidx.activity.result.
│    ActivityResultCallback
│    ↓ FragmentManager$10.this$0
├─ androidx.fragment.app.FragmentManagerImpl instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    ↓ FragmentManagerImpl.mParent
├─ org.schabi.newpipe.local.subscription.SubscriptionFragment instance
│    Leaking: NO (Fragment#mFragmentManager is not null)
│    activity instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ SubscriptionFragment.groupAdapter
│                           ~~~~~~~~~~~~
├─ com.xwray.groupie.GroupAdapter instance
│    Leaking: UNKNOWN
│    Retaining 252 bytes in 11 objects
│    ↓ GroupAdapter.mObservable
│                   ~~~~~~~~~~~
├─ androidx.recyclerview.widget.RecyclerView$AdapterDataObservable instance
│    Leaking: UNKNOWN
│    Retaining 108 bytes in 6 objects
│    ↓ RecyclerView$AdapterDataObservable.mObservers
│                                         ~~~~~~~~~~
├─ java.util.ArrayList instance
│    Leaking: UNKNOWN
│    Retaining 96 bytes in 5 objects
│    ↓ ArrayList.elementData
│                ~~~~~~~~~~~
├─ java.lang.Object[] array
│    Leaking: UNKNOWN
│    Retaining 76 bytes in 4 objects
│    ↓ Object[].[0]
│               ~~~
├─ androidx.recyclerview.widget.RecyclerView$RecyclerViewDataObserver instance
│    Leaking: UNKNOWN
│    Retaining 12 bytes in 1 objects
│    ↓ RecyclerView$RecyclerViewDataObserver.this$0
│                                            ~~~~~~
├─ androidx.recyclerview.widget.RecyclerView instance
│    Leaking: UNKNOWN
│    Retaining 2194738 bytes in 1707 objects
│    View not part of a window view hierarchy
│    View.mAttachInfo is null (view detached)
│    View.mID = R.id.items_list
│    View.mWindowAttachCount = 1
│    mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ 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))
​     Retaining 32016 bytes in 668 objects
​     key = 9fcde48c-bc32-4066-98de-1adadea60ce4
​     watchDurationMillis = 648202
​     retainedDurationMillis = 638201
​     View not part of a window view hierarchy
​     View.mAttachInfo is null (view detached)
​     View.mWindowAttachCount = 1
​     mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
​     false

4915 bytes retained by leaking objects
Signature: 5fe849ce30a038be8ff2a51c1ecace8b7d8a6
┬───
│ GC Root: Global variable in native code
│
├─ android.view.contentcapture.
│  MainContentCaptureSession$$ExternalSyntheticLambda0 instance
│    Leaking: NO (MainActivity↓ is not leaking)
│    ↓ MainContentCaptureSession$$ExternalSyntheticLambda0.f$0
├─ android.view.contentcapture.MainContentCaptureSession instance
│    Leaking: NO (MainActivity↓ is not leaking)
│    mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ MainContentCaptureSession.mContext
├─ org.schabi.newpipe.MainActivity instance
│    Leaking: NO (DefaultKioskFragment↓ is not leaking and Activity#mDestroyed
│    is false)
│    mApplication instance of org.schabi.newpipe.DebugApp
│    mBase instance of androidx.appcompat.view.ContextThemeWrapper, not
│    wrapping known Android context
│    ↓ MainActivity.mActivityResultRegistry
├─ androidx.activity.ComponentActivity$2 instance
│    Leaking: NO (DefaultKioskFragment↓ is not leaking)
│    Anonymous subclass of androidx.activity.result.ActivityResultRegistry
│    this$0 instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│    ↓ ComponentActivity$2.mKeyToCallback
├─ java.util.HashMap instance
│    Leaking: NO (DefaultKioskFragment↓ is not leaking)
│    ↓ HashMap.table
├─ java.util.HashMap$Node[] array
│    Leaking: NO (DefaultKioskFragment↓ is not leaking)
│    ↓ HashMap$Node[].[7]
├─ java.util.HashMap$Node instance
│    Leaking: NO (DefaultKioskFragment↓ is not leaking)
│    ↓ HashMap$Node.value
├─ androidx.activity.result.ActivityResultRegistry$CallbackAndContract instance
│    Leaking: NO (DefaultKioskFragment↓ is not leaking)
│    ↓ ActivityResultRegistry$CallbackAndContract.mCallback
├─ androidx.fragment.app.FragmentManager$11 instance
│    Leaking: NO (DefaultKioskFragment↓ is not leaking)
│    Anonymous class implementing androidx.activity.result.
│    ActivityResultCallback
│    ↓ FragmentManager$11.this$0
├─ androidx.fragment.app.FragmentManagerImpl instance
│    Leaking: NO (DefaultKioskFragment↓ is not leaking)
│    ↓ FragmentManagerImpl.mParent
├─ org.schabi.newpipe.fragments.list.kiosk.DefaultKioskFragment instance
│    Leaking: NO (Fragment#mFragmentManager is not null)
│    activity instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ DefaultKioskFragment.emptyStateView
│                           ~~~~~~~~~~~~~~
├─ android.widget.LinearLayout instance
│    Leaking: UNKNOWN
│    Retaining 4381 bytes in 44 objects
│    View not part of a window view hierarchy
│    View.mAttachInfo is null (view detached)
│    View.mID = R.id.empty_state_view
│    View.mWindowAttachCount = 1
│    mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ LinearLayout.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))
​     Retaining 4915 bytes in 112 objects
​     key = a43ef9a4-1d33-498b-937c-bf861462e2ff
​     watchDurationMillis = 509727
​     retainedDurationMillis = 499689
​     View not part of a window view hierarchy
​     View.mAttachInfo is null (view detached)
​     View.mWindowAttachCount = 1
​     mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
​     false

113710 bytes retained by leaking objects
Displaying only 1 leak trace out of 3 with the same signature
Signature: aebd5c76cde34df8e97975e2ef58fd3f1ea9a4
┬───
│ GC Root: Global variable in native code
│
├─ android.view.contentcapture.
│  MainContentCaptureSession$$ExternalSyntheticLambda0 instance
│    Leaking: NO (MainActivity↓ is not leaking)
│    ↓ MainContentCaptureSession$$ExternalSyntheticLambda0.f$0
├─ android.view.contentcapture.MainContentCaptureSession instance
│    Leaking: NO (MainActivity↓ is not leaking)
│    mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ MainContentCaptureSession.mContext
├─ org.schabi.newpipe.MainActivity instance
│    Leaking: NO (DefaultKioskFragment↓ is not leaking and Activity#mDestroyed
│    is false)
│    mApplication instance of org.schabi.newpipe.DebugApp
│    mBase instance of androidx.appcompat.view.ContextThemeWrapper, not
│    wrapping known Android context
│    ↓ MainActivity.mActivityResultRegistry
├─ androidx.activity.ComponentActivity$2 instance
│    Leaking: NO (DefaultKioskFragment↓ is not leaking)
│    Anonymous subclass of androidx.activity.result.ActivityResultRegistry
│    this$0 instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│    ↓ ComponentActivity$2.mKeyToCallback
├─ java.util.HashMap instance
│    Leaking: NO (DefaultKioskFragment↓ is not leaking)
│    ↓ HashMap.table
├─ java.util.HashMap$Node[] array
│    Leaking: NO (DefaultKioskFragment↓ is not leaking)
│    ↓ HashMap$Node[].[7]
├─ java.util.HashMap$Node instance
│    Leaking: NO (DefaultKioskFragment↓ is not leaking)
│    ↓ HashMap$Node.value
├─ androidx.activity.result.ActivityResultRegistry$CallbackAndContract instance
│    Leaking: NO (DefaultKioskFragment↓ is not leaking)
│    ↓ ActivityResultRegistry$CallbackAndContract.mCallback
├─ androidx.fragment.app.FragmentManager$11 instance
│    Leaking: NO (DefaultKioskFragment↓ is not leaking)
│    Anonymous class implementing androidx.activity.result.
│    ActivityResultCallback
│    ↓ FragmentManager$11.this$0
├─ androidx.fragment.app.FragmentManagerImpl instance
│    Leaking: NO (DefaultKioskFragment↓ is not leaking)
│    ↓ FragmentManagerImpl.mParent
├─ org.schabi.newpipe.fragments.list.kiosk.DefaultKioskFragment instance
│    Leaking: NO (Fragment#mFragmentManager is not null)
│    activity instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ DefaultKioskFragment.infoListAdapter
│                           ~~~~~~~~~~~~~~~
├─ org.schabi.newpipe.info_list.InfoListAdapter instance
│    Leaking: UNKNOWN
│    Retaining 1839968 bytes in 31984 objects
│    ↓ InfoListAdapter.mObservable
│                      ~~~~~~~~~~~
├─ androidx.recyclerview.widget.RecyclerView$AdapterDataObservable instance
│    Leaking: UNKNOWN
│    Retaining 1839468 bytes in 31980 objects
│    ↓ RecyclerView$AdapterDataObservable.mObservers
│                                         ~~~~~~~~~~
├─ java.util.ArrayList instance
│    Leaking: UNKNOWN
│    Retaining 1839456 bytes in 31979 objects
│    ↓ ArrayList.elementData
│                ~~~~~~~~~~~
├─ java.lang.Object[] array
│    Leaking: UNKNOWN
│    Retaining 1839436 bytes in 31978 objects
│    ↓ Object[].[0]
│               ~~~
├─ androidx.recyclerview.widget.RecyclerView$RecyclerViewDataObserver instance
│    Leaking: UNKNOWN
│    Retaining 637306 bytes in 10921 objects
│    ↓ RecyclerView$RecyclerViewDataObserver.this$0
│                                            ~~~~~~
├─ org.schabi.newpipe.views.NewPipeRecyclerView instance
│    Leaking: UNKNOWN
│    Retaining 637294 bytes in 10920 objects
│    View not part of a window view hierarchy
│    View.mAttachInfo is null (view detached)
│    View.mID = R.id.items_list
│    View.mWindowAttachCount = 1
│    mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ 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))
​     Retaining 42812 bytes in 976 objects
​     key = f70c010a-65ea-4026-b884-4fa11c979dda
​     watchDurationMillis = 648203
​     retainedDurationMillis = 638201
​     View not part of a window view hierarchy
​     View.mAttachInfo is null (view detached)
​     View.mWindowAttachCount = 1
​     mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
​     false

10252 bytes retained by leaking objects
Signature: ffd68db09531a40e5a1f380bd7d4694ac1d24a
┬───
│ GC Root: Global variable in native code
│
├─ android.view.contentcapture.
│  MainContentCaptureSession$$ExternalSyntheticLambda0 instance
│    Leaking: NO (MainActivity↓ is not leaking)
│    ↓ MainContentCaptureSession$$ExternalSyntheticLambda0.f$0
├─ android.view.contentcapture.MainContentCaptureSession instance
│    Leaking: NO (MainActivity↓ is not leaking)
│    mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ MainContentCaptureSession.mContext
├─ org.schabi.newpipe.MainActivity instance
│    Leaking: NO (BookmarkFragment↓ is not leaking and Activity#mDestroyed is
│    false)
│    mApplication instance of org.schabi.newpipe.DebugApp
│    mBase instance of androidx.appcompat.view.ContextThemeWrapper, not
│    wrapping known Android context
│    ↓ MainActivity.mActivityResultRegistry
├─ androidx.activity.ComponentActivity$2 instance
│    Leaking: NO (BookmarkFragment↓ is not leaking)
│    Anonymous subclass of androidx.activity.result.ActivityResultRegistry
│    this$0 instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│    ↓ ComponentActivity$2.mKeyToCallback
├─ java.util.HashMap instance
│    Leaking: NO (BookmarkFragment↓ is not leaking)
│    ↓ HashMap.table
├─ java.util.HashMap$Node[] array
│    Leaking: NO (BookmarkFragment↓ is not leaking)
│    ↓ HashMap$Node[].[11]
├─ java.util.HashMap$Node instance
│    Leaking: NO (BookmarkFragment↓ is not leaking)
│    ↓ HashMap$Node.value
├─ androidx.activity.result.ActivityResultRegistry$CallbackAndContract instance
│    Leaking: NO (BookmarkFragment↓ is not leaking)
│    ↓ ActivityResultRegistry$CallbackAndContract.mCallback
├─ androidx.fragment.app.FragmentManager$10 instance
│    Leaking: NO (BookmarkFragment↓ is not leaking)
│    Anonymous class implementing androidx.activity.result.
│    ActivityResultCallback
│    ↓ FragmentManager$10.this$0
├─ androidx.fragment.app.FragmentManagerImpl instance
│    Leaking: NO (BookmarkFragment↓ is not leaking)
│    ↓ FragmentManagerImpl.mParent
├─ org.schabi.newpipe.local.bookmark.BookmarkFragment instance
│    Leaking: NO (Fragment#mFragmentManager is not null)
│    activity instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ BookmarkFragment.emptyStateView
│                       ~~~~~~~~~~~~~~
├─ android.widget.LinearLayout instance
│    Leaking: UNKNOWN
│    Retaining 5585 bytes in 67 objects
│    View not part of a window view hierarchy
│    View.mAttachInfo is null (view detached)
│    View.mID = R.id.empty_state_view
│    View.mWindowAttachCount = 1
│    mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ LinearLayout.mParent
│                   ~~~~~~~
╰→ android.widget.RelativeLayout instance
​     Leaking: YES (ObjectWatcher was watching this because org.schabi.newpipe.
​     local.bookmark.BookmarkFragment received Fragment#onDestroyView()
​     callback (references to its views should be cleared to prevent leaks))
​     Retaining 10252 bytes in 246 objects
​     key = 06455e69-de56-42ff-a462-0fed7a8e2a07
​     watchDurationMillis = 509725
​     retainedDurationMillis = 499689
​     View not part of a window view hierarchy
​     View.mAttachInfo is null (view detached)
​     View.mWindowAttachCount = 1
​     mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
​     false
====================================
0 LIBRARY LEAKS

A Library Leak is a leak caused by a known bug in 3rd party code that you do
not have control over.
See https://square.github.
io/leakcanary/fundamentals-how-leakcanary-works/#4-categorizing-leaks
====================================
METADATA

Please include this in bug reports and Stack Overflow questions.

Build.VERSION.SDK_INT: 32
Build.MANUFACTURER: Google
LeakCanary version: 2.5
App process name: org.schabi.newpipe.debug.ytmoreparamsinnertuberequests
Stats: LruCache[maxSize=3000,hits=10568,misses=227753,hitRate=4%]
RandomAccess[bytes=12341415,reads=227753,travel=142651198782,range=43823468,size
=53675228]
Analysis duration: 6099 ms
Heap dump file path: /storage/emulated/0/Download/leakcanary-org.schabi.newpipe.
debug.ytmoreparamsinnertuberequests/2022-04-02_14-09-58_302.hprof
Heap dump timestamp: 1648923006790
Heap dump duration: 2025 ms
====================================>
opusforlife2 commented 2 years ago

Works. 👍 Now comedians can swear again.

oddtoddy commented 2 years ago

Can also confirm this is working now.

jok3rsgr1n commented 2 years ago

Works !

WesleyTRV commented 2 years ago

Please test this APK: app-debug.zip

Thought it was gonna be a virus or scam but it works! Thanks!

AudricV commented 2 years ago

No, it's not at all, I compiled it myself from sources I published that you can find here:

https://github.com/TiA4f8R/NewPipe/tree/yt-more-params-innertube-requests https://github.com/TiA4f8R/NewPipeExtractor/tree/yt-more-params-innertube-requests (corresponding PR: TeamNewPipe/NewPipeExtractor#780)

Only extractor changes are needed to fix the extraction (the app changes only change the extractor used).

Minibus93 commented 2 years ago

Is there any ETA about the merge of the changes of TiA4f8R?

His apk fixed the issue.