I would quibble with that. It's really all or nothing. Youtube changes something, NewPipe breaks entirely. Then NewPipe is updated, and it works perfectly again.
I like NewPipe, but in practice this means you just have to accept that there will be stretches, a few days or a week long, where it just doesn't work at all.
Unless you're talking aboit videos that had stereo audio that have been converted to mono. (;
I know what you're talking about since I have experienced it before, but I have not encountered the problem often in the past year or so. Perhaps you were just using it during a dry spell from the NewPipe developers or F-Droid. A number of useful features have been added during the past year, such as the ability to view live streams. A few quirks also exist, such as feeds displaying videos that are posted in the future.
As for the recommendation engine, I prefer gaming it. NewPipe is wonderful because it does not feed it. I have a special profiles setup on my desktop for when I want to feed it. This approach works wonderfully for discovering new channels, allows for multiple profiles to get recommendations for different viewing interests, avoids polluting recommendations based upon a single odd-ball view, and allows finer grained control over the information that I feed Google.
Since updating manually (in f-droid) i have been a happy camper.
{"user_action":"requested stream","request":"https://www.youtube.com/watch?v=lRdkI09KCpk","content_language":"en_US","service":"YouTube","package":"org.schabi.newpipe","version":"0.19.3","os":"Linux Android 8.0.0 - 26","time":"2020-07-18 05:29","exceptions":["org.schabi.newpipe.extractor.stream.StreamInfo$StreamExtractException: Could not get any stream. See error variable to get further details.\n\tat org.schabi.newpipe.extractor.stream.StreamInfo.extractStreams(StreamInfo.java:192)\n\tat org.schabi.newpipe.extractor.stream.StreamInfo.getInfo(StreamInfo.java:70)\n\tat org.schabi.newpipe.extractor.stream.StreamInfo.getInfo(StreamInfo.java:62)\n\tat org.schabi.newpipe.util.ExtractorHelper.lambda$getStreamInfo$3(ExtractorHelper.java:116)\n\tat org.schabi.newpipe.util.-$$Lambda$ExtractorHelper$5fJcha6Sq5APJBLdG6osaJby-mc.call(Unknown Source:4)\n\tat io.reactivex.internal.operators.single.SingleFromCallable.subscribeActual(SingleFromCallable.java:44)\n\tat io.reactivex.Single.subscribe(Single.java:3438)\n\tat io.reactivex.internal.operators.single.SingleDoOnSuccess.subscribeActual(SingleDoOnSuccess.java:35)\n\tat io.reactivex.Single.subscribe(Single.java:3438)\n\tat io.reactivex.internal.operators.maybe.MaybeFromSingle.subscribeActual(MaybeFromSingle.java:41)\n\tat io.reactivex.Maybe.subscribe(Maybe.java:4154)\n\tat io.reactivex.internal.operators.maybe.MaybeConcatArray$ConcatMaybeObserver.drain(MaybeConcatArray.java:153)\n\tat io.reactivex.internal.operators.maybe.MaybeConcatArray$ConcatMaybeObserver.request(MaybeConcatArray.java:78)\n\tat io.reactivex.internal.operators.flowable.FlowableElementAtMaybe$ElementAtSubscriber.onSubscribe(FlowableElementAtMaybe.java:66)\n\tat io.reactivex.internal.operators.maybe.MaybeConcatArray.subscribeActual(MaybeConcatArray.java:42)\n\tat io.reactivex.Flowable.subscribe(Flowable.java:14479)\n\tat io.reactivex.internal.operators.flowable.FlowableElementAtMaybe.subscribeActual(FlowableElementAtMaybe.java:36)\n\tat io.reactivex.Maybe.subscribe(Maybe.java:4154)\n\tat io.reactivex.internal.operators.maybe.MaybeToSingle.subscribeActual(MaybeToSingle.java:46)\n\tat io.reactivex.Single.subscribe(Single.java:3438)\n\tat io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)\n\tat io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:578)\n\tat io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)\n\tat io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)\n\tat java.util.concurrent.FutureTask.run(FutureTask.java:266)\n\tat java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)\n\tat java.lang.Thread.run(Thread.java:764)\n"],"user_comment":""}
And this isn't on anything hard or new. It's a London Underground technical video.You need to install from the github repository. Youtube changes interface every once in a while, this is really isnt any app's fault, but youtube's. Same thing happens to youtube-dl all the time.
If the app crashes with a Java stack backtrace, it's the app's fault.
Due to Fdroid being so slow at updating indexes on my older devices, I actually use a secondary Fdroid client (nethunter client also has a privileged extension) for manual updates, which only has my personal repos enabled.
Also, suggestion capabilities of Youtube are very high. I'll always be coming back for that until there is an alternative. Unfortunately, that also means that using non-official players is counterproductive (I want to feed the recommendation engine).