[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). 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? ### 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` 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 - `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 - `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). **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 #### Output template examples
```bash ```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 test video.webm # Literal name with correct extension
$ yt-dlp --print filename -o "%(title)s.%(ext)s" BaW_jenozKc $ yt-dlp --print filename -o "%(title)s.%(ext)s" ptd1NN40vMw
youtube-dl test video ''_ä↭𝕐.webm # All kinds of weird characters To'y!🤯😂🤦🏻‍♂️.webm # All kinds of weird characters
$ yt-dlp --print filename -o "%(title)s.%(ext)s" BaW_jenozKc --restrict-filenames $ yt-dlp --print filename -o "%(title)s.%(ext)s" ptd1NN40vMw --restrict-filenames
youtube-dl_test_video_.webm # Restricted file name To_y.webm # Restricted file name
# Download YouTube playlist videos in separate directory indexed by video order in a playlist # 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" $ 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" $ 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 # 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: # 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" $ 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" # 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" # 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" # 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 # Stream the video being downloaded to stdout
$ yt-dlp -o - BaW_jenozKc $ yt-dlp -o - YE7VzlLtp-4
``` ```
# FORMAT SELECTION # FORMAT SELECTION
@ -2062,7 +2062,7 @@ From a Python program, you can embed yt-dlp in a more powerful fashion, like thi
```python ```python
from yt_dlp import YoutubeDL 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: with YoutubeDL() as ydl:
ydl.download(URLS) 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 json
import yt_dlp 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 # See help(yt_dlp.YoutubeDL) for a list of available options and public functions
ydl_opts = {} ydl_opts = {}
@ -2108,7 +2108,7 @@ print('Some videos failed to download' if error_code
```python ```python
import yt_dlp import yt_dlp
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc'] URLS = ['https://www.youtube.com/watch?v=YE7VzlLtp-4']
ydl_opts = { ydl_opts = {
'format': 'm4a/bestaudio/best', 'format': 'm4a/bestaudio/best',
@ -2128,7 +2128,7 @@ with yt_dlp.YoutubeDL(ydl_opts) as ydl:
```python ```python
import yt_dlp 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): def longer_than_a_minute(info, *, incomplete):
"""Download only videos longer than a minute (or with unknown duration)""" """Download only videos longer than a minute (or with unknown duration)"""
@ -2149,7 +2149,7 @@ with yt_dlp.YoutubeDL(ydl_opts) as ydl:
```python ```python
import yt_dlp import yt_dlp
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc'] URLS = ['https://www.youtube.com/watch?v=YE7VzlLtp-4']
class MyLogger: class MyLogger:
def debug(self, msg): def debug(self, msg):
@ -2190,7 +2190,7 @@ with yt_dlp.YoutubeDL(ydl_opts) as ydl:
```python ```python
import yt_dlp 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) # See help(yt_dlp.postprocessor.PostProcessor)
class MyCustomPP(yt_dlp.postprocessor.PostProcessor): class MyCustomPP(yt_dlp.postprocessor.PostProcessor):
@ -2211,7 +2211,7 @@ with yt_dlp.YoutubeDL() as ydl:
```python ```python
import yt_dlp 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): def format_selector(ctx):
""" Select the best video and the best audio that won't result in an mkv. """ Select the best video and the best audio that won't result in an mkv.

View File

@ -32,7 +32,7 @@ VERBOSE = '''
description: | description: |
It should start like this: It should start like this:
placeholder: | 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] 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] 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) [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 [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 Latest version: nightly@... from yt-dlp/yt-dlp-nightly-builds
yt-dlp is up to date (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> <more lines>
render: shell render: shell
validations: 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>.*)$' _VALID_URL = r'(?P<bom>\ufeff)(?P<id>.*)$'
_TESTS = [{ _TESTS = [{
'url': '\ufeffhttp://www.youtube.com/watch?v=BaW_jenozKc', 'url': '\ufeffhttp://www.youtube.com/watch?v=YE7VzlLtp-4',
'only_matching': True, 'only_matching': True,
}] }]

View File

@ -62,7 +62,7 @@ class ViewSourceIE(InfoExtractor):
_VALID_URL = r'view-source:(?P<url>.+)' _VALID_URL = r'view-source:(?P<url>.+)'
_TEST = { _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, 'only_matching': True,
} }

View File

@ -778,7 +778,7 @@ class GenericIE(InfoExtractor):
if default_search == 'auto_warning': if default_search == 'auto_warning':
if re.match(r'^(?:url|URL)$', url): if re.match(r'^(?:url|URL)$', url):
raise ExtractorError( 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) expected=True)
else: else:
self.report_warning( self.report_warning(

View File

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

View File

@ -152,37 +152,38 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
IE_NAME = 'youtube' IE_NAME = 'youtube'
_TESTS = [{ _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': { 'info_dict': {
'id': 'BaW_jenozKc', 'id': 'YE7VzlLtp-4',
'ext': 'mp4', 'ext': 'mp4',
'title': 'youtube-dl test video "\'/\\ä↭𝕐', 'title': 'Big Buck Bunny',
'age_limit': 0, 'description': 'md5:e95316924b5eca2a74b87ab0b290724a',
'availability': 'public', 'media_type': 'video',
'categories': ['Science & Technology'], 'uploader': 'Blender',
'channel': 'Philipp Hagemeister', '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_follower_count': int,
'channel_id': 'UCLqxVugv74EIW3VWh2NOa3Q',
'channel_url': 'https://www.youtube.com/channel/UCLqxVugv74EIW3VWh2NOa3Q',
'comment_count': int, '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, '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)', 'note': 'Embed-only video (#1746)',
'url': '//www.YouTube.com/watch?v=yZIXLfi8CZQ', 'url': '//www.YouTube.com/watch?v=yZIXLfi8CZQ',
@ -197,35 +198,36 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
'skip': 'Private video', 'skip': 'Private video',
}, { }, {
'note': 'Use the first video ID in the URL', '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': { 'info_dict': {
'id': 'BaW_jenozKc', 'id': 'YE7VzlLtp-4',
'ext': 'mp4', 'ext': 'mp4',
'title': 'youtube-dl test video "\'/\\ä↭𝕐', 'title': 'Big Buck Bunny',
'age_limit': 0, 'description': 'md5:e95316924b5eca2a74b87ab0b290724a',
'availability': 'public', 'media_type': 'video',
'categories': ['Science & Technology'], 'uploader': 'Blender',
'channel': 'Philipp Hagemeister', '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_follower_count': int,
'channel_id': 'UCLqxVugv74EIW3VWh2NOa3Q',
'channel_url': 'https://www.youtube.com/channel/UCLqxVugv74EIW3VWh2NOa3Q',
'comment_count': int, '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, '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', 'note': '256k DASH audio (format 141) via DASH manifest',
'url': 'https://www.youtube.com/watch?v=a9LDPn-MO4I', 'url': 'https://www.youtube.com/watch?v=a9LDPn-MO4I',
@ -823,10 +825,10 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
'url': 'sJL6WA-aGkQ', 'url': 'sJL6WA-aGkQ',
'only_matching': True, 'only_matching': True,
}, { }, {
'url': 'https://invidio.us/watch?v=BaW_jenozKc', 'url': 'https://invidio.us/watch?v=YE7VzlLtp-4',
'only_matching': True, 'only_matching': True,
}, { }, {
'url': 'https://redirect.invidious.io/watch?v=BaW_jenozKc', 'url': 'https://redirect.invidious.io/watch?v=YE7VzlLtp-4',
'only_matching': True, 'only_matching': True,
}, { }, {
# from https://nitter.pussthecat.org/YouTube/status/1360363141947944964#m # from https://nitter.pussthecat.org/YouTube/status/1360363141947944964#m