NewPipe 0.27.6 released, state of the rewrite, state of the team

post image

TLDR: NewPipe 0.27.6 fixes the YouTube issues by performing the integrity checks now required by Google; NewPipe is being refactored heavily on the refactor branch and you can help and provide feedback on a nightly version; NewPipe will soon have a new completely rewritten player; the NewPipe team is struggling to keep up with the project’s demands due to dwindling free time of its members.

Hello everyone,

This blog has been pretty quiet in the last few months, but many things happened in the NewPipe project: the YouTube service implementation had to be fixed a few times with complicated patches, and in the meantime NewPipe was being rewritten in many parts. We are sincerely sorry about the lack of communication, and this post is meant to address the aforementioned points and explain the significant hindrances the NewPipe team is currently facing.

Note: this post is quite long, but we assure you, it’s also full of information about the State of the Pipe! It’s split in 4 sections: Team issues, The refactor (take look at the nice screenshots!), Release 0.27.6 and YouTube shenanigans.

Team issues

First of all, let’s talk about the state of the team, which heavily influences all of the other issues. So what is happening? All active team members are really busy with their lives and can only find very little time (if at all) to work on NewPipe projects. This means that development is going really slow and there is no workforce to handle big changes, and so lately only small and easy-to-review fixes were merged.

It has been difficult to acquire new team members in the last few years (probably) due to the complexity of the codebase, which makes it hard for a newbie to make a good Pull Request (PR), and also makes it hard for team members to provide clear instructions in reviews. More often than not, the maintainers end up polishing and completing PRs opened by external contributors, because even the maintainers themselves don’t know what needs to be done before trying out some stuff on their own.

In mid 2023 we acknowledged that the codebase’s complexity was getting in the way. We thus decided to focus on rewriting the badly written components (see The refactor below), but first we wanted to merge all remaining big PRs, which otherwise would have grown incompatible with the new codebase. We finished doing so in mid 2024 after completing support for channel tabs, comment replies, image quality selection, bookmark ordering and multiple audio tracks. Unfortunately we had to drop the search sorting/filters PR, because the proposed changes in NewPipeExtractor did not fit in well with the existing code structure. 0.27.0 was the last release to add significant new features, and we only focused on the rewrite from then on, except for bugfix releases.

In late 2024 and 2025 the NewPipe e.V. hired two contributors (first Schabi, then Profpatsch) to work on the rewrite, so fortunately they have been able to keep some gears turning. Despite this, we still need new contributors to get the engine back to full speed, and we especially need new team members that review PRs and are knowledgeable about which requirements need to be met before approving a PR.

Many PRs opened on the NewPipe repository share a common challenge: while authors often provide a Proof-of-Concept that demonstrates the idea effectively, refining all details to finally merge the PR requires much more effort, which often falls on the maintainers. The necessary steps to make a PR ready might include making the UI nice and responsive to screen size, thinking about the user’s usecases and seeing if they are fulfilled, ensuring the code is well structured and complies with Android best practices, adding comments and documentation, testing the changes on various devices with various usage patterns.

The team is also lacking some triaging manpower to handle all of the issues and discussions that are opened on the repository. Despite this it is usually easy to identify new issues/regressions or pressing problems thanks to the active community, but it is much harder to distinguish old tickets that are useful from the niche ones.

I want to end this paragraph with a call-to-action: if you have some time and want to help, feel free to get in touch with us on the Matrix channel and ask us for something to work on, and we will give you indications. When opening a Pull Request, make sure your proposal is not just a Proof-of-Concept, but provide the best code you can write and highlight the areas that need more work, so the team can review and merge the PR fast. If you want to learn modern Android development (Kotlin, Jetpack Compose, Hilt and other modern practices), working on the NewPipe rewrite might be a good opportunity for you, and the team members will be able to provide you with good guidance.

With this said, we want to deeply thank all of the contributors that opened a PR, fixed a bug, proposed a design, helped triaging an issue, … You are clearly the best!

Bonus note: the NewPipe e.V. ships merch to active contributors and organizes in-person meetups (like at FOSDEM two weeks ago) 😉

The refactor

As explained above, in mid 2024 we finally started working on the awaited refactor. For reference, the original announcement is here, the project board with the issues to tackle is here. We chose a mix between just refactoring (when the current code is already good enough) and fully rewriting (for UI components and for the player). The refactor is currently happening on the refactor branch of the NewPipe repository, so that the dev branch can still be used for hotfix releases and maintenance bugfixes. The following points explain our efforts and objectives, along with screenshots and a video.

Rewriting the player

A showcase of the NewPlayer test app

As explained in this previous blogpost, NewPipe’s current player is buggy and mis-structured. Schabi was contracted to rewrite it from scratch by the NewPipe e.V., and he delivered a great implementation in October 2024. The new player (or rather, NewPlayer) uses media3 for playback (a successor of ExoPlayer), and was built in a separate repository to ensure separation of concerns and so that other apps can possibly use it too. You can read Schabi’s announcement here, find the source code here and download a test APK from here. Now the e.V. signed a contract with Profpatsch, who picked up Schabi’s work and is integrating NewPlayer into NewPipe. Let’s wish them and us a lot of success with their work!

If you have experience with media3, ExoPlayer or media apps on Android, we’d love to get some feedback from you on the architecture and lifecycle 😌

Migrating to modern libraries

NewPipe’s codebase dates back to 2015, when the Android library landscape was a lot different. New architectural patterns, new good practices, new programming languages and new libraries have emerged since then, and we want to benefit from them in the refactored codebase:

  • NewPipe is still a mix of Java and Kotlin, and we would like to complete the move to Kotlin. This means making use of Kotlin’s language features, like nullability checks, but also switching from RxJava to the built-in coroutines.
  • We want to migrate every UI component to Jetpack Compose, a UI toolkit which employs a declarative approach as opposed to the default Android XML-based imperative approach. It makes development significantly faster and less error-prone, since it allows writing UI components directly in Kotlin and favours having a single source of truth for the app’s state.
  • We want to embrace the Model-View-ViewModel architectural pattern (the standard one for Android apps).
  • We want to use Hilt for dependency injection, use DataStore instead of SharedPreferences, modernize the build system, …

Redesigning the UI (in Material 3)

While migrating the UI to Jetpack Compose, we want to take the opportunity to redesign the most used UI components and make sure they are easy to understand, convenient to use, powerful, and nice to see. We also wish to adopt Material 3.

Users often ask for new features, and when they are told that those features would be in the way of the average user, they ask for settings toggles to tune the app’s behavior. While having customizability is good, too much of it is almost equivalent to not having it at all: If there are pages upon pages of settings, would you really go through and try what each of them does? Moreover, more settings implies more possible configurations, which implies more code to maintain, which implies more bugs.

The redesigned bottom-sheet long-press menu

Therefore it is important to make sure that app designs are intuitive enough for the average user, but also provide advanced features for power users without introducing too many settings. An example of our efforts to achieve this goal is the redesigned long-press menu, which will be used when you long press on videos, playlists and channels. It is still in the works and the final design might change, so feel free to provide feedback in our Matrix channel or in the Pull Request.

How to test the current progress

Although NewPlayer and the long press menu still need some work, plenty of other stuff is already complete (see below) and you can test it by downloading nightly APKs from here. @litetex also conveniently setup an unofficial F-Droid repository that ships both the normal nightly and the refactored nightly versions, see here.

Completed migrations and screenshots

The rewritten related items section

The first component to be migrated to Jetpack Compose and Material 3 was the related items section, thanks to @Isira-Seneviratne. Isira’s Pull Request also included some general code that handles lists and that will be used by all NewPipe lists as the refactor progresses. If you want to chip in on this foundational code, take a look at the comments at the bottom of the PR.

@Isira-Seneviratne also provided the initial implementation for the migrated comment section, which @Stypox took up and redesigned, thanks to both! You can easily contribute by fixing a few leftover bugs highlighted in the comments at the bottom of the PR.
Finally comment replies behave normally!

The revamped comment section with replies shown in a bottom-sheet dialog

@Isira-Seneviratne and @Stypox worked (again) together on the reimplementation of the About screen (that’s the most useful part of the app, right?). In particular they made use of the AboutLibraries Gradle plugin which automatically compiles information on the dependencies which can be accessed at run time. This saves the developers from having to hardcode these details about the libraries used in NewPipe.

The improved about screen with an autocompiled set of dependencies

@Profpatsch migrated the empty screens with sad faces that appear in various places of the app. Thank you for this change that moves the app one step closer to Jetpack Compose!

Look how cute the new kaomojis are!

Onto the under-the-hood changes, @snaik20 introduced Jetpack Compose in the app and set up the initial theming support. @JL0000 moved dependency declarations from Gradle scripts to version catalogs, making dependency management easier. @Isira-Seneviratne changed the image loading library from Picasso to Coil 3, which has better support for the Compose environment.

Thank you to everyone who contributed, with big or small changes! As you can tell also by looking at the GitHub Project, there is plenty of stuff to choose from if you wish to contribute 😊 (though make sure to get in touch with the team before starting to work).

Release 0.27.6

Here are the major changes to YouTube that were shipped in v0.27.6:

  • We fixed loading stream details for YouTube videos, which appeared as “iOS player response is not valid”, by using the web client instead of the iOS one.
  • We fixed 403 HTTP errors for streams on YouTube after ≈1 minute of playback. To do so, we are now running YouTube’s code to pass the integrity checks of the desktop website. This requires an Android WebView installed and enabled on your device. In case the WebView is unable to run YouTube’s code for whatever reason, we fallback to other methods that may be affected by 403 HTTP issues after many requests. We therefore recommend you to use to an up-to-date WebView on your system. Note that you should be able to change the WebView in Android’s developer options to one other than the preinstalled one, which may be useful if your device is outdated.

Other important changes:

  • @neosis91 fixed a bug where we weren’t closing resources of HTTP requests the extractor makes, causing potential memory leaks
  • @Stypox fixed fetching stream info twice when loading a video details page after a fresh app start
  • @theScrabi added a donate button on the drawer redirecting to the newpipe.net’s donation page, which was also enhanced
  • @AudricV made the extractor not try to obtain the URLs of DRM-protected streams on Soundcloud tracks, which saves some bandwidth on licensed songs from major music companies; the regular formats are still here, at least for now
  • @Thompson3142 fixed captions size not being adapted according to the system settings
  • @AudricV switched the fallback method for age-restricted YouTube videos to embeds. Only very few age-restricted videos can be played in embeds, e.g. game trailers. Unless there is a new workaround/bypass found, other age-restricted videos can be only played with a YouTube age-verified account.
  • on YouTube, 720p video streams with a framerate in the range 24~30 are now available again when videos have a framerate higher than 30 (e.g. 60 fps)
  • unfortunately livestreams can now only be rewinded up to 30 seconds (see why in the explanation below). Ability to rewind up to 4 hours is expected to be provided in a future release.

YouTube shenanigans (aka why NewPipe broke twice)

Since several users asked why NewPipe broke twice very recently, here is a basic explaination (to learn even more, please look at the code changes).

How NewPipe’s extractor works

NewPipe uses an extractor that fetches content from services. As described in the app README:

NewPipe works by fetching the required data from the official API (e.g. PeerTube) of the service you’re using. If the official API is restricted (e.g. YouTube) for our purposes, or is proprietary, the app parses the website or uses an internal API instead. This means that you don’t need an account on any service to use NewPipe.

So for YouTube, NewPipe’s extractor is a scraper. As you may believe, an internal API or a website can always change at any time, which is why we need to adapt the extractor to services changes.

Breaking change 1: 403 HTTP issues (fixed in 0.27.6)

The extractor spoofs YouTube clients to get streams. As YouTube requires integrity tokens on the browser and on some devices, we used to spoof to clients for which integrity checks were not yet in place. The iOS client was one of them, but it isn’t the case anymore: a roll out is in progress.

Without valid integrity tokens, obtained after passing integrity checks, you cannot download/play videos for long timespans (if at all). Therefore we switched to the web (i.e. browser) client, and implemented the integrity checks in a WebView (which is basically a small browser any app can use to embed web content, see above for more info).

Breaking change 2: invalid iOS player responses (fixed in 0.27.5)

YouTube started to require a visitor data string in some requests with some clients (the ones used to get streams). It is used to identify in a unique way the session of a user and is returned by YouTube servers the first time a client makes a request. If a visitor data is not provided, YouTube returns a “Sign in to confirm that you’re not a bot” error.

To fix this issue, @Theta-Dev opened a PR where a random visitor data is generated locally every time.

Breaking change 3: invalid iOS player responses (fixed in 0.27.6)

A couple of weeks ago, YouTube started to reject randomly generated visitor data, and so required visitor data generated by their servers. NewPipe’s extractor now makes requests to get a visitor data from YouTube for every player request we make, regardless of the client (just in the case this change applies to all clients at some point).

YouTube is requiring integrity checks in their iOS client for most formats returned. We are not able to pass them, so we removed usage of this client in NewPipe. This unfortunately means that livestreams cannot be rewinded for more than 30 seconds, since the web client does not allow to rewind livestreams in HLS manifests for more than this duration (while the iOS client allows to rewind up to 1 hour).

The DASH manifests returned by the web client are known to be kind of broken and cannot be played directly in the app, but we found a workaround which we should be able to ship in the next release, allowing to rewind up to 4 hours!

All of these durations apply unless the creator disabled rewinding.

Donations are awesome

We sincerely thank all people who have donated to the NewPipe team and now the NewPipe e.V. or helped us in any way, we really appreciate your help and encourage you to continue doing so if you can. You can donate by following the instructions on our website.

Conclusion and contact

In the name of the team, I would like to thank every contributor, triager, translator, tester, donor, and even every user that wrote us kind emails. The community around NewPipe is truly fantastic! If you wish to start contributing, you can reach out to us via Matrix #newpipe:matrix.newpipe-ev.de or IRC (#newpipe on Libera.Chat).

Let us know what you think!

Please read our rules before leaving a comment!

→ Feature requests or bug reports need to be reported on GitHub! ←