text:
[Youtube] Immediate HTTP Error 403 on download

🚨 click here to see the current status of this issue 🚨

[X] I understand that I will be blocked if I intentionally remove or skip any mandatory* field

Checklist

[X] I'm reporting that yt-dlp is broken on a supported site
[X] I've verified that I have updated yt-dlp to nightly or master (update instructions)
[X] I've checked that all provided URLs are playable in a browser with the same IP and same login details
[X] I've checked that all URLs and arguments with special characters are properly quoted or escaped
[X] I've searched known issues and the bugtracker for similar issues including closed ones. DO NOT post duplicates
[X] I've read the guidelines for opening an issue
[X] I've read about sharing account credentials and I'm willing to share it if required

Region
Germany
Provide a description that is worded well enough to be understood
Downloading videos currently results in an 403 error.
What I found out is, that the video gets played in browser when being logged in, when trying to start the videos in a private window without cookies, the video doesn't start without an error. However, the ads do play.
Provide verbose output that clearly demonstrates the problem

[X] Run your yt-dlp command with -vU flag added (yt-dlp -vU <your command line>)
[ ] If using API, add 'verbose': True to YoutubeDL params instead
[X] Copy the WHOLE output (starting with [debug] Command-line config) and insert it below

Complete Verbose Output
yt-dlp -vU https://www.youtube.com/watch?v=l35ok-7n2IU
[debug] Command-line config: ['-vU', 'https://www.youtube.com/watch?v=l35ok-7n2IU']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version nightly@2024.12.15.232913 from yt-dlp/yt-dlp-nightly-builds [d298693b1] (win_exe)
[debug] Python 3.10.11 (CPython AMD64 64bit) - Windows-10-10.0.19045-SP0 (OpenSSL 1.1.1t  7 Feb 2023)
[debug] exe versions: ffmpeg 2024-05-13-git-37db0454e4-essentials_build-www.gyan.dev (setts), ffprobe 2024-05-13-git-37db0454e4-essentials_build-www.gyan.dev, phantomjs 2.1.1
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.12.14, curl_cffi-0.5.10, mutagen-1.47.0, requests-2.32.3, sqlite3-3.40.1, urllib3-2.2.3, websockets-14.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Loaded 1837 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp-nightly-builds/releases/latest
Latest version: nightly@2024.12.15.232913 from yt-dlp/yt-dlp-nightly-builds
yt-dlp is up to date (nightly@2024.12.15.232913 from yt-dlp/yt-dlp-nightly-builds)
[youtube] Extracting URL: https://www.youtube.com/watch?v=l35ok-7n2IU
[youtube] l35ok-7n2IU: Downloading webpage
[youtube] l35ok-7n2IU: Downloading ios player API JSON
[youtube] l35ok-7n2IU: Downloading mweb player API JSON
[debug] [youtube] Extracting signature function js_03dbdfab_107
[debug] Loading youtube-sigfuncs.js_03dbdfab_107 from cache
[debug] Loading youtube-nsig.03dbdfab from cache
[debug] [youtube] Decrypted nsig aV2SlxDn5CNaYgrXF => IlSumDx_jM-HcQ
[debug] Loading youtube-nsig.03dbdfab from cache
[debug] [youtube] Decrypted nsig DD96eHcKsL6Qq9E90 => hxviA3B9kS_9QA
[debug] [youtube] Extracting signature function js_03dbdfab_103
[debug] Loading youtube-sigfuncs.js_03dbdfab_103 from cache
[youtube] l35ok-7n2IU: Downloading m3u8 information
[debug] Sort order given by extractor: quality, res, fps, hdr:12, source, vcodec, channels, acodec, lang, proto
[debug] Formats sorted by: hasvid, ie_pref, quality, res, fps, hdr:12(7), source, vcodec, channels, acodec, lang, proto, size, br, asr, vext, aext, hasaud, id
[debug] Default format spec: bestvideo*+bestaudio/best
[info] l35ok-7n2IU: Downloading 1 format(s): 313+251
[debug] Invoking http downloader on "https://rr3---sn-8vq54voxqx-cxgs.googlevideo.com/videoplayback?expire=1734837482&ei=ijBnZ5bkLN7t6dsPxZnjqA8&ip=2a02%3A8109%3A9d8f%3A3e00%3A693d%3A9ea1%3A7054%3A8015&id=o-AD-6zsiRz7FIC1te5s18LyYs5Y8ksIOFcZIi9DwV-4eZ&itag=313&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&met=1734815882%2C&mh=OR&mm=31%2C29&mn=sn-8vq54voxqx-cxgs%2Csn-i5h7lnll&ms=au%2Crdu&mv=m&mvi=3&pl=43&rms=au%2Cau&initcwndbps=3333750&bui=AfMhrI_ngaE8pa7Haos9jOTZ3q5auYyyVfDQXr5jsroWyEFRCr9GmkX8qUqEH8wbn8V2hlhS9c3-WuEV&spc=x-caUMh6H49vmv_2Nq1W3Z-hU6SkreEU_haD9Rl720YYO1YqHc5O&vprv=1&svpuc=1&mime=video%2Fwebm&rqh=1&gir=yes&clen=6804056254&dur=3879.720&lmt=1734697485233688&mt=1734815349&fvip=3&keepalive=yes&fexp=51326932%2C51335594%2C51371294&c=IOS&txp=4432434&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAPI4tNsuKx7xFM9mNgrxyyp8hSGN0-5CbzTuHZVdC9jXAiEA8wF4h9cuQjRMIDaEFCRCiwLDkWelVq5pslq_8uHVYPg%3D&lsparams=met%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Crms%2Cinitcwndbps&lsig=AGluJ3MwRgIhAJJ-X3tKgTINiH5L18EpIN5fb92EiSjLW5srWP1fl6CmAiEAncDu51bsexappSLmrSkwFZ4ZUfKzdhk4uOfkHq8jU8Q%3D"
ERROR: unable to download video data: HTTP Error 403: Forbidden
Traceback (most recent call last):
  File "yt_dlp\YoutubeDL.py", line 3461, in process_info
  File "yt_dlp\YoutubeDL.py", line 3199, in dl
  File "yt_dlp\downloader\common.py", line 464, in download
  File "yt_dlp\downloader\http.py", line 367, in real_download
  File "yt_dlp\downloader\http.py", line 118, in establish_connection
  File "yt_dlp\YoutubeDL.py", line 4162, in urlopen
  File "yt_dlp\networking\common.py", line 117, in send
  File "yt_dlp\networking\_helper.py", line 208, in wrapper
  File "yt_dlp\networking\common.py", line 340, in send
  File "yt_dlp\networking\_requests.py", line 365, in _send
yt_dlp.networking.exceptions.HTTPError: HTTP Error 403: Forbidden

I get this too.  If I try to play the video in a browser, it just loops adverts constantly.  Seems to be a bug on the youtube side.

I experience the same, it started around 12 hours ago. It might be ISP related, since I cannot watch your video in a private tab while on my home network (KPN, The Netherlands) but I can while connected to a mobile network (hollandsnieuwe, which in turn uses Vodafones network).

I'm having a similar issue on a tool I'm maintaining. Just out of curiosity, does it work with the legacy format? (yt-dlp -v -f 18 https://www.youtube.com/watch?v=l35ok-7n2IU)

Throws 403 fairly consistent regardless of IP or usage 🫡

@spencermp is correct. I was getting 403 error consistently. Tried with command "yt-dlp -4 URL" and it starts downloading. The IPv4 forcing seems to solve this issue temporarily.

Just tried my daily download of Youtube videos using Media-Downloader which uses yt-dlp. Same problem. Unfortunately it's difficult to chang the default configuration of Media-Downloader using the GUI to add th -4 option. I will see if I can change it in the underlying config files.

On a datacenter IP, forcing IPv4 did not help.

The -4 option doesn't work for me.

Refreshing my public IP to another worked for me, looks like YT are detecting the download and banning via IP.

Is there a way to hide the download by throttling the download speed?

Is there a way to hide the download by throttling the download speed?

It won't work. PipePipe use yt-dlp as extractor and many users still report 403 when playing.

I have a separate script I use occasionally instead of Media Downloader, which produces a yt-dlp download command as follows:
yt-dlp -R 0 -4 --no-progress --fragment-retries 0 --skip-unavailable-fragments --abort-on-unavailable-fragment -o '%(title)s.%(ext)s' https://www.youtube.com/watch?v=scERYKmRU4M
Without the -4, it will not download; with it, it downloads. If they're blocking by IP, why does it work multiple times on my IP which has not changed? I'm on Comcast Xfinity Essentials. Perhaps they simply haven't spotted my IP yet?

Is there a way to hide the download by throttling the download speed?

It won't work. PipePipe use yt-dlp as extractor and many users still report 403 when playing.

Yeah, but if I use a new ip that hasn't been blocked yet?

Same here, even from a residential IP. And po_token doesn't seem to be a solution either.

As the video also doesn't get played in a tab without cookies, I think the only solution for the programmers is to keep YouTube not knowing about that you are downloading instead of playing. I think the solution is, to throttle every YouTube download to the video bitrate.

It's most likely an IP ban for downloading because even video download helper fails in the same way. Using a vpn solves the issue.
Let's see how long they keep it up.

Using residential proxy am able to download for a few minutes before getting 403.

Seems like apps that rely on yt downloads are also experiencing this. Probably yt has a new ip blocking policy for downloaders.

Been able to download a full 8+ hour video without issue. But as soon as i started another download in parallel I got the 403 error.
Then I got IP blocked. Switched to VPN and could download again.

For anyone on a data center IP, this is to be expected and there's nothing we can do about it.
But I have a question for anyone on a residential IP who is experiencing this issue:
What were your downloading habits like before you started getting the 403 errors? Were you downloading in bulk, e.g. large playlists/channels/batches? Concurrent downloads? Or did you just go to download a single video and got hit with the 403?

@bashonly I download nearly every video I watch, then watch it, then delete the download. Apparently it defaults to IPv6, so they banned my v6 but not my v4.
I had just recently downloaded a full, large playlist as well, which may have been the issue.

@bashonly I download nearly every video I watch, then watch it, then delete the download. Apparently it defaults to IPv6, so they banned my v6 but not my v4. I had just recently downloaded a full, large playlist as well, which may have been the issue.
Quite same here: I have a program which downloads the videos that I want to watch, I watch than delete them. The program use a queue to download the videos one after the other, only one at a time, not concurrent downloads.

It varies but rarely I download playlists, mostly single videos that are a bit long and I want to watch in multiple sessions.

The interesting but is that now embedded youtube videos are not playing when on a website, but they do play when I watch directly from youtube.

For anyone on a data center IP, this is to be expected and there's nothing we can do about it.
But I have a question for anyone on a residential IP who is experiencing this issue:
What were your downloading habits like before you started getting the 403 errors? Were you downloading in bulk, e.g. large playlists/channels/batches? Concurrent downloads? Or did you just go to download a single video and got hit with the 403?

Long videos, and also had some concurrent downloads. Because of the long videos and many fast downloaded fragments I would guess that YouTube found out, that I am downloading. Because you could never skip so fast through every segment of a one hour video. This is why I suggested the download speed throttling.

Well, I tried an experiment. All of the IPv4 addresses I have are blocked. I can view videos with some problems but not download any of them on my usual workstation. I setup a network connection through my cellphone by tethering my laptop. Doing so allowed me to download a few videos with no apparent problems. So that works! I did not try to view any videos on a browser on this laptop connection in fear that logging on to Youtube would associate the IP address I was using with my account which may have been banned from doing any downloads at all. I did this just to be safe!

@linxman If you have v6 enabled, have you tried forcing with -6?
I believe the workaround is to just swap versions based off of what is banned, though if there's an easy way to get a new IPv6 address then the ban-evasion space is effectively unlimited.
I just don't know how to force a new v6 upon myself.

@linxman If you have v6 enabled, have you tried forcing with -6? I believe the workaround is to just swap versions based off of what is banned, though if there's an easy way to get a new IPv6 address then the ban-evasion space is effectively unlimited. I just don't know how to force a new v6 upon myself.

My local network will not route any traffic via IPv6. This just the way it is setup.

What were your downloading habits like before you started getting the 403 errors? Were you downloading in bulk, e.g. large playlists/channels/batches? Concurrent downloads? Or did you just go to download a single video and got hit with the 403?

I never did concurrent downloads, did not even visit the YouTube site during a download, and I throttle to 800K usually which is faster than real-time at my quality level (360p).  I typically download 3-12 videos a day in a single call to yt-dlp.  I normally use TorGuard to have a US IP address but I also tried directly with my cellular IP and still get 403's. The issue is new for me today and from the very first try, so it doesn't seem to be something I triggered, it kind of looks like they know it's a file download.
Strangely, downloading subtitles does work, it's the video which is forbidden.

@bashonly I download nearly every video I watch, then watch it, then delete the download. Apparently it defaults to IPv6, so they banned my v6 but not my v4. I had just recently downloaded a full, large playlist as well, which may have been the issue.

Quite same here: I have a Python program which downloads the videos that I want to watch, I watch than delete them. The program use a queue to download the videos with yt-dlp one after the other, only one at a time, not concurrent downloads.

Also similar situation for me. Usually about 5 to 10 video's per day

@linxman If you have v6 enabled, have you tried forcing with -6? I believe the workaround is to just swap versions based off of what is banned, though if there's an easy way to get a new IPv6 address then the ban-evasion space is effectively unlimited. I just don't know how to force a new v6 upon myself.

I've tried this. My IP is datacenter range and I've got the issue 403 forbidden with the ipv4 one. That's the IP I'm normally using for yt-dlp. With ipv6 it works for me.

If anyone has recently been 403d, and still has a googlevideo.com/videoplayback link from before they were 403d, does it still work? Note that they expire after 6 hours.

Adding --extractor-args "youtube:po_token=web+XXX" fixed it for me. I have also passed the user agent, switched to ipv4 and downloaded a nightly build, but this is the only thing that worked

I can confirm: I made a PO token with instructions in https://github.com/yt-dlp/yt-dlp/wiki/Extractors#manually-acquiring-a-po-token-from-a-browser-for-use-when-logged-out without the --cookies bit, just the --extractor-args argument formated as @Husenberg did above and from the same IP address at least, downloading does work. Not sure how long it'll last but even doing this once a day seems tolerable in order to get durable local files.
Thanks for the tip!

@Husenberg @vphantom could each of you test if --extractor-arg "youtube:player_client=mweb" works (without any PO token or cookies)? Also please make sure you are on yt-dlp version 2024.12.13 or later
It's possible that we are seeing multiple issues with the same error being reported in this thread, and this will help diagnose exactly what is happening.

@bashonly I can successfully download with that mweb argument instead of the PO token.

@bashonly it works if I remove the cookies from my config, yes.

@vphantom Thanks. Since this seems to be an A/B test and I am not in the test group, could you test something else please?
Could you see if you get 403'd with these options:
--extractor-arg "youtube:player_client=ios" -f "bv[protocol=m3u8_native]+ba[protocol=m3u8_native]"

@bashonly  isn't mweb equals to default, -ios? I can confirm some users still have issue with that.

@InfinityLoop1308 as stated in an earlier comment, this issue looks like it is two separate issues being reported in the same thread

@bashonly I had the client set to web, but using your arguments seems to work too. The 403 https error happens after getting the thumbnails, so as soon as the actual download starts.

@bashonly I am also successful with those arguments.
But wait, it seems that my last 2 tests may not have been valid: I no longer get a 403 when I revert back to this morning's command line (without extractor args) either! I have no means to find out if this is because I sent a valid PO token from this IP recently or if YouTube's blocking truly changed in the last couple of hours. 😕

It is a temp ban so possibly you just get recovered. In my case 403 can even be solved by refetching the same stream and 403 occurs only about 1/30.
I think it highly depends on your ip, or YouTube is testing more than one blocking methods.

@bashonly I'm kinda lost.

ios now requires po_token
some type of blocking is introduced to mweb

Am I right?

@InfinityLoop1308 I was trying to see if reports of the ios PO token requirement were getting mixed in with the overall googleplayback IP block that seems to be going on in the most of the reports

Yeah they are mixed. @bashonly
With ios extractor, some of our users report not be able to play any videos, while others report random failure (from like 1/10 to 1/2, but not any)
I believe the first type is due to ios PO token requirement and the second is the overall IP blocking.

Just a question: does the players android, ios and mediaconnect also require po tokens now? My program worked fine until today, but now every download is denied with 403.

With yt-dlp -4 I started getting 403 error.
If I'm using just yt-dlp, it works as, I believe my server has IPv6.
However, yt-dlp -4 --extractor-args "youtube:po_token=web+XXX" also works.

I also faced HTTP error 403 too while using ytdlp-interface which relies on yt-dlp. yt-dlp version is latest. Not just yt-dlp, 3rd-party YouTube downloaders (Tried Wonderfox & Winxvideo) also affected. Changing DNS makes YouTube downloader working again (I use Cloudflare DNS).

I have the same problem.
-6 and -4 flags do not work; however, I can play videos through browser just fine.

Hi all - things just started working for me automatically after not trying for about 12 hours. I am using this via Pinchflat w/ yt-dlp 2021.12.10 and now is back to working. Hopefully the same for others? Region: Australia.
Cheers,
DoFo

Whenever i download a video from Y2Mate this stupid "Access denied" error keeps popping up!

For anyone on a data center IP, this is to be expected and there's nothing we can do about it.
But I have a question for anyone on a residential IP who is experiencing this issue:
What were your downloading habits like before you started getting the 403 errors? Were you downloading in bulk, e.g. large playlists/channels/batches? Concurrent downloads? Or did you just go to download a single video and got hit with the 403?

Long videos, and also had some concurrent downloads. Because of the long videos and many fast downloaded fragments I would guess that YouTube found out, that I am downloading. Because you could never skip so fast through every segment of a one hour video. This is why I suggested the download speed throttling.

My yt-dlp is still working as of this morning using the -4 option. I downloaded 6 or 8 videos in one session using Media Downloader in the last hour with no problems. So apparently they haven't seen my IP yet. I'm on Comcast Xfinity Essentials, perhaps that's why.
I normally download between 40 and 100 videos per day using Media Downloader and occasionally a couple with yt-dlp on the command line using my script. The videos I download daily vary in length from a minimum of two minutes to as much as three hours. Media Downloader keeps yt-dlp up to date; currently on 2024.12.13 version. The command line version was back on 2024-03-10; I just updated it using pipx to current 2024-12-13.

[https @ 0x55fd3b2dbf00] HTTP error 403 Forbidden
[hls @ 0x55fd3afccec0] Failed to open segment 224571 of playlist 0
Same problem

An update from some preliminary investigation - there are two issues we appear to be seeing here:

A rollout or A/B test of what we presume is a PO Token requirement on the iOS client. This will produce an HTTP 403 error on iOS videoplayback urls, either immediately or midway through streaming if a valid iOS PO Token is not provided.

You can test if this is the issue by trying HLS formats (-S proto:hls) or use another client (--extractor-args youtube:player-client=default,-ios). Both should work.
- A fix has been merged that skips these iOS formats that require a PO Token. HLS formats do not appear to be impacted yet.

YouTube is experimenting with some sort of new aggressive IP-based block on videoplayback urls - perhaps to replace or compliment the existing "sign in to confirm you are not a bot" error on the player endpoint. This produces an HTTP 403 error on videoplayback urls, regardless of client and protocol (HTTPS, DASH, HLS, UMP, SABR, ONESIE).

If you are seeing this for the first time, backing off further downloading/requests for a little while may help to lift it. It is recommended to make use of the yt-dlp sleep options  to help avoid it.
Otherwise, you might need to change IP.

With the changes YouTube has been pushing recently, it is likely the out-of-the-box YouTube format support for yt-dlp will become more limited. To retain format support, we recommend looking into using/adding the WEB client with a PO Token. You can do this manually or automatically via plugins. Refer to the PO Token Guide for more information.

I'm not sure if the merge was put into the pip install -U --pre "yt-dlp[default]" but when I run that and I try a video like so, https://www.youtube.com/watch?v=_2B3_RA2Zqg it works without a proxy, but when I put that url behind a proxy.  It doesn't work, but this one works with or without the proxy https://youtu.be/kXxvV5KKNfM
 yt-dlp -vvv --proxy proxy:1001 https://www.youtube.com/watch?v=_2B3_RA2Zqg
[debug] Command-line config: ['-vvv', '--proxy', 'http://proxy:1001', 'https://www.youtube.com/watch?v=_2B3_RA2Zqg']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version nightly@2024.12.23.232812 from yt-dlp/yt-dlp-nightly-builds [65cf46cdd] (pip)
[debug] Python 3.9.21 (CPython x86_64 64bit) - Linux-6.11.0-061100-generic-x86_64-with-glibc2.39 (OpenSSL 3.0.13 30 Jan 2024, glibc 2.39)
[debug] exe versions: ffmpeg 6.1.1 (setts), ffprobe 6.1.1
[debug] Optional libraries: Cryptodome-3.20.0, brotli-1.1.0, certifi-2024.08.30, mutagen-1.47.0, requests-2.32.3, sqlite3-3.45.1, urllib3-2.2.3, websockets-13.0.1
[debug] Proxy map: {'all': 'http://proxy:1001'}
[debug] Request Handlers: urllib, requests, websockets
[debug] Loaded 1837 extractors
[youtube] Extracting URL: https://www.youtube.com/watch?v=_2B3_RA2Zqg
[youtube] _2B3_RA2Zqg: Downloading webpage
[youtube] _2B3_RA2Zqg: Downloading ios player API JSON
[youtube] _2B3_RA2Zqg: Downloading mweb player API JSON
[debug] [youtube] _2B3_RA2Zqg: ios client https formats require a PO Token which was not provided. They will be skipped as they may yield HTTP Error 403. You can manually pass a PO Token for this client with --extractor-args "youtube:po_token=ios+XXX. For more information, refer to  https://github.com/yt-dlp/yt-dlp/wiki/Extractors#po-token-guide . To enable these broken formats anyway, pass --extractor-args "youtube:formats=missing_pot"
[debug] [youtube] Extracting signature function js_03dbdfab_107
[debug] Loading youtube-sigfuncs.js_03dbdfab_107 from cache
[debug] Loading youtube-nsig.03dbdfab from cache
[debug] [youtube] Decrypted nsig somQ9o5DslgBPZqSC => Y2YUKdHImFzfVg
[debug] Loading youtube-nsig.03dbdfab from cache
[debug] [youtube] Decrypted nsig XyitzSXXJyMn6tseI => 6DPoNNRuOd_byA
[debug] [youtube] Extracting signature function js_03dbdfab_103
[debug] Loading youtube-sigfuncs.js_03dbdfab_103 from cache
[youtube] _2B3_RA2Zqg: Downloading m3u8 information
[debug] Sort order given by extractor: quality, res, fps, hdr:12, source, vcodec, channels, acodec, lang, proto
[debug] Formats sorted by: hasvid, ie_pref, quality, res, fps, hdr:12(7), source, vcodec, channels, acodec, lang, proto, size, br, asr, vext, aext, hasaud, id
[debug] Default format spec: bestvideo*+bestaudio/best
[info] _2B3_RA2Zqg: Downloading 1 format(s): 248+251
[debug] Invoking http downloader on "https://rr3---sn-p5qs7nsr.googlevideo.com/videoplayback?expire=1735024784&ei=MAxqZ6q4Jce7kucPyc7siQM&ip=2601%3A2008%3A9e85%3A3688%3Afef1%3Aaa3%3Afc70%3A42b3&id=o-ANcruYdrDe0EfRK7iFRNr7pOpLQT28Ip1HqYHytaVZ0i&itag=248&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C597%2C598&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&met=1735003184%2C&mh=9b&mm=31%2C29&mn=sn-p5qs7nsr%2Csn-p5qlsn7d&ms=au%2Crdu&mv=m&mvi=3&pl=29&rms=au%2Cau&gcr=us&bui=AfMhrI_pf0Rd0eUh7k-mLzJjNMsjbA6hppNO5rC4w8aTn44LMcC5bJjr7iOn2kpkeTIx1HhEVPYeI9KV&vprv=1&svpuc=1&mime=video%2Fwebm&ns=Vwyuju3n1DNMMH2cxGKuLT8Q&rqh=1&gir=yes&clen=3861619&dur=131.520&lmt=1725547178905052&mt=1735002784&fvip=4&keepalive=yes&fexp=51326932%2C51331020%2C51335594%2C51371294&c=MWEB&sefc=1&txp=231F224&n=6DPoNNRuOd_byA&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cgcr%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=met%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Crms&lsig=AGluJ3MwRQIhAPThbsGRQe9w2-ZSkNm9xngPE922Swmy2_C-__h0B_1DAiAOlHpqKABjSGRo4ewvqMSlk0NYBGPlb2oLICGBjOD38A%3D%3D&sig=AJfQdSswRAIgIcPAiyN7k0kRfW3X1Sm_YKrClMCKceQJzN_wHiqzwjcCICPxLHBO_91mIaoCGEBmSYwJGowde5pvJ1cB0jt0nZfn"
ERROR: unable to download video data: HTTP Error 403: Forbidden
Traceback (most recent call last):
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/YoutubeDL.py", line 3471, in process_info
    partial_success, real_download = self.dl(fname, new_info)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/YoutubeDL.py", line 3209, in dl
    return fd.download(name, new_info, subtitle)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/downloader/common.py", line 464, in download
    ret = self.real_download(filename, info_dict)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/downloader/http.py", line 367, in real_download
    establish_connection()
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/downloader/http.py", line 118, in establish_connection
    ctx.data = self.ydl.urlopen(request)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/YoutubeDL.py", line 4172, in urlopen
    return self._request_director.send(req)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/networking/common.py", line 117, in send
    response = handler.send(request)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/networking/_helper.py", line 208, in wrapper
    return func(self, *args, **kwargs)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/networking/common.py", line 340, in send
    return self._send(request)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/networking/_requests.py", line 365, in _send
    raise HTTPError(res, redirect_loop=max_redirects_exceeded)
yt_dlp.networking.exceptions.HTTPError: HTTP Error 403: Forbidden

Even if I try passing in  --extractor-args "youtube:formats=missing_pot" it still errors out, same with -S proto:hls and --extractor-args "youtube:player-client=default,-ios"

I'm not sure if the merge was put into the pip install -U --pre "yt-dlp[default]" but when I run that and I try a video like so, https://www.youtube.com/watch?v=_2B3_RA2Zqg it works without a proxy, but when I put that url behind a proxy. It doesn't work, but this one works with or without the proxy https://youtu.be/kXxvV5KKNfM
 yt-dlp -vvv --proxy proxy:1001 https://www.youtube.com/watch?v=_2B3_RA2Zqg
[debug] Command-line config: ['-vvv', '--proxy', 'http://proxy:1001', 'https://www.youtube.com/watch?v=_2B3_RA2Zqg']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version nightly@2024.12.23.232812 from yt-dlp/yt-dlp-nightly-builds [65cf46cdd] (pip)
[debug] Python 3.9.21 (CPython x86_64 64bit) - Linux-6.11.0-061100-generic-x86_64-with-glibc2.39 (OpenSSL 3.0.13 30 Jan 2024, glibc 2.39)
[debug] exe versions: ffmpeg 6.1.1 (setts), ffprobe 6.1.1
[debug] Optional libraries: Cryptodome-3.20.0, brotli-1.1.0, certifi-2024.08.30, mutagen-1.47.0, requests-2.32.3, sqlite3-3.45.1, urllib3-2.2.3, websockets-13.0.1
[debug] Proxy map: {'all': 'http://proxy:1001'}
[debug] Request Handlers: urllib, requests, websockets
[debug] Loaded 1837 extractors
[youtube] Extracting URL: https://www.youtube.com/watch?v=_2B3_RA2Zqg
[youtube] _2B3_RA2Zqg: Downloading webpage
[youtube] _2B3_RA2Zqg: Downloading ios player API JSON
[youtube] _2B3_RA2Zqg: Downloading mweb player API JSON
[debug] [youtube] _2B3_RA2Zqg: ios client https formats require a PO Token which was not provided. They will be skipped as they may yield HTTP Error 403. You can manually pass a PO Token for this client with --extractor-args "youtube:po_token=ios+XXX. For more information, refer to  https://github.com/yt-dlp/yt-dlp/wiki/Extractors#po-token-guide . To enable these broken formats anyway, pass --extractor-args "youtube:formats=missing_pot"
[debug] [youtube] Extracting signature function js_03dbdfab_107
[debug] Loading youtube-sigfuncs.js_03dbdfab_107 from cache
[debug] Loading youtube-nsig.03dbdfab from cache
[debug] [youtube] Decrypted nsig somQ9o5DslgBPZqSC => Y2YUKdHImFzfVg
[debug] Loading youtube-nsig.03dbdfab from cache
[debug] [youtube] Decrypted nsig XyitzSXXJyMn6tseI => 6DPoNNRuOd_byA
[debug] [youtube] Extracting signature function js_03dbdfab_103
[debug] Loading youtube-sigfuncs.js_03dbdfab_103 from cache
[youtube] _2B3_RA2Zqg: Downloading m3u8 information
[debug] Sort order given by extractor: quality, res, fps, hdr:12, source, vcodec, channels, acodec, lang, proto
[debug] Formats sorted by: hasvid, ie_pref, quality, res, fps, hdr:12(7), source, vcodec, channels, acodec, lang, proto, size, br, asr, vext, aext, hasaud, id
[debug] Default format spec: bestvideo*+bestaudio/best
[info] _2B3_RA2Zqg: Downloading 1 format(s): 248+251
[debug] Invoking http downloader on "https://rr3---sn-p5qs7nsr.googlevideo.com/videoplayback?expire=1735024784&ei=MAxqZ6q4Jce7kucPyc7siQM&ip=2601%3A2008%3A9e85%3A3688%3Afef1%3Aaa3%3Afc70%3A42b3&id=o-ANcruYdrDe0EfRK7iFRNr7pOpLQT28Ip1HqYHytaVZ0i&itag=248&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C597%2C598&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&met=1735003184%2C&mh=9b&mm=31%2C29&mn=sn-p5qs7nsr%2Csn-p5qlsn7d&ms=au%2Crdu&mv=m&mvi=3&pl=29&rms=au%2Cau&gcr=us&bui=AfMhrI_pf0Rd0eUh7k-mLzJjNMsjbA6hppNO5rC4w8aTn44LMcC5bJjr7iOn2kpkeTIx1HhEVPYeI9KV&vprv=1&svpuc=1&mime=video%2Fwebm&ns=Vwyuju3n1DNMMH2cxGKuLT8Q&rqh=1&gir=yes&clen=3861619&dur=131.520&lmt=1725547178905052&mt=1735002784&fvip=4&keepalive=yes&fexp=51326932%2C51331020%2C51335594%2C51371294&c=MWEB&sefc=1&txp=231F224&n=6DPoNNRuOd_byA&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cgcr%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=met%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Crms&lsig=AGluJ3MwRQIhAPThbsGRQe9w2-ZSkNm9xngPE922Swmy2_C-__h0B_1DAiAOlHpqKABjSGRo4ewvqMSlk0NYBGPlb2oLICGBjOD38A%3D%3D&sig=AJfQdSswRAIgIcPAiyN7k0kRfW3X1Sm_YKrClMCKceQJzN_wHiqzwjcCICPxLHBO_91mIaoCGEBmSYwJGowde5pvJ1cB0jt0nZfn"
ERROR: unable to download video data: HTTP Error 403: Forbidden
Traceback (most recent call last):
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/YoutubeDL.py", line 3471, in process_info
    partial_success, real_download = self.dl(fname, new_info)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/YoutubeDL.py", line 3209, in dl
    return fd.download(name, new_info, subtitle)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/downloader/common.py", line 464, in download
    ret = self.real_download(filename, info_dict)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/downloader/http.py", line 367, in real_download
    establish_connection()
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/downloader/http.py", line 118, in establish_connection
    ctx.data = self.ydl.urlopen(request)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/YoutubeDL.py", line 4172, in urlopen
    return self._request_director.send(req)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/networking/common.py", line 117, in send
    response = handler.send(request)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/networking/_helper.py", line 208, in wrapper
    return func(self, *args, **kwargs)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/networking/common.py", line 340, in send
    return self._send(request)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/networking/_requests.py", line 365, in _send
    raise HTTPError(res, redirect_loop=max_redirects_exceeded)
yt_dlp.networking.exceptions.HTTPError: HTTP Error 403: Forbidden

Even if I try passing in  --extractor-args "youtube:formats=missing_pot" it still errors out, same with -S proto:hls and --extractor-args "youtube:player-client=default,-ios"

Both fail for me on a proxy that's getting 403 on every video. If you try again, do you get the same results?

Correct, I still get this video to work with the proxy https://youtu.be/kXxvV5KKNfM
yt-dlp -vvv --proxy http://proxy:101 https://youtu.be/kXxvV5KKNfM
[debug] Command-line config: ['-vvv', '--proxy', 'http://proxy:101', 'https://youtu.be/kXxvV5KKNfM']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version nightly@2024.12.23.232812 from yt-dlp/yt-dlp-nightly-builds [65cf46cdd] (pip)
[debug] Python 3.9.21 (CPython x86_64 64bit) - Linux-6.11.0-061100-generic-x86_64-with-glibc2.39 (OpenSSL 3.0.13 30 Jan 2024, glibc 2.39)
[debug] exe versions: ffmpeg 6.1.1 (setts), ffprobe 6.1.1
[debug] Optional libraries: Cryptodome-3.20.0, brotli-1.1.0, certifi-2024.08.30, mutagen-1.47.0, requests-2.32.3, sqlite3-3.45.1, urllib3-2.2.3, websockets-13.0.1
[debug] Proxy map: {'all': 'http://proxy:101'}
[debug] Request Handlers: urllib, requests, websockets
[debug] Loaded 1837 extractors
[youtube] Extracting URL: https://youtu.be/kXxvV5KKNfM
[youtube] kXxvV5KKNfM: Downloading webpage
[youtube] kXxvV5KKNfM: Downloading ios player API JSON
[youtube] kXxvV5KKNfM: Downloading mweb player API JSON
[debug] [youtube] kXxvV5KKNfM: ios client https formats require a PO Token which was not provided. They will be skipped as they may yield HTTP Error 403. You can manually pass a PO Token for this client with --extractor-args "youtube:po_token=ios+XXX. For more information, refer to  https://github.com/yt-dlp/yt-dlp/wiki/Extractors#po-token-guide . To enable these broken formats anyway, pass --extractor-args "youtube:formats=missing_pot"
[debug] Loading youtube-nsig.03dbdfab from cache
[debug] [youtube] Decrypted nsig BNBYqYHrn64SDhniA => bxh3BVCK7e4JgQ
[debug] Loading youtube-nsig.03dbdfab from cache
[debug] [youtube] Decrypted nsig zVkiaqyBKs5Y6BTdg => a23zACAfz9-Dxg
[youtube] kXxvV5KKNfM: Downloading m3u8 information
[debug] Sort order given by extractor: quality, res, fps, hdr:12, source, vcodec, channels, acodec, lang, proto
[debug] Formats sorted by: hasvid, ie_pref, quality, res, fps, hdr:12(7), source, vcodec, channels, acodec, lang, proto, size, br, asr, vext, aext, hasaud, id
[debug] Default format spec: bestvideo*+bestaudio/best
[info] kXxvV5KKNfM: Downloading 1 format(s): 136+251
[debug] Invoking http downloader on "https://rr5---sn-p5qlsn76.googlevideo.com/videoplayback?expire=1735028357&ei=JRpqZ62YGrmEkucPzbCp-A8&ip=2601%3A200d%3Ade0a%3Aa69e%3Aa6e3%3A2699%3A4aa7%3A5ac4&id=o-AIwdRqfF7OhNBSzi9g13_Gmzh6Y7Aapf5YHuFLaYkKSu&itag=136&aitags=134%2C136%2C160%2C243&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&met=1735006757%2C&mh=U6&mm=31%2C29&mn=sn-p5qlsn76%2Csn-p5qs7nsk&ms=au%2Crdu&mv=m&mvi=5&pl=29&rms=au%2Cau&bui=AfMhrI-Is41XvI40olubWpmSdr7RnQu7iD8Fch0HveON4Dp9dCgC6dHYRZeYAvouwedCr5Ol6zgt1SKX&vprv=1&svpuc=1&mime=video%2Fmp4&ns=mXenMm9iFyWFBW_DQ0lr5ecQ&rqh=1&gir=yes&clen=34214510&dur=132.266&lmt=1724646437416607&mt=1735006406&fvip=2&keepalive=yes&fexp=51326932%2C51331020%2C51335594%2C51371294&c=MWEB&sefc=1&txp=5309224&n=a23zACAfz9-Dxg&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAIfkGbbz17fSdH12eB4_AAJYn6-uiS1PryjVkh1LKmz0AiEA1FOCYBunipQ9TvOoB0TjbNWA0skHtvrgzG08WBtRET4%3D&lsparams=met%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Crms&lsig=AGluJ3MwRQIgRTqe3mE-4H_VkYLKDXE6wdpLFDXplOG8OwxLVCduVwwCIQDKuEd5Fcb0WxAv3cxVyLUE-XSA9ZBiPxlxgjoDJrtl-w%3D%3D"
[download] Destination: El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].f136.mp4
[download]  61.6% of   32.63MiB at   18.12MiB/s ETA 00:00[download] Got error: ("Connection broken: ConnectionResetError(104, 'Connection reset by peer')", ConnectionResetError(104, 'Connection reset by peer')). Retrying (1/10)...
[download] Destination: El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].f136.mp4
[download] 100% of   32.63MiB in 00:00:06 at 5.11MiB/s
[debug] Invoking http downloader on "https://rr5---sn-p5qlsn76.googlevideo.com/videoplayback?expire=1735028357&ei=JRpqZ62YGrmEkucPzbCp-A8&ip=2601%3A200d%3Ade0a%3Aa69e%3Aa6e3%3A2699%3A4aa7%3A5ac4&id=o-AIwdRqfF7OhNBSzi9g13_Gmzh6Y7Aapf5YHuFLaYkKSu&itag=251&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&met=1735006757%2C&mh=U6&mm=31%2C29&mn=sn-p5qlsn76%2Csn-p5qs7nsk&ms=au%2Crdu&mv=m&mvi=5&pl=29&rms=au%2Cau&bui=AfMhrI-Is41XvI40olubWpmSdr7RnQu7iD8Fch0HveON4Dp9dCgC6dHYRZeYAvouwedCr5Ol6zgt1SKX&vprv=1&svpuc=1&mime=audio%2Fwebm&ns=mXenMm9iFyWFBW_DQ0lr5ecQ&rqh=1&gir=yes&clen=2100836&dur=132.301&lmt=1724646453989827&mt=1735006406&fvip=2&keepalive=yes&fexp=51326932%2C51331020%2C51335594%2C51371294&c=MWEB&sefc=1&txp=5308224&n=a23zACAfz9-Dxg&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAJGEahVoHzIiEyOO2t39bYg_SDkGkdN6oOx4v7eY4MzyAiEAu7-u1w8l2Bk5Bk1Ts5O5HWiiGTo5o74FFYRSkLPdtg0%3D&lsparams=met%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Crms&lsig=AGluJ3MwRQIgRTqe3mE-4H_VkYLKDXE6wdpLFDXplOG8OwxLVCduVwwCIQDKuEd5Fcb0WxAv3cxVyLUE-XSA9ZBiPxlxgjoDJrtl-w%3D%3D"
[download] Destination: El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].f251.webm
[download] 100% of    2.00MiB in 00:00:00 at 2.60MiB/s
[Merger] Merging formats into "El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].mkv"
[debug] ffmpeg command line: ffmpeg -y -loglevel repeat+info -i 'file:El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].f136.mp4' -i 'file:El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].f251.webm' -c copy -map 0:v:0 -map 1:a:0 -movflags +faststart 'file:El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].temp.mkv'
Deleting original file El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].f251.webm (pass -k to keep)
Deleting original file El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].f136.mp4 (pass -k to keep)

but this one not  https://www.youtube.com/watch?v=_2B3_RA2Zqg
 yt-dlp -vvv --proxy http://proxy:101 https://www.youtube.com/watch?v=_2B3_RA2Zqg
[debug] Command-line config: ['-vvv', '--proxy', 'http://proxy:101', 'https://www.youtube.com/watch?v=_2B3_RA2Zqg']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version nightly@2024.12.23.232812 from yt-dlp/yt-dlp-nightly-builds [65cf46cdd] (pip)
[debug] Python 3.9.21 (CPython x86_64 64bit) - Linux-6.11.0-061100-generic-x86_64-with-glibc2.39 (OpenSSL 3.0.13 30 Jan 2024, glibc 2.39)
[debug] exe versions: ffmpeg 6.1.1 (setts), ffprobe 6.1.1
[debug] Optional libraries: Cryptodome-3.20.0, brotli-1.1.0, certifi-2024.08.30, mutagen-1.47.0, requests-2.32.3, sqlite3-3.45.1, urllib3-2.2.3, websockets-13.0.1
[debug] Proxy map: {'all': 'http://proxy:101'}
[debug] Request Handlers: urllib, requests, websockets
[debug] Loaded 1837 extractors
[youtube] Extracting URL: https://www.youtube.com/watch?v=_2B3_RA2Zqg
[youtube] _2B3_RA2Zqg: Downloading webpage
[youtube] _2B3_RA2Zqg: Downloading ios player API JSON
[youtube] _2B3_RA2Zqg: Downloading mweb player API JSON
[debug] [youtube] _2B3_RA2Zqg: ios client https formats require a PO Token which was not provided. They will be skipped as they may yield HTTP Error 403. You can manually pass a PO Token for this client with --extractor-args "youtube:po_token=ios+XXX. For more information, refer to  https://github.com/yt-dlp/yt-dlp/wiki/Extractors#po-token-guide . To enable these broken formats anyway, pass --extractor-args "youtube:formats=missing_pot"
[debug] [youtube] Extracting signature function js_03dbdfab_107
[debug] Loading youtube-sigfuncs.js_03dbdfab_107 from cache
[debug] Loading youtube-nsig.03dbdfab from cache
[debug] [youtube] Decrypted nsig ftkuhGbkGTqjqi0Qv => OunMkCLT3GePEg
[debug] Loading youtube-nsig.03dbdfab from cache
[debug] [youtube] Decrypted nsig ejgF6D_YlaHHLUbBG => zRmn2tqP2kfkmA
[debug] [youtube] Extracting signature function js_03dbdfab_103
[debug] Loading youtube-sigfuncs.js_03dbdfab_103 from cache
[youtube] _2B3_RA2Zqg: Downloading m3u8 information
[debug] Sort order given by extractor: quality, res, fps, hdr:12, source, vcodec, channels, acodec, lang, proto
[debug] Formats sorted by: hasvid, ie_pref, quality, res, fps, hdr:12(7), source, vcodec, channels, acodec, lang, proto, size, br, asr, vext, aext, hasaud, id
[debug] Default format spec: bestvideo*+bestaudio/best
[info] _2B3_RA2Zqg: Downloading 1 format(s): 248+251
[debug] Invoking http downloader on "https://rr4---sn-p5qlsn7d.googlevideo.com/videoplayback?expire=1735028503&ei=txpqZ86mFfmKkucP4vS--As&ip=2a01%3Ae304%3A792f%3Ab70%3A8a9c%3Aaeb6%3A4d97%3A7d4b&id=o-APXunAi-75Q-D6Pp2c08oxsv4sjNek3fQj4Qi9SjGonL&itag=248&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C597%2C598&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&met=1735006903%2C&mh=9b&mm=31%2C26&mn=sn-p5qlsn7d%2Csn-a5meknzr&ms=au%2Conr&mv=m&mvi=4&pl=29&rms=au%2Cau&gcr=us&bui=AfMhrI9qulSDe_2894jxDTVDCg0rJ40qzzZKF1-3HncbjwLqu_9CgOgicx82MH-ZMqlqWpkSrwLSp3sk&vprv=1&svpuc=1&mime=video%2Fwebm&ns=Q8UQ9sRa7fiFnpLkUNtRWAwQ&rqh=1&gir=yes&clen=3861619&dur=131.520&lmt=1725547178905052&mt=1735006406&fvip=5&keepalive=yes&fexp=51326932%2C51331020%2C51335594%2C51371294&c=MWEB&sefc=1&txp=231F224&n=zRmn2tqP2kfkmA&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cgcr%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=met%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Crms&lsig=AGluJ3MwRQIhAKBfPL282obrcWL5BjgEamIL-rftmmeFUr1fpBKde6rsAiBzYe-p0ovN7YPlWkoaGRZHSz3XOGLErWJuvFuRn_GqIg%3D%3D&sig=AJfQdSswRQIhANv6NsEUxLH-sQfqZAPCcodtqLblM62FShDeGhVEH1LkAiBxzD7nAkZSJGLyy7eptdwUUDST-CWg3lqPrRSqYqE2PA%3D%3D"
ERROR: unable to download video data: HTTP Error 403: Forbidden
Traceback (most recent call last):
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/YoutubeDL.py", line 3471, in process_info
    partial_success, real_download = self.dl(fname, new_info)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/YoutubeDL.py", line 3209, in dl
    return fd.download(name, new_info, subtitle)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/downloader/common.py", line 464, in download
    ret = self.real_download(filename, info_dict)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/downloader/http.py", line 367, in real_download
    establish_connection()
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/downloader/http.py", line 118, in establish_connection
    ctx.data = self.ydl.urlopen(request)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/YoutubeDL.py", line 4172, in urlopen
    return self._request_director.send(req)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/networking/common.py", line 117, in send
    response = handler.send(request)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/networking/_helper.py", line 208, in wrapper
    return func(self, *args, **kwargs)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/networking/common.py", line 340, in send
    return self._send(request)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/networking/_requests.py", line 365, in _send
    raise HTTPError(res, redirect_loop=max_redirects_exceeded)
yt_dlp.networking.exceptions.HTTPError: HTTP Error 403: Forbidden

Correct, I still get this video to work with the proxy https://youtu.be/kXxvV5KKNfM
yt-dlp -vvv --proxy http://proxy:101 https://youtu.be/kXxvV5KKNfM
[debug] Command-line config: ['-vvv', '--proxy', 'http://proxy:101', 'https://youtu.be/kXxvV5KKNfM']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version nightly@2024.12.23.232812 from yt-dlp/yt-dlp-nightly-builds [65cf46cdd] (pip)
[debug] Python 3.9.21 (CPython x86_64 64bit) - Linux-6.11.0-061100-generic-x86_64-with-glibc2.39 (OpenSSL 3.0.13 30 Jan 2024, glibc 2.39)
[debug] exe versions: ffmpeg 6.1.1 (setts), ffprobe 6.1.1
[debug] Optional libraries: Cryptodome-3.20.0, brotli-1.1.0, certifi-2024.08.30, mutagen-1.47.0, requests-2.32.3, sqlite3-3.45.1, urllib3-2.2.3, websockets-13.0.1
[debug] Proxy map: {'all': 'http://proxy:101'}
[debug] Request Handlers: urllib, requests, websockets
[debug] Loaded 1837 extractors
[youtube] Extracting URL: https://youtu.be/kXxvV5KKNfM
[youtube] kXxvV5KKNfM: Downloading webpage
[youtube] kXxvV5KKNfM: Downloading ios player API JSON
[youtube] kXxvV5KKNfM: Downloading mweb player API JSON
[debug] [youtube] kXxvV5KKNfM: ios client https formats require a PO Token which was not provided. They will be skipped as they may yield HTTP Error 403. You can manually pass a PO Token for this client with --extractor-args "youtube:po_token=ios+XXX. For more information, refer to  https://github.com/yt-dlp/yt-dlp/wiki/Extractors#po-token-guide . To enable these broken formats anyway, pass --extractor-args "youtube:formats=missing_pot"
[debug] Loading youtube-nsig.03dbdfab from cache
[debug] [youtube] Decrypted nsig BNBYqYHrn64SDhniA => bxh3BVCK7e4JgQ
[debug] Loading youtube-nsig.03dbdfab from cache
[debug] [youtube] Decrypted nsig zVkiaqyBKs5Y6BTdg => a23zACAfz9-Dxg
[youtube] kXxvV5KKNfM: Downloading m3u8 information
[debug] Sort order given by extractor: quality, res, fps, hdr:12, source, vcodec, channels, acodec, lang, proto
[debug] Formats sorted by: hasvid, ie_pref, quality, res, fps, hdr:12(7), source, vcodec, channels, acodec, lang, proto, size, br, asr, vext, aext, hasaud, id
[debug] Default format spec: bestvideo*+bestaudio/best
[info] kXxvV5KKNfM: Downloading 1 format(s): 136+251
[debug] Invoking http downloader on "https://rr5---sn-p5qlsn76.googlevideo.com/videoplayback?expire=1735028357&ei=JRpqZ62YGrmEkucPzbCp-A8&ip=2601%3A200d%3Ade0a%3Aa69e%3Aa6e3%3A2699%3A4aa7%3A5ac4&id=o-AIwdRqfF7OhNBSzi9g13_Gmzh6Y7Aapf5YHuFLaYkKSu&itag=136&aitags=134%2C136%2C160%2C243&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&met=1735006757%2C&mh=U6&mm=31%2C29&mn=sn-p5qlsn76%2Csn-p5qs7nsk&ms=au%2Crdu&mv=m&mvi=5&pl=29&rms=au%2Cau&bui=AfMhrI-Is41XvI40olubWpmSdr7RnQu7iD8Fch0HveON4Dp9dCgC6dHYRZeYAvouwedCr5Ol6zgt1SKX&vprv=1&svpuc=1&mime=video%2Fmp4&ns=mXenMm9iFyWFBW_DQ0lr5ecQ&rqh=1&gir=yes&clen=34214510&dur=132.266&lmt=1724646437416607&mt=1735006406&fvip=2&keepalive=yes&fexp=51326932%2C51331020%2C51335594%2C51371294&c=MWEB&sefc=1&txp=5309224&n=a23zACAfz9-Dxg&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAIfkGbbz17fSdH12eB4_AAJYn6-uiS1PryjVkh1LKmz0AiEA1FOCYBunipQ9TvOoB0TjbNWA0skHtvrgzG08WBtRET4%3D&lsparams=met%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Crms&lsig=AGluJ3MwRQIgRTqe3mE-4H_VkYLKDXE6wdpLFDXplOG8OwxLVCduVwwCIQDKuEd5Fcb0WxAv3cxVyLUE-XSA9ZBiPxlxgjoDJrtl-w%3D%3D"
[download] Destination: El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].f136.mp4
[download]  61.6% of   32.63MiB at   18.12MiB/s ETA 00:00[download] Got error: ("Connection broken: ConnectionResetError(104, 'Connection reset by peer')", ConnectionResetError(104, 'Connection reset by peer')). Retrying (1/10)...
[download] Destination: El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].f136.mp4
[download] 100% of   32.63MiB in 00:00:06 at 5.11MiB/s
[debug] Invoking http downloader on "https://rr5---sn-p5qlsn76.googlevideo.com/videoplayback?expire=1735028357&ei=JRpqZ62YGrmEkucPzbCp-A8&ip=2601%3A200d%3Ade0a%3Aa69e%3Aa6e3%3A2699%3A4aa7%3A5ac4&id=o-AIwdRqfF7OhNBSzi9g13_Gmzh6Y7Aapf5YHuFLaYkKSu&itag=251&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&met=1735006757%2C&mh=U6&mm=31%2C29&mn=sn-p5qlsn76%2Csn-p5qs7nsk&ms=au%2Crdu&mv=m&mvi=5&pl=29&rms=au%2Cau&bui=AfMhrI-Is41XvI40olubWpmSdr7RnQu7iD8Fch0HveON4Dp9dCgC6dHYRZeYAvouwedCr5Ol6zgt1SKX&vprv=1&svpuc=1&mime=audio%2Fwebm&ns=mXenMm9iFyWFBW_DQ0lr5ecQ&rqh=1&gir=yes&clen=2100836&dur=132.301&lmt=1724646453989827&mt=1735006406&fvip=2&keepalive=yes&fexp=51326932%2C51331020%2C51335594%2C51371294&c=MWEB&sefc=1&txp=5308224&n=a23zACAfz9-Dxg&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAJGEahVoHzIiEyOO2t39bYg_SDkGkdN6oOx4v7eY4MzyAiEAu7-u1w8l2Bk5Bk1Ts5O5HWiiGTo5o74FFYRSkLPdtg0%3D&lsparams=met%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Crms&lsig=AGluJ3MwRQIgRTqe3mE-4H_VkYLKDXE6wdpLFDXplOG8OwxLVCduVwwCIQDKuEd5Fcb0WxAv3cxVyLUE-XSA9ZBiPxlxgjoDJrtl-w%3D%3D"
[download] Destination: El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].f251.webm
[download] 100% of    2.00MiB in 00:00:00 at 2.60MiB/s
[Merger] Merging formats into "El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].mkv"
[debug] ffmpeg command line: ffmpeg -y -loglevel repeat+info -i 'file:El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].f136.mp4' -i 'file:El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].f251.webm' -c copy -map 0:v:0 -map 1:a:0 -movflags +faststart 'file:El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].temp.mkv'
Deleting original file El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].f251.webm (pass -k to keep)
Deleting original file El Diaz - Channel Surfing (Official) [kXxvV5KKNfM].f136.mp4 (pass -k to keep)

but this one not https://www.youtube.com/watch?v=_2B3_RA2Zqg
 yt-dlp -vvv --proxy http://proxy:101 https://www.youtube.com/watch?v=_2B3_RA2Zqg
[debug] Command-line config: ['-vvv', '--proxy', 'http://proxy:101', 'https://www.youtube.com/watch?v=_2B3_RA2Zqg']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version nightly@2024.12.23.232812 from yt-dlp/yt-dlp-nightly-builds [65cf46cdd] (pip)
[debug] Python 3.9.21 (CPython x86_64 64bit) - Linux-6.11.0-061100-generic-x86_64-with-glibc2.39 (OpenSSL 3.0.13 30 Jan 2024, glibc 2.39)
[debug] exe versions: ffmpeg 6.1.1 (setts), ffprobe 6.1.1
[debug] Optional libraries: Cryptodome-3.20.0, brotli-1.1.0, certifi-2024.08.30, mutagen-1.47.0, requests-2.32.3, sqlite3-3.45.1, urllib3-2.2.3, websockets-13.0.1
[debug] Proxy map: {'all': 'http://proxy:101'}
[debug] Request Handlers: urllib, requests, websockets
[debug] Loaded 1837 extractors
[youtube] Extracting URL: https://www.youtube.com/watch?v=_2B3_RA2Zqg
[youtube] _2B3_RA2Zqg: Downloading webpage
[youtube] _2B3_RA2Zqg: Downloading ios player API JSON
[youtube] _2B3_RA2Zqg: Downloading mweb player API JSON
[debug] [youtube] _2B3_RA2Zqg: ios client https formats require a PO Token which was not provided. They will be skipped as they may yield HTTP Error 403. You can manually pass a PO Token for this client with --extractor-args "youtube:po_token=ios+XXX. For more information, refer to  https://github.com/yt-dlp/yt-dlp/wiki/Extractors#po-token-guide . To enable these broken formats anyway, pass --extractor-args "youtube:formats=missing_pot"
[debug] [youtube] Extracting signature function js_03dbdfab_107
[debug] Loading youtube-sigfuncs.js_03dbdfab_107 from cache
[debug] Loading youtube-nsig.03dbdfab from cache
[debug] [youtube] Decrypted nsig ftkuhGbkGTqjqi0Qv => OunMkCLT3GePEg
[debug] Loading youtube-nsig.03dbdfab from cache
[debug] [youtube] Decrypted nsig ejgF6D_YlaHHLUbBG => zRmn2tqP2kfkmA
[debug] [youtube] Extracting signature function js_03dbdfab_103
[debug] Loading youtube-sigfuncs.js_03dbdfab_103 from cache
[youtube] _2B3_RA2Zqg: Downloading m3u8 information
[debug] Sort order given by extractor: quality, res, fps, hdr:12, source, vcodec, channels, acodec, lang, proto
[debug] Formats sorted by: hasvid, ie_pref, quality, res, fps, hdr:12(7), source, vcodec, channels, acodec, lang, proto, size, br, asr, vext, aext, hasaud, id
[debug] Default format spec: bestvideo*+bestaudio/best
[info] _2B3_RA2Zqg: Downloading 1 format(s): 248+251
[debug] Invoking http downloader on "https://rr4---sn-p5qlsn7d.googlevideo.com/videoplayback?expire=1735028503&ei=txpqZ86mFfmKkucP4vS--As&ip=2a01%3Ae304%3A792f%3Ab70%3A8a9c%3Aaeb6%3A4d97%3A7d4b&id=o-APXunAi-75Q-D6Pp2c08oxsv4sjNek3fQj4Qi9SjGonL&itag=248&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C597%2C598&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&met=1735006903%2C&mh=9b&mm=31%2C26&mn=sn-p5qlsn7d%2Csn-a5meknzr&ms=au%2Conr&mv=m&mvi=4&pl=29&rms=au%2Cau&gcr=us&bui=AfMhrI9qulSDe_2894jxDTVDCg0rJ40qzzZKF1-3HncbjwLqu_9CgOgicx82MH-ZMqlqWpkSrwLSp3sk&vprv=1&svpuc=1&mime=video%2Fwebm&ns=Q8UQ9sRa7fiFnpLkUNtRWAwQ&rqh=1&gir=yes&clen=3861619&dur=131.520&lmt=1725547178905052&mt=1735006406&fvip=5&keepalive=yes&fexp=51326932%2C51331020%2C51335594%2C51371294&c=MWEB&sefc=1&txp=231F224&n=zRmn2tqP2kfkmA&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cgcr%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=met%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Crms&lsig=AGluJ3MwRQIhAKBfPL282obrcWL5BjgEamIL-rftmmeFUr1fpBKde6rsAiBzYe-p0ovN7YPlWkoaGRZHSz3XOGLErWJuvFuRn_GqIg%3D%3D&sig=AJfQdSswRQIhANv6NsEUxLH-sQfqZAPCcodtqLblM62FShDeGhVEH1LkAiBxzD7nAkZSJGLyy7eptdwUUDST-CWg3lqPrRSqYqE2PA%3D%3D"
ERROR: unable to download video data: HTTP Error 403: Forbidden
Traceback (most recent call last):
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/YoutubeDL.py", line 3471, in process_info
    partial_success, real_download = self.dl(fname, new_info)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/YoutubeDL.py", line 3209, in dl
    return fd.download(name, new_info, subtitle)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/downloader/common.py", line 464, in download
    ret = self.real_download(filename, info_dict)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/downloader/http.py", line 367, in real_download
    establish_connection()
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/downloader/http.py", line 118, in establish_connection
    ctx.data = self.ydl.urlopen(request)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/YoutubeDL.py", line 4172, in urlopen
    return self._request_director.send(req)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/networking/common.py", line 117, in send
    response = handler.send(request)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/networking/_helper.py", line 208, in wrapper
    return func(self, *args, **kwargs)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/networking/common.py", line 340, in send
    return self._send(request)
  File "/home/john/PycharmProjects/youtproxies/venv/lib/python3.9/site-packages/yt_dlp/networking/_requests.py", line 365, in _send
    raise HTTPError(res, redirect_loop=max_redirects_exceeded)
yt_dlp.networking.exceptions.HTTPError: HTTP Error 403: Forbidden

Interesting. The main difference I notice here is the servers are different
rr5---sn-p5qlsn76.googlevideo.com vs rr4---sn-p5qlsn7d.googlevideo.com

After testing, the download operation can be performed by using the cookies exported by the browser and passing them to yt-dlp.
step 1: yt-dlp --cookies-from-browser firefox --cookies cookie.txt
step 2: yt-dlp -f b --cookies ./cookie.txt https://www.youtube.com/watch?v=xxxxx

Good morning everyone! Just want to add my findings, maybe it helps:

I usually download with a dedicated youtube-vm on my homeserver, but not the last two days.
Got 403 immediately this morning. Since none of the command line parameters posted here helped, I assume an IP-ban.
IPv4/IPv6 both 403 on the vm.
Reconnected and got a new IPv4 and a new IPv6 prefix. No change.
Tried downloading on my workstation instead and it worked. IPv4, IPv6-prefix and yt-dlp version are the same as on the vm.

The only difference, seen from outside my network, is that I visited YouTube on my workstation before starting the yt-dlp download (of course, to gather the links). Firefox with logged in account. And the vm is on another IPv6 subnet (VLAN).

It looks like MWEB is now requiring PO Token

I started seeing this yesterday, so quite some time after this was first seen. My findings:

Started getting 403 Forbidden yesterday.
Tested various browsers, Ungoogled-Chromium, Brave, Firefox, Zen, no difference and can only play ads.
In the browser, seems to be the videoplayback call that fails.

Status: (failed)net::ERR_INCOMPLETE_CHUNKED_ENCODING or (failed)net::ERR_EMPTY_RESPONSE

yt-dlp -4 or -6 makes no difference.

What works:

Browser where you're logged in to an YT account which kind of defeats my purpose of using yt-dlp, privacy.

Since today, youtube is blocking video viewing without ads.
It impacts yt-dlp but also firefox + ublock origin.
Everything works fine on chrome.

Nope.
I'm in France.
It seems that youtube is rolling out progressively their new version all over the planet.

It seems YouTube is using TLS fingerprint to detect bot traffic.
I changed the TLS version to 1.3 from 1.2 and success downloading videos without 403 errors.
# This patch is in the public domain.
diff --git a/networking/_helper.py b/networking/_helper.py
--- a/networking/_helper.py
+++ b/networking/_helper.py
@@ -153,7 +153,7 @@ def make_ssl_context(
         # 6. https://github.com/yt-dlp/yt-dlp/commit/5b9f253fa0aee996cf1ed30185d4b502e00609c4#commitcomment-89054368
         context.set_ciphers(
             '@SECLEVEL=2:ECDH+AESGCM:ECDH+CHACHA20:ECDH+AES:DHE+AES:!aNULL:!eNULL:!aDSS:!SHA1:!AESCCM')
-        context.minimum_version = ssl.TLSVersion.TLSv1_2
+        context.minimum_version = ssl.TLSVersion.TLSv1_3

     if client_certificate:
         try:

This patch is a temporary solution. This change will be applied far-reaching beyond YouTube.
And I think YouTube may add a blocking rule soon against this change.
To make detect hard, we should use curl_cffi.
This behavior is not yet tested enough and further investing is needed.

I applied the TLSv1_3 fix, same 403 error
wassim@jupiter:~/dev/yt-dlp$ python3 -m yt_dlp --verbose -f 140 https://www.youtube.com/watch?v=20eebO8zBYk
[debug] Command-line config: ['--verbose', '-f', '140', 'https://www.youtube.com/watch?v=20eebO8zBYk']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2024.12.23 from yt-dlp/yt-dlp [65cf46cdd] (source)
[debug] Lazy loading extractors is disabled
[debug] Git HEAD: 0b6b7742c
[debug] Python 3.12.7 (CPython x86_64 64bit) - Linux-6.11.0-13-generic-x86_64-with-glibc2.40 (OpenSSL 3.3.1 4 Jun 2024, glibc 2.40)
[debug] exe versions: ffmpeg 7.0.2 (setts), ffprobe 7.0.2
[debug] Optional libraries: certifi-2024.06.02, requests-2.32.3, secretstorage-3.3.3, sqlite3-3.46.1, urllib3-2.0.7

Everything still working here in San Francisco using the cookies fix. Just downloaded one video, now batch downloading 3 videos, no 403 error.
yt-dlp --version: 2024.12.13

authors: Brainicism DAMIANTHENTZANBF2K8Hater Delitants DoFoT9 Husenberg InfinityLoop1308 MRDHR Robbo312 TCH68k WassimAttar andrechris24 ankmandwal asenmitrev ask2018 azihassan bashonly black-ish coletdjnz gianmichelemariani knoedel001 koent linxman minamotorin nadermx postmeow richardstevenhack rwmjones sebi-berlin sir01g spencermp summoningdark0 triplesixman vphantom ygaeon zelark


text:
Unable to download TV4 subtitles for Trap: Parse error

Checklist

[X] I'm reporting a broken site
[X] I've verified that I'm running yt-dlp version 2022.03.08.1. (update instructions)
[X] I've checked that all provided URLs are alive and playable in a browser
[X] I've checked that all URLs and arguments with special characters are properly quoted or escaped
[X] I've searched the bugtracker for similar issues including closed ones. DO NOT post duplicates
[X] I've read the guidelines for opening an issue
[X] I've read about sharing account credentials and I'm willing to share it if required

Region
Sweden
Description
yt-dlp fails to download subtitles for Trap on TV4, throws a ParseError exception. Probably something to do with Swedish character ä, potentially not being encoded correctly.
I have tried the following URLs, all throw ParseError on the same text:
https://www.tv4play.se/program/trap/13740796
https://www.tv4play.se/program/trap/13740798
https://www.tv4play.se/program/trap/13740800
https://www.tv4play.se/program/trap/13740793
https://www.tv4play.se/program/trap/13740801
https://www.tv4play.se/program/trap/13740794
https://www.tv4play.se/program/trap/13740795
This URL for a different TV series almost works - fails on the penultimate fragment (no special Swedish character in the text reported but plenty in the previous fragments that were successfully collected):
https://www.tv4play.se/program/catch-and-release/13725754
[download]  99.8% of ~72.38KiB at  569.55B/s ETA 00:00 (frag 606/607)ERROR: Parse error at position 91 (near 'Text: Susie Kristens')
Verbose log
yt-dlp -vU --write-subs sv --sub-format vtt "https://www.tv4play.se/program/trap/13740798"
[debug] Command-line config: ['-vU', '--write-subs', 'sv', '--sub-format', 'vtt', 'https://www.tv4play.se/program/trap/13740798']
[debug] Encodings: locale UTF-8, fs utf-8, out UTF-8, err UTF-8, pref UTF-8
[debug] yt-dlp version 2022.03.08.1 [c0c2c57d3] (zip)
[debug] Python version 3.7.3 (CPython 32bit) - Linux-5.10.63-v7l+-armv7l-with-debian-10.11
[debug] exe versions: ffmpeg 4.1.8-0, ffprobe 4.1.8-0, phantomjs ., rtmpdump 2.4
[debug] Optional libraries: Crypto, secretstorage, sqlite
[debug] Proxy map: {}
Latest version: 2022.03.08.1, Current version: 2022.03.08.1
yt-dlp is up to date (2022.03.08.1)
[debug] [generic] Extracting URL: sv
ERROR: [generic] 'sv' is not a valid URL. Set --default-search "ytsearch" (or run  yt-dlp "ytsearch:sv" ) to search YouTube
  File "/usr/local/bin/yt-dlp/yt_dlp/extractor/common.py", line 617, in extract
    ie_result = self._real_extract(url)
  File "/usr/local/bin/yt-dlp/yt_dlp/extractor/generic.py", line 2679, in _real_extract
    % (url, url), expected=True)

[debug] Using fake IP 78.75.126.29 (SE) as X-Forwarded-For
[debug] [TV4] Extracting URL: https://www.tv4play.se/program/trap/13740798
[TV4] 13740798: Downloading video info JSON
[TV4] 13740798: Downloading JSON metadata
[TV4] 13740798: Downloading m3u8 information
[TV4] 13740798: Downloading MPD manifest
[TV4] 13740798: Downloading f4m manifest
[TV4] 13740798: Downloading ISM manifest
[debug] Formats sorted by: hasvid, ie_pref, lang, quality, res, fps, hdr:12(7), vcodec:vp9.2(10), acodec, filesize, fs_approx, tbr, vbr, abr, asr, proto, vext, aext, hasaud, source, id
[debug] Downloading subtitles: sv
[debug] Default format spec: bestvideo*+bestaudio/best
[info] 13740798: Downloading 1 format(s): hls-2910+mss-audio-128
[info] Writing video subtitles to: Trap del 2 [13740798].sv.vtt
[debug] Invoking downloader on "https://lbs-usp-hls-vod.cmore.se/vod/950eb/s0apbjtom15(13740798_ISMUSP).ism/s0apbjtom15(13740798_ISMUSP)-textstream_swe=3000.m3u8"
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 1112
[download] Destination: Trap del 2 [13740798].sv.vtt
[download] Trap del 2 [13740798].sv.vtt.part-Frag13 has already been downloaded
[download]   1.2% of ~15.29KiB at  1.47KiB/s ETA Unknown (frag 13/1112)ERROR: Parse error at position 89 (near 'Det här är en fiktiv')
Traceback (most recent call last):
  File "/usr/local/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 1389, in wrapper
    return func(self, *args, **kwargs)
  File "/usr/local/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 1473, in __extract_info
    return self.process_ie_result(ie_result, download, extra_info)
  File "/usr/local/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 1529, in process_ie_result
    ie_result = self.process_video_result(ie_result, download=download)
  File "/usr/local/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 2638, in process_video_result
    self.process_info(new_info)
  File "/usr/local/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 2890, in process_info
    sub_files = self._write_subtitles(info_dict, temp_filename)
  File "/usr/local/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 3859, in _write_subtitles
    self.dl(sub_filename, sub_copy, subtitle=True)
  File "/usr/local/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 2835, in dl
    return fd.download(name, new_info, subtitle)
  File "/usr/local/bin/yt-dlp/yt_dlp/downloader/common.py", line 453, in download
    ret = self.real_download(filename, info_dict)
  File "/usr/local/bin/yt-dlp/yt_dlp/downloader/hls.py", line 356, in real_download
    ctx, fragments, info_dict, pack_func=pack_fragment, finish_func=fin_fragments)
  File "/usr/local/bin/yt-dlp/yt_dlp/downloader/fragment.py", line 539, in download_and_append_fragments
    result = append_fragment(decrypt_fragment(fragment, frag_content), frag_index, ctx)
  File "/usr/local/bin/yt-dlp/yt_dlp/downloader/fragment.py", line 512, in append_fragment
    self._append_fragment(ctx, pack_func(frag_content, frag_index))
  File "/usr/local/bin/yt-dlp/yt_dlp/downloader/hls.py", line 270, in pack_fragment
    for block in webvtt.parse_fragment(frag_content):
  File "/usr/local/bin/yt-dlp/yt_dlp/webvtt.py", line 398, in parse_fragment
    raise ParseError(parser)
yt_dlp.webvtt.ParseError: Parse error at position 89 (near 'Det här är en fiktiv')

Encoding is not an issue. https://lbs-usp-hls-vod.cmore.se/vod/950eb/s0apbjtom15(13740798_ISMUSP).ism/s0apbjtom15(13740798_ISMUSP)-textstream_swe=3000-13.webvtt contains a blank line which shouldn’t be there. #2175 should be able to address this… when I find the time to finish it.

source: gharchive/issue

authors: fstirlitz moftot

repo: yt-dlp/yt-dlp

license: Unlicense

license_type: permissive

license_source: github-api


text:
Downloading private embedded video from vimeo fails

Checklist

[X] I'm reporting a broken site
[X] I've verified that I'm running yt-dlp version 2022.04.08 (update instructions) or later (specify commit)
[X] I've checked that all provided URLs are alive and playable in a browser
[X] I've checked that all URLs and arguments with special characters are properly quoted or escaped
[X] I've searched the bugtracker for similar issues including closed ones. DO NOT post duplicates
[X] I've read the guidelines for opening an issue
[X] I've read about sharing account credentials and I'm willing to share it if required

Region
Europe, probably everywhere
Description
First: If this is too similar to #2128, sorry, please close it. But because I get error 404 directly, I think it is different (or not even a bug and I am just using yt-dlp wrong)
So there is a private page, accessible by URL without login, which has a video from vimeo embedded (actually it was a live stream and now is the recording of the stream). Since it is a private link, I am willing to share it with developers/maintainers but can't post it here.
The embedded video plays fine, and if I click on the vimeo logo, a new tab opens with the video on vimeo (https://vimeo.com/[videoID]?embedded=true&source=vimeo_logo&owner=[ownerID])
Opening this link in a different Browser fails, if the page where it is embedded hasn't been opened before.
So I exported the cookies on vimeo using this addon in Brave.
The full commandline I tried for yt-dlp is:
yt-dlp.exe -Uv "https://vimeo.com/[videoID]?embedded=true&source=vimeo_logo&owner=[ownerID]" --referer "[SITE WHERE IT IS EMBEDDED]" --cookies cookies.txt --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36"
I also tried only the referer, only cookies and different combinations without success.
From the logs, it looks like yt-dlp might extract just the ID from the URL and then try to load https://vimeo.com/[videoID]
This doesn't work in the browser, the URL only works with the query parameters.
Verbose log
[debug] Command-line config: ['-Uv', 'https://vimeo.com/[videoID]?embedded=true&source=vimeo_logo&owner=[ownerID]', '--referer', '[SITE WHERE IT IS EMBEDDED]', '--cookies', 'cookies.txt', '--user-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36']
[debug] Encodings: locale cp1252, fs utf-8, out utf-8, err utf-8, pref cp1252
[debug] yt-dlp version 2022.04.08 [7884ade] (win_exe)
[debug] Python version 3.8.10 (CPython 64bit) - Windows-10-10.0.19044-SP0
[debug] Checking exe version: ffmpeg -bsfs
[debug] Checking exe version: ffprobe -bsfs
[debug] exe versions: ffmpeg 2020-10-21-git-289e964873-full_build-www.gyan.dev, ffprobe 2020-10-21-git-289e964873-full_build-www.gyan.dev
[debug] Optional libraries: brotli, certifi, Cryptodome, mutagen, sqlite, websockets
[debug] Proxy map: {}
Latest version: 2022.04.08, Current version: 2022.04.08
yt-dlp is up to date (2022.04.08)
[debug] [vimeo] Extracting URL: https://vimeo.com/[videoID]?embedded=true&source=vimeo_logo&owner=[ownerID]
[vimeo] [videoID]: Downloading webpage
ERROR: [vimeo] [videoID]: Unable to download webpage: HTTP Error 404: Not Found (caused by <HTTPError 404: 'Not Found'>); please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
  File "yt_dlp\extractor\common.py", line 641, in extract
  File "yt_dlp\extractor\vimeo.py", line 864, in _real_extract
  File "yt_dlp\extractor\common.py", line 800, in _download_webpage_handle
  File "yt_dlp\extractor\common.py", line 785, in _request_webpage

  File "yt_dlp\extractor\common.py", line 767, in _request_webpage
  File "yt_dlp\YoutubeDL.py", line 3601, in urlopen
  File "urllib\request.py", line 531, in open
  File "urllib\request.py", line 640, in http_response
  File "urllib\request.py", line 569, in error
  File "urllib\request.py", line 502, in _call_chain
  File "urllib\request.py", line 649, in http_error_default
urllib.error.HTTPError: HTTP Error 404: Not Found

Send me the non-redacted verbose log. You can reach me on discord, reddit or by email

https://github.com/yt-dlp/yt-dlp/commit/aedaa455d9874f14662023f21b254168ecd55579 may have fixed this. Can't check since the URL you gave no longer works. If it doesn't fix the issue, pls give a new working URL

https://github.com/yt-dlp/yt-dlp/commit/aedaa455d9874f14662023f21b254168ecd55579 may have fixed this. Can't check since the URL you gave no longer works. If it doesn't fix the issue, pls give a new working URL

I have a private URL that still fails to be downloaded.

You can reach me on discord, reddit or by email

How can I contact you by email to send the URL to you ?

Contact: discord (pukkandan#4207) / reddit (/u/pukkandan) / email (pukkandan.ytdlp@gmail.com)

Sorry for the (extremely) delayed reply. It turns out to be an issue with embedly extractor. It has been fixed in 78d25e0b7c2b45597e193c0decb33f4f248502a9
❯ yt-dlp -v "https://cdn.embedly.com/widgets/media.html?src=https://player.vimeo.com/video/[redacted]?h=[redacted]&app_id=[redacted]&dntp=1&display_name=Vimeo&url=https://vimeo.com/[redacted]&key=[redacted]&type=text/html&schema=vimeo"
[debug] Command-line config: ['--ignore-config', '-v', 'https://cdn.embedly.com/widgets/media.html?src=https://player.vimeo.com/video/[redacted]?h=[redacted]&app_id=[redacted]&dntp=1&display_name=Vimeo&url=https://vimeo.com/[redacted]&key=[redacted]&type=text/html&schema=vimeo']
[debug] Encodings: locale cp65001, fs utf-8, pref cp65001, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2022.11.11 [8b644025b] (source)
[debug] Lazy loading extractors is disabled
[debug] Git HEAD: 78d25e0b7
[debug] Python 3.11.0 (CPython AMD64 64bit) - Windows-10-10.0.22000-SP0 (OpenSSL 1.1.1q  5 Jul 2022)
[debug] exe versions: ffmpeg n5.1.2-8-g5746987bad-20221204 (fdk,setts), ffprobe N-109332-g45ab5307a6-20221201, phantomjs 2.1.1
[debug] Optional libraries: Cryptodome-3.15.0, brotli-1.0.9, certifi-2022.09.24, mutagen-1.46.0, sqlite3-2.6.0, websockets-10.4
[debug] Proxy map: {}
[debug] Loaded 1751 extractors
[Embedly] Extracting URL: https://cdn.embedly.com/widgets/media.html?src=https://player.vimeo.com/video/[redacted]?h=[redacted]&app_id=[redacted]&dntp=1&display_name=Vimeo&url=https://vimeo.com/[redacted]&key=[redacted]&type=text/html&schema=vimeo
[vimeo] Extracting URL: https://player.vimeo.com/video/[redacted]?h=[redacted]#__youtubedl_smuggle=%7B%22http_headers%22%3A+%7B%22Referer%22%3A+%22https%3A%2F%2Fcdn.embedly.com%2Fwidgets%2Fmedia.html%3Fsrc%3Dhttps%3A%2F%2Fplayer.vimeo.com%2Fvideo%2F[redacted]%3Fh%3D[redacted]%26app_id%3D[redacted]%26dntp%3D1%26display_name%3DVimeo%26url%3Dhttps%3A%2F%2Fvimeo.com%2F[redacted]%26key%3D[redacted]%26type%3Dtext%2Fhtml%26schema%3Dvimeo%22%7D%7D
[vimeo] [redacted]: Downloading webpage
[vimeo] [redacted]: Downloading akfire_interconnect_quic m3u8 information
[vimeo] [redacted]: Downloading akfire_interconnect_quic m3u8 information
[vimeo] [redacted]: Downloading fastly_skyfire m3u8 information
[vimeo] [redacted]: Downloading fastly_skyfire m3u8 information
[vimeo] [redacted]: Downloading akfire_interconnect_quic MPD information
[vimeo] [redacted]: Downloading akfire_interconnect_quic MPD information
[vimeo] [redacted]: Downloading fastly_skyfire MPD information
[vimeo] [redacted]: Downloading fastly_skyfire MPD information
[debug] Sort order given by extractor: quality, res, fps, hdr:12, source
[debug] Formats sorted by: hasvid, ie_pref, quality, res, fps, hdr:12(7), source, lang, vcodec:vp9.2(10), channels, acodec, filesize, fs_approx, tbr, vbr, abr, asr, proto, vext, aext, hasaud, id
[debug] Default format spec: bestvideo*+bestaudio/best
[info] [redacted]: Downloading 1 format(s): dash-fastly_skyfire_sep-video-c368c1f6+dash-fastly_skyfire_sep-audio-8c7d422c
[debug] Invoking dashsegments downloader on "[redacted]"
[dashsegments] Total fragments: 870
[download] Destination: [redacted].fdash-fastly_skyfire_sep-video-c368c1f6.mp4
[debug] File locking is not supported. Proceeding without locking
[download]   0.8% of ~  30.03MiB at   59.34KiB/s ETA 05:34 (frag 7/870)
ERROR: Interrupted by user

Thanks, I can confirm I works fine with latest release yt-dlp 2023.01.02.

Still not working for me.
Using version 2023.01.06.
 yt-dlp.exe -v 'https://player.vimeo.com/video/700930056'

Still not working for me. Using version 2023.01.06.  yt-dlp.exe -v 'https://player.vimeo.com/video/700930056'

Confirmed: same version + problem here!
@pukkandan please reopen

it's been fixed in the master branch, meaning it will be fixed in the next release. If you don't want to wait for the next release, you can use the newest automated daily build, or install from master with PIP

authors: J0s3f JimLoose Massedil MusiCode1 bashonly pukkandan


text:
[youtube] force uploader_id to give id not nickname?

DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE

[X] I understand that I will be blocked if I remove or skip any mandatory* field

Checklist

[X] I'm asking a question and not reporting a bug or requesting a feature
[X] I've looked through the README
[X] I've verified that I'm running yt-dlp version 2022.10.04 (update instructions) or later (specify commit)
[X] I've searched the bugtracker for similar questions including closed ones. DO NOT post duplicates
[X] I've read the guidelines for opening an issue

Please make sure the question is worded well enough to be understood
When using the output option of uploader_id some channels get the channel id that starts with UC while some return channel nickname.
For example when downloading any video from https://www.youtube.com/c/LinusTechTips uploader_id = LinusTechTips
While downloading any video from https://www.youtube.com/c/ShortCircuit uploader_id = UCdBK94H6oZT2Q7l0-b0xmMg
I want it to only give the channel id not nickname.
Provide verbose output that clearly demonstrates the problem

[ ] Run your yt-dlp command with -vU flag added (yt-dlp -vU <your command line>)
[ ] Copy the WHOLE output (starting with [debug] Command-line config) and insert it below

Complete Verbose Output
No response

you can use channel_id instead of uploader_id

you can use channel_id instead of uploader_id

Thank you.  Just looked at my old batch script and I seem to have switched from using channel_id to uploader_id for some reason.

authors: Gage-Irwin bashonly


text:
[extractor/tvp] better hints for geoblock

DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE

[X] I understand that I will be blocked if I intentionally remove or skip any mandatory* field

Checklist

[X] I'm requesting a site-specific feature
[X] I've verified that I'm running yt-dlp version 2023.03.04 (update instructions) or later (specify commit)
[X] I've checked that all provided URLs are playable in a browser with the same IP and same login details
[X] I've searched known issues and the bugtracker for similar issues including closed ones. DO NOT post duplicates
[X] I've read the guidelines for opening an issue
[ ] I've read about sharing account credentials and I'm willing to share it if required

Region
Netherlands
Example URLs
https://vod.tvp.pl/filmy-dokumentalne,163/krzysztof-krawczyk--cale-moje-zycie,332512
Provide a description that is worded well enough to be understood
turns out at least some geo-restricted videos play in browser if logged in to a free account (might be EU only). the geoblock error message I'm getting when not logged in is this:

Z powodów licencyjnych materiał jest niedostępny w Twoim kraju.
Przepisy UE pozwalają abonentom, którzy w kraju zamieszkania (w tym przypadku w PL) zakupili pakiet TVP + utrzymać dostęp do materiałów wchodzących w skład pakietu, w czasie wizyty w innym kraju UE.

so I guess they wanted to implement this as it says but made an assumption that an account logged in means SVOD and not logged in means AVOD? login is by cookies and --cookies-from-browser firefox works for me on yt-dlp master
Provide verbose output that clearly demonstrates the problem

[X] Run your yt-dlp command with -vU flag added (yt-dlp -vU <your command line>)
[X] If using API, add 'verbose': True to YoutubeDL params instead
[X] Copy the WHOLE output (starting with [debug] Command-line config) and insert it below

Complete Verbose Output
not logged in:
[debug] Command-line config: ['https://vod.tvp.pl/filmy-dokumentalne,163/krzysztof-krawczyk--cale-moje-zycie,332512', '-v', '--skip-download']
[debug] User config "/home/lauren/.config/yt-dlp/config": ['--concurrent-fragments', '8', '--netrc', '--trim-filenames', '64', '--sub-langs', 'all,-live_chat', '--embed-subs']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2023.03.04 [392389b7d] (source)
[debug] Lazy loading extractors is disabled
[debug] Git HEAD: ef8fb7f02
[debug] Python 3.11.3 (CPython x86_64 64bit) - Linux-6.1.27-1-lts-x86_64-with (OpenSSL 3.1.0 14 Mar 2023)
[debug] exe versions: ffmpeg 6.0 (setts), ffprobe 6.0
[debug] Optional libraries: Cryptodome-3.17, brotli-1.0.9, certifi-2022.12.07, mutagen-1.46.0, secretstorage-3.3.3, sqlite3-2.6.0, websockets-10.4
[debug] Proxy map: {}
[debug] Loaded 1813 extractors
[tvp:vod] Extracting URL: https://vod.tvp.pl/filmy-dokumentalne,163/krzysztof-krawczyk--cale-moje-zycie,332512
[tvp:vod] 332512: Downloading JSON metadata
[tvp:vod] 332512: Downloading JSON metadata
ERROR: [tvp:vod] 332512: Woronicza said: GEOIP_FILTER_FAILED (HTTP 403); please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
  File "/home/lauren/yt-dlp/yt_dlp/extractor/common.py", line 694, in extract
    ie_result = self._real_extract(url)
                ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/lauren/yt-dlp/yt_dlp/extractor/tvp.py", line 570, in _real_extract
    playlist = self._call_api(f'{video_id}/videos/playlist', video_id, query={'videoType': 'MOVIE'})
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/lauren/yt-dlp/yt_dlp/extractor/tvp.py", line 493, in _call_api
    raise ExtractorError(f'Woronicza said: {document.get("code")} (HTTP {urlh.status})')

browser cookies:
[debug] Command-line config: ['https://vod.tvp.pl/filmy-dokumentalne,163/krzysztof-krawczyk--cale-moje-zycie,332512', '-v', '--cookies-from-browser', 'firefox', '--skip-download']
[debug] User config "/home/lauren/.config/yt-dlp/config": ['--concurrent-fragments', '8', '--netrc', '--trim-filenames', '64', '--sub-langs', 'all,-live_chat', '--embed-subs']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2023.03.04 [392389b7d] (source)
[debug] Lazy loading extractors is disabled
[debug] Git HEAD: ef8fb7f02
[debug] Python 3.11.3 (CPython x86_64 64bit) - Linux-6.1.27-1-lts-x86_64-with (OpenSSL 3.1.0 14 Mar 2023)
[debug] exe versions: ffmpeg 6.0 (setts), ffprobe 6.0
[debug] Optional libraries: Cryptodome-3.17, brotli-1.0.9, certifi-2022.12.07, mutagen-1.46.0, secretstorage-3.3.3, sqlite3-2.6.0, websockets-10.4
[Cookies] Extracting cookies from firefox
[debug] Extracting cookies from: "/home/lauren/.mozilla/firefox/[redacted]/cookies.sqlite"
[Cookies] Extracted [redacted] cookies from firefox
[debug] Proxy map: {}
[debug] Loaded 1813 extractors
[tvp:vod] Extracting URL: https://vod.tvp.pl/filmy-dokumentalne,163/krzysztof-krawczyk--cale-moje-zycie,332512
[tvp:vod] 332512: Downloading JSON metadata
[tvp:vod] 332512: Downloading JSON metadata
[tvp:vod] 332512: Downloading m3u8 information
[tvp:vod] 332512: Downloading MPD manifest
[debug] Formats sorted by: hasvid, ie_pref, lang, quality, res, fps, hdr:12(7), vcodec:vp9.2(10), channels, acodec, filesize, fs_approx, tbr, vbr, abr, asr, proto, vext, aext, hasaud, source, id
[debug] Default format spec: bestvideo*+bestaudio/best
[info] 332512: Downloading 1 format(s): 5128+f1-a1-x3
[info] There's no subtitles for the requested languages

Given this site is clearly bad at enforcing geo-restrictions, can you please check if --geo-bypass-country CODE works
NOTE: --geo-bypass-country CODE has been replaced with --xff CODE in master

no, that works correctly:
[debug] Using fake IP 83.5.107.173 (PL) as X-Forwarded-For
[tvp:vod] Extracting URL: https://vod.tvp.pl/filmy-dokumentalne,163/krzysztof-krawczyk--cale-moje-zycie,332512
[tvp:vod] 332512: Downloading JSON metadata
[tvp:vod] 332512: Downloading JSON metadata
ERROR: [tvp:vod] 332512: Woronicza said: GEOIP_FILTER_FAILED (HTTP 403)

I expect that actually constructing a valid free account cookie is too hard, though ofc one never knows.
Is the suggestion that the extractor should include a free account and perform login with it?
Otherwise, if affected shows can be detected, the geo-restriction message could be changed to suggest the free account work-around when applicable.

the exact cookie that makes this work is session_uuid, which is just an UUID v4. sending a random one does not work.
the suggestion was that instead of just showing the user GEOIP_FILTER_FAILED we can say "btw you might be able to workaround this with a free account and --cookies-from-browser"
also noticed: sessions for vod.tvp.pl only last half an hour, but user.tvp.pl sessions last longer. I'm gonna look into renewing them

nevermind, this doesn't work anymore. I wonder if they are reading this

authors: dirkf gamer191 selfisekai


text:
Pls add function: Auto save info of videos

Pls add a function:
Auto save info of all downloaded videos in one log file,
or in diff .txt file for each video.
.
Need infos: The video link & title, Uploader link & name, Video Uploaded timestamp, Video Duration,
the files I saved for the link (filetype, resolution, filesize), for example, mp4 3840x2160 1.00G, aac 128k 30.00M, srt en 25.00K

--write-info-json               Write video metadata to a .info.json file
                                (this may contain personal information)

--print-to-file [WHEN:]TEMPLATE FILE
                                Append given template to the file. The
                                values of WHEN and TEMPLATE are same as that
                                of --print. FILE uses the same syntax as the
                                output template. This option can be used
                                multiple times

Do not remove the issue template!!

[x] I understand that I will be blocked if I intentionally remove or skip any mandatory* field

authors: bashonly downleak


text:
[bbc] Respect --no-playlist

Please follow the guide below

You will be asked some questions, please read them carefully and answer honestly
Put an x into all the boxes [ ] relevant to your pull request (like that [x])
Use Preview tab to see how your pull request will actually look like

Before submitting a pull request make sure you have:

[x] At least skimmed through contributing guidelines including yt-dlp coding conventions
[x] Searched the bugtracker for similar pull requests
[x] Checked the code with flake8

In order to be accepted and merged into yt-dlp each piece of code must be in public domain or released under Unlicense. Check one of the following options:

[x] I am the original author of this code and I am willing to release it under Unlicense
[ ] I am not the original author of this code but it is in public domain or released under Unlicense (provide reliable evidence)

What is the purpose of your pull request?

[ ] Bug fix
[x] Improvement
[ ] New extractor
[ ] New feature

Description of your pull request and other information
If --no-playlist was used on a URL containing the seriesId parameter, the option was not respected before.
Example:
yt-dlp --no-playlist -F "https://www.bbc.co.uk/iplayer/episodes/p09twdp8/showtrial?seriesId=p09twdth"

This seems to cause infinite recursion for some reason, I'll need to fix that.

This is @remitamine's code. In yt-dl I didn't get infinite recursion with the commit applied, but it had no effect.
If the aim is to get the "Start Watching" episode when --no-playlist is used, I don't think just clearing the series_id will do the job. You either have to get the first episode from the playlist that otherwise be selected, or pull the episode URL from the page, as in this patch for yt-dl (self._downloader.params.get() vs self.get_param()):
--- old/youtube_dl/extractor/bbc.py
+++ new/youtube_dl/extractor/bbc.py
@@ -20,6 +20,7 @@
     OnDemandPagedList,
     clean_html,
     dict_get,
+    extract_attributes,
     float_or_none,
     get_element_by_class,
     int_or_none,
@@ -1410,9 +1411,19 @@

     def _real_extract(self, url):
         pid = self._match_id(url)
+        if self._downloader.params.get('noplaylist'):
+            webpage = self._download_webpage(url, pid)
+            start_tag = self._search_regex(
+                r'''<a\s[^>]*?data-bbc-content-label\s*=\s*(?P<q>'|"|\b)start-watching(?P=q)[^>]*>''',
+                webpage, 'Start Watching', default='', group=0)
+            start_tag = extract_attributes(start_tag)
+            start_url = start_tag.get('href')
+            if start_url:
+                self.to_screen('Downloading just starting video because of --no-playlist')
+                return self.url_result(urljoin(url, start_url))
         qs = compat_parse_qs(compat_urllib_parse_urlparse(url).query)
-        series_id = qs.get('seriesId', [None])[0]
-        page = qs.get('page', [None])[0]
+        series_id = qs.get('seriesId', [None])[-1]
+        page = qs.get('page', [None])[-1]
         per_page = 36 if page else self._PAGE_SIZE
         fetch_page = functools.partial(self._fetch_page, pid, per_page, series_id)
         entries = fetch_page(int(page) - 1) if page else OnDemandPagedList(fetch_page, self._PAGE_SIZE)

Also, as a matter of detail, you would presumably always want the last [-1] value for a parameter from the URL, not the [0] first. In yt-dlp,
Not entirely relevant to the PR, it might be considered whether the --yes/no-playlist option is well implemented.
In yt-dl (and I assume yt-dlp too), --no-playlist sets a boolean flag, which means that if a single video page also includes a playlist, you can't force the playlist to be selected with --yes-playlist, as that is equivalent to having no option at all. In fact the only use for it is to override a --no-playlist from another set of config options, which seems an unlikely case since these options target specific page types.
There are many sites where the default media page also includes a playlist. In such cases the playlist can only be accessed if the extractor gets the playlist as default, requiring --no-playlist to be specified to get the single media item. In this case it would be good to be able to say --yes-playlist to get the playlist while making the single media item the default extraction target.
We could introduce an explicit None value for the option "flag" to give 3 states:

True (or truthy? --no-playlist specified): select a single video and not the apparent playlist in the page;
None (neither of --yes/no-playlist specified): select the extractor default for the page;
False (or falsey except None? --yes-playlist specified): select a playlist and not the apparent single video in the page.

Existing code that checks for --no-playlist by testing anything other than is/is not False would not be affected.

You're right, the infinite recursion wasn't caused by this but something else. But indeed, this doesn't seem to actually work as-is.

The infinite loop issue has been fixed for a while @nyuszika7h. Any reason this is still draft?
A 3-stage --no/yes/force-playlist is a bit tricky to implement since we dont want any code that checks for noplaylist's truthiness to break. This is definitely not in the scope of this PR. Maybe consider opening a new feature-request for it

source: gharchive/pull-request

authors: dirkf nyuszika7h pukkandan