mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2026-07-02 16:28:52 +00:00
[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:
parent
57528faa36
commit
c102b20965
@ -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?
|
||||||
|
|
||||||
|
|||||||
36
README.md
36
README.md
@ -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.
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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()
|
|
||||||
@ -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,
|
||||||
}]
|
}]
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user