Repository: yt-dlp
Issue: Roosterteeth/Brightcove fallback gives 403 Forbidden errors in certain video fragments
Labels: external issue,site-bug

### 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 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](https://github.com/yt-dlp/yt-dlp#update-channels))
- [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](https://github.com/yt-dlp/yt-dlp/wiki/FAQ#video-url-contains-an-ampersand--and-im-getting-some-strange-output-1-2839-or-v-is-not-recognized-as-an-internal-or-external-command)
- [X] I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
- [X] I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
- [X] I've read about [sharing account credentials](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#are-you-willing-to-share-account-details-if-needed) and I'm willing to share it if required

### Region

United States

### Provide a description that is worded well enough to be understood

Issue #9403 and commit b2cc150 added a Brightcove fallback to downloads from Roosterteeth that were encountering HTTP Error 403: Forbidden. While some videos are fixed, other videos are still encountering these 403 Forbidden errors in specific fragments after falling back, even though the video plays perfectly online. This is especially an issue for archiving a full series, where video 70 of 264 may encounter errors that will go unnoticed until after the source is deleted when RT shuts down in a couple months.

### 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

```shell
[debug] Command-line config: ['-vU', 'https://roosterteeth.com/watch/lets-play-2012-15']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version master@2024.03.10.193100 from yt-dlp/yt-dlp-master-builds [615a84447] (win_exe)
[debug] Python 3.8.10 (CPython AMD64 64bit) - Windows-10-10.0.19045-SP0 (OpenSSL 1.1.1k  25 Mar 2021)
[debug] exe versions: ffmpeg 6.1.1-full_build-www.gyan.dev (setts), ffprobe 6.1.1-full_build-www.gyan.dev
[debug] Optional libraries: Cryptodome-3.20.0, brotli-1.1.0, certifi-2024.02.02, mutagen-1.47.0, requests-2.31.0, sqlite3-3.35.5, urllib3-2.2.1, websockets-12.0
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets
[debug] Loaded 1803 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp-master-builds/releases/latest
Latest version: master@2024.03.10.193100 from yt-dlp/yt-dlp-master-builds
yt-dlp is up to date (master@2024.03.10.193100 from yt-dlp/yt-dlp-master-builds)
[RoosterTeeth] Extracting URL: https://roosterteeth.com/watch/lets-play-2012-15
[RoosterTeeth] lets-play-2012-15: Downloading video JSON metadata
[RoosterTeeth] lets-play-2012-15: Downloading m3u8 information
WARNING: [RoosterTeeth] Direct m3u8 URL returned HTTP Error 403; retrying with Brightcove extraction
[brightcove:new] Extracting URL: https://players.brightcove.net/6203312018001/default_default/index.html?videoId=6311616776112#__youtubedl_smuggle=%7B%22referrer%22%3A+%22https%3A%2F%2Froosterteeth.com%2Fwatch%2Flets-play-2012-15%22%7D
[debug] Loading brightcove.6203312018001_default from cache
[brightcove:new] 6311616776112: Downloading JSON metadata
[brightcove:new] 6311616776112: Downloading m3u8 information
[RoosterTeeth] lets-play-2012-15: Downloading episode JSON metadata
[debug] Formats sorted by: hasvid, ie_pref, lang, quality, res, fps, hdr:12(7), vcodec:vp9.2(10), channels, acodec, size, br, asr, proto, vext, aext, hasaud, source, id
[debug] Default format spec: bestvideo*+bestaudio/best
[info] 17888: Downloading 1 format(s): hls-27493
[debug] Invoking hlsnative downloader on "https://rtv2-video.roosterteeth.com/uploads/videos/e9ecb102-7173-4a3c-a34a-91f4204468fd/1080P.m3u8"
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 2063
[download] Destination: Far Cry 3 Episode 3 [17888].mp4
[debug] File locking is not supported. Proceeding without locking
[download]   0.0% of ~   1.83GiB at    1.19MiB/s ETA Unknown (frag 1/2063)[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 2 (1/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 2 (2/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 2 (3/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 2 (4/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 2 (5/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 2 (6/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 2 (7/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 2 (8/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 2 (9/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 2 (10/10)...
[download] fragment not found; Skipping fragment 2 ...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 3 (1/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 3 (2/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 3 (3/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 3 (4/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 3 (5/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 3 (6/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 3 (7/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 3 (8/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 3 (9/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 3 (10/10)...
[download] fragment not found; Skipping fragment 3 ...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 4 (1/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 4 (2/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 4 (3/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 4 (4/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 4 (5/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 4 (6/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 4 (7/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 4 (8/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 4 (9/10)...
[download] Got error: HTTP Error 403: Forbidden. Retrying fragment 4 (10/10)...
[download] fragment not found; Skipping fragment 4 ...
[download] 100% of    1.82GiB in 00:07:16 at 4.27MiB/s
[debug] ffprobe command line: ffprobe -hide_banner -show_format -show_streams -print_format json "file:Far Cry 3 Episode 3 [17888].mp4"
[debug] ffmpeg command line: ffprobe -show_streams "file:Far Cry 3 Episode 3 [17888].mp4"
[FixupM3u8] Fixing MPEG-TS in MP4 container of "Far Cry 3 Episode 3 [17888].mp4"
[debug] ffmpeg command line: ffmpeg -y -loglevel "repeat+info" -i "file:Far Cry 3 Episode 3 [17888].mp4" -map 0 -dn -ignore_unknown -c copy -f mp4 "-bsf:a" aac_adtstoasc -movflags "+faststart" "file:Far Cry 3 Episode 3 [17888].temp.mp4```
```