diff --git a/sentence_transformers/evaluation/BinaryClassificationEvaluator.py b/sentence_transformers/evaluation/BinaryClassificationEvaluator.py
index e0e00ebc9..4a701279d 100644
--- a/sentence_transformers/evaluation/BinaryClassificationEvaluator.py
+++ b/sentence_transformers/evaluation/BinaryClassificationEvaluator.py
@@ -288,14 +288,14 @@ def compute_metrices(self, model: SentenceTransformer) -> dict[str, dict[str, fl
             logger.info(f"Matthews Correlation with {name}: {mcc * 100:.2f}\n")

             output_scores[similarity_fn_name] = {
-                "accuracy": acc,
-                "accuracy_threshold": acc_threshold,
-                "f1": f1,
-                "f1_threshold": f1_threshold,
-                "precision": precision,
-                "recall": recall,
-                "ap": ap,
-                "mcc": mcc,
+                "accuracy": float(acc),
+                "accuracy_threshold": float(acc_threshold),
+                "f1": float(f1),
+                "f1_threshold": float(f1_threshold),
+                "precision": float(precision),
+                "recall": float(recall),
+                "ap": float(ap),
+                "mcc": float(mcc),
             }

         return output_scores

BinaryClassificationEvaluator returns np.float32() and np.float64()
I came across the problem where

```python
output_scores[similarity_fn_name] = {
  "accuracy": acc,
  "accuracy_threshold": acc_threshold,
  "f1": f1,
  "f1_threshold": f1_threshold,
  "precision": precision,
  "recall": recall,
  "ap": ap,
}
```

is returning outputs in `np.float32()` and `np.float64()` which cause problems during model saving, as the `json/encoder.py` sees those types as `not JSON serializable`.

By changing the code snippet to

```python
output_scores[similarity_fn_name] = {
  "accuracy": acc.item(),
  "accuracy_threshold": acc_threshold.item(),
  "f1": f1.item(),
  "f1_threshold": f1_threshold.item(),
  "precision": precision,
  "recall": recall.item(),
  "ap": ap.item(),
}
```

the elements get copied to a standard Python scalar each (note: `precision` already is) and then behave like expected during saving.

Hello!

Well spotted, this is suboptimal. I'd rather have all of these converted to floats as expected. I'm tackling some other PRs right now, but I'll pick this up in a few days if someone else hasn't beat me to it by then.
Thanks for reporting!

- Tom Aarsen
ill be happy to work on this :)


diff --git a/sentence_transformers/sampler.py b/sentence_transformers/sampler.py
index 7efc19bf1..f3021b42f 100644
--- a/sentence_transformers/sampler.py
+++ b/sentence_transformers/sampler.py
@@ -184,7 +184,10 @@ def __iter__(self) -> Iterator[list[int]]:
         if self.generator and self.seed:
             self.generator.manual_seed(self.seed + self.epoch)

-        remaining_indices = set(torch.randperm(len(self.dataset), generator=self.generator).tolist())
+        # We create a dictionary to None because we need a data structure that:
+        # 1. Allows for cheap removal of elements
+        # 2. Preserves the order of elements, i.e. remains random
+        remaining_indices = dict.fromkeys(torch.randperm(len(self.dataset), generator=self.generator).tolist())
         while remaining_indices:
             batch_values = set()
             batch_indices = []
@@ -209,7 +212,8 @@ def __iter__(self) -> Iterator[list[int]]:
                 if not self.drop_last:
                     yield batch_indices

-            remaining_indices -= set(batch_indices)
+            for index in batch_indices:
+                del remaining_indices[index]

     def __len__(self) -> int:
         if self.drop_last:

Same order of training samples with `NoDuplicatesBatchSampler`
It seems that  `NoDuplicatesBatchSampler` produces the same set of batches in the same order regardless of the epoch index.
Indeed, in [this piece of code](https://github.com/UKPLab/sentence-transformers/blob/e156f38b1007e7860218c27223e1d577f3a021fe/sentence_transformers/sampler.py#L184C3-L187C102), the order of the indices in `remaining_indices` does not depend on the random permutation `torch.randperm(len(self.dataset), generator=self.generator)` as it is reset to the ordered range with `set`.

Moreover, the seed in line 185 does not change from one epoch to another (the [`set_epoch`](https://github.com/UKPLab/sentence-transformers/blob/e156f38b1007e7860218c27223e1d577f3a021fe/sentence_transformers/sampler.py#L32) method does not seem to be used...)

Hello!

`set_epoch` is used via the `transformers` `Trainer` which calls `set_epoch` of the `accelerate`-wrapped DataLoader, which should propagates it down into the sampler. However, it indeed seems that `accelerate` only propagates it into the `sampler`, not the batch sampler: https://github.com/huggingface/accelerate/blob/8ade23cc6aec7c3bd3d80fef6378cafaade75bbe/src/accelerate/data_loader.py#L591-L592
Perhaps this warrants a feature request/pull request on `accelerate` @muellerzr

As for the `set` - well spotted. I was falsely under the impression that the insertion order was kept, much like for `dict` instances. I'd like to avoid converting `remaining_indices` into a list, as that has an expensive `pop`. I'm open to suggestions here.

- Tom Aarsen
It might be not the most elegant solution, but maybe remaining_indices could be an `OrderedDict`?
`remaining_indices = OrderedDict({k: None for k in torch.randperm(len(self.dataset), generator=self.generator).tolist()})`

It probably won't be as fast as with the set (because the `OrderedDict` will need to maintain the order after each deletion), but deleting an element from an `OrderedDict` is still of constant complexity in average.
I was also considering a dict. Because we're at Python 3.7+ now, I think we can just use a normal `dict`:
> the insertion-order preservation nature of [dict](https://docs.python.org/3/library/stdtypes.html#typesmapping) objects [has been declared](https://mail.python.org/pipermail/python-dev/2017-December/151283.html) to be an official part of the Python language spec.

from https://docs.python.org/3/whatsnew/3.7.html

If the performance hit is not too large, then this is an acceptable solution I think.

I'll also look more into fixing the `set_epoch` issue in `accelerate`.

- Tom Aarsen
Yes, I agree. A normal dictionary can also be considered.

Even though, the behavior might be slightly less predictable. Because the declared "insertion-order preservation" does not necessarily mean the preservation of the order after the deletion of some elements.


diff --git a/backend/chainlit/data/__init__.py b/backend/chainlit/data/__init__.py
index dfc359c24b..513bc5975d 100644
--- a/backend/chainlit/data/__init__.py
+++ b/backend/chainlit/data/__init__.py
@@ -7,26 +7,38 @@
 )

 _data_layer: Optional[BaseDataLayer] = None
+_data_layer_initialized = False

 def get_data_layer():
-    global _data_layer
-    print("Getting data layer", _data_layer)
-
-    if not _data_layer:
-        from chainlit.config import config
-
-        if config.code.data_layer:
-            # When @data_layer is configured, call it to get data layer.
-            _data_layer = config.code.data_layer()
-        elif api_key := os.environ.get("LITERAL_API_KEY"):
-            # When LITERAL_API_KEY is defined, use LiteralAI data layer
-            from .literalai import LiteralDataLayer
-
-            # support legacy LITERAL_SERVER variable as fallback
-            server = os.environ.get("LITERAL_API_URL") or os.environ.get(
-                "LITERAL_SERVER"
+    global _data_layer, _data_layer_initialized
+
+    if not _data_layer_initialized:
+        if _data_layer:
+            # Data layer manually set, warn user that this is deprecated.
+            import warnings
+
+            warnings.warn(
+                "Setting data layer manually is deprecated. Use @data_layer instead.",
+                DeprecationWarning,
             )
-            _data_layer = LiteralDataLayer(api_key=api_key, server=server)
+
+        else:
+            from chainlit.config import config
+
+            if config.code.data_layer:
+                # When @data_layer is configured, call it to get data layer.
+                _data_layer = config.code.data_layer()
+            elif api_key := os.environ.get("LITERAL_API_KEY"):
+                # When LITERAL_API_KEY is defined, use LiteralAI data layer
+                from .literalai import LiteralDataLayer
+
+                # support legacy LITERAL_SERVER variable as fallback
+                server = os.environ.get("LITERAL_API_URL") or os.environ.get(
+                    "LITERAL_SERVER"
+                )
+                _data_layer = LiteralDataLayer(api_key=api_key, server=server)
+
+        _data_layer_initialized = True

     return _data_layer

Prevent attempting to setup data layer on every call toget_data_layer() when no data layer's defined.
**Is your feature request related to a problem? Please describe.**

Currently, the `get_data_layer()` function attempts to set up the data layer on every call, even when no data layer is defined. This can lead to unnecessary checks and potential performance issues if the setup logic is executed repeatedly.

**Describe the solution you'd like**

Modify the `get_data_layer()` function to return early if the `_data_layer` is already set. This prevents re-initialization by checking if `_data_layer` is `None` before attempting to set it up. The current implementation already includes this logic:

```python
def get_data_layer():
    global _data_layer

    if not _data_layer:
        if api_key := os.environ.get("LITERAL_API_KEY"):
            from .literalai import LiteralDataLayer

            # support legacy LITERAL_SERVER variable as fallback
            server = os.environ.get("LITERAL_API_URL") or os.environ.get(
                "LITERAL_SERVER"
            )
            _data_layer = LiteralDataLayer(api_key=api_key, server=server)

    return _data_layer
```

**Describe alternatives you've considered**

We should discriminate between there intentionally not being a data layer setup and there being a default data layer (e.g. LiteralAI). Perhaps we could add a 'null' data layer or something similar?

An alternative could be to refactor the data layer setup logic into a separate initialization function that is explicitly called once during application startup, rather than being embedded within `get_data_layer()`.

**Additional context**

The current implementation already prevents re-initialization by checking if `_data_layer` is `None` before setting it up. If `_data_layer` is already initialized, it simply returns the existing instance <sup>[[1]](https://github.com/Chainlit/chainlit/blob/main/backend/chainlit/data/__init__.py)</sup>. Just when no data layer is used, it will run this logic every time `get_data_layer()` is called.

@dosu Would you help me fill out the full issue report based on the title and the contents of `backend/data/__init__.py`?
<!-- Answer -->
To fill out the full issue report based on the title and the contents of `backend/data/__init__.py`, you can use the following template:

---

**Is your feature request related to a problem? Please describe.**

Currently, the `get_data_layer()` function attempts to set up the data layer on every call, even when no data layer is defined. This can lead to unnecessary checks and potential performance issues if the setup logic is executed repeatedly.

**Describe the solution you'd like**

Modify the `get_data_layer()` function to return early if the `_data_layer` is already set. This prevents re-initialization by checking if `_data_layer` is `None` before attempting to set it up. The current implementation already includes this logic:

```python
def get_data_layer():
    global _data_layer

    if not _data_layer:
        if api_key := os.environ.get("LITERAL_API_KEY"):
            from .literalai import LiteralDataLayer

            # support legacy LITERAL_SERVER variable as fallback
            server = os.environ.get("LITERAL_API_URL") or os.environ.get(
                "LITERAL_SERVER"
            )
            _data_layer = LiteralDataLayer(api_key=api_key, server=server)

    return _data_layer
```

**Describe alternatives you've considered**

An alternative could be to refactor the data layer setup logic into a separate initialization function that is explicitly called once during application startup, rather than being embedded within `get_data_layer()`.

**Additional context**

The current implementation already prevents re-initialization by checking if `_data_layer` is `None` before setting it up. If `_data_layer` is already initialized, it simply returns the existing instance <sup>[[1]](https://github.com/Chainlit/chainlit/blob/main/backend/chainlit/data/__init__.py)</sup>.

---

This template should help in clearly communicating the issue and the proposed solution.

<!-- Dosu Comment Footer -->
*To continue talking to [Dosu](https://dosu.dev), mention @dosu.*


diff --git a/moviepy/video/io/ffmpeg_reader.py b/moviepy/video/io/ffmpeg_reader.py
index f871bd8fd..536024371 100644
--- a/moviepy/video/io/ffmpeg_reader.py
+++ b/moviepy/video/io/ffmpeg_reader.py
@@ -35,8 +35,10 @@ def __init__(
             decode_file=decode_file,
             print_infos=print_infos,
         )
-        self.fps = infos["video_fps"]
-        self.size = infos["video_size"]
+        # If framerate is unavailable, assume 1.0 FPS to avoid divide-by-zero errors.
+        self.fps = infos.get("video_fps", 1.0)
+        # If frame size is unavailable, set 1x1 divide-by-zero errors.
+        self.size = infos.get("video_size", (1, 1))

         # ffmpeg automatically rotates videos if rotation information is
         # available, so exchange width and height
@@ -55,10 +57,10 @@ def __init__(
                 self.size = target_resolution
         self.resize_algo = resize_algo

-        self.duration = infos["video_duration"]
-        self.ffmpeg_duration = infos["duration"]
-        self.n_frames = infos["video_n_frames"]
-        self.bitrate = infos["video_bitrate"]
+        self.duration = infos.get("video_duration", 0.0)
+        self.ffmpeg_duration = infos.get("duration", 0.0)
+        self.n_frames = infos.get("video_n_frames", 0)
+        self.bitrate = infos.get("video_bitrate", 0)

         self.infos = infos

@@ -556,8 +558,11 @@ def parse(self):
         # last input file, must be included in self.result
         if self._current_input_file:
             self._current_input_file["streams"].append(self._current_stream)
-            # include their chapters, if there are
-            if len(input_chapters) == self._current_input_file["input_number"] + 1:
+            # include their chapters, if there are any
+            if (
+                "input_number" in self._current_input_file
+                and len(input_chapters) == self._current_input_file["input_number"] + 1
+            ):
                 self._current_input_file["chapters"] = input_chapters[
                     self._current_input_file["input_number"]
                 ]
@@ -565,13 +570,13 @@ def parse(self):

         # some video duration utilities
         if self.result["video_found"] and self.check_duration:
+            self.result["video_duration"] = self.result["duration"]
             self.result["video_n_frames"] = int(
-                self.result["duration"] * self.result["video_fps"]
+                self.result["duration"] * self.result.get("video_fps", 0)
             )
-            self.result["video_duration"] = self.result["duration"]
         else:
-            self.result["video_n_frames"] = 1
-            self.result["video_duration"] = None
+            self.result["video_n_frames"] = 0
+            self.result["video_duration"] = 0.0
         # We could have also recomputed duration from the number of frames, as follows:
         # >>> result['video_duration'] = result['video_n_frames'] / result['video_fps']

MoviePy 2.0 throws exception on loading video previous version worked with
#### Expected Behavior

MoviePy should continue to work with the same videos it did previously, even if those videos aren't fully compliant (e.g. are missing some metadata).

#### Actual Behavior

The same video crashes on MoviePy 2.0 but works with MoviePy 1.x.

#### Steps to Reproduce the Problem

See the `corrupt_video.mp4` file from https://github.com/Breakthrough/PySceneDetect/tree/resources/tests/resources and the associated unit test in https://github.com/Breakthrough/PySceneDetect/blob/95d20ddca57bb8cba77354697cc092643bd04afb/tests/test_video_stream.py#L359

The issue seems to come from the ffmpeg info parser assuming the presence of certain metadata fields.  Instead of failing, MoviePy should probably try to set some reasonable default value for these fields if they are not critical, to improve compatibility with media files.

#### Specifications

Tested on a wide variety of OS and Python versions:
 -  os: [macos-13, macos-14, ubuntu-20.04, ubuntu-latest, windows-latest]
 - python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]

MoviePy 2.0 throws exception on loading video previous version worked with
#### Expected Behavior

MoviePy should continue to work with the same videos it did previously, even if those videos aren't fully compliant (e.g. are missing some metadata).

#### Actual Behavior

The same video crashes on MoviePy 2.0 but works with MoviePy 1.x.

#### Steps to Reproduce the Problem

See the `corrupt_video.mp4` file from https://github.com/Breakthrough/PySceneDetect/tree/resources/tests/resources and the associated unit test in https://github.com/Breakthrough/PySceneDetect/blob/95d20ddca57bb8cba77354697cc092643bd04afb/tests/test_video_stream.py#L359

The issue seems to come from the ffmpeg info parser assuming the presence of certain metadata fields.  Instead of failing, MoviePy should probably try to set some reasonable default value for these fields if they are not critical, to improve compatibility with media files.

#### Specifications

Tested on a wide variety of OS and Python versions:
 -  os: [macos-13, macos-14, ubuntu-20.04, ubuntu-latest, windows-latest]
 - python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]


diff --git a/yt_dlp/update.py b/yt_dlp/update.py
index ca2ec5f376a0..dfab132afdfe 100644
--- a/yt_dlp/update.py
+++ b/yt_dlp/update.py
@@ -525,11 +525,16 @@ def filename(self):
     @functools.cached_property
     def cmd(self):
         """The command-line to run the executable, if known"""
+        argv = None
         # There is no sys.orig_argv in py < 3.10. Also, it can be [] when frozen
         if getattr(sys, 'orig_argv', None):
-            return sys.orig_argv
+            argv = sys.orig_argv
         elif getattr(sys, 'frozen', False):
-            return sys.argv
+            argv = sys.argv
+        # linux_static exe's argv[0] will be /tmp/staticx-NNNN/yt-dlp_linux if we don't fixup here
+        if argv and os.getenv('STATICX_PROG_PATH'):
+            argv = [self.filename, *argv[1:]]
+        return argv

     def restart(self):
         """Restart the executable"""

noise downloads
### 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 a bug unrelated to a specific 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)

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

old quality controls are skipped and some proffesional downloads are way too noisy as they might be on the fly being amplified due too high speed downloads

### 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
oot@cc6299b89843:/Application# yt-dlp -vU --restrict-filenames --audio-format mp3 --prefer-ffmpeg https://www.youtube.com/watch?v=rqRjv32l1FM
[debug] Command-line config: ['-vU', '--restrict-filenames', '--audio-format', 'mp3', '--prefer-ffmpeg', 'https://www.youtube.com/watch?v=rqRjv32l1FM']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2024.12.06 from yt-dlp/yt-dlp (linux_exe)
[debug] Python 3.11.11 (CPython x86_64 64bit) - Linux-6.1.0-28-amd64-x86_64-with (OpenSSL 3.1.7 3 Sep 2024)
[debug] exe versions: ffmpeg 5.1.6-0 (setts), ffprobe 5.1.6-0
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.7.1, mutagen-1.47.0, requests-2.32.3, secretstorage-3.3.3, sqlite3-3.44.2, urllib3-2.2.3, websockets-14.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Loaded 1837 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
[debug] Downloading _update_spec from https://github.com/yt-dlp/yt-dlp/releases/latest/download/_update_spec
[debug] Downloading SHA2-256SUMS from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/SHA2-256SUMS
Current version: stable@2024.12.06 from yt-dlp/yt-dlp
Latest version: stable@2024.12.13 from yt-dlp/yt-dlp
Current Build Hash: feca08aa6623e786be628d5f1a72fb2f4fce1ccb7af5b6429a06f5e79b14fead
Updating to stable@2024.12.13 from yt-dlp/yt-dlp ...
[debug] Downloading yt-dlp_linux from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/yt-dlp_linux
Updated yt-dlp to stable@2024.12.13 from yt-dlp/yt-dlp
[debug] Restarting: /tmp/staticx-JhoGDA/yt-dlp_linux -vU --restrict-filenames --audio-format mp3 --prefer-ffmpeg 'https://www.youtube.com/watch?v=rqRjv32l1FM'
[debug] Command-line config: ['-vU', '--restrict-filenames', '--audio-format', 'mp3', '--prefer-ffmpeg', 'https://www.youtube.com/watch?v=rqRjv32l1FM']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2024.12.06 from yt-dlp/yt-dlp (linux_exe)
[debug] Python 3.11.11 (CPython x86_64 64bit) - Linux-6.1.0-28-amd64-x86_64-with (OpenSSL 3.1.7 3 Sep 2024)
[debug] exe versions: ffmpeg 5.1.6-0 (setts), ffprobe 5.1.6-0
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.7.1, mutagen-1.47.0, requests-2.32.3, secretstorage-3.3.3, sqlite3-3.44.2, urllib3-2.2.3, websockets-14.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Loaded 1837 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
[debug] Downloading _update_spec from https://github.com/yt-dlp/yt-dlp/releases/latest/download/_update_spec
[debug] Downloading SHA2-256SUMS from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/SHA2-256SUMS
Current version: stable@2024.12.06 from yt-dlp/yt-dlp
Latest version: stable@2024.12.13 from yt-dlp/yt-dlp
Current Build Hash: e7788b8556c73e409d5713a4fdb71df12734b0853353f2da2352540dc9d22c95
Updating to stable@2024.12.13 from yt-dlp/yt-dlp ...
[debug] Downloading yt-dlp_linux from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/yt-dlp_linux
Updated yt-dlp to stable@2024.12.13 from yt-dlp/yt-dlp
[debug] Restarting: /tmp/staticx-JhoGDA/yt-dlp_linux -vU --restrict-filenames --audio-format mp3 --prefer-ffmpeg 'https://www.youtube.com/watch?v=rqRjv32l1FM'
[debug] Command-line config: ['-vU', '--restrict-filenames', '--audio-format', 'mp3', '--prefer-ffmpeg', 'https://www.youtube.com/watch?v=rqRjv32l1FM']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2024.12.06 from yt-dlp/yt-dlp (linux_exe)
[debug] Python 3.11.11 (CPython x86_64 64bit) - Linux-6.1.0-28-amd64-x86_64-with (OpenSSL 3.1.7 3 Sep 2024)
[debug] exe versions: ffmpeg 5.1.6-0 (setts), ffprobe 5.1.6-0
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.7.1, mutagen-1.47.0, requests-2.32.3, secretstorage-3.3.3, sqlite3-3.44.2, urllib3-2.2.3, websockets-14.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Loaded 1837 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
[debug] Downloading _update_spec from https://github.com/yt-dlp/yt-dlp/releases/latest/download/_update_spec
[debug] Downloading SHA2-256SUMS from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/SHA2-256SUMS
Current version: stable@2024.12.06 from yt-dlp/yt-dlp
Latest version: stable@2024.12.13 from yt-dlp/yt-dlp
Current Build Hash: e7788b8556c73e409d5713a4fdb71df12734b0853353f2da2352540dc9d22c95
Updating to stable@2024.12.13 from yt-dlp/yt-dlp ...
[debug] Downloading yt-dlp_linux from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/yt-dlp_linux
Updated yt-dlp to stable@2024.12.13 from yt-dlp/yt-dlp
[debug] Restarting: /tmp/staticx-JhoGDA/yt-dlp_linux -vU --restrict-filenames --audio-format mp3 --prefer-ffmpeg 'https://www.youtube.com/watch?v=rqRjv32l1FM'
[debug] Command-line config: ['-vU', '--restrict-filenames', '--audio-format', 'mp3', '--prefer-ffmpeg', 'https://www.youtube.com/watch?v=rqRjv32l1FM']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2024.12.06 from yt-dlp/yt-dlp (linux_exe)
[debug] Python 3.11.11 (CPython x86_64 64bit) - Linux-6.1.0-28-amd64-x86_64-with (OpenSSL 3.1.7 3 Sep 2024)
[debug] exe versions: ffmpeg 5.1.6-0 (setts), ffprobe 5.1.6-0
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.7.1, mutagen-1.47.0, requests-2.32.3, secretstorage-3.3.3, sqlite3-3.44.2, urllib3-2.2.3, websockets-14.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Loaded 1837 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
[debug] Downloading _update_spec from https://github.com/yt-dlp/yt-dlp/releases/latest/download/_update_spec
[debug] Downloading SHA2-256SUMS from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/SHA2-256SUMS
Current version: stable@2024.12.06 from yt-dlp/yt-dlp
Latest version: stable@2024.12.13 from yt-dlp/yt-dlp
Current Build Hash: e7788b8556c73e409d5713a4fdb71df12734b0853353f2da2352540dc9d22c95
Updating to stable@2024.12.13 from yt-dlp/yt-dlp ...
[debug] Downloading yt-dlp_linux from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/yt-dlp_linux
Updated yt-dlp to stable@2024.12.13 from yt-dlp/yt-dlp
[debug] Restarting: /tmp/staticx-JhoGDA/yt-dlp_linux -vU --restrict-filenames --audio-format mp3 --prefer-ffmpeg 'https://www.youtube.com/watch?v=rqRjv32l1FM'
[debug] Command-line config: ['-vU', '--restrict-filenames', '--audio-format', 'mp3', '--prefer-ffmpeg', 'https://www.youtube.com/watch?v=rqRjv32l1FM']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2024.12.06 from yt-dlp/yt-dlp (linux_exe)
[debug] Python 3.11.11 (CPython x86_64 64bit) - Linux-6.1.0-28-amd64-x86_64-with (OpenSSL 3.1.7 3 Sep 2024)
[debug] exe versions: ffmpeg 5.1.6-0 (setts), ffprobe 5.1.6-0
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.7.1, mutagen-1.47.0, requests-2.32.3, secretstorage-3.3.3, sqlite3-3.44.2, urllib3-2.2.3, websockets-14.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Loaded 1837 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
[debug] Downloading _update_spec from https://github.com/yt-dlp/yt-dlp/releases/latest/download/_update_spec
[debug] Downloading SHA2-256SUMS from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/SHA2-256SUMS
Current version: stable@2024.12.06 from yt-dlp/yt-dlp
Latest version: stable@2024.12.13 from yt-dlp/yt-dlp
Current Build Hash: e7788b8556c73e409d5713a4fdb71df12734b0853353f2da2352540dc9d22c95
Updating to stable@2024.12.13 from yt-dlp/yt-dlp ...
[debug] Downloading yt-dlp_linux from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/yt-dlp_linux
Updated yt-dlp to stable@2024.12.13 from yt-dlp/yt-dlp
[debug] Restarting: /tmp/staticx-JhoGDA/yt-dlp_linux -vU --restrict-filenames --audio-format mp3 --prefer-ffmpeg 'https://www.youtube.com/watch?v=rqRjv32l1FM'
[debug] Command-line config: ['-vU', '--restrict-filenames', '--audio-format', 'mp3', '--prefer-ffmpeg', 'https://www.youtube.com/watch?v=rqRjv32l1FM']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2024.12.06 from yt-dlp/yt-dlp (linux_exe)
[debug] Python 3.11.11 (CPython x86_64 64bit) - Linux-6.1.0-28-amd64-x86_64-with (OpenSSL 3.1.7 3 Sep 2024)
[debug] exe versions: ffmpeg 5.1.6-0 (setts), ffprobe 5.1.6-0
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.7.1, mutagen-1.47.0, requests-2.32.3, secretstorage-3.3.3, sqlite3-3.44.2, urllib3-2.2.3, websockets-14.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Loaded 1837 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
[debug] Downloading _update_spec from https://github.com/yt-dlp/yt-dlp/releases/latest/download/_update_spec
[debug] Downloading SHA2-256SUMS from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/SHA2-256SUMS
Current version: stable@2024.12.06 from yt-dlp/yt-dlp
Latest version: stable@2024.12.13 from yt-dlp/yt-dlp
Current Build Hash: e7788b8556c73e409d5713a4fdb71df12734b0853353f2da2352540dc9d22c95
Updating to stable@2024.12.13 from yt-dlp/yt-dlp ...
[debug] Downloading yt-dlp_linux from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/yt-dlp_linux
Updated yt-dlp to stable@2024.12.13 from yt-dlp/yt-dlp
[debug] Restarting: /tmp/staticx-JhoGDA/yt-dlp_linux -vU --restrict-filenames --audio-format mp3 --prefer-ffmpeg 'https://www.youtube.com/watch?v=rqRjv32l1FM'
[debug] Command-line config: ['-vU', '--restrict-filenames', '--audio-format', 'mp3', '--prefer-ffmpeg', 'https://www.youtube.com/watch?v=rqRjv32l1FM']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2024.12.06 from yt-dlp/yt-dlp (linux_exe)
[debug] Python 3.11.11 (CPython x86_64 64bit) - Linux-6.1.0-28-amd64-x86_64-with (OpenSSL 3.1.7 3 Sep 2024)
[debug] exe versions: ffmpeg 5.1.6-0 (setts), ffprobe 5.1.6-0
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.7.1, mutagen-1.47.0, requests-2.32.3, secretstorage-3.3.3, sqlite3-3.44.2, urllib3-2.2.3, websockets-14.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Loaded 1837 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
[debug] Downloading _update_spec from https://github.com/yt-dlp/yt-dlp/releases/latest/download/_update_spec
[debug] Downloading SHA2-256SUMS from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/SHA2-256SUMS
Current version: stable@2024.12.06 from yt-dlp/yt-dlp
Latest version: stable@2024.12.13 from yt-dlp/yt-dlp
Current Build Hash: e7788b8556c73e409d5713a4fdb71df12734b0853353f2da2352540dc9d22c95
Updating to stable@2024.12.13 from yt-dlp/yt-dlp ...
[debug] Downloading yt-dlp_linux from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/yt-dlp_linux
Updated yt-dlp to stable@2024.12.13 from yt-dlp/yt-dlp
[debug] Restarting: /tmp/staticx-JhoGDA/yt-dlp_linux -vU --restrict-filenames --audio-format mp3 --prefer-ffmpeg 'https://www.youtube.com/watch?v=rqRjv32l1FM'
[debug] Command-line config: ['-vU', '--restrict-filenames', '--audio-format', 'mp3', '--prefer-ffmpeg', 'https://www.youtube.com/watch?v=rqRjv32l1FM']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2024.12.06 from yt-dlp/yt-dlp (linux_exe)
[debug] Python 3.11.11 (CPython x86_64 64bit) - Linux-6.1.0-28-amd64-x86_64-with (OpenSSL 3.1.7 3 Sep 2024)
[debug] exe versions: ffmpeg 5.1.6-0 (setts), ffprobe 5.1.6-0
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.7.1, mutagen-1.47.0, requests-2.32.3, secretstorage-3.3.3, sqlite3-3.44.2, urllib3-2.2.3, websockets-14.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Loaded 1837 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
[debug] Downloading _update_spec from https://github.com/yt-dlp/yt-dlp/releases/latest/download/_update_spec
[debug] Downloading SHA2-256SUMS from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/SHA2-256SUMS
Current version: stable@2024.12.06 from yt-dlp/yt-dlp
Latest version: stable@2024.12.13 from yt-dlp/yt-dlp
Current Build Hash: e7788b8556c73e409d5713a4fdb71df12734b0853353f2da2352540dc9d22c95
Updating to stable@2024.12.13 from yt-dlp/yt-dlp ...
[debug] Downloading yt-dlp_linux from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/yt-dlp_linux
Updated yt-dlp to stable@2024.12.13 from yt-dlp/yt-dlp
[debug] Restarting: /tmp/staticx-JhoGDA/yt-dlp_linux -vU --restrict-filenames --audio-format mp3 --prefer-ffmpeg 'https://www.youtube.com/watch?v=rqRjv32l1FM'
[debug] Command-line config: ['-vU', '--restrict-filenames', '--audio-format', 'mp3', '--prefer-ffmpeg', 'https://www.youtube.com/watch?v=rqRjv32l1FM']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2024.12.06 from yt-dlp/yt-dlp (linux_exe)
[debug] Python 3.11.11 (CPython x86_64 64bit) - Linux-6.1.0-28-amd64-x86_64-with (OpenSSL 3.1.7 3 Sep 2024)
[debug] exe versions: ffmpeg 5.1.6-0 (setts), ffprobe 5.1.6-0
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.7.1, mutagen-1.47.0, requests-2.32.3, secretstorage-3.3.3, sqlite3-3.44.2, urllib3-2.2.3, websockets-14.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Loaded 1837 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
[debug] Downloading _update_spec from https://github.com/yt-dlp/yt-dlp/releases/latest/download/_update_spec
[debug] Downloading SHA2-256SUMS from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/SHA2-256SUMS
Current version: stable@2024.12.06 from yt-dlp/yt-dlp
Latest version: stable@2024.12.13 from yt-dlp/yt-dlp
Current Build Hash: e7788b8556c73e409d5713a4fdb71df12734b0853353f2da2352540dc9d22c95
Updating to stable@2024.12.13 from yt-dlp/yt-dlp ...
[debug] Downloading yt-dlp_linux from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/yt-dlp_linux
Updated yt-dlp to stable@2024.12.13 from yt-dlp/yt-dlp
[debug] Restarting: /tmp/staticx-JhoGDA/yt-dlp_linux -vU --restrict-filenames --audio-format mp3 --prefer-ffmpeg 'https://www.youtube.com/watch?v=rqRjv32l1FM'
[debug] Command-line config: ['-vU', '--restrict-filenames', '--audio-format', 'mp3', '--prefer-ffmpeg', 'https://www.youtube.com/watch?v=rqRjv32l1FM']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2024.12.06 from yt-dlp/yt-dlp (linux_exe)
[debug] Python 3.11.11 (CPython x86_64 64bit) - Linux-6.1.0-28-amd64-x86_64-with (OpenSSL 3.1.7 3 Sep 2024)
[debug] exe versions: ffmpeg 5.1.6-0 (setts), ffprobe 5.1.6-0
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.7.1, mutagen-1.47.0, requests-2.32.3, secretstorage-3.3.3, sqlite3-3.44.2, urllib3-2.2.3, websockets-14.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Loaded 1837 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
[debug] Downloading _update_spec from https://github.com/yt-dlp/yt-dlp/releases/latest/download/_update_spec
[debug] Downloading SHA2-256SUMS from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/SHA2-256SUMS
Current version: stable@2024.12.06 from yt-dlp/yt-dlp
Latest version: stable@2024.12.13 from yt-dlp/yt-dlp
Current Build Hash: e7788b8556c73e409d5713a4fdb71df12734b0853353f2da2352540dc9d22c95
Updating to stable@2024.12.13 from yt-dlp/yt-dlp ...
[debug] Downloading yt-dlp_linux from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/yt-dlp_linux
^C
ERROR: Interrupted by user

ERROR: Interrupted by user
ERROR: Interrupted by user

ERROR: Interrupted by user

ERROR: Interrupted by user

ERROR: Interrupted by user
root@cc6299b89843:/Application#
ERROR: Interrupted by user

ERROR: Interrupted by user
ERROR: Interrupted by user

ERROR: Interrupted by user
^C
```

![image](https://github.com/user-attachments/assets/b81fdc4d-4088-48c2-b50f-a64419c14aa2)

Using `--audio-format mp3` alongside `--extract-audio` instructs yt-dlp to convert the audio track to mp3. This is lossy. To get the files as streamed by the site don't pass `--audio-format`.
Do note that nearly all sites don't offer uncompressed audio, so the files downloaded will have the same compression artifacts as present when playing in a web browser.
@seproDev howto get only the audio from the container then (i am a developer and not using lot' s of commands from yt-dlp and only want the best quality audio track available from the container.
Now without --audio-format its 8.6 GB download instead of 200 MB

![image](https://github.com/user-attachments/assets/d101feca-3fbb-4dd0-a22e-f2685abb2a9b)

For YouTube specifically there usually exist both a opus and aac audio format. yt-dlp preferrs opus due to being a newer codec.
You can download the opus audio format with
```
yt-dlp -x "URL"
```
If you instead want the aac format use
```
yt-dlp -x -S acodec:aac "URL"
```

`-x` is short for `--extract-audio`


diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py
index fd9c7107c7f7..b12a22d852ab 100644
--- a/yt_dlp/extractor/youtube.py
+++ b/yt_dlp/extractor/youtube.py
@@ -1495,7 +1495,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
         },
         # Age-gate videos. See https://github.com/yt-dlp/yt-dlp/pull/575#issuecomment-888837000
         {
-            'note': 'Embed allowed age-gate video',
+            'note': 'Embed allowed age-gate video; works with web_embedded',
             'url': 'https://youtube.com/watch?v=HtVdAasjOgU',
             'info_dict': {
                 'id': 'HtVdAasjOgU',
@@ -1525,7 +1525,6 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
                 'heatmap': 'count:100',
                 'timestamp': 1401991663,
             },
-            'skip': 'Age-restricted; requires authentication',
         },
         {
             'note': 'Age-gate video with embed allowed in public site',
@@ -3983,10 +3982,20 @@ def append_client(*client_names):
                 else:
                     prs.append(pr)

+            # web_embedded can work around age-gate and age-verification for some embeddable videos
+            if self._is_agegated(pr) and variant != 'web_embedded':
+                append_client(f'web_embedded.{base_client}')
+            # Unauthenticated users will only get web_embedded client formats if age-gated
+            if self._is_agegated(pr) and not self.is_authenticated:
+                self.to_screen(
+                    f'{video_id}: This video is age-restricted; some formats may be missing '
+                    f'without authentication. {self._login_hint()}', only_once=True)
+
             ''' This code is pointless while web_creator is in _DEFAULT_AUTHED_CLIENTS
             # EU countries require age-verification for accounts to access age-restricted videos
             # If account is not age-verified, _is_agegated() will be truthy for non-embedded clients
-            if self.is_authenticated and self._is_agegated(pr):
+            embedding_is_disabled = variant == 'web_embedded' and self._is_unplayable(pr)
+            if self.is_authenticated and (self._is_agegated(pr) or embedding_is_disabled):
                 self.to_screen(
                     f'{video_id}: This video is age-restricted and YouTube is requiring '
                     'account age-verification; some formats may be missing', only_once=True)

[youtube] Age-restricted videos now always require sign-in
### 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)
- [ ] 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

_No response_

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

I'm unable to download any age restricted videos without signing in. Wasn't a problem till a week ago.
I'm on the latest nightly and it fails with or without the AGP plugin.

### 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
C:\Users\Casey>yt-dlp https://www.youtube.com/watch?v=7Do70nztRNE -vU
[debug] Command-line config: ['https://www.youtube.com/watch?v=7Do70nztRNE', '-vU']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version nightly@2024.10.19.232833 from yt-dlp/yt-dlp-nightly-builds [679c68240] (pip)
[debug] Python 3.11.2 (CPython AMD64 64bit) - Windows-10-10.0.19044-SP0 (OpenSSL 1.1.1s  1 Nov 2022)
[debug] exe versions: ffmpeg 2023-07-06-git-f00222e81f-essentials_build-www.gyan.dev (setts), ffprobe 2023-07-06-git-f00222e81f-essentials_build-www.gyan.dev
[debug] Optional libraries: Cryptodome-3.19.0, brotli-1.1.0, certifi-2022.12.07, curl_cffi-0.5.10, mutagen-1.47.0, requests-2.32.3, sqlite3-3.39.4, urllib3-1.26.18, websockets-13.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Extractor Plugins: AGB (YoutubeIE)
[debug] Plugin directories: ['C:\\Users\\Casey\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\yt_dlp_plugins']
[debug] Loaded 1838 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp-nightly-builds/releases/latest
Latest version: nightly@2024.10.19.232833 from yt-dlp/yt-dlp-nightly-builds
yt-dlp is up to date (nightly@2024.10.19.232833 from yt-dlp/yt-dlp-nightly-builds)
[youtube+AGB] Extracting URL: https://www.youtube.com/watch?v=7Do70nztRNE
[youtube+AGB] 7Do70nztRNE: Downloading webpage
[youtube+AGB] 7Do70nztRNE: Downloading ios player API JSON
[youtube+AGB] 7Do70nztRNE: This video is age-restricted; some formats may be missing without authentication. Use --cookies-from-browser or --cookies for the authentication. See  https://github.com/yt-dlp/yt-dlp/wiki/FAQ#how-do-i-pass-cookies-to-yt-dlp  for how to manually pass cookies
[youtube+AGB] 7Do70nztRNE: Downloading tv embedded player API JSON
[youtube+AGB] 7Do70nztRNE: Downloading mweb player API JSON
[youtube+AGB] 7Do70nztRNE: Downloading Zerody API JSON
WARNING: [youtube+AGB] Unable to download JSON metadata: HTTP Error 502: Bad Gateway
ERROR: [youtube+AGB] 7Do70nztRNE: Sign in to confirm your age. This video may be inappropriate for some users.
  File "C:\Users\Casey\AppData\Local\Programs\Python\Python311\Lib\site-packages\yt_dlp\extractor\common.py", line 741, in extract
    ie_result = self._real_extract(url)
                ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Casey\AppData\Local\Programs\Python\Python311\Lib\site-packages\yt_dlp\extractor\youtube.py", line 4468, in _real_extract
    self.raise_no_formats(reason, expected=True)
  File "C:\Users\Casey\AppData\Local\Programs\Python\Python311\Lib\site-packages\yt_dlp\extractor\common.py", line 1275, in raise_no_formats
    raise ExtractorError(msg, expected=expected, video_id=video_id)
```

please provide a log without the plugin. run `set YTDLP_NO_PLUGINS=1` and then your download command again
Log without the AGP plugin

```
C:\Users\Casey>yt-dlp https://www.youtube.com/watch?v=7Do70nztRNE -vU
[debug] Command-line config: ['https://www.youtube.com/watch?v=7Do70nztRNE', '-vU']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version nightly@2024.10.19.232833 from yt-dlp/yt-dlp-nightly-builds [679c68240] (pip)
[debug] Python 3.11.2 (CPython AMD64 64bit) - Windows-10-10.0.19044-SP0 (OpenSSL 1.1.1s  1 Nov 2022)
[debug] exe versions: ffmpeg 2023-07-06-git-f00222e81f-essentials_build-www.gyan.dev (setts), ffprobe 2023-07-06-git-f00222e81f-essentials_build-www.gyan.dev
[debug] Optional libraries: Cryptodome-3.19.0, brotli-1.1.0, certifi-2022.12.07, curl_cffi-0.5.10, mutagen-1.47.0, requests-2.32.3, sqlite3-3.39.4, urllib3-1.26.18, 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-nightly-builds/releases/latest
Latest version: nightly@2024.10.19.232833 from yt-dlp/yt-dlp-nightly-builds
yt-dlp is up to date (nightly@2024.10.19.232833 from yt-dlp/yt-dlp-nightly-builds)
[youtube] Extracting URL: https://www.youtube.com/watch?v=7Do70nztRNE
[youtube] 7Do70nztRNE: Downloading webpage
[youtube] 7Do70nztRNE: Downloading ios player API JSON
[youtube] 7Do70nztRNE: This video is age-restricted; some formats may be missing without authentication. Use --cookies-from-browser or --cookies for the authentication. See  https://github.com/yt-dlp/yt-dlp/wiki/FAQ#how-do-i-pass-cookies-to-yt-dlp  for how to manually pass cookies
[youtube] 7Do70nztRNE: Downloading tv embedded player API JSON
[youtube] 7Do70nztRNE: Downloading mweb player API JSON
ERROR: [youtube] 7Do70nztRNE: Sign in to confirm your age. This video may be inappropriate for some users.
  File "C:\Users\Casey\AppData\Local\Programs\Python\Python311\Lib\site-packages\yt_dlp\extractor\common.py", line 741, in extract
    ie_result = self._real_extract(url)
                ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Casey\AppData\Local\Programs\Python\Python311\Lib\site-packages\yt_dlp\extractor\youtube.py", line 4468, in _real_extract
    self.raise_no_formats(reason, expected=True)
  File "C:\Users\Casey\AppData\Local\Programs\Python\Python311\Lib\site-packages\yt_dlp\extractor\common.py", line 1275, in raise_no_formats
    raise ExtractorError(msg, expected=expected, video_id=video_id)
```

> ERROR: [youtube] 7Do70nztRNE: Sign in to confirm your age. This video may be inappropriate for some users.

The `tv_embedded` client that yt-dlp was using to work around the age-restriction now requires sign-in for every video, so it is no longer useful for this purpose.

The [linked pull request that will close this issue](https://github.com/yt-dlp/yt-dlp/pull/11297) merely removes the broken age-gate workaround and now-misleading warning message.

**There will likely not be a solution to this besides authenticating with cookies or oauth.**
(Obligatory mention of the [**risk you would be taking if you use cookies or oauth**](https://github.com/yt-dlp/yt-dlp/issues/10085))

---

> [youtube+AGB] 7Do70nztRNE: Downloading Zerody API JSON
> WARNING: [youtube+AGB] Unable to download JSON metadata: HTTP Error 502: Bad Gateway

As for the plugin error, that is out-of-scope for this issue tracker. It looks like an issue with the AGB API (the server, not the plugin code). There's likely nothing that the maintainer of the yt-dlp plugin can do about that either.
This is disappointing. I've already had an account blocked by Google when using oauth so downloading without signing in was the only real option for me.

So is there any workaround that anyone knows?
@eytay Your options are:
- Provide cookies to yt-dlp at the risk of your account getting blocked if you download an excessive amount
- Try the [YTAgeGateBypass](https://github.com/pukkandan/yt-dlp-YTAgeGateBypass) plugin (as you already did). This relies on a public account proxy and might not work.

I am surprised the bypass yt-dlp used worked for as long as it did.
It can't read my cookies, no matter from browser or the cookies.sqlite.
```
[ytdl_hook] ERROR: 'utf-8' codec can't decode byte 0x80 in position 16: invalid start byte
[ytdl_hook] ERROR: 'utf-8' codec can't decode byte 0x80 in position 16: invalid start byte
[ytdl_hook] youtube-dl failed: unexpected error occurred
Failed to recognize file format.
```
@laichiaheng `--cookies` requires a netscape cookie file. NOT the sqlite file your browser uses. If you want yt-dlp to read the cookies directly from your browser use `--cookies-from-browser`. If you need further help please open a new issue with a complete verbose log.
> @laichiaheng `--cookies` requires a netscape cookie file. NOT the sqlite file your browser uses. If you want yt-dlp to read the cookies directly from your browser use `--cookies-from-browser`. If you need further help please open a new issue with a complete verbose log.

I did, but it showed me the same error.

Nevermind, it seems to be fixed with the latest update, I guess, I can play the video with cookies from browser now.
Workaround for age-restricted and similar issues. This uses a personal throw-away google account, and optionally uses tor.

#### start a browser with a temp/throway profile (optionally with tor).
`torsocks chromium  --temp-profile`

#### add an extension to export cookies.txt - "Get cookies.txt LOCALLY".
chromewebstore.google.com/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc

#### pin that extension to the taskbar.

#### create a google account using the temp-profile browser instance.

#### make a note of login credentials, in case you need to access the account later.

#### go to youtube, this sets YT cookies in the browser.

#### find an age-restricted video, and verify that you want to see it.

#### use the `Get cookies.txt LOCALLY` extension to "Export All Cookies".

#### (optional) re-name the saved cookies file to something more meaningful:
`mv -vi ~/Downloads/cookies.txt ~/Downloads/cookies-throwaway.txt`

#### (optional) check that only a minimal set of domains is stored in that cookie file:
```
awk '{print $1}' ~/Downloads/cookies-throwaway.txt | sort -u

#
accounts.google.com
.chromewebstore.google.com
chromewebstore.google.com
.google.com
.google.co.nz
ogs.google.com
www.google.com
.youtube.com
```
#### profit:
`torsocks yt-dlp --cookies ~/Downloads/cookies-throwaway.txt ...`

#### (optional) save the login credentials where they can be found when needed. DO NOT ADD THIS TO THE COOKIES.TXT FILE.
```
cat ~/Downloads/cookies-throwaway-login.txt
name: xxxxxx
login: xxxxxx
pass:	xxxxxx
```

@atom-smasher

Thank you for this. But is creating Google Account without any personal information (e.g SMS verification) a challenge in itself?
> Thank you for this. But is creating Google Account without any personal information (e.g SMS verification) a challenge in itself?

It can be, but as I was going through step-by-step to document the process, it did not ask for any SMS verification.

I don't remember… It may have asked for something like a phone-number or backup email address, for account recovery purposes, but if it did, I was able to “skip” past them.
@atom-smasher How exactly you make your throwaway accounts? What browser/VPN server or real IP country/3rd party email if any for recovery/ask for new gmail as main or just use 3rd party as main/believable name/bd/etc were you using? I think probably all of this and more affects if you get forced phone verification or not. I had an old burner account I made with VPN and Edge but it got blocked trying it now.


diff --git a/yt_dlp/update.py b/yt_dlp/update.py
index ca2ec5f376a0..9ccd44b5e77d 100644
--- a/yt_dlp/update.py
+++ b/yt_dlp/update.py
@@ -65,9 +65,14 @@ def _get_variant_and_executable_path():
             machine = '_legacy' if version_tuple(platform.mac_ver()[0]) < (10, 15) else ''
         else:
             machine = f'_{platform.machine().lower()}'
+            is_64bits = sys.maxsize > 2**32
             # Ref: https://en.wikipedia.org/wiki/Uname#Examples
             if machine[1:] in ('x86', 'x86_64', 'amd64', 'i386', 'i686'):
-                machine = '_x86' if platform.architecture()[0][:2] == '32' else ''
+                machine = '_x86' if not is_64bits else ''
+            # platform.machine() on 32-bit raspbian OS may return 'aarch64', so check "64-bitness"
+            # See: https://github.com/yt-dlp/yt-dlp/issues/11813
+            elif machine[1:] == 'aarch64' and not is_64bits:
+                machine = '_armv7l'
             # sys.executable returns a /tmp/ path for staticx builds (linux_static)
             # Ref: https://staticx.readthedocs.io/en/latest/usage.html#run-time-information
             if static_exe_path := os.getenv('STATICX_PROG_PATH'):

--update flag updates to the wrong software architecture
### 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 a bug unrelated to a specific 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)

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

I was using `yt-dlp_linux_armv7l`, but using the `--update` flag updated me to the `yt-dlp_linux_aarch64` binary.

Attempting to run the updated binary doesn't work because it uses the wrong software architecture:
```
$ ./yt-dlp_linux_armv7l --help
bash: ./yt-dlp_linux_armv7l: No such file or directory
```

Steps to reproduce:

1. Download version `2024.12.06/yt-dlp_linux_armv7l` and confirm it is the right binary:
    1. `mkdir test ; cd test`
    2. `wget https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.06/yt-dlp_linux_armv7l ; chmod a+x ./yt-dlp_linux_armv7l`
    3. `sha256sum ./yt-dlp_linux_armv7l`
    4. observer sha256 output `ed7ce4a5508dbecb5e0272ae57023eae243b4ac73d0969a498844fc3e111d8b4` is correct
    5. `file ./yt-dlp_linux_armv7l`
    6. Observe output is correct: `./yt-dlp_linux_armv7l: ELF 32-bit LSB pie executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, BuildID[sha1]=9a7fa40acc4aaeaf3d330fc2fc510872be2db480, for GNU/Linux 3.2.0, stripped`
 2. Update yt-dlp and observe it now uses the wrong architecture
     1. `./yt-dlp_linux_armv7l -vU` (verbose log pasted below)
     2. `sha256sum ./yt-dlp_linux_armv7l`
     3. observer sha256 output `d55bb8356ce48facdd0d1c34a54fc947824210a2bf67c9e2569b1b59080df7c1` corresponds to the linux_aarch64 architecture now rather than linux_armv7l
     4. `file ./yt-dlp_linux_armv7l`
     5. Observe output confirms we have the wrong architecture now: `./yt-dlp_linux_armv7l: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=165c3840e46a056d08c976cddc9073109cf26ee7, for GNU/Linux 3.7.0, stripped`

### Provide verbose output that clearly demonstrates the problem

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

### Complete Verbose Output

```shell
[debug] Command-line config: ['-vU']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2024.12.06 from yt-dlp/yt-dlp (linux_aarch64_exe)
[debug] Python 3.9.5 (CPython aarch64 32bit) - Linux-6.1.21-v8+-aarch64-with-glibc2.31 (OpenSSL 1.1.1f  31 Mar 2020, glibc 2.31)
[debug] exe versions: ffmpeg 4.3.8-0, ffprobe 4.3.8-0
[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.31.1, urllib3-2.2.3, websockets-14.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets
[debug] Loaded 1837 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
[debug] Downloading _update_spec from https://github.com/yt-dlp/yt-dlp/releases/latest/download/_update_spec
[debug] Downloading SHA2-256SUMS from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/SHA2-256SUMS
Current version: stable@2024.12.06 from yt-dlp/yt-dlp
Latest version: stable@2024.12.13 from yt-dlp/yt-dlp
Current Build Hash: ed7ce4a5508dbecb5e0272ae57023eae243b4ac73d0969a498844fc3e111d8b4
Updating to stable@2024.12.13 from yt-dlp/yt-dlp ...
[debug] Downloading yt-dlp_linux_aarch64 from https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.13/yt-dlp_linux_aarch64
Updated yt-dlp to stable@2024.12.13 from yt-dlp/yt-dlp
```

Is the verbose log you've provided the armv7l binary updating to the aarch64 binary?

If so, the armv7l binary is detecting itself as being the aarch64
>Is the verbose log you've provided the armv7l binary updating to the aarch64 binary?

Yes.

>If so, the armv7l binary is detecting itself as being the aarch64

Agreed -- very weird

Do you have python installed on your armv7l machine? If so, could you show the output of this command:
```
python -c "import platform; print(platform.machine())"
```
Here is the output you requested:
```
% python3 -c "import platform; print(platform.machine())"
aarch64
```

I'm using a raspberry pi 4b. I'm running 32 bit raspbian OS on it.

The output of `uname -a` is misleading on the system -- the `aarch64` output makes it seem like it is a 64 bit OS:
```
% uname -a
Linux piwall 6.1.21-v8+ #1642 SMP PREEMPT Mon Apr  3 17:24:16 BST 2023 aarch64 GNU/Linux
```

However, this output shows that it is actually a 32 bit OS:
```
% getconf LONG_BIT
32
```

In case it's helpful, here's some more output from my system:
```
% cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 11 (bullseye)"
NAME="Raspbian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
```
Thanks. Could you also show the output of this command please?
```
python3 -c "import sys; print(sys.maxsize > 2**32)"
```
Sure:
```
% python3 -c "import sys; print(sys.maxsize > 2**32)"
False
```
I think we could patch it like this:
```diff
diff --git a/yt_dlp/update.py b/yt_dlp/update.py
index ca2ec5f37..9ccd44b5e 100644
--- a/yt_dlp/update.py
+++ b/yt_dlp/update.py
@@ -65,9 +65,14 @@ def _get_variant_and_executable_path():
             machine = '_legacy' if version_tuple(platform.mac_ver()[0]) < (10, 15) else ''
         else:
             machine = f'_{platform.machine().lower()}'
+            is_64bits = sys.maxsize > 2**32
             # Ref: https://en.wikipedia.org/wiki/Uname#Examples
             if machine[1:] in ('x86', 'x86_64', 'amd64', 'i386', 'i686'):
-                machine = '_x86' if platform.architecture()[0][:2] == '32' else ''
+                machine = '_x86' if not is_64bits else ''
+            # platform.machine() on 32-bit raspbian OS may return 'aarch64', so check "64-bitness"
+            # See: https://github.com/yt-dlp/yt-dlp/issues/11813
+            elif machine[1:] == 'aarch64' and not is_64bits:
+                machine = '_armv7l'
             # sys.executable returns a /tmp/ path for staticx builds (linux_static)
             # Ref: https://staticx.readthedocs.io/en/latest/usage.html#run-time-information
             if static_exe_path := os.getenv('STATICX_PROG_PATH'):
```

@Grub4K what do you think?


diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py
index fd9c7107c7f7..e12f728ea323 100644
--- a/yt_dlp/extractor/youtube.py
+++ b/yt_dlp/extractor/youtube.py
@@ -518,11 +518,12 @@ def ucid_or_none(self, ucid):
         return self._search_regex(rf'^({self._YT_CHANNEL_UCID_RE})$', ucid, 'UC-id', default=None)

     def handle_or_none(self, handle):
-        return self._search_regex(rf'^({self._YT_HANDLE_RE})$', handle, '@-handle', default=None)
+        return self._search_regex(rf'^({self._YT_HANDLE_RE})$', urllib.parse.unquote(handle or ''),
+                                  '@-handle', default=None)

     def handle_from_url(self, url):
         return self._search_regex(rf'^(?:https?://(?:www\.)?youtube\.com)?/({self._YT_HANDLE_RE})',
-                                  url, 'channel handle', default=None)
+                                  urllib.parse.unquote(url or ''), 'channel handle', default=None)

     def ucid_from_url(self, url):
         return self._search_regex(rf'^(?:https?://(?:www\.)?youtube\.com)?/({self._YT_CHANNEL_UCID_RE})',
@@ -2801,6 +2802,35 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
                 'extractor_args': {'youtube': {'player_client': ['ios'], 'player_skip': ['webpage']}},
             },
         },
+        {
+            # uploader_id has non-ASCII characters that are percent-encoded in YT's JSON
+            'url': 'https://www.youtube.com/shorts/18NGQq7p3LY',
+            'info_dict': {
+                'id': '18NGQq7p3LY',
+                'ext': 'mp4',
+                'title': '아이브 이서 장원영 리즈 삐끼삐끼 챌린지',
+                'description': '',
+                'uploader': 'ㅇㅇ',
+                'uploader_id': '@으아-v1k',
+                'uploader_url': 'https://www.youtube.com/@으아-v1k',
+                'channel': 'ㅇㅇ',
+                'channel_id': 'UCC25oTm2J7ZVoi5TngOHg9g',
+                'channel_url': 'https://www.youtube.com/channel/UCC25oTm2J7ZVoi5TngOHg9g',
+                'thumbnail': r're:https?://.+/.+\.jpg',
+                'playable_in_embed': True,
+                'age_limit': 0,
+                'duration': 3,
+                'timestamp': 1724306170,
+                'upload_date': '20240822',
+                'availability': 'public',
+                'live_status': 'not_live',
+                'view_count': int,
+                'like_count': int,
+                'channel_follower_count': int,
+                'categories': ['People & Blogs'],
+                'tags': [],
+            },
+        },
     ]

     _WEBPAGE_TESTS = [

The `uploader_id` template does not print asian characters or letters with diacritical marks on the yt site.
### 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)
- [ ] 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

_No response_

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

The template `uploader_id` doesn't print asian characters or letters with diacritical marks on the yt site. While the template `uploader` does.

_Example Channel URL:_
1. https://www.youtube.com/@으아-v1k
2. https://www.youtube.com/c/CONTROLMÁS-SUILERALTAMIRANO

_Example Command:_
`yt-dlp -o "./%(uploader)s %(uploader_id)s/Videos/%(upload_date)s %(uploader_id)s %(title)s [%(id)s].%(ext)s" "Example_Channel_URL"`

_Output:_
Name of the created folders
1. `ㅇㅇ#`
2. `Suiler Altamirano - Control + NA`

Using the `--print` argument.

_Command:_
`yt-dlp -vU --print uploader,uploader_id "https://www.youtube.com/shorts/18NGQq7p3LY"`

_Ouput:_
```
ㅇㅇ
NA
```

### 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', '--print', 'uploader,uploader_id', 'https://www.youtube.com/shorts/18NGQq7p3LY']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2024.12.13 from yt-dlp/yt-dlp [542166962] (win_exe)
[debug] Python 3.10.11 (CPython AMD64 64bit) - Windows-10-10.0.19045-SP0 (OpenSSL 1.1.1t  7 Feb 2023)
[debug] exe versions: ffmpeg 2024-07-07-git-0619138639-full_build-www.gyan.dev (setts), ffprobe 2024-07-07-git-0619138639-full_build-www.gyan.dev, phantomjs 2.1.1
[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-14.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Extractor Plugins:
[debug] Post-Processor Plugins:
[debug] Plugin directories: []
[debug] Loaded 1839 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: stable@2024.12.13 from yt-dlp/yt-dlp
yt-dlp is up to date (stable@2024.12.13 from yt-dlp/yt-dlp)
[youtube] Extracting URL: https://www.youtube.com/shorts/18NGQq7p3LY
[youtube] 18NGQq7p3LY: Downloading webpage
[youtube] 18NGQq7p3LY: Downloading ios player API JSON
[youtube] 18NGQq7p3LY: Downloading mweb player API JSON
[debug] Loading youtube-nsig.f8f53e1a from cache
[debug] [youtube] Decrypted nsig uq0JCV23R3b7atLWxO4 => 9vigDFaIWXoXwA
[debug] Loading youtube-nsig.f8f53e1a from cache
[debug] [youtube] Decrypted nsig -T_DSjpoOPpyTJKSn0b => N9TXRFGASCEhbA
[youtube] 18NGQq7p3LY: Downloading m3u8 information
[debug] Sort order given by extractor: quality, res, fps, hdr:12, source, vcodec, channels, acodec, lang, proto
[debug] Formats sorted by: hasvid, ie_pref, quality, res, fps, hdr:12(7), source, vcodec, channels, acodec, lang, proto, size, br, asr, vext, aext, hasaud, id
[debug] Default format spec: bestvideo*+bestaudio/best
[info] 18NGQq7p3LY: Downloading 1 format(s): 315+251
ㅇㅇ
NA
```


diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py
index e69373ba2f42..0814d0a0621b 100644
--- a/yt_dlp/extractor/youtube.py
+++ b/yt_dlp/extractor/youtube.py
@@ -5282,6 +5282,7 @@ def _extract_entries(self, parent_renderer, continuation_list):
                     'channelRenderer': lambda x: self._grid_entries({'items': [{'channelRenderer': x}]}),
                     'hashtagTileRenderer': lambda x: [self._hashtag_tile_entry(x)],
                     'richGridRenderer': lambda x: self._extract_entries(x, continuation_list),
+                    'lockupViewModel': lambda x: [self._extract_lockup_view_model(x)],
                 }
                 for key, renderer in isr_content.items():
                     if key not in known_renderers:

[Youtube] Playlist search broken
### 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

Germany

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

Using the youtube search functionality with playlist filter enabled does not work anymore.
Worked on previous versions. Should be related to current playlist issues which return 0 results.

Expected behavior should be getting the json result of the playlists results.

### 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: ['-vvvv', '-4', '--no-warnings', '--no-check-certificate', '--dump-json', '--playlist-start', '1', '--playlist-end', '50', '--flat-playlist', 'https://www.youtube.com/results?search_query=cute+cat&sp=EgIQAw%253D%253D']
[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.18 from yt-dlp/yt-dlp [7ea278792] (linux_exe)
[debug] Lazy loading extractors is disabled
[debug] Python 3.9.2 (CPython x86_64 64bit) - Linux-4.19.0-24-amd64-x86_64-with-glibc2.31 (OpenSSL 1.1.1w  11 Sep 2023, glibc 2.31)
[debug] exe versions: ffmpeg 4.3.8-0, ffprobe 4.3.8-0
[debug] Optional libraries: Cryptodome-3.9.7, certifi-2020.06.20, requests-2.25.1, secretstorage-3.3.1, sqlite3-3.34.1, urllib3-1.26.5
[debug] Proxy map: {}
[debug] Request Handlers: urllib
[debug] Loaded 1837 extractors
[youtube:search_url] Extracting URL: https://www.youtube.com/results?search_query=cute+cat&sp=EgIQAw%253D%253D
[download] Downloading playlist: cute cat
[youtube:search_url] query "cute cat": Downloading web client config
[youtube:search_url] query "cute cat" page 1: Downloading API JSON
[youtube:search_url] query "cute cat" page 2: Downloading API JSON
[youtube:search_url] query "cute cat" page 3: Downloading API JSON
[youtube:search_url] query "cute cat" page 4: Downloading API JSON
[youtube:search_url] query "cute cat" page 5: Downloading API JSON
[youtube:search_url] query "cute cat" page 6: Downloading API JSON
[youtube:search_url] query "cute cat" page 7: Downloading API JSON
[youtube:search_url] query "cute cat" page 8: Downloading API JSON
[youtube:search_url] query "cute cat" page 9: Downloading API JSON
[youtube:search_url] query "cute cat" page 10: Downloading API JSON
[youtube:search_url] query "cute cat" page 11: Downloading API JSON
[youtube:search_url] query "cute cat" page 12: Downloading API JSON
[youtube:search_url] query "cute cat" page 13: Downloading API JSON
[youtube:search_url] query "cute cat" page 14: Downloading API JSON
[youtube:search_url] query "cute cat" page 15: Downloading API JSON
[youtube:search_url] query "cute cat" page 16: Downloading API JSON
[youtube:search_url] query "cute cat" page 17: Downloading API JSON
[youtube:search_url] query "cute cat" page 18: Downloading API JSON
[youtube:search_url] query "cute cat" page 19: Downloading API JSON
[youtube:search_url] query "cute cat" page 20: Downloading API JSON
[youtube:search_url] query "cute cat" page 21: Downloading API JSON
[youtube:search_url] query "cute cat" page 22: Downloading API JSON
[youtube:search_url] query "cute cat" page 23: Downloading API JSON
[youtube:search_url] query "cute cat" page 24: Downloading API JSON
[youtube:search_url] Playlist cute cat: Downloading 0 items
[debug] The information of all playlist entries will be held in memory
[download] Finished downloading playlist: cute cat
```

did you update to nightly/master like the issue template told you to, though?
yes, i am on master and compiled it myself.

> yes, i am on master and compiled it myself.

that verbose log tells me that you are on yt-dlp stable branch and not nightly/master branch
how can i be on stable if i clone the master branche and compile it? I am on the master branche.
if you want to extract the flat-playlist from eg.
https://www.youtube.com/results?search_query=cute+cat&sp=EgIQAw%253D%253D

its still broken in master.
> if you want to extract the flat-playlist from eg. https://www.youtube.com/results?search_query=cute+cat&sp=EgIQAw%253D%253D
>
> its still broken in master.

You need to change the search link to this: https://m.youtube.com/results?search_query=your+search+terms
Well that’s a potential workaround but no fix.
If YouTube is doing site/layout changes, then the parsers have to get updated and not just pointed to a mobile site, which is likely to also getting changed.
> > if you want to extract the flat-playlist from eg. https://www.youtube.com/results?search_query=cute+cat&sp=EgIQAw%253D%253D
> > its still broken in master.
>
> You need to change the search link to this: https://m.youtube.com/results?search_query=your+search+terms

for notice:

suggested change is also broken.

https://m.youtube.com/results?search_query=cute+cat&sp=EgIQAw%253D%253D

does not work, as the parsing for playlists in general is broken and we only search for playlists with "&sp=EgIQAw%253D%253D" search filter added.
> > > if you want to extract the flat-playlist from eg. https://www.youtube.com/results?search_query=cute+cat&sp=EgIQAw%253D%253D
> > > its still broken in master.
> >
> >
> > You need to change the search link to this: https://m.youtube.com/results?search_query=your+search+terms
>
> for notice:
>
> suggested change is also broken.
>
> https://m.youtube.com/results?search_query=cute+cat&sp=EgIQAw%253D%253D
>
> does not work, as the parsing for playlists in general is broken and we only search for playlists with "&sp=EgIQAw%253D%253D" search filter added.

cute cat playlist as you search doesn't exist
I do not search for a specific playlist. That is a general search request to youtube to get a list of all available playlists where youtube results for the query.
This worked before and for years. To be able to search for type "playlist" only in the search results and get it back as a json response by using --flat-playlist and --dump-json
> I do not search for a specific playlist. That is a general search request to youtube to get a list of all available playlists where youtube results for the query. This worked before and for years. To be able to search for type "playlist" only in the search results and get it back as a json response by using --flat-playlist and --dump-json

playlists from youtube results for cute cat that you say don't exist now
so then whats this?:

https://www.youtube.com/results?search_query=cute+cat&sp=EgIQAw%253D%253D

its a list of playlists for the search query "cute cat", which before yt-dlp parsed as a json list of playlist urls, with titles, amount of videos in the playlist, creator ...

i think you don't get the point what is tried to archive here, which worked fine before.
I am currently debugging this issue and found out, that the search query calls "_search_results" function first and then "_extract_entries" is beeing called.

Inside "_extract_entries" there is a definition of known renderers:

```
known_renderers = {
                    'playlistVideoListRenderer': self._playlist_entries,
                    'gridRenderer': self._grid_entries,
                    'reelShelfRenderer': self._grid_entries,
                    'shelfRenderer': self._shelf_entries,
                    'musicResponsiveListItemRenderer': lambda x: [self._music_reponsive_list_entry(x)],
                    'backstagePostThreadRenderer': self._post_thread_entries,
                    'videoRenderer': lambda x: [self._video_entry(x)],
                    'playlistRenderer': lambda x: self._grid_entries({'items': [{'playlistRenderer': x}]}),
                    'channelRenderer': lambda x: self._grid_entries({'items': [{'channelRenderer': x}]}),
                    'hashtagTileRenderer': lambda x: [self._hashtag_tile_entry(x)],
                    'richGridRenderer': lambda x: self._extract_entries(x, continuation_list),
                }
```

which is beeing looked for.
I added prints to see whats happening for:
```
for key, renderer in isr_content.items():
                    if key not in known_renderers:
                        print("key NOT found in known_renderers: " + key)
                        continue
                    for entry in known_renderers[key](renderer):
                        print("found renderer: " + entry)
```

which results in this output:

```
[youtube:search_url] query "cute cat" page 1: Downloading API JSON
=====================_extract_entries=====================
key NOT found in known_renderers: adSlotRenderer
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: adSlotRenderer
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: adSlotRenderer
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: adSlotRenderer
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: adSlotRenderer
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: lockupViewModel
key NOT found in known_renderers: lockupViewModel
```

For me this looks like on the search results there are "lockupViewModel" which is missing in the "knwon_rednerers", so no parsing is done anymore, as continue just skips it as no renderer is defined anymore for this case.

Any ideas to speed this up fixing this? Otherwise I have to look through all the code myself.
This issue probably highly relates to:
https://github.com/yt-dlp/yt-dlp/pull/11615

I am looking how this already merged pull request can be used to solve this issue too.
How about
```diff
diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py
index e69373ba2..0814d0a06 100644
--- a/yt_dlp/extractor/youtube.py
+++ b/yt_dlp/extractor/youtube.py
@@ -5282,6 +5282,7 @@ def _extract_entries(self, parent_renderer, continuation_list):
                     'channelRenderer': lambda x: self._grid_entries({'items': [{'channelRenderer': x}]}),
                     'hashtagTileRenderer': lambda x: [self._hashtag_tile_entry(x)],
                     'richGridRenderer': lambda x: self._extract_entries(x, continuation_list),
+                    'lockupViewModel': lambda x: [self._extract_lockup_view_model(x)],
                 }
                 for key, renderer in isr_content.items():
                     if key not in known_renderers:
```
> How about
>
> ```diff
> diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py
> index e69373ba2..0814d0a06 100644
> --- a/yt_dlp/extractor/youtube.py
> +++ b/yt_dlp/extractor/youtube.py
> @@ -5282,6 +5282,7 @@ def _extract_entries(self, parent_renderer, continuation_list):
>                      'channelRenderer': lambda x: self._grid_entries({'items': [{'channelRenderer': x}]}),
>                      'hashtagTileRenderer': lambda x: [self._hashtag_tile_entry(x)],
>                      'richGridRenderer': lambda x: self._extract_entries(x, continuation_list),
> +                    'lockupViewModel': lambda x: [self._extract_lockup_view_model(x)],
>                  }
>                  for key, renderer in isr_content.items():
>                      if key not in known_renderers:
> ```

this does work!

output:
```
=====================_extract_entries=====================
[youtube:search_url] Playlist cute cat: Downloading 50 items
[debug] The information of all playlist entries will be held in memory
[download] Downloading item 1 of 50
{"title": "Cute Cat of NI", "thumbnails": [{"url": "https://i.ytimg.com/vi/phXmMI35fIo/hqdefault.jpg?sqp=-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLCexppnbWUPXQgz341lRGXxTwGGww", "height": 94, "width": 168}, {"url": "https://i.ytimg.com/vi/phXmMI35fIo/hqdefault.jpg?sqp=-oaymwEWCMQBEG5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLCNJgQ2qs-2znEem1B90IIx-h8QcA", "height": 110, "width": 196}, {"url": "https://i.ytimg.com/vi/phXmMI35fIo/hqdefault.jpg?sqp=-oaymwEXCPYBEIoBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCpjHdPSkoqpwTrF9zPElW4ICJwkw", "height": 138, "width": 246}, {"url": "https://i.ytimg.com/vi/phXmMI35fIo/hqdefault.jpg?sqp=-oaymwEXCNACELwBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAgoA5ZH_HfuzDBg1QYHVu4R_kRzQ", "height": 188, "width": 336}], "ie_key": "YoutubeTab", "id": "PLBFAOHoKf1k6-tWa_yjDJKxnR6srQXhSH", "_type": "url", "url": "https://www.youtube.com/playlist?list=PLBFAOHoKf1k6-tWa_yjDJKxnR6srQXhSH", "__x_forwarded_for_ip": null, "webpage_url": "https://www.youtube.com/playlist?list=PLBFAOHoKf1k6-tWa_yjDJKxnR6srQXhSH", "original_url": "https://www.youtube.com/playlist?list=PLBFAOHoKf1k6-tWa_yjDJKxnR6srQXhSH", "webpage_url_basename": "playlist", "webpage_url_domain": "youtube.com", "extractor": "youtube:tab", "extractor_key": "YoutubeTab", "playlist_count": null, "playlist": "cute cat", "playlist_id": "cute cat", "playlist_title": "cute cat", "playlist_uploader": null, "playlist_uploader_id": null, "playlist_channel": null, "playlist_channel_id": null, "playlist_webpage_url": "https://www.youtube.com/results?search_query=cute+cat&sp=EgIQAw%253D%253D", "n_entries": 50, "playlist_index": 1, "__last_playlist_index": 50, "playlist_autonumber": 1, "epoch": 1733840411, "release_year": null, "_version": {"version": "2024.12.06", "current_git_head": null, "release_git_head": "4bd2655398aed450456197a6767639114a24eac2", "repository": "yt-dlp/yt-dlp"}}
[download] Downloading item 2 of 50
{"title": "Cute cat \u2618\ufe0f \u3010Cute Lofi Mix\ud83c\udf52\u3011\ud83c\udf3crelax / study / sleep / work / aesthetic", "thumbnails": [{"url": "https://i.ytimg.com/vi/hW9g7To610w/hqdefault.jpg?sqp=-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLDPa1XYgae4ZMThWSTnPuckBqOwYg", "height": 94, "width": 168}, {"url": "https://i.ytimg.com/vi/hW9g7To610w/hqdefault.jpg?sqp=-oaymwEWCMQBEG5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLDA0cKLczY3zRxwelwc4LBRfz_FOA", "height": 110, "width": 196}, {"url": "https://i.ytimg.com/vi/hW9g7To610w/hqdefault.jpg?sqp=-oaymwEXCPYBEIoBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDd60KIWDS1XMf99cU-L93sTYWa1w", "height": 138, "width": 246}, {"url": "https://i.ytimg.com/vi/hW9g7To610w/hqdefault.jpg?sqp=-oaymwEXCNACELwBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLC2dbcOvc9nlk_OrOPTyeklrmxFXg", "height": 188, "width": 336}], "ie_key": "YoutubeTab", "id": "PLumUPw_clK5HHuZIUFXApW7jShX5JPmMJ", "_type": "url", "url": "https://www.youtube.com/playlist?list=PLumUPw_clK5HHuZIUFXApW7jShX5JPmMJ", "__x_forwarded_for_ip": null,"webpage_url": "https://www.youtube.com/playlist?list=PLumUPw_clK5HHuZIUFXApW7jShX5JPmMJ", "original_url": "https://www.youtube.com/playlist?list=PLumUPw_clK5HHuZIUFXApW7jShX5JPmMJ", "webpage_url_basename": "playlist", "webpage_url_domain": "youtube.com", "extractor": "youtube:tab", "extractor_key": "YoutubeTab", "playlist_count": null, "playlist": "cute cat", "playlist_id": "cute cat", "playlist_title": "cute cat", "playlist_uploader": null, "playlist_uploader_id": null, "playlist_channel": null, "playlist_channel_id": null, "playlist_webpage_url": "https://www.youtube.com/results?search_query=cute+cat&sp=EgIQAw%253D%253D", "n_entries": 50, "playlist_index": 2, "__last_playlist_index": 50, "playlist_autonumber": 2, "epoch": 1733840411, "release_year": null, "_version": {"version": "2024.12.06", "current_git_head": null, "release_git_head": "4bd2655398aed450456197a6767639114a24eac2", "repository": "yt-dlp/yt-dlp"}}
[download] Downloading item 3 of 50
{"title": "Cute Kitten, Cute Cat | Little Kittens", "thumbnails": [{"url": "https://i.ytimg.com/vi/nAvtX22KNTg/hqdefault.jpg?sqp=-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLA37XsAbQxF7--pdSd9V-8Mgdvk-Q", "height": 94, "width": 168}, {"url": "https://i.ytimg.com/vi/nAvtX22KNTg/hqdefault.jpg?sqp=-oaymwEWCMQBEG5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLDgP2JXJQQ9eKyjRq_kzHH-PvSjZQ", "height": 110, "width": 196}, {"url": "https://i.ytimg.com/vi/nAvtX22KNTg/hqdefault.jpg?sqp=-oaymwEXCPYBEIoBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLD7sRLFMJcsZyb78yGmcrvD3JIZmw", "height": 138, "width": 246}, {"url": "https://i.ytimg.com/vi/nAvtX22KNTg/hqdefault.jpg?sqp=-oaymwEXCNACELwBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBE3bQuBq3UpaLpq71JYp9bmfRZnQ", "height": 188, "width": 336}], "ie_key": "YoutubeTab", "id": "PLlBfWe1gfOezsfNKeEE00vzCjgBgBVeE-", "_type": "url", "url": "https://www.youtube.com/playlist?list=PLlBfWe1gfOezsfNKeEE00vzCjgBgBVeE-", "__x_forwarded_for_ip": null, "webpage_url": "https://www.youtube.com/playlist?list=PLlBfWe1gfOezsfNKeEE00vzCjgBgBVeE-", "original_url": "https://www.youtube.com/playlist?list=PLlBfWe1gfOezsfNKeEE00vzCjgBgBVeE-", "webpage_url_basename": "playlist", "webpage_url_domain": "youtube.com", "extractor": "youtube:tab", "extractor_key": "YoutubeTab", "playlist_count": null, "playlist": "cute cat", "playlist_id": "cute cat", "playlist_title": "cute cat", "playlist_uploader": null, "playlist_uploader_id": null, "playlist_channel": null, "playlist_channel_id": null, "playlist_webpage_url": "https://www.youtube.com/results?search_query=cute+cat&sp=EgIQAw%253D%253D", "n_entries": 50, "playlist_index": 3, "__last_playlist_index": 50, "playlist_autonumber": 3, "epoch": 1733840411, "release_year": null, "_version": {"version": "2024.12.06", "current_git_head": null, "release_git_head": "4bd2655398aed450456197a6767639114a24eac2", "repository": "yt-dlp/yt-dlp"}}
[download] Downloading item 4 of 50
{"title": "Cute Cat Videos", "thumbnails": [{"url": "https://i.ytimg.com/vi/nMeSViR6Uoc/hqdefault.jpg?sqp=-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLDZyAud_wlAIhfjJsELZG7jgfRlpw", "height": 94, "width": 168}, {"url": "https://i.ytimg.com/vi/nMeSViR6Uoc/hqdefault.jpg?sqp=-oaymwEWCMQBEG5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLDqn_ufZK0wAMo5ahDJOSvyiOFLfw", "height": 110, "width": 196}, {"url": "https://i.ytimg.com/vi/nMeSViR6Uoc/hqdefault.jpg?sqp=-oaymwEXCPYBEIoBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAkHUkEJUTHwdwphBPzCBmis1Ga-A", "height": 138, "width": 246}, {"url": "https://i.ytimg.com/vi/nMeSViR6Uoc/hqdefault.jpg?sqp=-oaymwEXCNACELwBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDLyEqB0fjSAVjRU2YOLzsztNKgvA", "height": 188, "width": 336}], "ie_key": "YoutubeTab", "id": "PL7-x6iMIEpgc1Vhq-FASNb186TWXVS_u2", "_type": "url", "url": "https://www.youtube.com/playlist?list=PL7-x6iMIEpgc1Vhq-FASNb186TWXVS_u2", "__x_forwarded_for_ip": null, "webpage_url": "https://www.youtube.com/playlist?list=PL7-x6iMIEpgc1Vhq-FASNb186TWXVS_u2", "original_url": "https://www.youtube.com/playlist?list=PL7-x6iMIEpgc1Vhq-FASNb186TWXVS_u2", "webpage_url_basename": "playlist", "webpage_url_domain": "youtube.com", "extractor": "youtube:tab", "extractor_key": "YoutubeTab", "playlist_count": null, "playlist": "cute cat", "playlist_id": "cute cat", "playlist_title": "cute cat", "playlist_uploader": null, "playlist_uploader_id": null, "playlist_channel": null, "playlist_channel_id": null, "playlist_webpage_url": "https://www.youtube.com/results?search_query=cute+cat&sp=EgIQAw%253D%253D", "n_entries": 50, "playlist_index": 4, "__last_playlist_index": 50, "playlist_autonumber": 4, "epoch": 1733840411, "release_year": null, "_version": {"version": "2024.12.06", "current_git_head": null, "release_git_head": "4bd2655398aed450456197a6767639114a24eac2", "repository": "yt-dlp/yt-dlp"}}
[download] Downloading item 5 of 50
{"title": "Cute cat and puppy world", "thumbnails": [{"url": "https://i.ytimg.com/vi/GCnQYjXvV7Q/hqdefault.jpg?sqp=-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLBd6bosQTSVHcMWS8miLbZT2gq_ig", "height": 94, "width": 168}, {"url": "https://i.ytimg.com/vi/GCnQYjXvV7Q/hqdefault.jpg?sqp=-oaymwEWCMQBEG5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLDV7lb4j_K5SUFVZQ5qRuAcU4MWNQ", "height": 110, "width": 196}, {"url": "https://i.ytimg.com/vi/GCnQYjXvV7Q/hqdefault.jpg?sqp=-oaymwEXCPYBEIoBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBqjGracCqwvT3R-4U19k5GUiAY4w", "height": 138, "width": 246}, {"url": "https://i.ytimg.com/vi/GCnQYjXvV7Q/hqdefault.jpg?sqp=-oaymwEXCNACELwBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCotimRQTnkRcbXiEDjnTTJEOwGzQ", "height": 188, "width": 336}], "ie_key": "YoutubeTab", "id": "PLdL74Q19adY0dh-ymKIxIHrwSRyIFL5a1", "_type": "url", "url": "https://www.youtube.com/playlist?list=PLdL74Q19adY0dh-ymKIxIHrwSRyIFL5a1", "__x_forwarded_for_ip": null, "webpage_url": "https://www.youtube.com/playlist?list=PLdL74Q19adY0dh-ymKIxIHrwSRyIFL5a1", "original_url": "https://www.youtube.com/playlist?list=PLdL74Q19adY0dh-ymKIxIHrwSRyIFL5a1", "webpage_url_basename": "playlist", "webpage_url_domain": "youtube.com", "extractor": "youtube:tab", "extractor_key": "YoutubeTab", "playlist_count": null, "playlist": "cute cat", "playlist_id": "cute cat", "playlist_title": "cute cat", "playlist_uploader": null, "playlist_uploader_id": null, "playlist_channel": null, "playlist_channel_id": null, "playlist_webpage_url": "https://www.youtube.com/results?search_query=cute+cat&sp=EgIQAw%253D%253D", "n_entries": 50, "playlist_index": 5, "__last_playlist_index": 50, "playlist_autonumber": 5, "epoch": 1733840411, "release_year": null, "_version": {"version": "2024.12.06", "current_git_head": null, "release_git_head": "4bd2655398aed450456197a6767639114a24eac2", "repository": "yt-dlp/yt-dlp"}}
[download] Downloading item 6 of 50
{"title": "Duet Cats Cute Popcat Music - all SONG, CATS and FOOD", "thumbnails": [{"url": "https://i.ytimg.com/vi/X5-AkEhhjho/hqdefault.jpg?sqp=-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLBhqwVi5L8OHVcLOc6KHVavr3Cplg", "height": 94, "width": 168}, {"url": "https://i.ytimg.com/vi/X5-AkEhhjho/hqdefault.jpg?sqp=-oaymwEWCMQBEG5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLBFRO7M6WkW6tPC_5Y__Ze9xM8M2A", "height": 110, "width": 196}, {"url": "https://i.ytimg.com/vi/X5-AkEhhjho/hqdefault.jpg?sqp=-oaymwEXCPYBEIoBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLA1IVtb2WvU1ZVY4AYhDP3uT7n99A", "height": 138, "width": 246}, {"url": "https://i.ytimg.com/vi/X5-AkEhhjho/hqdefault.jpg?sqp=-oaymwEXCNACELwBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDolJQfj3Qoim5rPS8LWifAerl5Aw", "height": 188, "width": 336}], "ie_key": "YoutubeTab", "id": "PL7DH5KKQ3-8LkwNGLHF_shz4Pmew1vtVN", "_type": "url", "url": "https://www.youtube.com/playlist?list=PL7DH5KKQ3-8LkwNGLHF_shz4Pmew1vtVN", "__x_forwarded_for_ip": null, "webpage_url": "https://www.youtube.com/playlist?list=PL7DH5KKQ3-8LkwNGLHF_shz4Pmew1vtVN", "original_url": "https://www.youtube.com/playlist?list=PL7DH5KKQ3-8LkwNGLHF_shz4Pmew1vtVN", "webpage_url_basename": "playlist", "webpage_url_domain": "youtube.com", "extractor": "youtube:tab", "extractor_key": "YoutubeTab", "playlist_count": null, "playlist": "cute cat", "playlist_id": "cute cat", "playlist_title": "cute cat", "playlist_uploader": null, "playlist_uploader_id": null, "playlist_channel": null, "playlist_channel_id": null, "playlist_webpage_url": "https://www.youtube.com/results?search_query=cute+cat&sp=EgIQAw%253D%253D", "n_entries": 50, "playlist_index": 6, "__last_playlist_index": 50, "playlist_autonumber": 6, "epoch": 1733840411, "release_year": null, "_version": {"version": "2024.12.06", "current_git_head": null, "release_git_head": "4bd2655398aed450456197a6767639114a24eac2", "repository": "yt-dlp/yt-dlp"}}
[download] Downloading item 7 of 50
{"title": "Cute cat", "thumbnails": [{"url": "https://i.ytimg.com/vi/w9g6_xz8hUQ/hqdefault.jpg?sqp=-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLDWIKpFazsSR-TQR4NRvvEoI2dXRA", "height": 94, "width": 168}, {"url": "https://i.ytimg.com/vi/w9g6_xz8hUQ/hqdefault.jpg?sqp=-oaymwEWCMQBEG5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLB2gg6WiCJO7rSggnpyY_btM8318w", "height": 110, "width": 196}, {"url": "https://i.ytimg.com/vi/w9g6_xz8hUQ/hqdefault.jpg?sqp=-oaymwEXCPYBEIoBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDVYR5pdbk9qoXhAF-kLDZT1mpIzA", "height": 138, "width": 246}, {"url": "https://i.ytimg.com/vi/w9g6_xz8hUQ/hqdefault.jpg?sqp=-oaymwEXCNACELwBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLACrgV-nDaVlyDlUmPN8bCGwTffyQ", "height": 188, "width": 336}], "ie_key": "YoutubeTab", "id": "PL-_BwsNAuul_t0zp8SPKxbD-ktDqxiG5W", "_type": "url", "url": "https://www.youtube.com/playlist?list=PL-_BwsNAuul_t0zp8SPKxbD-ktDqxiG5W", "__x_forwarded_for_ip": null, "webpage_url": "https://www.youtube.com/playlist?list=PL-_BwsNAuul_t0zp8SPKxbD-ktDqxiG5W", "original_url": "https://www.youtube.com/playlist?list=PL-_BwsNAuul_t0zp8SPKxbD-ktDqxiG5W", "webpage_url_basename": "playlist", "webpage_url_domain": "youtube.com", "extractor": "youtube:tab", "extractor_key": "YoutubeTab", "playlist_count": null, "playlist": "cute cat", "playlist_id": "cute cat", "playlist_title": "cute cat", "playlist_uploader": null, "playlist_uploader_id": null, "playlist_channel": null, "playlist_channel_id": null, "playlist_webpage_url": "https://www.youtube.com/results?search_query=cute+cat&sp=EgIQAw%253D%253D", "n_entries": 50, "playlist_index": 7, "__last_playlist_index": 50, "playlist_autonumber": 7, "epoch": 1733840411, "release_year": null, "_version": {"version": "2024.12.06", "current_git_head": null, "release_git_head": "4bd2655398aed450456197a6767639114a24eac2", "repository": "yt-dlp/yt-dlp"}}
[download] Downloading item 8 of 50
...
```