not for moi at the present but Iâve had the whole âWorks-For-Certain-Videos-Onlyâ thing happen before so will keep trying. picture is freetube-bin
Gabber
September 29, 2025, 12:13am
63
try other Invidious instance.
what video doesnât work? I will test
It was the Plasmatics The Damned video where she drives the crazy bus. except it would not play
And Brandy by looking glass wouldnât work either.
yes. I am odd.
I didnât want to fight anymore after that
Bink
September 29, 2025, 12:43am
65
The principle of Grayjay is:
Follow Creators,
Not Platforms
So in principle, itâs not about YouTube (or whatever platform), itâs about the content creatorâs I choose to follow.
In practice, the majority of content creators still exclusively use YouTube, so the principle only gets you so far, but at the very least,Grayjay does bring in content from those other platforms for those content creators who do use them.
Grayjay provides a means to centrally manage subscription and watch content for I wide range of platforms, so yes, I like it.
1 Like
cactux
September 29, 2025, 6:27am
66
That happens when it discovers âunusual trafficâ. In this case I was testing if you could route yt-dlp over a proxy.
1 Like
Freetube is great if you want to watch youtube without ads and even sponsor segments. Youtube is constantly pushing new security measures to prevent 3rd party apps like freetube to play their videos but freetube devs eventually find a way. I use âuBlock originâ on chromium so even the youtube website is ad-free for me.
I also have an ad-free youtube player on my android phone. So I can say that i havenât seen a youtube ad for a long long time. Sometimes other people try to show me a video on their phones and the amount of ads that they have been âconformed intoâ is absolutely diabolical. Like how the hell do you even accept that? Unbelievable. I would just throw the phone to the wall.
1 Like
Love to see that UBO rule(s). That said Iâd still prefer to proxy for many reasons than use the simple ad-block of YT.
Cynically maybe it makes no difference in the end, i.e. your privacy is not really mitigated with either option.
ads I can l can be patient with but excessive, gratuitous ads really piss me off. I listened to an 11-minute song today and they inserted it in the middleâŚwork computer, out of my control.
PSâthe number of people who are âconformed intoâ excessive adds is equal to the amt that ask chatgpt what they should wear to lunchâŚ
cactux
October 1, 2025, 5:52am
69
Have you found any working instances of Invidious which still work in FreeTube?
1 Like
not with invidious,
have not tried the yt-dlp workaround tbh.
baby steps âlotta work hours this week
I can dig playing music in the cli; cannot dig browsing/choosing versions in the cli though
1 Like
You mean something like this ?
Interface to select youtube-dl format for streaming stuff with mpv
1 Like
Freetube also allows you to set a third party app as the player. MPV for example. And MPV can be set to use yt-dlp automatically. That still works. You can install both with pacman, however, i suggest installing the âgitâ version of yt-dlp from the AUR repo because youtube constantly changes things and the pacman version is not updated frequent enough to catch up.
A feature-rich command-line audio/video downloader
1 Like
cactux
October 1, 2025, 6:12pm
73
Out of curiosity, what does an app like NewPipe (on Android) do differently? Very rarely have I had issues with it playing YT videos. I cannot even remember when the last was. Knocking on the wood, NewPipe is working just fine as of this writing and hopefully will keep doing so in the future.
I am far from knowledgeable about the under-hood-working of Android, but I am just curious if some of you know the difference.
As I see on page for the issue reported for FreeTube, there seems to be the same problem for FreeTubeâs android app as well.
opened 12:13PM - 30 Sep 25 UTC
closed 12:48PM - 30 Sep 25 UTC
bug
B: content not loading
### Guidelines
- [x] I have encountered this bug in the [latest release of Free⌠Tube](https://github.com/FreeTubeApp/FreeTube/releases).
- [x] I have searched the issue tracker for [open](https://github.com/FreeTubeApp/FreeTube/issues?q=is%3Aopen+is%3Aissue) and [closed](https://github.com/FreeTubeApp/FreeTube/issues?q=is%3Aissue+is%3Aclosed) issues that are similar to the bug report I want to file, without success.
- [x] I have searched the [documentation](https://docs.freetubeapp.io/) for information that matches the description of the bug I want to file, without success.
- [x] This issue contains only one bug.
- [x] I have read and agree to follow the [rules](https://docs.freetubeapp.io/community/rules/).
### Describe the bug
1. Click on any video
2. An error pops up that says "[BAD_HTTP_STATUS: 403] Potential causes: IP block or streaming URL deciphering failed"
### Expected Behavior
1. Click on any video
2. The video plays
### Issue Labels
content not loading
### FreeTube Version
v0.23.8.1
### Operating System Version
Android 15
### Installation Method
.apk
### Primary API used
Local API
### Last Known Working FreeTube Version (If Any)
N/A
### Additional Information
This seems to be a trickle-down issue from time main fork of freetube, since they had the same issue a couple of weeks ago.
### Nightly Build
- [ ] I have encountered this bug in the latest [nightly build](https://docs.freetubeapp.io/development/nightly-builds).
I use this on my android phone:
It is actually a fork of newpipe. And yes, like newpipe, it has never failed to play a youtube video. Only the ones that require account log in (due to age limited videos).
Freetube is mainly a desktop app. It is not made for android originally (somebody ported it). And you are right, it constantly hits the wall of youtube changing something here and there and becomes unusable. They fix it but then it happens again. Freetube has been kind of in a software purgatory for a long time. They were talking about a huge overhaul of the code but they never did it. But I honestly donât care about the playback function of freetube, i can always bounce the links to chromium or even MPV (via yt-dlp). The most functional part of freetube for me is its subscription feed that i can export and import anytime i want âwithout the need for any google accountâ.
1 Like
Bink
October 1, 2025, 11:29pm
75
NewPipe has had itâs issues with YouTube as well, just perhaps not as recently. There have been numerous times where it was failing constantly and an update was needed, much like FreeTube is dealing with at the moment.
Eg:
opened 04:13PM - 09 Jul 24 UTC
closed 07:07AM - 26 Jul 24 UTC
bug
ASAP
youtube
requires extractor change
## Please also see [About YouTube playback errors - YouTube changed some things⌠to get working streams](https://github.com/TeamNewPipe/NewPipe/issues/11260)
---
### Checklist
- [X] I am able to reproduce the bug with the latest version given here: [CLICK THIS LINK](https://github.com/TeamNewPipe/NewPipe/releases/latest).
- [X] I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to.
- [X] I have read the [FAQ](https://newpipe.net/FAQ/) and my problem isn't listed.
- [X] I have taken the time to fill in all the required details. I understand that the bug report will be dismissed otherwise.
- [X] This issue contains only one bug.
- [X] I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md).
### Affected version
0.27.0
### Steps to reproduce the bug
Open the video and try to play it.
### Expected behavior
For the videos to play.
### Actual behavior
The video doesn't want to play. An error code appears in the notification.
### Screenshots/Screen recordings
_No response_
### Logs
## Exception
* __User Action:__ play stream
* __Request:__ Player error[type=ERROR_CODE_IO_BAD_HTTP_STATUS] occurred while playing https://www.youtube.com/watch?v=WoLa-J8YpxU
* __Content Country:__ RU
* __Content Language:__ ru-RU
* __App Language:__ ru_RU
* __Service:__ YouTube
* __Version:__ 0.27.0
* __OS:__ Linux Android 7.0 - 24
<details><summary><b>Crash log </b></summary><p>
```
com.google.android.exoplayer2.ExoPlaybackException: Source error
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:644)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:616)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:159)
at android.os.HandlerThread.run(HandlerThread.java:61)
Caused by: com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 403
at org.schabi.newpipe.player.datasource.YoutubeHttpDataSource.open(YoutubeHttpDataSource.java:422)
at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:263)
at com.google.android.exoplayer2.upstream.TeeDataSource.open(TeeDataSource.java:52)
at com.google.android.exoplayer2.upstream.cache.CacheDataSource.openNextSource(CacheDataSource.java:796)
at com.google.android.exoplayer2.upstream.cache.CacheDataSource.open(CacheDataSource.java:609)
at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:84)
at com.google.android.exoplayer2.source.chunk.InitializationChunk.load(InitializationChunk.java:99)
at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:412)
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:761)
```
</details>
<hr>
### Affected Android/Custom ROM version
Android 7
### Affected device model
Asus z500m
### Additional information
_No response_
dev â AudricV:yt_upd-cver-rm-keys-and-do-fixes
opened 04:57AM - 16 Apr 24 UTC
- [x] I carefully read the [contribution guidelines](https://github.com/TeamNewP⌠ipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md) and agree to them.
- [x] I have tested the API against [NewPipe](https://github.com/TeamNewPipe/NewPipe).
- [ ] I agree to create a pull request for [NewPipe](https://github.com/TeamNewPipe/NewPipe) as soon as possible to make it compatible with the changed API.
This PR updates YouTube hardcoded clients' versions to newer ones and removes usage of InnerTube API keys, as official clients do not use them anymore in all endpoints we use.
It also restores the availability some streams (itag 22 on musical videos, itag 139 (+DRC audio streams - used for stable audio feature on mobile apps), when iOS client fetch is not forced, itags 599 and 600) by using new player parameters found to workaround the integrity checks on the official Android app, which requires to pass DroidGuard's VM and to associate a visitor ID to InnerTube requests.
Finally, it adds the missing `prettyPrint` query parameter to mixes continuations and implements the new crisis meta info action data, while fixing YouTube tests and updating mocks on the fly.
## :warning: Breaking changes :warning:
Due to the removal of the usage of InnerTube API keys, some methods in `YoutubeParsingHelper` which can be used by clients have been changed:
- `areHardcodedClientVersionAndKeyValid` was renamed to `isHardcodedClientVersionValid`
- `getKey` was removed, since there is no InnerTube API key anymore
- `resetClientVersionAndKey` was renamed to `resetClientVersion`
- `isHardcodedYoutubeMusicKeyValid` was renamed to `isHardcodedYoutubeMusicClientVersionValid`
- `getYoutubeMusicKey` was renamed to `getYoutubeMusicClientVersion` and now just returns the version instead of (key, name, version), since there is no key anymore and the name is fixed ("67") and therefore hardcoded
- other related methods which are not really meant to be used outside of the extractor
Closes #1112, as it is not relevant anymore, and fixes multiple issues which have been not reported as issues in the extractor/NewPipe's issue tracker.
dev â AudricV:yt_innertube-clients-changes-for-streams
opened 06:29PM - 19 Jul 24 UTC
- [x] I carefully read the [contribution guidelines](https://github.com/TeamNewP⌠ipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md) and agree to them.
- [ ] I have tested the API against [NewPipe](https://github.com/TeamNewPipe/NewPipe).
This PR works around an anti-bot token, for which its requirement is A/B tested on the WEB client. In this test, streaming URLs of this client return HTTP errors 403 if the token is not provided after some time.
It also allows to not fetch the JavaScript player for non-age restricted videos, reducing data usage. The TVHTML5 embed client is now also only fetched in the case of age-restricted videos.
:warning: The methods `forceFetchAndroidClient` and `forceFetchIosClient` of `YoutubeStreamExtractor` **have been removed**, as they are now not needed anymore. This is a **breaking change** for users of these methods.
The PR changes also break the extraction of appropriate error states for private and deleted videos and invalid video IDs (an invalid player response message is thrown instead of a content not available one). This should fixed before this PR is merged, but I can't find a solution, so I will need help for that.
Clients info have been updated, this means that mocks have to be updated and several tests unrelated to my changes are failing. I fixed one in this PR (at least for the connection I used to ran the tests), `YoutubeSearchExtractorTest.CrisisResources`.
Fixes TeamNewPipe/NewPipe#11191.
dev â AudricV:yt_fix-streams-sabr-npe
opened 06:06PM - 06 May 25 UTC
- [x] I carefully read the [contribution guidelines](https://github.com/TeamNewP⌠ipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md) and agree to them.
- [x] I have tested the API against [NewPipe](https://github.com/TeamNewPipe/NewPipe).
This PR fixes `NullPointerException`s when an adapative format has no stream URL available, which is the case for SABR-only YouTube player responses, rolled out for the WEB client (almost?) completely. This caused the extractor to crash, as no null handling for URLs was made.
`TVHTML5` client usage for streaming has been also removed for now, as signatures extraction of HTML5 clients is currently broken (`WEB_EMBEDDED_PLAYER` fallback for age-restricted video is still done but won't work).
Stream mocks need to be updated.
Fixes TeamNewPipe/NewPipe#12126, fixes TeamNewPipe/NewPipe#12134.
1 Like
how long has this been now? 3 weeks? not being able to hear what you want to hear or see what you want to see for 3 weeks is like not having coffee for three weeks. Or (gasp!) beer.
When I checked in to see what condition my condition was in. Yeah yeah yeah. Not good.
I have not caved in to crawl to YT yet.
to @Bink : you present a plethora of passive workarounds ^^ above this post. I have resisted exploring all of them in this thread because I really did not think this BS would go on 3 weeksâŚugh
dalto
October 4, 2025, 4:23pm
77
It has only been 10 daysâŚ
1 Like
Goyano
October 4, 2025, 5:11pm
78
So what does that mean for future usage of yt-dlp?
opened 09:38AM - 23 Sep 25 UTC
discussion/announcement
site:youtube
### Beginning very soon, you'll need to have [Deno](https://deno.com/) (or anoth⌠er supported JavaScript runtime) installed to keep YouTube downloads working as normal.
## Why?
Up until now, yt-dlp has been able to use its [built-in JavaScript "interpreter"](https://github.com/yt-dlp/yt-dlp/blob/2025.09.23/yt_dlp/jsinterp.py) to solve the JavaScript challenges that are required for YouTube downloads. But due to [recent changes on YouTube's end](https://github.com/yt-dlp/yt-dlp/issues/14400), the built-in JS interpreter will soon be insufficient for this purpose. The changes are so drastic that [yt-dlp will need to leverage a proper JavaScript runtime in order to solve the JS challenges](https://github.com/yt-dlp/yt-dlp/pull/14157).
## What do I need to do?
### Everyone will need to install [Deno](https://deno.com/) (or another supported JavaScript runtime; see the FAQ below).
yt-dlp will also need a few JavaScript components, and **this *may* require additional action from you** depending on how you installed yt-dlp:
- **Official PyInstaller-bundled executable users (e.g. `yt-dlp.exe`, `yt-dlp_macos`, `yt-dlp_linux`, etc):**
- No additional action required (besides having Deno). All the necessary JavaScript components will be bundled with these executables.
- **PyPI package users (e.g. installed with `pip`, `pipx`, etc):**
- Install *and upgrade* yt-dlp with the `default` optional dependency group included, e.g.: `pip install -U "yt-dlp[default]"`
- **Official zipimport binary users (the `yt-dlp` Unix executable):**
- Run yt-dlp with an additional flag to allow Deno to download `npm` dependencies *--or--* install yt-dlp's JS solver package in your Python environment. (The flag name and the package name are both still TBD.)
- **Third-party package users (e.g. installed with `pacman`, `brew`, etc):**
- The action required will depend on how your third-party package repository decides to handle this change. But the options available for "official zipimport binary users" should work for you as well.
---
# Frequently Asked Questions
(and answers to them)
1. ### Does this mean yt-dlp is unusable without Deno (or another supported JavaScript runtime)?
No. The JavaScript runtime requirement will only apply to downloading from YouTube. yt-dlp can still be used without it on [the other ~thousand sites it supports](https://github.com/yt-dlp/yt-dlp/blob/2025.09.23/supportedsites.md).
The relationship between yt-dlp and the JS runtime will be analogous to the relationship between yt-dlp and ffmpeg. You need to bring your own ffmpeg, but yt-dlp can still do a lot of things without it.
Downloading *some* formats from YouTube without a JS runtime will still be possible for at least a little while longer: e.g. [`web_safari`](https://github.com/yt-dlp/yt-dlp#youtube) m3u8 formats do not require a `n` parameter nor do they require a [PO token](https://github.com/yt-dlp/yt-dlp/wiki/PO-Token-Guide). We'll try to keep these formats available for as long as possible.
2. ### Why can't yt-dlp's native JavaScript interpreter be improved to handle the new YouTube player JS?
Currently, yt-dlp relies on a complicated [set of regex patterns](https://github.com/yt-dlp/yt-dlp/blob/4429fd0450a3fbd5e89573e06533c1a0874fae42/yt_dlp/extractor/youtube/_video.py#L2226-L2287) to identify the necessary functions in the YouTube player JS, and relies on even [more regex](https://github.com/yt-dlp/yt-dlp/blob/master/yt_dlp/jsinterp.py) to try and interpret that JavaScript code natively within Python.
This code was already hugely costly to maintain. Any time YouTube changed something about their player JS, it would cause multiple maintainers to drop everything and spend all of their free time for the next 2-3 days trying to fix things.
With the latest changes, the necessary functions are spread out all over the player and are much more difficult to identify. Continuing to use the regex-based approach would be far too brittle and far too costly (i.e. maintainers would be spending all of their free time for the next 2-3 *weeks* after a breakage trying to fix things).
So the regex-based approach has been abandoned in favor of an AST-based approach (https://github.com/yt-dlp/ejs), which should allow us to respond much more quickly to changes in the player JS, even as its obfuscation increases.
3. ### Why *Deno*?
Deno is sandboxed by default and does not allow filesystem or network access. This is essential to protect our less-technically-inclined users. It also comes as a single-file portable executable, making its "installation" comparable to that of ffmpeg (which is something that all of our users should already be familiar with.)
Another obstacle we are facing in the near future is [YouTube's proof-of-origin (PO) token](https://github.com/yt-dlp/yt-dlp/wiki/PO-Token-Guide) requirement being enforced for all YT player clients. Implementing a built-in solution to this will also require JavaScript functionality which far exceeds that of our native `jsinterp` module. So we chose a runtime that would be able to handle the JS challenges (`n` parameter/signature cipher) *as well as* PO token generation in the future.
4. ### Will other JavaScript runtimes be supported?
The [linked pull request](https://github.com/yt-dlp/yt-dlp/pull/14157/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5) already supports **Node** and **Bun** in addition to Deno.
This was not advertised in the original announcement post because **A.)** Deno is the safest option & we'd prefer less-technically-inclined yt-dlp users to stick with that, **B.)** Deno will be used by default while using Node/Bun will require user intervention (i.e. passing a CLI argument), and **C.)** yt-dlp may only be able to support recent versions of Node and Bun (see question 10 below).
And while Deno, Node and Bun are the only runtimes that will be *initially* supported, we are open to adding support for more.
5. ### What about *PhantomJS*?
PhantomJS will no longer be used by yt-dlp's YouTube extractor in any capacity. The project is unmaintained, outdated and insecure. From a developer's perspective, it is nearly impossible to debug. There was an unsuccessful attempt made to get it working with this solution, but ultimately we decided we need to abandon it. For now, PhantomJS is still being used by a handful of other (non-YouTube) extractors.
6. ### What about *QuickJS*?
There was also an attempt made to use our external solver script with QuickJS, but it yielded execution times of ~33 minutes per video. (It also failed because QuickJS needed a polyfill for `URL`). Per [consultation with a quickjs-ng maintainer](https://github.com/yt-dlp/yt-dlp/issues/14404#issuecomment-3330764760), QuickJS is not a good fit for us since we could only realistically expect to double this speed (~15 minutes per video).
Edit: After more investigation, the performance characteristics observed by us are only present in quickjs-ng, not upstream quickjs. quickjs-ng is also looking in to backporting the performance improvements from upstream (https://github.com/quickjs-ng/quickjs/issues/1002). While slower than v8 based engines, quickjs seems fast enough to be viable. For now we will focus on getting the framework merged. Support for other JS runtimes can easily be added later.
7. ### What about *Selenium* or a headless browser solution?
The yt-dlp maintainers have no interest in doing this except as a measure of last resort. A headless browser solution would be an admission of defeat and would go against the spirit of this project.
8. ### Is this change the same thing as the [YTNSigDeno plugin](https://github.com/bashonly/yt-dlp-YTNSigDeno)?
No. The plugin just substitutes Deno for the native JSInterp after the `n` cipher function has already been extracted using Python regex. The actual solution will (out of necessity) completely delegate the `n` cipher function extraction to the JS runtime.
The plugin's development has been abandoned and the repository will be archived after yt-dlp has native Deno support.
9. ### What is the minimum required version of Deno?
We don't yet know exactly, but we are assuming version 2.x for now. After the patch is finalized and more testing has been conducted, we will have a definitive answer and it will be included in the announcement at release time. If we find out any sooner, this answer will be updated.
10. ### What is the minimum required version of Node?
It can be assumed that EOL versions of Node (i.e. `<20`) will **not** be supported. Per some testing earlier today, Node version `>=21` is required by the PR branch. We'll look into the feasibility of supporting Node 20.
11. ### What about platforms that aren't supported by the minimum required versions of these JavaScript runtimes?
We are open to adding support for other JavaScript runtimes so long as they fit into our established framework (see the [linked PR](https://github.com/yt-dlp/yt-dlp/pull/14157)). Pull requests are welcome, but obviously we ask that you wait until the initial linked PR has been merged.
12. ### What do I need to do if I'm using \[*insert Linux/BSD distro here*\]?
You'll have to wait and see what your distro's package maintainers decide to do.
13. ### I installed Deno, but why doesn't yt-dlp seem to be using it?
This change has not yet been implemented. This announcement is intended to give everyone a heads up.
1 Like
dalto
October 4, 2025, 5:23pm
79
It likely means that yt-dlp will have extra dependencies in the future. Luckily deno and nodejs are already in the repos.
2 Likes
if it feels like three weeks itâs the same, right? asking for a friend
1 Like