diff --git a/yt_dlp/extractor/archiveorg.py b/yt_dlp/extractor/archiveorg.py
index f5a55efc4ff1..2849d9fd5b0d 100644
--- a/yt_dlp/extractor/archiveorg.py
+++ b/yt_dlp/extractor/archiveorg.py
@@ -205,6 +205,26 @@ class ArchiveOrgIE(InfoExtractor):
                 },
             },
         ],
+    }, {
+        # The reviewbody is None for one of the reviews; just need to extract data without crashing
+        'url': 'https://archive.org/details/gd95-04-02.sbd.11622.sbeok.shnf/gd95-04-02d1t04.shn',
+        'info_dict': {
+            'id': 'gd95-04-02.sbd.11622.sbeok.shnf/gd95-04-02d1t04.shn',
+            'ext': 'mp3',
+            'title': 'Stuck Inside of Mobile with the Memphis Blues Again',
+            'creators': ['Grateful Dead'],
+            'duration': 338.31,
+            'track': 'Stuck Inside of Mobile with the Memphis Blues Again',
+            'description': 'md5:764348a470b986f1217ffd38d6ac7b72',
+            'display_id': 'gd95-04-02d1t04.shn',
+            'location': 'Pyramid Arena',
+            'uploader': 'jon@archive.org',
+            'album': '1995-04-02 - Pyramid Arena',
+            'upload_date': '20040519',
+            'track_number': 4,
+            'release_date': '19950402',
+            'timestamp': 1084927901,
+        },
     }]

     @staticmethod
@@ -335,7 +355,7 @@ def _real_extract(self, url):
                 info['comments'].append({
                     'id': review.get('review_id'),
                     'author': review.get('reviewer'),
-                    'text': str_or_none(review.get('reviewtitle'), '') + '\n\n' + review.get('reviewbody'),
+                    'text': join_nonempty('reviewtitle', 'reviewbody', from_dict=review, delim='\n\n'),
                     'timestamp': unified_timestamp(review.get('createdate')),
                     'parent': 'root'})

[archive.org] ERROR: can only concatenate str (not "NoneType") to str - sporadic, only on certain URLs
### 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

I'm getting the error in the title, and in the verbose output, when attempting to download certain archive.org URLs, but not others.

Downloading https://archive.org/details/gd95-04-02.sbd.11622.sbeok.shnf fails with the provided log output; however, downloading, say, https://archive.org/details/gd1995-04-02.nak300.holtz.91056.flac16 is successful.

However, I was able to "fix" the bug by editing my local installation of `yt-dlp`. Apparently, in some cases, the "reviewbody" attribute might be missing from the review, which causes a `TypeError` when an attempt at string concatenation is made. Forcing the body to empty-string in these cases was enough to bypass the crash and allow the download to proceed.
```diff
diff --git a/yt_dlp/extractor/archiveorg.py b/yt_dlp/extractor/archiveorg.py
index f5a55efc4..2869e5233 100644
--- a/yt_dlp/extractor/archiveorg.py
+++ b/yt_dlp/extractor/archiveorg.py
@@ -335,7 +335,7 @@ def _real_extract(self, url):
                 info['comments'].append({
                     'id': review.get('review_id'),
                     'author': review.get('reviewer'),
-                    'text': str_or_none(review.get('reviewtitle'), '') + '\n\n' + review.get('reviewbody'),
+                    'text': str_or_none(review.get('reviewtitle'), '') + '\n\n' + str_or_none(review.get('reviewbody'), ''),
                     'timestamp': unified_timestamp(review.get('createdate')),
                     'parent': 'root'})
```
I put "fix" in quotes, though, because I'm not familiar enough with the yt-dlp codebase as a whole to know whether this "fix" doesn't cause its own problems; I'm decent at Python and I figured I might as well take a stab at patching over the "obvious" problem, and it did work in my case.

However, it might well be the case that this hack breaks other components of the archive.org extractor - for example, some sort of other advanced functionality that I'm not familiar with (that my simple download request didn't invoke), which depends on a correctly-parsed review body in order to do its job.

That said, I can certainly file that PR if a maintainer indicates that the change wouldn't have unintended consequences.

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

```shell
[debug] Command-line config: ['-vU', '--playlist-items', '4:5', 'https://archive.org/details/gd95-04-02.sbd.11622.sbeok.shnf']
[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.11.04 from yt-dlp/yt-dlp [197d0b03b]
[debug] Python 3.12.7 (CPython x86_64 64bit) - Linux-6.11.6-arch1-1-x86_64-with-glibc2.40 (OpenSSL 3.4.0 22 Oct 2024, glibc 2.40)
[debug] exe versions: ffmpeg 7.1 (setts), ffprobe 7.1, rtmpdump 2.4
[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.46.1, urllib3-1.26.20, websockets-12.0
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests
[debug] Loaded 1838 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: stable@2024.11.04 from yt-dlp/yt-dlp
yt-dlp is up to date (stable@2024.11.04 from yt-dlp/yt-dlp)
[archive.org] Extracting URL: https://archive.org/details/gd95-04-02.sbd.11622.sbeok.shnf
[archive.org] gd95-04-02.sbd.11622.sbeok.shnf: Downloading webpage
[archive.org] gd95-04-02.sbd.11622.sbeok.shnf: Downloading JSON metadata
ERROR: can only concatenate str (not "NoneType") to str
Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py", line 1625, in wrapper
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py", line 1760, in __extract_info
    ie_result = ie.extract(url)
                ^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/yt_dlp/extractor/common.py", line 742, in extract
    ie_result = self._real_extract(url)
                ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/yt_dlp/extractor/archiveorg.py", line 338, in _real_extract
    'text': str_or_none(review.get('reviewtitle'), '') + '\n\n' + review.get('reviewbody'),
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
TypeError: can only concatenate str (not "NoneType") to str
```

 ideally, `join_nonempty` would've been used here

```diff
diff --git a/yt_dlp/extractor/archiveorg.py b/yt_dlp/extractor/archiveorg.py
index f5a55efc4..52fd02acc 100644
--- a/yt_dlp/extractor/archiveorg.py
+++ b/yt_dlp/extractor/archiveorg.py
@@ -335,7 +335,7 @@ def _real_extract(self, url):
                 info['comments'].append({
                     'id': review.get('review_id'),
                     'author': review.get('reviewer'),
-                    'text': str_or_none(review.get('reviewtitle'), '') + '\n\n' + review.get('reviewbody'),
+                    'text': join_nonempty('reviewtitle', 'reviewbody', from_dict=review, delim='\n\n'),
                     'timestamp': unified_timestamp(review.get('createdate')),
                     'parent': 'root'})

```


diff --git a/yt_dlp/extractor/facebook.py b/yt_dlp/extractor/facebook.py
index 2bcb5a8411f1..91e2f3489cea 100644
--- a/yt_dlp/extractor/facebook.py
+++ b/yt_dlp/extractor/facebook.py
@@ -563,13 +563,13 @@ def extract_from_jsmods_instances(js_data):
                 return extract_video_data(try_get(
                     js_data, lambda x: x['jsmods']['instances'], list) or [])

-        def extract_dash_manifest(video, formats):
+        def extract_dash_manifest(vid_data, formats, mpd_url=None):
             dash_manifest = traverse_obj(
-                video, 'dash_manifest', 'playlist', 'dash_manifest_xml_string', expected_type=str)
+                vid_data, 'dash_manifest', 'playlist', 'dash_manifest_xml_string', 'manifest_xml', expected_type=str)
             if dash_manifest:
                 formats.extend(self._parse_mpd_formats(
                     compat_etree_fromstring(urllib.parse.unquote_plus(dash_manifest)),
-                    mpd_url=url_or_none(video.get('dash_manifest_url'))))
+                    mpd_url=url_or_none(video.get('dash_manifest_url')) or mpd_url))

         def process_formats(info):
             # Downloads with browser's User-Agent are rate limited. Working around
@@ -619,9 +619,12 @@ def parse_graphql_video(video):
                         video = video['creation_story']
                         video['owner'] = traverse_obj(video, ('short_form_video_context', 'video_owner'))
                         video.update(reel_info)
-                    fmt_data = traverse_obj(video, ('videoDeliveryLegacyFields', {dict})) or video
+
                     formats = []
                     q = qualities(['sd', 'hd'])
+
+                    # Legacy formats extraction
+                    fmt_data = traverse_obj(video, ('videoDeliveryLegacyFields', {dict})) or video
                     for key, format_id in (('playable_url', 'sd'), ('playable_url_quality_hd', 'hd'),
                                            ('playable_url_dash', ''), ('browser_native_hd_url', 'hd'),
                                            ('browser_native_sd_url', 'sd')):
@@ -629,7 +632,7 @@ def parse_graphql_video(video):
                         if not playable_url:
                             continue
                         if determine_ext(playable_url) == 'mpd':
-                            formats.extend(self._extract_mpd_formats(playable_url, video_id))
+                            formats.extend(self._extract_mpd_formats(playable_url, video_id, fatal=False))
                         else:
                             formats.append({
                                 'format_id': format_id,
@@ -638,6 +641,28 @@ def parse_graphql_video(video):
                                 'url': playable_url,
                             })
                     extract_dash_manifest(fmt_data, formats)
+
+                    # New videoDeliveryResponse formats extraction
+                    fmt_data = traverse_obj(video, ('videoDeliveryResponseFragment', 'videoDeliveryResponseResult'))
+                    mpd_urls = traverse_obj(fmt_data, ('dash_manifest_urls', ..., 'manifest_url', {url_or_none}))
+                    dash_manifests = traverse_obj(fmt_data, ('dash_manifests', lambda _, v: v['manifest_xml']))
+                    for idx, dash_manifest in enumerate(dash_manifests):
+                        extract_dash_manifest(dash_manifest, formats, mpd_url=traverse_obj(mpd_urls, idx))
+                    if not dash_manifests:
+                        # Only extract from MPD URLs if the manifests are not already provided
+                        for mpd_url in mpd_urls:
+                            formats.extend(self._extract_mpd_formats(mpd_url, video_id, fatal=False))
+                    for prog_fmt in traverse_obj(fmt_data, ('progressive_urls', lambda _, v: v['progressive_url'])):
+                        format_id = traverse_obj(prog_fmt, ('metadata', 'quality', {str.lower}))
+                        formats.append({
+                            'format_id': format_id,
+                            # sd, hd formats w/o resolution info should be deprioritized below DASH
+                            'quality': q(format_id) - 3,
+                            'url': prog_fmt['progressive_url'],
+                        })
+                    for m3u8_url in traverse_obj(fmt_data, ('hls_playlist_urls', ..., 'hls_playlist_url', {url_or_none})):
+                        formats.extend(self._extract_m3u8_formats(m3u8_url, video_id, 'mp4', fatal=False, m3u8_id='hls'))
+
                     if not formats:
                         # Do not append false positive entry w/o any formats
                         return

[facebook] ERROR: No video formats found (on >= 2024.11.04)
### 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

US

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

Please note this is not related to #11337 and is new.  I had the problem reported in that issue, and it went away for about a week or so after updating to the nightly build.  This problem is new in the past week.

I've duplicated this on Windows and Mac, and it appears as though it's specifically related to private group videos.  I've tested `--cookies-from-browser` for `chrome`, `firefox`, and `safari`, all with the same results.

If needed, I can invite any developers to the group for troubleshooting, videos are SFW (youth hockey video).

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

```shell
[debug] Command-line config: ['--cookies-from-browser', 'safari', 'https://www.facebook.com/1358150084/videos/7350931248365050/', '-vU']
[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.11.09.232836 from yt-dlp/yt-dlp-nightly-builds [f13df591d] (pip)
[debug] Python 3.12.2 (CPython arm64 64bit) - macOS-14.6.1-arm64-arm-64bit (OpenSSL 3.3.2 3 Sep 2024)
[debug] exe versions: ffmpeg 7.1 (setts), ffprobe 7.1, rtmpdump 2.4
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, mutagen-1.47.0, requests-2.32.3, sqlite3-3.43.2, urllib3-2.2.3, websockets-13.1
[debug] Proxy map: {}
[debug] Trying secondary cookie location
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     2[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     2[debug] skipping 4 bytes (unknown record field 1): b'\x01\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x01\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     4[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     1[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     1[debug] skipping 4 bytes (unknown record field 1): b'\x02\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     3[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     2[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     4[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     3[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     2[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     1[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     1[debug] skipping 4 bytes (unknown record field 1): b'\x02\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     2[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     9[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     7[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     1[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     2[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     1[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     3[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     1[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     1[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     1[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     1[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     1[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     1[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     3[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     1[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     2[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     8[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     3[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     3[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     1[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     2[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     1[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown page header field): b'\x00\x00\x00\x00'
[Cookies] Loading cookie      0/     1[debug] skipping 4 bytes (unknown record field 1): b'\x00\x00\x00\x00'
[debug] skipping 4 bytes (unknown record field 2): b'\x00\x00\x00\x00'
[debug] skipping 8 bytes (unknown record field 3): b'\x00\x00\x00\x00\x00\x00\x00\x00'
[debug] skipping 87 bytes (footer): b'\x00\x02\xe4R\x07\x17 \x05\x00\x00\x00Kbplist00\xd1\x01\x02_\x10\x18NSHTTPCookieAcceptPolicy\x10\x02\x08\x0b&\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00('
Extracted 82 cookies from safari
[debug] Request Handlers: urllib, requests, websockets
[debug] Loaded 1839 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp-nightly-builds/releases/latest
Latest version: nightly@2024.11.09.232836 from yt-dlp/yt-dlp-nightly-builds
yt-dlp is up to date (nightly@2024.11.09.232836 from yt-dlp/yt-dlp-nightly-builds)
[facebook] Extracting URL: https://www.facebook.com/1358150084/videos/7350931248365050/
[facebook] 7350931248365050: Downloading webpage
ERROR: [facebook] 7350931248365050: No video formats 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
Traceback (most recent call last):
  File "/Users/justine/.pyenv/versions/3.12.2/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py", line 1625, in wrapper
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/justine/.pyenv/versions/3.12.2/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py", line 1781, in __extract_info
    return self.process_ie_result(ie_result, download, extra_info)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/justine/.pyenv/versions/3.12.2/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py", line 1840, in process_ie_result
    ie_result = self.process_video_result(ie_result, download=download)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/justine/.pyenv/versions/3.12.2/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py", line 2846, in process_video_result
    self.raise_no_formats(info_dict)
  File "/Users/justine/.pyenv/versions/3.12.2/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py", line 1122, in raise_no_formats
    raise ExtractorError(msg, video_id=info['id'], ie=info['extractor'],
yt_dlp.utils.ExtractorError: [facebook] 7350931248365050: No video formats 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
```

The debug output during cookies extraction is a bit concerning; are you sure the facebook cookies are being successfully extracted/passed? Have you tried with `--cookies` instead?
I didn't, but here's the debug output pulling cookies from chrome giving the same end result without all the cookie parsing output:
```
[debug] Command-line config: ['--cookies-from-browser', 'chrome', 'https://www.facebook.com/1358150084/videos/7350931248365050/', '-vU']
[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.11.09.232836 from yt-dlp/yt-dlp-nightly-builds [f13df591d] (pip)
[debug] Python 3.12.2 (CPython arm64 64bit) - macOS-14.6.1-arm64-arm-64bit (OpenSSL 3.3.2 3 Sep 2024)
[debug] exe versions: ffmpeg 7.1 (setts), ffprobe 7.1, rtmpdump 2.4
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, mutagen-1.47.0, requests-2.32.3, sqlite3-3.43.2, urllib3-2.2.3, websockets-13.1
[debug] Proxy map: {}
Extracting cookies from chrome
[debug] Extracting cookies from: "/Users/justine/Library/Application Support/Google/Chrome/Default/Cookies"
[debug] using find-generic-password to obtain password from OSX keychain
Extracted 308 cookies from chrome
[debug] cookie version breakdown: {'v10': 314, 'other': 0, 'unencrypted': 0}
[debug] Request Handlers: urllib, requests, websockets
[debug] Loaded 1839 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp-nightly-builds/releases/latest
[debug] Downloading _update_spec from https://github.com/yt-dlp/yt-dlp-nightly-builds/releases/latest/download/_update_spec
Current version: nightly@2024.11.09.232836 from yt-dlp/yt-dlp-nightly-builds
Latest version: nightly@2024.11.10.232816 from yt-dlp/yt-dlp-nightly-builds
ERROR: You installed yt-dlp with pip or using the wheel from PyPi; Use that to update
[facebook] Extracting URL: https://www.facebook.com/1358150084/videos/7350931248365050/
[facebook] 7350931248365050: Downloading webpage
ERROR: [facebook] 7350931248365050: No video formats 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
Traceback (most recent call last):
  File "/Users/justine/.pyenv/versions/3.12.2/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py", line 1625, in wrapper
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/justine/.pyenv/versions/3.12.2/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py", line 1781, in __extract_info
    return self.process_ie_result(ie_result, download, extra_info)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/justine/.pyenv/versions/3.12.2/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py", line 1840, in process_ie_result
    ie_result = self.process_video_result(ie_result, download=download)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/justine/.pyenv/versions/3.12.2/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py", line 2846, in process_video_result
    self.raise_no_formats(info_dict)
  File "/Users/justine/.pyenv/versions/3.12.2/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py", line 1122, in raise_no_formats
    raise ExtractorError(msg, video_id=info['id'], ie=info['extractor'],
yt_dlp.utils.ExtractorError: [facebook] 7350931248365050: No video formats 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
```
If you want to add `--write-pages` to your command (with `--cookies-from-browser chrome`) and send me the resulting `.dump` file(s), I could take a look at what can be done (if they tell me anything at all). I'd advise not to post them publicly, since they could contain personal information (e.g. your FB username / ID / display name). You could send them to me over [discord](https://discord.gg/H5MNcFW63r) (same username) or via email: `bashonly ( a t) proton mail [d o t] com`
Sent to your proton mail.
I have a similar but maybe different issue. Same kind of response but with a publicly available video.

https://www.facebook.com/watch/?v=1085099419908696&rdid=tfjgd4h6VuK74V0w

[1085099419908696-560p-סוף שבוע טוב וגם מצחיק קצת 🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣 ｜ By שלמה טל.info.json](https://github.com/user-attachments/files/17709270/1085099419908696-560p-.By.info.json)
[fb1085099419908696.http.txt](https://github.com/user-attachments/files/17709274/fb1085099419908696.http.txt)
[1085099419908696_https_-_www.facebook.com_100037646286664_videos_1085099419908696_rdid=tfjgd4h6VuK74V0w.dump.html.txt](https://github.com/user-attachments/files/17709277/1085099419908696_https_-_www.facebook.com_100037646286664_videos_1085099419908696_rdid.tfjgd4h6VuK74V0w.dump.html.txt)

and this patch get the job done:
```patch
diff --git a/yt_dlp/extractor/facebook.py b/yt_dlp/extractor/facebook.py
index 2bcb5a841..c4fa88c05 100644
--- a/yt_dlp/extractor/facebook.py
+++ b/yt_dlp/extractor/facebook.py
@@ -566,6 +566,10 @@ def extract_from_jsmods_instances(js_data):
         def extract_dash_manifest(video, formats):
             dash_manifest = traverse_obj(
                 video, 'dash_manifest', 'playlist', 'dash_manifest_xml_string', expected_type=str)
+            if not dash_manifest:
+                videoDeliveryResponseFragment = (
+                    'videoDeliveryResponseFragment', 'videoDeliveryResponseResult', 'dash_manifests', 0, 'manifest_xml')
+                dash_manifest = traverse_obj(video, videoDeliveryResponseFragment, expected_type=str)
             if dash_manifest:
                 formats.extend(self._parse_mpd_formats(
                     compat_etree_fromstring(urllib.parse.unquote_plus(dash_manifest)),
```

Is it PR worthy, or too kludgy. Give me some feedback and I'll submit this
I manually applied the fix from @refack above to my installation and can confirm my videos are downloading now


diff --git a/yt_dlp/extractor/rutube.py b/yt_dlp/extractor/rutube.py
index 2c416811af35..abf9aec7276b 100644
--- a/yt_dlp/extractor/rutube.py
+++ b/yt_dlp/extractor/rutube.py
@@ -2,15 +2,18 @@

 from .common import InfoExtractor
 from ..utils import (
+    UnsupportedError,
     bool_or_none,
     determine_ext,
     int_or_none,
+    js_to_json,
     parse_qs,
-    traverse_obj,
+    str_or_none,
     try_get,
     unified_timestamp,
     url_or_none,
 )
+from ..utils.traversal import traverse_obj

 class RutubeBaseIE(InfoExtractor):
@@ -19,7 +22,7 @@ def _download_api_info(self, video_id, query=None):
             query = {}
         query['format'] = 'json'
         return self._download_json(
-            f'http://rutube.ru/api/video/{video_id}/',
+            f'https://rutube.ru/api/video/{video_id}/',
             video_id, 'Downloading video JSON',
             'Unable to download video JSON', query=query)

@@ -61,18 +64,21 @@ def _download_api_options(self, video_id, query=None):
             query = {}
         query['format'] = 'json'
         return self._download_json(
-            f'http://rutube.ru/api/play/options/{video_id}/',
+            f'https://rutube.ru/api/play/options/{video_id}/',
             video_id, 'Downloading options JSON',
             'Unable to download options JSON',
             headers=self.geo_verification_headers(), query=query)

-    def _extract_formats(self, options, video_id):
+    def _extract_formats_and_subtitles(self, options, video_id):
         formats = []
+        subtitles = {}
         for format_id, format_url in options['video_balancer'].items():
             ext = determine_ext(format_url)
             if ext == 'm3u8':
-                formats.extend(self._extract_m3u8_formats(
-                    format_url, video_id, 'mp4', m3u8_id=format_id, fatal=False))
+                fmts, subs = self._extract_m3u8_formats_and_subtitles(
+                    format_url, video_id, 'mp4', m3u8_id=format_id, fatal=False)
+                formats.extend(fmts)
+                self._merge_subtitles(subs, target=subtitles)
             elif ext == 'f4m':
                 formats.extend(self._extract_f4m_formats(
                     format_url, video_id, f4m_id=format_id, fatal=False))
@@ -82,11 +88,19 @@ def _extract_formats(self, options, video_id):
                     'format_id': format_id,
                 })
         for hls_url in traverse_obj(options, ('live_streams', 'hls', ..., 'url', {url_or_none})):
-            formats.extend(self._extract_m3u8_formats(hls_url, video_id, ext='mp4', fatal=False))
-        return formats
-
-    def _download_and_extract_formats(self, video_id, query=None):
-        return self._extract_formats(
+            fmts, subs = self._extract_m3u8_formats_and_subtitles(
+                hls_url, video_id, 'mp4', fatal=False, m3u8_id='hls')
+            formats.extend(fmts)
+            self._merge_subtitles(subs, target=subtitles)
+        for caption in traverse_obj(options, ('captions', lambda _, v: url_or_none(v['file']))):
+            subtitles.setdefault(caption.get('code') or 'ru', []).append({
+                'url': caption['file'],
+                'name': caption.get('langTitle'),
+            })
+        return formats, subtitles
+
+    def _download_and_extract_formats_and_subtitles(self, video_id, query=None):
+        return self._extract_formats_and_subtitles(
             self._download_api_options(video_id, query=query), video_id)

@@ -97,8 +111,8 @@ class RutubeIE(RutubeBaseIE):
     _EMBED_REGEX = [r']+?src=(["\'])(?P<url>(?:https?:)?//rutube\.ru/(?:play/)?embed/[\da-z]{32}.*?)\1']

     _TESTS = [{
-        'url': 'http://rutube.ru/video/3eac3b4561676c17df9132a9a1e62e3e/',
-        'md5': 'e33ac625efca66aba86cbec9851f2692',
+        'url': 'https://rutube.ru/video/3eac3b4561676c17df9132a9a1e62e3e/',
+        'md5': '3d73fdfe5bb81b9aef139e22ef3de26a',
         'info_dict': {
             'id': '3eac3b4561676c17df9132a9a1e62e3e',
             'ext': 'mp4',
@@ -111,26 +125,25 @@ class RutubeIE(RutubeBaseIE):
             'upload_date': '20131016',
             'age_limit': 0,
             'view_count': int,
-            'thumbnail': 'http://pic.rutubelist.ru/video/d2/a0/d2a0aec998494a396deafc7ba2c82add.jpg',
+            'thumbnail': 'https://pic.rutubelist.ru/video/d2/a0/d2a0aec998494a396deafc7ba2c82add.jpg',
             'categories': ['Новости и СМИ'],
             'chapters': [],
         },
-        'expected_warnings': ['Unable to download f4m'],
     }, {
-        'url': 'http://rutube.ru/play/embed/a10e53b86e8f349080f718582ce4c661',
+        'url': 'https://rutube.ru/play/embed/a10e53b86e8f349080f718582ce4c661',
         'only_matching': True,
     }, {
-        'url': 'http://rutube.ru/embed/a10e53b86e8f349080f718582ce4c661',
+        'url': 'https://rutube.ru/embed/a10e53b86e8f349080f718582ce4c661',
         'only_matching': True,
     }, {
-        'url': 'http://rutube.ru/video/3eac3b4561676c17df9132a9a1e62e3e/?pl_id=4252',
+        'url': 'https://rutube.ru/video/3eac3b4561676c17df9132a9a1e62e3e/?pl_id=4252',
         'only_matching': True,
     }, {
         'url': 'https://rutube.ru/video/10b3a03fc01d5bbcc632a2f3514e8aab/?pl_type=source',
         'only_matching': True,
     }, {
         'url': 'https://rutube.ru/video/private/884fb55f07a97ab673c7d654553e0f48/?p=x2QojCumHTS3rsKHWXN8Lg',
-        'md5': 'd106225f15d625538fe22971158e896f',
+        'md5': '4fce7b4fcc7b1bcaa3f45eb1e1ad0dd7',
         'info_dict': {
             'id': '884fb55f07a97ab673c7d654553e0f48',
             'ext': 'mp4',
@@ -143,11 +156,10 @@ class RutubeIE(RutubeBaseIE):
             'upload_date': '20221210',
             'age_limit': 0,
             'view_count': int,
-            'thumbnail': 'http://pic.rutubelist.ru/video/f2/d4/f2d42b54be0a6e69c1c22539e3152156.jpg',
+            'thumbnail': 'https://pic.rutubelist.ru/video/f2/d4/f2d42b54be0a6e69c1c22539e3152156.jpg',
             'categories': ['Видеоигры'],
             'chapters': [],
         },
-        'expected_warnings': ['Unable to download f4m'],
     }, {
         'url': 'https://rutube.ru/video/c65b465ad0c98c89f3b25cb03dcc87c6/',
         'info_dict': {
@@ -156,17 +168,16 @@ class RutubeIE(RutubeBaseIE):
             'chapters': 'count:4',
             'categories': ['Бизнес и предпринимательство'],
             'description': 'md5:252feac1305257d8c1bab215cedde75d',
-            'thumbnail': 'http://pic.rutubelist.ru/video/71/8f/718f27425ea9706073eb80883dd3787b.png',
+            'thumbnail': 'https://pic.rutubelist.ru/video/71/8f/718f27425ea9706073eb80883dd3787b.png',
             'duration': 782,
             'age_limit': 0,
             'uploader_id': '23491359',
             'timestamp': 1677153329,
             'view_count': int,
             'upload_date': '20230223',
-            'title': 'Бизнес с нуля: найм сотрудников. Интервью с директором строительной компании',
+            'title': 'Бизнес с нуля: найм сотрудников. Интервью с директором строительной компании #1',
             'uploader': 'Стас Быков',
         },
-        'expected_warnings': ['Unable to download f4m'],
     }, {
         'url': 'https://rutube.ru/live/video/c58f502c7bb34a8fcdd976b221fca292/',
         'info_dict': {
@@ -174,7 +185,7 @@ class RutubeIE(RutubeBaseIE):
             'ext': 'mp4',
             'categories': ['Телепередачи'],
             'description': '',
-            'thumbnail': 'http://pic.rutubelist.ru/video/14/19/14190807c0c48b40361aca93ad0867c7.jpg',
+            'thumbnail': 'https://pic.rutubelist.ru/video/14/19/14190807c0c48b40361aca93ad0867c7.jpg',
             'live_status': 'is_live',
             'age_limit': 0,
             'uploader_id': '23460655',
@@ -184,6 +195,24 @@ class RutubeIE(RutubeBaseIE):
             'title': r're:Первый канал. Прямой эфир \d{4}-\d{2}-\d{2} \d{2}:\d{2}$',
             'uploader': 'Первый канал',
         },
+    }, {
+        'url': 'https://rutube.ru/play/embed/03a9cb54bac3376af4c5cb0f18444e01/',
+        'info_dict': {
+            'id': '03a9cb54bac3376af4c5cb0f18444e01',
+            'ext': 'mp4',
+            'age_limit': 0,
+            'description': '',
+            'title': 'Церемония начала торгов акциями ПАО «ЕвроТранс»',
+            'chapters': [],
+            'upload_date': '20240829',
+            'duration': 293,
+            'uploader': 'MOEX - Московская биржа',
+            'timestamp': 1724946628,
+            'thumbnail': 'https://pic.rutubelist.ru/video/2e/24/2e241fddb459baf0fa54acfca44874f4.jpg',
+            'view_count': int,
+            'uploader_id': '38420507',
+            'categories': ['Интервью'],
+        },
     }, {
         'url': 'https://rutube.ru/video/5ab908fccfac5bb43ef2b1e4182256b0/',
         'only_matching': True,
@@ -192,40 +221,46 @@ class RutubeIE(RutubeBaseIE):
         'only_matching': True,
     }]

-    @classmethod
-    def suitable(cls, url):
-        return False if RutubePlaylistIE.suitable(url) else super().suitable(url)
-
     def _real_extract(self, url):
         video_id = self._match_id(url)
         query = parse_qs(url)
         info = self._download_and_extract_info(video_id, query)
-        info['formats'] = self._download_and_extract_formats(video_id, query)
-        return info
+        formats, subtitles = self._download_and_extract_formats_and_subtitles(video_id, query)
+        return {
+            **info,
+            'formats': formats,
+            'subtitles': subtitles,
+        }

 class RutubeEmbedIE(RutubeBaseIE):
     IE_NAME = 'rutube:embed'
     IE_DESC = 'Rutube embedded videos'
-    _VALID_URL = r'https?://rutube\.ru/(?:video|play)/embed/(?P<id>[0-9]+)'
+    _VALID_URL = r'https?://rutube\.ru/(?:video|play)/embed/(?P<id>[0-9]+)(?:[?#/]|$)'

     _TESTS = [{
-        'url': 'http://rutube.ru/video/embed/6722881?vk_puid37=&vk_puid38=',
+        'url': 'https://rutube.ru/video/embed/6722881?vk_puid37=&vk_puid38=',
         'info_dict': {
             'id': 'a10e53b86e8f349080f718582ce4c661',
             'ext': 'mp4',
             'timestamp': 1387830582,
             'upload_date': '20131223',
             'uploader_id': '297833',
-            'description': 'Видео группы ★http://vk.com/foxkidsreset★ музей Fox Kids и Jetix

 восстановлено и сделано в шикоформате subziro89 http://vk.com/subziro89',
             'uploader': 'subziro89 ILya',
             'title': 'Мистический городок Эйри в Индиан 5 серия озвучка subziro89',
+            'age_limit': 0,
+            'duration': 1395,
+            'chapters': [],
+            'description': 'md5:a5acea57bbc3ccdc3cacd1f11a014b5b',
+            'view_count': int,
+            'thumbnail': 'https://pic.rutubelist.ru/video/d3/03/d3031f4670a6e6170d88fb3607948418.jpg',
+            'categories': ['Сериалы'],
         },
         'params': {
             'skip_download': True,
         },
     }, {
-        'url': 'http://rutube.ru/play/embed/8083783',
+        'url': 'https://rutube.ru/play/embed/8083783',
         'only_matching': True,
     }, {
         # private video
@@ -240,11 +275,12 @@ def _real_extract(self, url):
         query = parse_qs(url)
         options = self._download_api_options(embed_id, query)
         video_id = options['effective_video']
-        formats = self._extract_formats(options, video_id)
+        formats, subtitles = self._extract_formats_and_subtitles(options, video_id)
         info = self._download_and_extract_info(video_id, query)
         info.update({
             'extractor_key': 'Rutube',
             'formats': formats,
+            'subtitles': subtitles,
         })
         return info

@@ -295,14 +331,14 @@ class RutubeTagsIE(RutubePlaylistBaseIE):
     IE_DESC = 'Rutube tags'
     _VALID_URL = r'https?://rutube\.ru/tags/video/(?P<id>\d+)'
     _TESTS = [{
-        'url': 'http://rutube.ru/tags/video/1800/',
+        'url': 'https://rutube.ru/tags/video/1800/',
         'info_dict': {
             'id': '1800',
         },
         'playlist_mincount': 68,
     }]

-    _PAGE_TEMPLATE = 'http://rutube.ru/api/tags/video/%s/?page=%s&format=json'
+    _PAGE_TEMPLATE = 'https://rutube.ru/api/tags/video/%s/?page=%s&format=json'

 class RutubeMovieIE(RutubePlaylistBaseIE):
@@ -310,8 +346,8 @@ class RutubeMovieIE(RutubePlaylistBaseIE):
     IE_DESC = 'Rutube movies'
     _VALID_URL = r'https?://rutube\.ru/metainfo/tv/(?P<id>\d+)'

-    _MOVIE_TEMPLATE = 'http://rutube.ru/api/metainfo/tv/%s/?format=json'
-    _PAGE_TEMPLATE = 'http://rutube.ru/api/metainfo/tv/%s/video?page=%s&format=json'
+    _MOVIE_TEMPLATE = 'https://rutube.ru/api/metainfo/tv/%s/?format=json'
+    _PAGE_TEMPLATE = 'https://rutube.ru/api/metainfo/tv/%s/video?page=%s&format=json'

     def _real_extract(self, url):
         movie_id = self._match_id(url)
@@ -327,62 +363,82 @@ class RutubePersonIE(RutubePlaylistBaseIE):
     IE_DESC = 'Rutube person videos'
     _VALID_URL = r'https?://rutube\.ru/video/person/(?P<id>\d+)'
     _TESTS = [{
-        'url': 'http://rutube.ru/video/person/313878/',
+        'url': 'https://rutube.ru/video/person/313878/',
         'info_dict': {
             'id': '313878',
         },
-        'playlist_mincount': 37,
+        'playlist_mincount': 36,
     }]

-    _PAGE_TEMPLATE = 'http://rutube.ru/api/video/person/%s/?page=%s&format=json'
+    _PAGE_TEMPLATE = 'https://rutube.ru/api/video/person/%s/?page=%s&format=json'

 class RutubePlaylistIE(RutubePlaylistBaseIE):
     IE_NAME = 'rutube:playlist'
     IE_DESC = 'Rutube playlists'
-    _VALID_URL = r'https?://rutube\.ru/(?:video|(?:play/)?embed)/[\da-z]{32}/\?.*?\bpl_id=(?P<id>\d+)'
+    _VALID_URL = r'https?://rutube\.ru/plst/(?P<id>\d+)'
     _TESTS = [{
-        'url': 'https://rutube.ru/video/cecd58ed7d531fc0f3d795d51cee9026/?pl_id=3097&pl_type=tag',
+        'url': 'https://rutube.ru/plst/308547/',
         'info_dict': {
-            'id': '3097',
+            'id': '308547',
         },
-        'playlist_count': 27,
-    }, {
-        'url': 'https://rutube.ru/video/10b3a03fc01d5bbcc632a2f3514e8aab/?pl_id=4252&pl_type=source',
-        'only_matching': True,
+        'playlist_mincount': 22,
     }]
-
-    _PAGE_TEMPLATE = 'http://rutube.ru/api/playlist/%s/%s/?page=%s&format=json'
-
-    @classmethod
-    def suitable(cls, url):
-        from ..utils import int_or_none, parse_qs
-
-        if not super().suitable(url):
-            return False
-        params = parse_qs(url)
-        return params.get('pl_type', [None])[0] and int_or_none(params.get('pl_id', [None])[0])
-
-    def _next_page_url(self, page_num, playlist_id, item_kind):
-        return self._PAGE_TEMPLATE % (item_kind, playlist_id, page_num)
-
-    def _real_extract(self, url):
-        qs = parse_qs(url)
-        playlist_kind = qs['pl_type'][0]
-        playlist_id = qs['pl_id'][0]
-        return self._extract_playlist(playlist_id, item_kind=playlist_kind)
+    _PAGE_TEMPLATE = 'https://rutube.ru/api/playlist/custom/%s/videos?page=%s&format=json'

 class RutubeChannelIE(RutubePlaylistBaseIE):
     IE_NAME = 'rutube:channel'
     IE_DESC = 'Rutube channel'
-    _VALID_URL = r'https?://rutube\.ru/channel/(?P<id>\d+)/videos'
+    _VALID_URL = r'https?://rutube\.ru/(?:channel/(?P<id>\d+)|u/(?P<slug>\w+))(?:/(?P
videos|shorts|playlists))?'
     _TESTS = [{
         'url': 'https://rutube.ru/channel/639184/videos/',
         'info_dict': {
-            'id': '639184',
+            'id': '639184_videos',
+        },
+        'playlist_mincount': 129,
+    }, {
+        'url': 'https://rutube.ru/channel/25902603/shorts/',
+        'info_dict': {
+            'id': '25902603_shorts',
         },
-        'playlist_mincount': 133,
+        'playlist_mincount': 277,
+    }, {
+        'url': 'https://rutube.ru/channel/25902603/',
+        'info_dict': {
+            'id': '25902603',
+        },
+        'playlist_mincount': 406,
+    }, {
+        'url': 'https://rutube.ru/u/rutube/videos/',
+        'info_dict': {
+            'id': '23704195_videos',
+        },
+        'playlist_mincount': 113,
     }]

-    _PAGE_TEMPLATE = 'http://rutube.ru/api/video/person/%s/?page=%s&format=json'
+    _PAGE_TEMPLATE = 'https://rutube.ru/api/video/person/%s/?page=%s&format=json&origin__type=%s'
+
+    def _next_page_url(self, page_num, playlist_id, section):
+        origin_type = {
+            'videos': 'rtb,rst,ifrm,rspa',
+            'shorts': 'rshorts',
+            None: '',
+        }.get(section)
+        return self._PAGE_TEMPLATE % (playlist_id, page_num, origin_type)
+
+    def _real_extract(self, url):
+        playlist_id, slug, section = self._match_valid_url(url).group('id', 'slug', 'section')
+        if section == 'playlists':
+            raise UnsupportedError(url)
+        if slug:
+            webpage = self._download_webpage(url, slug)
+            redux_state = self._search_json(
+                r'window\.reduxState\s*=', webpage, 'redux state', slug, transform_source=js_to_json)
+            playlist_id = traverse_obj(redux_state, (
+                'api', 'queries', lambda k, _: k.startswith('channelIdBySlug'),
+                'data', 'channel_id', {int}, {str_or_none}, any))
+        playlist = self._extract_playlist(playlist_id, section=section)
+        if section:
+            playlist['id'] = f'{playlist_id}_{section}'
+        return playlist

[rutube] Connection to bl.rutube.ru timed out => No video formats found!
### 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

Russia

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

Current yt-dlp doesn't download any videos from rutube.ru at all.

The errors are `Connection to bl.rutube.ru timed out. (connect timeout=20.0)` followed by `No video formats found!`. With and without VPN.

Also tried `--user-agent "Mozilla/5.0 (X11; Linux x86_64; rv:131.0) Gecko/20100101 Firefox/131.0" --cookies-from-browser firefox`  with no help. But in Firefox video plays.

### 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: ['https://rutube.ru/video/d144161b680dbc3a864c1587632b18f7/', '-vU']
[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.11.04 from yt-dlp/yt-dlp [197d0b03b] (zip)
[debug] Python 3.12.6 (CPython x86_64 64bit) - Linux-6.11.2-amd64-x86_64-with-glibc2.40 (OpenSSL 3.3.2 3 Sep 2024, glibc 2.40)
[debug] exe versions: ffmpeg 7.0.2-3 (setts), ffprobe 7.0.2-3, phantomjs 2.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.46.1, urllib3-2.0.7, websockets-10.4
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests
[debug] Loaded 1838 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: stable@2024.11.04 from yt-dlp/yt-dlp
yt-dlp is up to date (stable@2024.11.04 from yt-dlp/yt-dlp)
[rutube] Extracting URL: https://rutube.ru/video/d144161b680dbc3a864c1587632b18f7/
[rutube] d144161b680dbc3a864c1587632b18f7: Downloading video JSON
[rutube] d144161b680dbc3a864c1587632b18f7: Downloading options JSON
[rutube] d144161b680dbc3a864c1587632b18f7: Downloading m3u8 information
WARNING: [rutube] Failed to download m3u8 information: (<urllib3.connection.HTTPConnection object at 0x7fca20f0ccb0>, 'Connection to bl.rutube.ru timed out. (connect timeout=20.0)')
[rutube] d144161b680dbc3a864c1587632b18f7: Downloading m3u8 information
WARNING: [rutube] Failed to download m3u8 information: (<urllib3.connection.HTTPConnection object at 0x7fca20f0d460>, 'Connection to bl.rutube.ru timed out. (connect timeout=20.0)')
ERROR: [rutube] d144161b680dbc3a864c1587632b18f7: No video formats 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
Traceback (most recent call last):
  File "/usr/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 1625, in wrapper
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 1781, in __extract_info
    return self.process_ie_result(ie_result, download, extra_info)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 1840, in process_ie_result
    ie_result = self.process_video_result(ie_result, download=download)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 2846, in process_video_result
    self.raise_no_formats(info_dict)
  File "/usr/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 1122, in raise_no_formats
    raise ExtractorError(msg, video_id=info['id'], ie=info['extractor'],
yt_dlp.utils.ExtractorError: [rutube] d144161b680dbc3a864c1587632b18f7: No video formats 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
```

Exactly same behavior for both master and nightly:

```
[...]
Latest version: master@2024.11.06.215904 from yt-dlp/yt-dlp-master-builds
yt-dlp is up to date (master@2024.11.06.215904 from yt-dlp/yt-dlp-master-builds)
[...]
WARNING: [rutube] Failed to download m3u8 information: (<urllib3.connection.HTTPConnection object at 0x7fbde7180410>, 'Connection to bl.rutube.ru timed out. (connect timeout=20.0)')
[...]
ERROR: [rutube] d144161b680dbc3a864c1587632b18f7: No video formats found!
```

```
[...]
Latest version: nightly@2024.11.06.232826 from yt-dlp/yt-dlp-nightly-builds
yt-dlp is up to date (nightly@2024.11.06.232826 from yt-dlp/yt-dlp-nightly-builds)
[...]
WARNING: [rutube] Failed to download m3u8 information: (<urllib3.connection.HTTPConnection object at 0x7fbde7180410>, 'Connection to bl.rutube.ru timed out. (connect timeout=20.0)')
[...]
ERROR: [rutube] d144161b680dbc3a864c1587632b18f7: No video formats found!
```

The Firefox's Developer Tools are stating the browser does connect successfully to bl.rutube.ru:

```
GET https://bl.rutube.ru/route/d144161b680dbc3a864c1587632b18f7.m3u8?...

HTTP/2 200
server: QRATOR
date: Fri, 08 Nov 2024 08:05:52 GMT
content-type: text/html; charset=utf-8
temperature: {'short': 2, 'long': 4}
dest-server: river-2-301
client-ip: X.X.X.X
x-frontend-config-version: 3.8.2
access-control-allow-origin: *
access-control-allow-methods: GET, HEAD
access-control-allow-headers: Range
access-control-expose-headers: Range, Content-Length, Accept-Ranges, Date
access-control-allow-credentials: true
content-encoding: br
X-Firefox-Spdy: h2
```

Seems like QRATOR (rutube's anti-ddos service of choice) somehow detects yt-dlp's requests and block them?
Just tried to "wget" the m3u8 link directly from console and it works too. So it allows any user-agent, even wget. The problem must be somewhere inside the extractor or the urllib3:

```
$ wget "https://bl.rutube.ru/route/d144161b680dbc3a864c1587632b18f7.m3u8?..."
Resolving bl.rutube.ru (bl.rutube.ru)... 178.248.232.241
Connecting to bl.rutube.ru (bl.rutube.ru)|178.248.232.241|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1642 (1.6K) [text/html]

=> correct m3u8 file.
```

Seems like this fixes it:
```diff
diff --git a/yt_dlp/extractor/rutube.py b/yt_dlp/extractor/rutube.py
index 2c416811a..c77e0bf8a 100644
--- a/yt_dlp/extractor/rutube.py
+++ b/yt_dlp/extractor/rutube.py
@@ -61,7 +61,7 @@ def _download_api_options(self, video_id, query=None):
             query = {}
         query['format'] = 'json'
         return self._download_json(
-            f'http://rutube.ru/api/play/options/{video_id}/',
+            f'https://rutube.ru/api/play/options/{video_id}/',
             video_id, 'Downloading options JSON',
             'Unable to download options JSON',
             headers=self.geo_verification_headers(), query=query)
```
Yep, can confirm this patch does the job. It works with it:

```
[debug] Command-line config: ['https://rutube.ru/video/d144161b680dbc3a864c1587632b18f7/', '-vU']
[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.11.04 from yt-dlp/yt-dlp [197d0b03b] (linux_exe)
[debug] Python 3.12.6 (CPython x86_64 64bit) - Linux-6.11.2-amd64-x86_64-with-glibc2.40 (OpenSSL 3.3.2 3 Sep 2024, glibc 2.40)
[debug] exe versions: ffmpeg 7.0.2-3 (setts), ffprobe 7.0.2-3, phantomjs broken
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, mutagen-1.47.0, requests-2.32.3, sqlite3-3.46.1, urllib3-2.2.3, websockets-13.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets
[debug] Loaded 1839 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: stable@2024.11.04 from yt-dlp/yt-dlp
yt-dlp is up to date (stable@2024.11.04 from yt-dlp/yt-dlp)
[rutube] Extracting URL: https://rutube.ru/video/d144161b680dbc3a864c1587632b18f7/
[rutube] d144161b680dbc3a864c1587632b18f7: Downloading video JSON
[rutube] d144161b680dbc3a864c1587632b18f7: Downloading options JSON
[rutube] d144161b680dbc3a864c1587632b18f7: Downloading m3u8 information
[rutube] d144161b680dbc3a864c1587632b18f7: Downloading m3u8 information
[debug] Formats sorted by: hasvid, ie_pref, lang, quality, res, fps, hdr:12(7), vcodec, channels, acodec, size, br, asr, proto, vext, aext, hasaud, source, id
[debug] Default format spec: bestvideo*+bestaudio/best
[info] d144161b680dbc3a864c1587632b18f7: Downloading 1 format(s): m3u8-406-1
[debug] Invoking hlsnative downloader on "https://river-1.rutube.ru/hls-vod/QJgc4k_gFwQXtJK3H3QXaA/1731661417/1944/rutube-ds-origin-118-1/ebb02cbd26b04bf5a83e50c038e49b90.mp4.m3u8?i=1280x720_406"
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 45
[download] Destination: yt-dlp, the best youtube-dl alternative with more features [d144161b680dbc3a864c1587632b18f7].mp4
[download] 100% of   12.26MiB in 00:00:08 at 1.50MiB/s
```

Additional info: patch is working. Without the patch it's not possible to download any video.
Hello! Could you create a pull request? I have the same problem. If you can't do it, I can try to do it.
I will create a PR and merge it later today
I confirm that this works from UK. There are several other http: URLs used in the extractor that appear to be unaffected.
Maybe also adopt patch from #11415 ?
Maybe change ALL "http" to "https" in extractor?


diff --git a/yt_dlp/extractor/cloudflarestream.py b/yt_dlp/extractor/cloudflarestream.py
index 8a409461a8bc..9e9e89a801fa 100644
--- a/yt_dlp/extractor/cloudflarestream.py
+++ b/yt_dlp/extractor/cloudflarestream.py
@@ -8,7 +8,7 @@ class CloudflareStreamIE(InfoExtractor):
     _DOMAIN_RE = r'(?:cloudflarestream\.com|(?:videodelivery|bytehighway)\.net)'
     _EMBED_RE = rf'(?:embed\.|{_SUBDOMAIN_RE}){_DOMAIN_RE}/embed/[^/?#]+\.js\?(?:[^#]+&)?video='
     _ID_RE = r'[\da-f]{32}|eyJ[\w-]+\.[\w-]+\.[\w-]+'
-    _VALID_URL = rf'https?://(?:{_SUBDOMAIN_RE}{_DOMAIN_RE}/|{_EMBED_RE})(?P<id>{_ID_RE})'
+    _VALID_URL = rf'https?://(?:{_SUBDOMAIN_RE}(?P<domain>{_DOMAIN_RE})/|{_EMBED_RE})(?P<id>{_ID_RE})'
     _EMBED_REGEX = [
         rf'<script[^>]+\bsrc=(["\'])(?P<url>(?:https?:)?//{_EMBED_RE}(?:{_ID_RE})(?:(?!\1).)*)\1',
         rf'<iframe[^>]+\bsrc=["\'](?P<url>https?://{_SUBDOMAIN_RE}{_DOMAIN_RE}/[\da-f]{{32}})',
@@ -19,7 +19,7 @@ class CloudflareStreamIE(InfoExtractor):
             'id': '31c9291ab41fac05471db4e73aa11717',
             'ext': 'mp4',
             'title': '31c9291ab41fac05471db4e73aa11717',
-            'thumbnail': 'https://videodelivery.net/31c9291ab41fac05471db4e73aa11717/thumbnails/thumbnail.jpg',
+            'thumbnail': 'https://cloudflarestream.com/31c9291ab41fac05471db4e73aa11717/thumbnails/thumbnail.jpg',
         },
         'params': {
             'skip_download': 'm3u8',
@@ -30,7 +30,7 @@ class CloudflareStreamIE(InfoExtractor):
             'id': '0e8e040aec776862e1d632a699edf59e',
             'ext': 'mp4',
             'title': '0e8e040aec776862e1d632a699edf59e',
-            'thumbnail': 'https://videodelivery.net/0e8e040aec776862e1d632a699edf59e/thumbnails/thumbnail.jpg',
+            'thumbnail': 'https://cloudflarestream.com/0e8e040aec776862e1d632a699edf59e/thumbnails/thumbnail.jpg',
         },
     }, {
         'url': 'https://watch.cloudflarestream.com/9df17203414fd1db3e3ed74abbe936c1',
@@ -54,7 +54,7 @@ class CloudflareStreamIE(InfoExtractor):
             'id': 'eaef9dea5159cf968be84241b5cedfe7',
             'ext': 'mp4',
             'title': 'eaef9dea5159cf968be84241b5cedfe7',
-            'thumbnail': 'https://videodelivery.net/eaef9dea5159cf968be84241b5cedfe7/thumbnails/thumbnail.jpg',
+            'thumbnail': 'https://cloudflarestream.com/eaef9dea5159cf968be84241b5cedfe7/thumbnails/thumbnail.jpg',
         },
         'params': {
             'skip_download': 'm3u8',
@@ -62,8 +62,9 @@ class CloudflareStreamIE(InfoExtractor):
     }]

     def _real_extract(self, url):
-        video_id = self._match_id(url)
-        domain = 'bytehighway.net' if 'bytehighway.net/' in url else 'videodelivery.net'
+        video_id, domain = self._match_valid_url(url).group('id', 'domain')
+        if domain != 'bytehighway.net':
+            domain = 'cloudflarestream.com'
         base_url = f'https://{domain}/{video_id}/'
         if '.' in video_id:
             video_id = self._parse_json(base64.urlsafe_b64decode(

CloudFlareStream "No video formats found!"
### 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

Spain

### Used URL

https://watch.cloudflarestream.com/e8766bfd7771e53b5dc26c76b650d91a/

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

Can't download a public CloudFlareStream video.
I get CERTIFICATE_VERIFY_FAILED warnings and then an error stating "No video formats found!"

Expected result: A video download from the provided link.

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

```shell
[debug] Command-line config: ['-vU', 'https://watch.cloudflarestream.com/e8766bfd7771e53b5dc26c76b650d91a/']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2024.11.04 from yt-dlp/yt-dlp [197d0b03b] (win_exe)
[debug] Python 3.10.11 (CPython AMD64 64bit) - Windows-10-10.0.22631-SP0 (OpenSSL 1.1.1t  7 Feb 2023)
[debug] exe versions: ffmpeg 5.1.2-essentials_build-www.gyan.dev (setts), ffprobe 5.1.2-essentials_build-www.gyan.dev
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.5.10, mutagen-1.47.0, requests-2.32.3, sqlite3-3.40.1, urllib3-2.2.3, websockets-13.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Loaded 1838 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: stable@2024.11.04 from yt-dlp/yt-dlp
yt-dlp is up to date (stable@2024.11.04 from yt-dlp/yt-dlp)
[CloudflareStream] Extracting URL: https://watch.cloudflarestream.com/e8766bfd7771e53b5dc26c76b650d91a/
[CloudflareStream] e8766bfd7771e53b5dc26c76b650d91a: Downloading m3u8 information
WARNING: [CloudflareStream] Failed to download m3u8 information: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1007)
[CloudflareStream] e8766bfd7771e53b5dc26c76b650d91a: Downloading MPD manifest
WARNING: [CloudflareStream] Failed to download MPD manifest: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1007)
ERROR: [CloudflareStream] e8766bfd7771e53b5dc26c76b650d91a: No video formats 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
Traceback (most recent call last):
  File "yt_dlp\YoutubeDL.py", line 1625, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1781, in __extract_info
  File "yt_dlp\YoutubeDL.py", line 1840, in process_ie_result
  File "yt_dlp\YoutubeDL.py", line 2846, in process_video_result
  File "yt_dlp\YoutubeDL.py", line 1122, in raise_no_formats
yt_dlp.utils.ExtractorError: [CloudflareStream] e8766bfd7771e53b5dc26c76b650d91a: No video formats 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
```

i still meet this issue too
I am able to manually download the video.mpd file with
https://videodelivery.net/eaef9dea5159cf968be84241b5cedfe7/manifest/video.mpd
So I'm not sure what's going wrong, maybe the extractor is malforming the url?

When running the command with "--no-check-certificate" I get a 404 error when trying to fetch m3u8 and mpd files:

```shell
[debug] Command-line config: ['-vU', 'https://watch.cloudflarestream.com/e8766bfd7771e53b5dc26c76b650d91a/', '--no-check-certificate']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2024.11.04 from yt-dlp/yt-dlp [197d0b03b] (win_exe)
[debug] Python 3.10.11 (CPython AMD64 64bit) - Windows-10-10.0.22631-SP0 (OpenSSL 1.1.1t  7 Feb 2023)
[debug] exe versions: ffmpeg 5.1.2-essentials_build-www.gyan.dev (setts), ffprobe 5.1.2-essentials_build-www.gyan.dev
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.5.10, mutagen-1.47.0, requests-2.32.3, sqlite3-3.40.1, urllib3-2.2.3, websockets-13.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Loaded 1838 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: stable@2024.11.04 from yt-dlp/yt-dlp
yt-dlp is up to date (stable@2024.11.04 from yt-dlp/yt-dlp)
[CloudflareStream] Extracting URL: https://watch.cloudflarestream.com/e8766bfd7771e53b5dc26c76b650d91a/
[CloudflareStream] e8766bfd7771e53b5dc26c76b650d91a: Downloading m3u8 information
WARNING: [CloudflareStream] Failed to download m3u8 information: HTTP Error 404: Not Found
[CloudflareStream] e8766bfd7771e53b5dc26c76b650d91a: Downloading MPD manifest
WARNING: [CloudflareStream] Failed to download MPD manifest: HTTP Error 404: Not Found
ERROR: [CloudflareStream] e8766bfd7771e53b5dc26c76b650d91a: No video formats 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
Traceback (most recent call last):
  File "yt_dlp\YoutubeDL.py", line 1625, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1781, in __extract_info
  File "yt_dlp\YoutubeDL.py", line 1840, in process_ie_result
  File "yt_dlp\YoutubeDL.py", line 2846, in process_video_result
  File "yt_dlp\YoutubeDL.py", line 1122, in raise_no_formats
yt_dlp.utils.ExtractorError: [CloudflareStream] e8766bfd7771e53b5dc26c76b650d91a: No video formats 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
```
Playing around with Postman and GET requests to videodelivery.net don't go through but they do for cloudflarestream.com

GET https://videodelivery.net/eaef9dea5159cf968be84241b5cedfe7/manifest/video.mpd
```
<html>

<body>Object not found</body>

</html>
```

GET https://cloudflarestream.com/eaef9dea5159cf968be84241b5cedfe7/manifest/video.mpd

```
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="static" mediaPresentationDuration="PT38S" minBufferTime="PT8S">
    <Period id="0">
        <AdaptationSet id="800962650" mimeType="audio/mp4" segmentAlignment="true" lang="original">
            <Representation id="449134446" audioSamplingRate="44100" bandwidth="142554" codecs="mp4a.40.2">
                <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="1"></AudioChannelConfiguration>
                <SegmentTemplate duration="172695" initialization="../../eaef9dea5159cf968be84241b5cedfe7/audio/142/init.mp4?p=eyJ0eXBlIjoiaW5pdCIsInZpZGVvSUQiOiJlYWVmOWRlYTUxNTljZjk2OGJlODQyNDFiNWNlZGZlNyIsIm93bmVySUQiOjY2MzQxNTgsImNyZWF0b3JJRCI6InVwcmlkZSIsInVzZVZPRE9URkUiOmZhbHNlLCJmcm9tTWV6emFuaW5lIjpmYWxzZSwic3RvcmFnZVByb3ZpZGVyIjoyLCJ0cmFjayI6ImFjZjUxZDAwYTlkNmNiODNmNGNhNzI1ZDZiOTM2MjI3IiwicmVuZGl0aW9uIjoiNDQ5MTM0NDQ2IiwibXV4aW5nIjoiNDk5ODMzNjE1In0&s=L3jChcK8L8Kgwo0zwrTDhU_DpncjwpzCqMO0esOCC8O5wonCvRTCohMOQsOQwpBMAg" media="../../eaef9dea5159cf968be84241b5cedfe7/audio/142/seg_$Number$.mp4?p=eyJ0eXBlIjoic2VnbWVudCIsInZpZGVvSUQiOiJlYWVmOWRlYTUxNTljZjk2OGJlODQyNDFiNWNlZGZlNyIsIm93bmVySUQiOjY2MzQxNTgsImNyZWF0b3JJRCI6InVwcmlkZSIsInNlZ21lbnREdXJhdGlvblNlY3MiOjMuOTE1OTgzMTU1MTY2ODI4NSwidXNlVk9ET1RGRSI6ZmFsc2UsImZyb21NZXp6YW5pbmUiOmZhbHNlLCJzdG9yYWdlUHJvdmlkZXIiOjIsInRyYWNrIjoiYWNmNTFkMDBhOWQ2Y2I4M2Y0Y2E3MjVkNmI5MzYyMjciLCJyZW5kaXRpb24iOiI0NDkxMzQ0NDYiLCJtdXhpbmciOiI0OTk4MzM2MTUifQ&s=XW0iRcO7w4zCvsO5wqbCrxo0TMO3w5bDgcKhb8Oaw7dtXMKFScKfwpHCt8OBwpJaOcOv" startNumber="1" timescale="44100"></SegmentTemplate>
            </Representation>
        </AdaptationSet>
        <AdaptationSet id="386409604" mimeType="video/mp4" segmentAlignment="true" >
            <Representation id="449134449" bandwidth="405430" codecs="avc1.42c015" frameRate="30/1" height="240" width="426">
                <SegmentTemplate duration="120000" initialization="../../eaef9dea5159cf968be84241b5cedfe7/video/240/init.mp4?p=eyJ0eXBlIjoiaW5pdCIsInZpZGVvSUQiOiJlYWVmOWRlYTUxNTljZjk2OGJlODQyNDFiNWNlZGZlNyIsIm93bmVySUQiOjY2MzQxNTgsImNyZWF0b3JJRCI6InVwcmlkZSIsInVzZVZPRE9URkUiOmZhbHNlLCJmcm9tTWV6emFuaW5lIjpmYWxzZSwic3RvcmFnZVByb3ZpZGVyIjoyLCJ0cmFjayI6IjI5ODBlNzIyOTQ5NjkzOGQ4OGQyODEwZmRjNWM5ZWQ5IiwicmVuZGl0aW9uIjoiNDQ5MTM0NDQ5IiwibXV4aW5nIjoiNDk5ODMzNjE4In0&s=w6XCjsKzw7fCmsKKwo_DoAvDq0LCniYHa39Tw6JEw6BUwojDiENvDMO9wqw7ccOwwpM" media="../../eaef9dea5159cf968be84241b5cedfe7/video/240/seg_$Number$.mp4?p=eyJ0eXBlIjoic2VnbWVudCIsInZpZGVvSUQiOiJlYWVmOWRlYTUxNTljZjk2OGJlODQyNDFiNWNlZGZlNyIsIm93bmVySUQiOjY2MzQxNTgsImNyZWF0b3JJRCI6InVwcmlkZSIsInNlZ21lbnREdXJhdGlvblNlY3MiOjQsInVzZVZPRE9URkUiOmZhbHNlLCJmcm9tTWV6emFuaW5lIjpmYWxzZSwic3RvcmFnZVByb3ZpZGVyIjoyLCJ0cmFjayI6IjI5ODBlNzIyOTQ5NjkzOGQ4OGQyODEwZmRjNWM5ZWQ5IiwicmVuZGl0aW9uIjoiNDQ5MTM0NDQ5IiwibXV4aW5nIjoiNDk5ODMzNjE4In0&s=bcOaIsOHPV_Cu8KiwqppCzkvw70Uwp8XHTbDqztcY8KVfkg6wqIHS8Ktw54" startNumber="1" timescale="30000"></SegmentTemplate>
            </Representation>
            <Representation id="449134457" bandwidth="680674" codecs="avc1.4d401e" frameRate="30/1" height="360" width="640">
                <SegmentTemplate duration="120000" initialization="../../eaef9dea5159cf968be84241b5cedfe7/video/360/init.mp4?p=eyJ0eXBlIjoiaW5pdCIsInZpZGVvSUQiOiJlYWVmOWRlYTUxNTljZjk2OGJlODQyNDFiNWNlZGZlNyIsIm93bmVySUQiOjY2MzQxNTgsImNyZWF0b3JJRCI6InVwcmlkZSIsInVzZVZPRE9URkUiOmZhbHNlLCJmcm9tTWV6emFuaW5lIjpmYWxzZSwic3RvcmFnZVByb3ZpZGVyIjoyLCJ0cmFjayI6IjI5ODBlNzIyOTQ5NjkzOGQ4OGQyODEwZmRjNWM5ZWQ5IiwicmVuZGl0aW9uIjoiNDQ5MTM0NDU3IiwibXV4aW5nIjoiNDk5ODMzNjI2In0&s=w5_DpDHCncOVwpVtw4HDnMOOwqfDl8Oyw6PDrMO1w5Y5PmlSJnUxFyHCq8KHwpbDqMO0w4M" media="../../eaef9dea5159cf968be84241b5cedfe7/video/360/seg_$Number$.mp4?p=eyJ0eXBlIjoic2VnbWVudCIsInZpZGVvSUQiOiJlYWVmOWRlYTUxNTljZjk2OGJlODQyNDFiNWNlZGZlNyIsIm93bmVySUQiOjY2MzQxNTgsImNyZWF0b3JJRCI6InVwcmlkZSIsInNlZ21lbnREdXJhdGlvblNlY3MiOjQsInVzZVZPRE9URkUiOmZhbHNlLCJmcm9tTWV6emFuaW5lIjpmYWxzZSwic3RvcmFnZVByb3ZpZGVyIjoyLCJ0cmFjayI6IjI5ODBlNzIyOTQ5NjkzOGQ4OGQyODEwZmRjNWM5ZWQ5IiwicmVuZGl0aW9uIjoiNDQ5MTM0NDU3IiwibXV4aW5nIjoiNDk5ODMzNjI2In0&s=wp07RcKIN8ORB8Oww5fCkB02AMO2dEEgwqpRAhVcZMOywqbCnxhuwqDCqHrDrg" startNumber="1" timescale="30000"></SegmentTemplate>
            </Representation>
            <Representation id="449134468" bandwidth="1113178" codecs="avc1.4d401f" frameRate="30/1" height="480" width="854">
                <SegmentTemplate duration="120000" initialization="../../eaef9dea5159cf968be84241b5cedfe7/video/480/init.mp4?p=eyJ0eXBlIjoiaW5pdCIsInZpZGVvSUQiOiJlYWVmOWRlYTUxNTljZjk2OGJlODQyNDFiNWNlZGZlNyIsIm93bmVySUQiOjY2MzQxNTgsImNyZWF0b3JJRCI6InVwcmlkZSIsInVzZVZPRE9URkUiOmZhbHNlLCJmcm9tTWV6emFuaW5lIjpmYWxzZSwic3RvcmFnZVByb3ZpZGVyIjoyLCJ0cmFjayI6IjI5ODBlNzIyOTQ5NjkzOGQ4OGQyODEwZmRjNWM5ZWQ5IiwicmVuZGl0aW9uIjoiNDQ5MTM0NDY4IiwibXV4aW5nIjoiNDk5ODMzNjM3In0&s=w4LCtMKUw5InVcKkRcKJw6dNw55_USATD8KCw5zDi0rCpMOyWjXDqsKAwqDCnQzDrMKd" media="../../eaef9dea5159cf968be84241b5cedfe7/video/480/seg_$Number$.mp4?p=eyJ0eXBlIjoic2VnbWVudCIsInZpZGVvSUQiOiJlYWVmOWRlYTUxNTljZjk2OGJlODQyNDFiNWNlZGZlNyIsIm93bmVySUQiOjY2MzQxNTgsImNyZWF0b3JJRCI6InVwcmlkZSIsInNlZ21lbnREdXJhdGlvblNlY3MiOjQsInVzZVZPRE9URkUiOmZhbHNlLCJmcm9tTWV6emFuaW5lIjpmYWxzZSwic3RvcmFnZVByb3ZpZGVyIjoyLCJ0cmFjayI6IjI5ODBlNzIyOTQ5NjkzOGQ4OGQyODEwZmRjNWM5ZWQ5IiwicmVuZGl0aW9uIjoiNDQ5MTM0NDY4IiwibXV4aW5nIjoiNDk5ODMzNjM3In0&s=SBvCiTjDkMKfw7YTcsOeJcOhw6ltbEtMVXTCv8KGBBTCkFwUKsOyVFl2Bg" startNumber="1" timescale="30000"></SegmentTemplate>
            </Representation>
            <Representation id="449134513" bandwidth="2380128" codecs="avc1.4d401f" frameRate="30/1" height="720" width="1280">
                <SegmentTemplate duration="120000" initialization="../../eaef9dea5159cf968be84241b5cedfe7/video/720/init.mp4?p=eyJ0eXBlIjoiaW5pdCIsInZpZGVvSUQiOiJlYWVmOWRlYTUxNTljZjk2OGJlODQyNDFiNWNlZGZlNyIsIm93bmVySUQiOjY2MzQxNTgsImNyZWF0b3JJRCI6InVwcmlkZSIsInVzZVZPRE9URkUiOmZhbHNlLCJmcm9tTWV6emFuaW5lIjpmYWxzZSwic3RvcmFnZVByb3ZpZGVyIjoyLCJ0cmFjayI6IjI5ODBlNzIyOTQ5NjkzOGQ4OGQyODEwZmRjNWM5ZWQ5IiwicmVuZGl0aW9uIjoiNDQ5MTM0NTEzIiwibXV4aW5nIjoiNDk5ODMzNjgyIn0&s=XcOPGjHClhTDn8KcBMKXw5HCo8ONIcKuQMKqbSp8wpLCnMOZXMODw6zDqMKew4_CoEpu" media="../../eaef9dea5159cf968be84241b5cedfe7/video/720/seg_$Number$.mp4?p=eyJ0eXBlIjoic2VnbWVudCIsInZpZGVvSUQiOiJlYWVmOWRlYTUxNTljZjk2OGJlODQyNDFiNWNlZGZlNyIsIm93bmVySUQiOjY2MzQxNTgsImNyZWF0b3JJRCI6InVwcmlkZSIsInNlZ21lbnREdXJhdGlvblNlY3MiOjQsInVzZVZPRE9URkUiOmZhbHNlLCJmcm9tTWV6emFuaW5lIjpmYWxzZSwic3RvcmFnZVByb3ZpZGVyIjoyLCJ0cmFjayI6IjI5ODBlNzIyOTQ5NjkzOGQ4OGQyODEwZmRjNWM5ZWQ5IiwicmVuZGl0aW9uIjoiNDQ5MTM0NTEzIiwibXV4aW5nIjoiNDk5ODMzNjgyIn0&s=SMOOEMOcw5HDq8KTw67CqUMhYzVUGWobQXVvK8OYLMKdw4TDk8KMw5_DnV5ow48" startNumber="1" timescale="30000"></SegmentTemplate>
            </Representation>
        </AdaptationSet>
    </Period>
</MPD>
```


diff --git a/yt_dlp/extractor/adobepass.py b/yt_dlp/extractor/adobepass.py
index 7cc15ec7b6f2..f1b87792713f 100644
--- a/yt_dlp/extractor/adobepass.py
+++ b/yt_dlp/extractor/adobepass.py
@@ -1362,7 +1362,7 @@ class AdobePassIE(InfoExtractor):  # XXX: Conventionally, base classes should en

     def _download_webpage_handle(self, *args, **kwargs):
         headers = self.geo_verification_headers()
-        headers.update(kwargs.get('headers', {}))
+        headers.update(kwargs.get('headers') or {})
         kwargs['headers'] = headers
         return super()._download_webpage_handle(
             *args, **kwargs)

[NBC]/[adobepass] ERROR: 'NoneType' object is not iterable
### 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

Unable to pull Law and Order SVU or any NBC shows. Getting ERROR: 'NoneType' object is not iterable. I also tried cookies-from-browser but the application still returns to use ap-mso credentials.

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

```shell
[debug] Command-line config: ['https://www.nbc.com/law-and-order-special-victims-unit/video/economics-of-shame/9000392650', '--ap-mso', 'Verizon', '--ap-username', 'PRIVATE', '--ap-password', 'PRIVATE', '-vU']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2024.11.04 from yt-dlp/yt-dlp [197d0b03b] (win_exe)
[debug] Python 3.10.11 (CPython AMD64 64bit) - Windows-10-10.0.22631-SP0 (OpenSSL 1.1.1t  7 Feb 2023)
[debug] exe versions: ffmpeg N-93302-g147ef1d947, ffprobe N-93302-g147ef1d947
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.5.10, mutagen-1.47.0, requests-2.32.3, sqlite3-3.40.1, urllib3-2.2.3, websockets-13.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Loaded 1838 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: stable@2024.11.04 from yt-dlp/yt-dlp
yt-dlp is up to date (stable@2024.11.04 from yt-dlp/yt-dlp)
[NBC] Extracting URL: https://www.nbc.com/law-and-order-special-victims-unit/video/economics-of-shame/9000392650
[NBC] 9000392650: Downloading JSON metadata
[NBC] 9000392650: Downloading JSON metadata
ERROR: 'NoneType' object is not iterable
Traceback (most recent call last):
  File "yt_dlp\YoutubeDL.py", line 1625, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1760, in __extract_info
  File "yt_dlp\extractor\common.py", line 742, in extract
  File "yt_dlp\extractor\nbc.py", line 212, in _real_extract
  File "yt_dlp\extractor\adobepass.py", line 1449, in _extract_mvpd_auth
  File "yt_dlp\extractor\adobepass.py", line 1365, in _download_webpage_handle
TypeError: 'NoneType' object is not iterable
```

Regression introduced in dcfeea4dd5e5686821350baa6c7767a011944867

This should be the fix:
```diff
diff --git a/yt_dlp/extractor/adobepass.py b/yt_dlp/extractor/adobepass.py
index 7cc15ec7b..f1b877927 100644
--- a/yt_dlp/extractor/adobepass.py
+++ b/yt_dlp/extractor/adobepass.py
@@ -1362,7 +1362,7 @@ class AdobePassIE(InfoExtractor):  # XXX: Conventionally, base classes should en

     def _download_webpage_handle(self, *args, **kwargs):
         headers = self.geo_verification_headers()
-        headers.update(kwargs.get('headers', {}))
+        headers.update(kwargs.get('headers') or {})
         kwargs['headers'] = headers
         return super()._download_webpage_handle(
             *args, **kwargs)
```