[cleanup] Replace dead example/test URL (#17061)

* Replace dead example URL in documentation
* Replace primary Youtube test URL
* Remove obsolete `test_youtube_lists` module

Closes #12263
Authored by: bashonly
This commit is contained in:
bashonly 2026-06-26 17:36:35 -05:00 committed by GitHub
parent 57528faa36
commit c102b20965
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 78 additions and 147 deletions

View File

@ -76,7 +76,7 @@ For bug reports, this means that your report should contain the **complete** out
If the error is `ERROR: Unable to extract ...` and you cannot reproduce it from multiple countries, add `--write-pages` and upload the `.dump` files you get [somewhere](https://gist.github.com).
**Site support requests must contain an example URL**. An example URL is a URL you might want to download, like `https://www.youtube.com/watch?v=BaW_jenozKc`. There should be an obvious video present. Except under very special circumstances, the main page of a video service (e.g. `https://www.youtube.com/`) is *not* an example URL.
**Site support requests must contain an example URL**. An example URL is a URL you might want to download, like `https://www.youtube.com/watch?v=YE7VzlLtp-4`. There should be an obvious video present. Except under very special circumstances, the main page of a video service (e.g. `https://www.youtube.com/`) is *not* an example URL.
### Are you using the latest version?

View File

@ -1264,7 +1264,7 @@ As an alternative to using the `.netrc` file, which has the disadvantage of keep
E.g. To use an encrypted `.netrc` file stored as `.authinfo.gpg`
```
yt-dlp --netrc-cmd 'gpg --decrypt ~/.authinfo.gpg' 'https://www.youtube.com/watch?v=BaW_jenozKc'
yt-dlp --netrc-cmd 'gpg --decrypt ~/.authinfo.gpg' 'https://www.youtube.com/watch?v=YE7VzlLtp-4'
```
@ -1454,7 +1454,7 @@ Available only in `--sponsorblock-chapter-title`:
- `name` (string): Friendly name of the smallest category
- `type` (string): The [SponsorBlock action type](https://wiki.sponsor.ajay.app/w/Types#Action_Type) of the chapter
Each aforementioned sequence when referenced in an output template will be replaced by the actual value corresponding to the sequence name. E.g. for `-o %(title)s-%(id)s.%(ext)s` and an mp4 video with title `yt-dlp test video` and id `BaW_jenozKc`, this will result in a `yt-dlp test video-BaW_jenozKc.mp4` file created in the current directory.
Each aforementioned sequence when referenced in an output template will be replaced by the actual value corresponding to the sequence name. E.g. for `-o %(title)s-%(id)s.%(ext)s` and an mp4 video with title `yt-dlp test video` and id `YE7VzlLtp-4`, this will result in a `yt-dlp test video-YE7VzlLtp-4.mp4` file created in the current directory.
**Note**: Some of the sequences are not guaranteed to be present, since they depend on the metadata obtained by a particular extractor. Such sequences will be replaced with placeholder value provided with `--output-na-placeholder` (`NA` by default).
@ -1473,14 +1473,14 @@ In some cases, you don't want special characters such as 中, spaces, or &, such
#### Output template examples
```bash
$ yt-dlp --print filename -o "test video.%(ext)s" BaW_jenozKc
$ yt-dlp --print filename -o "test video.%(ext)s" ptd1NN40vMw
test video.webm # Literal name with correct extension
$ yt-dlp --print filename -o "%(title)s.%(ext)s" BaW_jenozKc
youtube-dl test video ''_ä↭𝕐.webm # All kinds of weird characters
$ yt-dlp --print filename -o "%(title)s.%(ext)s" ptd1NN40vMw
To'y!🤯😂🤦🏻‍♂️.webm # All kinds of weird characters
$ yt-dlp --print filename -o "%(title)s.%(ext)s" BaW_jenozKc --restrict-filenames
youtube-dl_test_video_.webm # Restricted file name
$ yt-dlp --print filename -o "%(title)s.%(ext)s" ptd1NN40vMw --restrict-filenames
To_y.webm # Restricted file name
# Download YouTube playlist videos in separate directory indexed by video order in a playlist
$ yt-dlp -o "%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s" "https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re"
@ -1489,7 +1489,7 @@ $ yt-dlp -o "%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s" "https://www.y
$ yt-dlp -o "%(upload_date>%Y)s/%(title)s.%(ext)s" "https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re"
# Prefix playlist index with " - " separator, but only if it is available
$ yt-dlp -o "%(playlist_index&{} - |)s%(title)s.%(ext)s" BaW_jenozKc "https://www.youtube.com/user/TheLinuxFoundation/playlists"
$ yt-dlp -o "%(playlist_index&{} - |)s%(title)s.%(ext)s" YE7VzlLtp-4 "https://www.youtube.com/user/TheLinuxFoundation/playlists"
# Download all playlists of YouTube channel/user keeping each playlist in separate directory:
$ yt-dlp -o "%(uploader)s/%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s" "https://www.youtube.com/user/TheLinuxFoundation/playlists"
@ -1502,13 +1502,13 @@ $ yt-dlp -P "C:/MyVideos" -o "%(series)s/%(season_number)s - %(season)s/%(episod
# Download video as "C:\MyVideos\uploader\title.ext", subtitles as "C:\MyVideos\subs\uploader\title.ext"
# and put all temporary files in "C:\MyVideos\tmp"
$ yt-dlp -P "C:/MyVideos" -P "temp:tmp" -P "subtitle:subs" -o "%(uploader)s/%(title)s.%(ext)s" BaW_jenozKc --write-subs
$ yt-dlp -P "C:/MyVideos" -P "temp:tmp" -P "subtitle:subs" -o "%(uploader)s/%(title)s.%(ext)s" YE7VzlLtp-4 --write-subs
# Download video as "C:\MyVideos\uploader\title.ext" and subtitles as "C:\MyVideos\uploader\subs\title.ext"
$ yt-dlp -P "C:/MyVideos" -o "%(uploader)s/%(title)s.%(ext)s" -o "subtitle:%(uploader)s/subs/%(title)s.%(ext)s" BaW_jenozKc --write-subs
$ yt-dlp -P "C:/MyVideos" -o "%(uploader)s/%(title)s.%(ext)s" -o "subtitle:%(uploader)s/subs/%(title)s.%(ext)s" YE7VzlLtp-4 --write-subs
# Stream the video being downloaded to stdout
$ yt-dlp -o - BaW_jenozKc
$ yt-dlp -o - YE7VzlLtp-4
```
# FORMAT SELECTION
@ -2062,7 +2062,7 @@ From a Python program, you can embed yt-dlp in a more powerful fashion, like thi
```python
from yt_dlp import YoutubeDL
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
URLS = ['https://www.youtube.com/watch?v=YE7VzlLtp-4']
with YoutubeDL() as ydl:
ydl.download(URLS)
```
@ -2079,7 +2079,7 @@ Most likely, you'll want to use various options. For a list of options available
import json
import yt_dlp
URL = 'https://www.youtube.com/watch?v=BaW_jenozKc'
URL = 'https://www.youtube.com/watch?v=YE7VzlLtp-4'
# See help(yt_dlp.YoutubeDL) for a list of available options and public functions
ydl_opts = {}
@ -2108,7 +2108,7 @@ print('Some videos failed to download' if error_code
```python
import yt_dlp
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
URLS = ['https://www.youtube.com/watch?v=YE7VzlLtp-4']
ydl_opts = {
'format': 'm4a/bestaudio/best',
@ -2128,7 +2128,7 @@ with yt_dlp.YoutubeDL(ydl_opts) as ydl:
```python
import yt_dlp
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
URLS = ['https://www.youtube.com/watch?v=YE7VzlLtp-4']
def longer_than_a_minute(info, *, incomplete):
"""Download only videos longer than a minute (or with unknown duration)"""
@ -2149,7 +2149,7 @@ with yt_dlp.YoutubeDL(ydl_opts) as ydl:
```python
import yt_dlp
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
URLS = ['https://www.youtube.com/watch?v=YE7VzlLtp-4']
class MyLogger:
def debug(self, msg):
@ -2190,7 +2190,7 @@ with yt_dlp.YoutubeDL(ydl_opts) as ydl:
```python
import yt_dlp
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
URLS = ['https://www.youtube.com/watch?v=YE7VzlLtp-4']
# See help(yt_dlp.postprocessor.PostProcessor)
class MyCustomPP(yt_dlp.postprocessor.PostProcessor):
@ -2211,7 +2211,7 @@ with yt_dlp.YoutubeDL() as ydl:
```python
import yt_dlp
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
URLS = ['https://www.youtube.com/watch?v=YE7VzlLtp-4']
def format_selector(ctx):
""" Select the best video and the best audio that won't result in an mkv.

View File

@ -32,7 +32,7 @@ VERBOSE = '''
description: |
It should start like this:
placeholder: |
[debug] Command-line config: ['-vU', 'https://www.youtube.com/watch?v=BaW_jenozKc']
[debug] Command-line config: ['-vU', 'https://www.youtube.com/watch?v=YE7VzlLtp-4']
[debug] Encodings: locale cp65001, fs utf-8, pref cp65001, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version nightly@... from yt-dlp/yt-dlp-nightly-builds [1a176d874] (win_exe)
[debug] Python 3.10.11 (CPython AMD64 64bit) - Windows-10-10.0.20348-SP0 (OpenSSL 1.1.1t 7 Feb 2023)
@ -44,7 +44,7 @@ VERBOSE = '''
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: nightly@... from yt-dlp/yt-dlp-nightly-builds
yt-dlp is up to date (nightly@... from yt-dlp/yt-dlp-nightly-builds)
[youtube] Extracting URL: https://www.youtube.com/watch?v=BaW_jenozKc
[youtube] Extracting URL: https://www.youtube.com/watch?v=YE7VzlLtp-4
<more lines>
render: shell
validations:

View File

@ -1,71 +0,0 @@
#!/usr/bin/env python3
# Allow direct execution
import os
import sys
import unittest
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from test.helper import FakeYDL, is_download_test
from yt_dlp.extractor import YoutubeIE, YoutubeTabIE
from yt_dlp.utils import ExtractorError
@is_download_test
class TestYoutubeLists(unittest.TestCase):
def assertIsPlaylist(self, info):
"""Make sure the info has '_type' set to 'playlist'"""
self.assertEqual(info['_type'], 'playlist')
def test_youtube_playlist_noplaylist(self):
dl = FakeYDL()
dl.params['noplaylist'] = True
ie = YoutubeTabIE(dl)
result = ie.extract('https://www.youtube.com/watch?v=OmJ-4B-mS-Y&list=PLydZ2Hrp_gPRJViZjLFKaBMgCQOYEEkyp&index=2')
self.assertEqual(result['_type'], 'url')
self.assertEqual(result['ie_key'], YoutubeIE.ie_key())
self.assertEqual(YoutubeIE.extract_id(result['url']), 'OmJ-4B-mS-Y')
def test_youtube_mix(self):
dl = FakeYDL()
ie = YoutubeTabIE(dl)
result = ie.extract('https://www.youtube.com/watch?v=tyITL_exICo&list=RDCLAK5uy_kLWIr9gv1XLlPbaDS965-Db4TrBoUTxQ8')
entries = list(result['entries'])
self.assertTrue(len(entries) >= 50)
original_video = entries[0]
self.assertEqual(original_video['id'], 'tyITL_exICo')
def test_youtube_flat_playlist_extraction(self):
dl = FakeYDL()
dl.params['extract_flat'] = True
ie = YoutubeTabIE(dl)
result = ie.extract('https://www.youtube.com/playlist?list=PL4lCao7KL_QFVb7Iudeipvc2BCavECqzc')
self.assertIsPlaylist(result)
entries = list(result['entries'])
self.assertTrue(len(entries) == 1)
video = entries[0]
self.assertEqual(video['_type'], 'url')
self.assertEqual(video['ie_key'], 'Youtube')
self.assertEqual(video['id'], 'BaW_jenozKc')
self.assertEqual(video['url'], 'https://www.youtube.com/watch?v=BaW_jenozKc')
self.assertEqual(video['title'], 'youtube-dl test video "\'/\\ä↭𝕐')
self.assertEqual(video['duration'], 10)
self.assertEqual(video['uploader'], 'Philipp Hagemeister')
def test_youtube_channel_no_uploads(self):
dl = FakeYDL()
dl.params['extract_flat'] = True
ie = YoutubeTabIE(dl)
# no uploads
with self.assertRaisesRegex(ExtractorError, r'no uploads'):
ie.extract('https://www.youtube.com/channel/UC2yXPzFejc422buOIzn_0CA')
# no uploads and no UCID given
with self.assertRaisesRegex(ExtractorError, r'no uploads'):
ie.extract('https://www.youtube.com/news')
if __name__ == '__main__':
unittest.main()

View File

@ -30,7 +30,7 @@ class UnicodeBOMIE(InfoExtractor):
_VALID_URL = r'(?P<bom>\ufeff)(?P<id>.*)$'
_TESTS = [{
'url': '\ufeffhttp://www.youtube.com/watch?v=BaW_jenozKc',
'url': '\ufeffhttp://www.youtube.com/watch?v=YE7VzlLtp-4',
'only_matching': True,
}]

View File

@ -62,7 +62,7 @@ class ViewSourceIE(InfoExtractor):
_VALID_URL = r'view-source:(?P<url>.+)'
_TEST = {
'url': 'view-source:https://www.youtube.com/watch?v=BaW_jenozKc',
'url': 'view-source:https://www.youtube.com/watch?v=YE7VzlLtp-4',
'only_matching': True,
}

View File

@ -778,7 +778,7 @@ class GenericIE(InfoExtractor):
if default_search == 'auto_warning':
if re.match(r'^(?:url|URL)$', url):
raise ExtractorError(
f'Invalid URL: {url!r} . Call yt-dlp like this: yt-dlp -v "https://www.youtube.com/watch?v=BaW_jenozKc" ',
f'Invalid URL: {url!r} . Call yt-dlp like this: yt-dlp -v "https://www.youtube.com/watch?v=YE7VzlLtp-4" ',
expected=True)
else:
self.report_warning(

View File

@ -47,8 +47,8 @@ class YoutubeTruncatedURLIE(YoutubeBaseInfoExtractor):
'Did you forget to quote the URL? Remember that & is a meta '
'character in most shells, so you want to put the URL in quotes, '
'like yt-dlp '
'"https://www.youtube.com/watch?feature=foo&v=BaW_jenozKc" '
' or simply yt-dlp BaW_jenozKc .',
'"https://www.youtube.com/watch?feature=foo&v=YE7VzlLtp-4" '
' or simply yt-dlp YE7VzlLtp-4 .',
expected=True)

View File

@ -152,37 +152,38 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
IE_NAME = 'youtube'
_TESTS = [{
'url': 'https://www.youtube.com/watch?v=BaW_jenozKc&t=1s&end=9',
'url': 'https://www.youtube.com/watch?v=YE7VzlLtp-4&t=1s&end=9',
'info_dict': {
'id': 'BaW_jenozKc',
'id': 'YE7VzlLtp-4',
'ext': 'mp4',
'title': 'youtube-dl test video "\'/\\ä↭𝕐',
'age_limit': 0,
'availability': 'public',
'categories': ['Science & Technology'],
'channel': 'Philipp Hagemeister',
'title': 'Big Buck Bunny',
'description': 'md5:e95316924b5eca2a74b87ab0b290724a',
'media_type': 'video',
'uploader': 'Blender',
'uploader_id': '@BlenderOfficial',
'uploader_url': 'https://www.youtube.com/@BlenderOfficial',
'channel': 'Blender',
'channel_id': 'UCSMOQeBJ2RAnuFungnQOxLg',
'channel_url': 'https://www.youtube.com/channel/UCSMOQeBJ2RAnuFungnQOxLg',
'channel_is_verified': True,
'channel_follower_count': int,
'channel_id': 'UCLqxVugv74EIW3VWh2NOa3Q',
'channel_url': 'https://www.youtube.com/channel/UCLqxVugv74EIW3VWh2NOa3Q',
'comment_count': int,
'description': 'md5:8fb536f4877b8a7455c2ec23794dbc22',
'duration': 10,
'end_time': 9,
'heatmap': 'count:100',
'like_count': int,
'live_status': 'not_live',
'playable_in_embed': True,
'start_time': 1,
'tags': 'count:1',
'thumbnail': r're:https?://i\.ytimg\.com/.+',
'timestamp': 1349198244,
'upload_date': '20121002',
'uploader': 'Philipp Hagemeister',
'uploader_id': '@PhilippHagemeister',
'uploader_url': 'https://www.youtube.com/@PhilippHagemeister',
'view_count': int,
'like_count': int,
'age_limit': 0,
'duration': 597,
'thumbnail': 'https://i.ytimg.com/vi/YE7VzlLtp-4/maxresdefault.jpg',
'heatmap': 'count:100',
'start_time': 1.0,
'end_time': 9.0,
'categories': ['Film & Animation'],
'tags': 'count:16',
'timestamp': 1212060266,
'upload_date': '20080529',
'playable_in_embed': True,
'availability': 'public',
'live_status': 'not_live',
},
'skip': 'Video unavailable',
}, {
'note': 'Embed-only video (#1746)',
'url': '//www.YouTube.com/watch?v=yZIXLfi8CZQ',
@ -197,35 +198,36 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
'skip': 'Private video',
}, {
'note': 'Use the first video ID in the URL',
'url': 'https://www.youtube.com/watch?v=BaW_jenozKc&v=yZIXLfi8CZQ',
'url': 'https://www.youtube.com/watch?v=YE7VzlLtp-4&v=BaW_jenozKc',
'info_dict': {
'id': 'BaW_jenozKc',
'id': 'YE7VzlLtp-4',
'ext': 'mp4',
'title': 'youtube-dl test video "\'/\\ä↭𝕐',
'age_limit': 0,
'availability': 'public',
'categories': ['Science & Technology'],
'channel': 'Philipp Hagemeister',
'title': 'Big Buck Bunny',
'description': 'md5:e95316924b5eca2a74b87ab0b290724a',
'media_type': 'video',
'uploader': 'Blender',
'uploader_id': '@BlenderOfficial',
'uploader_url': 'https://www.youtube.com/@BlenderOfficial',
'channel': 'Blender',
'channel_id': 'UCSMOQeBJ2RAnuFungnQOxLg',
'channel_url': 'https://www.youtube.com/channel/UCSMOQeBJ2RAnuFungnQOxLg',
'channel_is_verified': True,
'channel_follower_count': int,
'channel_id': 'UCLqxVugv74EIW3VWh2NOa3Q',
'channel_url': 'https://www.youtube.com/channel/UCLqxVugv74EIW3VWh2NOa3Q',
'comment_count': int,
'description': 'md5:8fb536f4877b8a7455c2ec23794dbc22',
'duration': 10,
'heatmap': 'count:100',
'like_count': int,
'live_status': 'not_live',
'playable_in_embed': True,
'tags': 'count:1',
'thumbnail': r're:https?://i\.ytimg\.com/.+',
'timestamp': 1349198244,
'upload_date': '20121002',
'uploader': 'Philipp Hagemeister',
'uploader_id': '@PhilippHagemeister',
'uploader_url': 'https://www.youtube.com/@PhilippHagemeister',
'view_count': int,
'like_count': int,
'age_limit': 0,
'duration': 597,
'thumbnail': 'https://i.ytimg.com/vi/YE7VzlLtp-4/maxresdefault.jpg',
'heatmap': 'count:100',
'categories': ['Film & Animation'],
'tags': 'count:16',
'timestamp': 1212060266,
'upload_date': '20080529',
'playable_in_embed': True,
'availability': 'public',
'live_status': 'not_live',
},
'skip': 'Video unavailable',
}, {
'note': '256k DASH audio (format 141) via DASH manifest',
'url': 'https://www.youtube.com/watch?v=a9LDPn-MO4I',
@ -823,10 +825,10 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
'url': 'sJL6WA-aGkQ',
'only_matching': True,
}, {
'url': 'https://invidio.us/watch?v=BaW_jenozKc',
'url': 'https://invidio.us/watch?v=YE7VzlLtp-4',
'only_matching': True,
}, {
'url': 'https://redirect.invidious.io/watch?v=BaW_jenozKc',
'url': 'https://redirect.invidious.io/watch?v=YE7VzlLtp-4',
'only_matching': True,
}, {
# from https://nitter.pussthecat.org/YouTube/status/1360363141947944964#m