Repository: yt-dlp
Issue: `--no-playlist` doesn't work for YouTube embed links
Labels: site-bug,triage,site:youtube

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

The following command, with a YouTube `watch?v=` URL:
```bash
yt-dlp --no-playlist 'https://www.youtube.com/watch?v=zeJD6dqJ5lo&list=PLZHQObOWTQDOMxJDswBaLu8xBMKxSTvg8'
```
works as expected, downloading only the video, and showing the message `Downloading just the video zeJD6dqJ5lo because of --no-playlist`. But with an embed URL:
```bash
yt-dlp --no-playlist 'https://www.youtube.com/embed/zeJD6dqJ5lo?list=PLZHQObOWTQDOMxJDswBaLu8xBMKxSTvg8'
```
the whole playlist is downloaded.

### 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', '-s', '--no-playlist', 'https://www.youtube.com/embed/zeJD6dqJ5lo?list=PLZHQObOWTQDOMxJDswBaLu8xBMKxSTvg8']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8 (No ANSI), error utf-8 (No ANSI), screen utf-8 (No ANSI)
[debug] yt-dlp version stable@2025.01.12 from yt-dlp/yt-dlp [dade5e35c] (source)
[debug] Lazy loading extractors is disabled
[debug] Git HEAD: a3c032182
[debug] Python 3.9.21 (CPython x86_64 64bit) - Linux-6.12.8-arch1-1-x86_64-with-glibc2.40 (OpenSSL 3.0.15 3 Sep 2024, glibc 2.40)
[debug] exe versions: ffmpeg 7.1 (setts), ffprobe 7.1, rtmpdump 2.4
[debug] Optional libraries: sqlite3-3.47.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib
[debug] Loaded 1837 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: stable@2025.01.12 from yt-dlp/yt-dlp
yt-dlp is up to date (stable@2025.01.12 from yt-dlp/yt-dlp)
[youtube:playlist] Extracting URL: https://www.youtube.com/embed/zeJD6dqJ5lo?list=PLZHQObOWTQDOMxJDswBaLu8xBMKxSTvg8
[youtube:tab] Extracting URL: https://www.youtube.com/playlist?list=PLZHQObOWTQDOMxJDswBaLu8xBMKxSTvg8
[youtube:tab] PLZHQObOWTQDOMxJDswBaLu8xBMKxSTvg8: Downloading webpage
[youtube:tab] PLZHQObOWTQDOMxJDswBaLu8xBMKxSTvg8: Redownloading playlist API JSON with unavailable videos
[download] Downloading playlist: Central limit theorem
[youtube:tab] PLZHQObOWTQDOMxJDswBaLu8xBMKxSTvg8 page 1: Downloading API JSON
WARNING: [youtube:tab] Incomplete data received. Retrying (1/3)...
[youtube:tab] PLZHQObOWTQDOMxJDswBaLu8xBMKxSTvg8 page 1: Downloading API JSON
WARNING: [youtube:tab] Incomplete data received. Retrying (2/3)...
[youtube:tab] PLZHQObOWTQDOMxJDswBaLu8xBMKxSTvg8 page 1: Downloading API JSON
WARNING: [youtube:tab] Incomplete data received. Retrying (3/3)...
[youtube:tab] PLZHQObOWTQDOMxJDswBaLu8xBMKxSTvg8 page 1: Downloading API JSON
WARNING: [youtube:tab] Incomplete data received. Giving up after 3 retries
[youtube:tab] Playlist Central limit theorem: Downloading 4 items of 4
[download] Downloading item 1 of 4
[youtube] Extracting URL: https://www.youtube.com/watch?v=zeJD6dqJ5lo
[youtube] zeJD6dqJ5lo: Downloading webpage
[youtube] zeJD6dqJ5lo: Downloading ios player API JSON
[youtube] zeJD6dqJ5lo: Downloading tv player API JSON
[debug] [youtube] zeJD6dqJ5lo: ios client https formats require a PO Token which was not provided. They will be skipped as they may yield HTTP Error 403. You can manually pass a PO Token for this client with --extractor-args "youtube:po_token=ios+XXX". For more information, refer to  https://github.com/yt-dlp/yt-dlp/wiki/Extractors#po-token-guide . To enable these broken formats anyway, pass --extractor-args "youtube:formats=missing_pot"
[debug] Loading youtube-nsig.0b866fa6 from cache
[debug] [youtube] Decrypted nsig WFTh6zlKa9WyDPsG => CzNKUMel9Ut-qQ
[debug] Loading youtube-nsig.0b866fa6 from cache
[debug] [youtube] Decrypted nsig xmvh64e_u-zoD1X0 => iO2uQjisVHe5Eg
[youtube] zeJD6dqJ5lo: 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] zeJD6dqJ5lo: Downloading 1 format(s): 401+251
[download] Downloading item 2 of 4
[youtube] Extracting URL: https://www.youtube.com/watch?v=cy8r7WSuT1I
[youtube] cy8r7WSuT1I: Downloading webpage
[youtube] cy8r7WSuT1I: Downloading ios player API JSON
[youtube] cy8r7WSuT1I: Downloading tv player API JSON
[debug] [youtube] cy8r7WSuT1I: ios client https formats require a PO Token which was not provided. They will be skipped as they may yield HTTP Error 403. You can manually pass a PO Token for this client with --extractor-args "youtube:po_token=ios+XXX". For more information, refer to  https://github.com/yt-dlp/yt-dlp/wiki/Extractors#po-token-guide . To enable these broken formats anyway, pass --extractor-args "youtube:formats=missing_pot"
[debug] Loading youtube-nsig.0b866fa6 from cache
[debug] [youtube] Decrypted nsig FZn0CbGXqWhlkCcn => g_Ot3QuVr0mPrw
[debug] Loading youtube-nsig.0b866fa6 from cache
[debug] [youtube] Decrypted nsig RFhUwgVrgHSrdhCR => jRNYMhgSHoHYtA
[youtube] cy8r7WSuT1I: 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] cy8r7WSuT1I: Downloading 1 format(s): 401+251-1
[download] Downloading item 3 of 4
[youtube] Extracting URL: https://www.youtube.com/watch?v=IaSGqQa5O-M
[youtube] IaSGqQa5O-M: Downloading webpage
[youtube] IaSGqQa5O-M: Downloading ios player API JSON
[youtube] IaSGqQa5O-M: Downloading tv player API JSON
[debug] [youtube] IaSGqQa5O-M: ios client https formats require a PO Token which was not provided. They will be skipped as they may yield HTTP Error 403. You can manually pass a PO Token for this client with --extractor-args "youtube:po_token=ios+XXX". For more information, refer to  https://github.com/yt-dlp/yt-dlp/wiki/Extractors#po-token-guide . To enable these broken formats anyway, pass --extractor-args "youtube:formats=missing_pot"
[debug] Loading youtube-nsig.0b866fa6 from cache
[debug] [youtube] Decrypted nsig EkCCni_0P44fKyKZ => jAHvNr-9_wILHw
[debug] Loading youtube-nsig.0b866fa6 from cache
[debug] [youtube] Decrypted nsig 3eE3RIKu5Ovxa1DE => YdSmEh2Qg4eJkw
[youtube] IaSGqQa5O-M: 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] IaSGqQa5O-M: Downloading 1 format(s): 401+251
[download] Downloading item 4 of 4
[youtube] Extracting URL: https://www.youtube.com/watch?v=d_qvLDhkg00
[youtube] d_qvLDhkg00: Downloading webpage
[youtube] d_qvLDhkg00: Downloading ios player API JSON
[youtube] d_qvLDhkg00: Downloading tv player API JSON
[debug] [youtube] d_qvLDhkg00: ios client https formats require a PO Token which was not provided. They will be skipped as they may yield HTTP Error 403. You can manually pass a PO Token for this client with --extractor-args "youtube:po_token=ios+XXX". For more information, refer to  https://github.com/yt-dlp/yt-dlp/wiki/Extractors#po-token-guide . To enable these broken formats anyway, pass --extractor-args "youtube:formats=missing_pot"
[debug] Loading youtube-nsig.0b866fa6 from cache
[debug] [youtube] Decrypted nsig Xc6WtuFpYV6mZx6Q => KNNLIcUocRl3vw
[debug] Loading youtube-nsig.0b866fa6 from cache
[debug] [youtube] Decrypted nsig WwXbzskCeIen8oF8 => iys5vHbyKhYejw
[youtube] d_qvLDhkg00: 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] d_qvLDhkg00: Downloading 1 format(s): 401+251
[download] Finished downloading playlist: Central limit theorem
```