mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2024-11-27 10:31:29 +00:00
parent
bb66c24797
commit
88f23a18e0
3
.github/ISSUE_TEMPLATE/config.yml
vendored
3
.github/ISSUE_TEMPLATE/config.yml
vendored
|
@ -3,3 +3,6 @@ contact_links:
|
||||||
- name: Get help from the community on Discord
|
- name: Get help from the community on Discord
|
||||||
url: https://discord.gg/H5MNcFW63r
|
url: https://discord.gg/H5MNcFW63r
|
||||||
about: Join the yt-dlp Discord for community-powered support!
|
about: Join the yt-dlp Discord for community-powered support!
|
||||||
|
- name: Matrix Bridge to the Discord server
|
||||||
|
url: https://matrix.to/#/#yt-dlp:matrix.org
|
||||||
|
about: For those who do not want to use Discord
|
||||||
|
|
|
@ -379,8 +379,9 @@ ## Network Options:
|
||||||
--proxy URL Use the specified HTTP/HTTPS/SOCKS proxy.
|
--proxy URL Use the specified HTTP/HTTPS/SOCKS proxy.
|
||||||
To enable SOCKS proxy, specify a proper
|
To enable SOCKS proxy, specify a proper
|
||||||
scheme. For example
|
scheme. For example
|
||||||
socks5://127.0.0.1:1080/. Pass in an empty
|
socks5://user:pass@127.0.0.1:1080/. Pass in
|
||||||
string (--proxy "") for direct connection
|
an empty string (--proxy "") for direct
|
||||||
|
connection
|
||||||
--socket-timeout SECONDS Time to wait before giving up, in seconds
|
--socket-timeout SECONDS Time to wait before giving up, in seconds
|
||||||
--source-address IP Client-side IP address to bind to
|
--source-address IP Client-side IP address to bind to
|
||||||
-4, --force-ipv4 Make all connections via IPv4
|
-4, --force-ipv4 Make all connections via IPv4
|
||||||
|
@ -1049,7 +1050,7 @@ # CONFIGURATION
|
||||||
|
|
||||||
1. **Main Configuration**: The file given by `--config-location`
|
1. **Main Configuration**: The file given by `--config-location`
|
||||||
1. **Portable Configuration**: `yt-dlp.conf` in the same directory as the bundled binary. If you are running from source-code (`<root dir>/yt_dlp/__main__.py`), the root directory is used instead.
|
1. **Portable Configuration**: `yt-dlp.conf` in the same directory as the bundled binary. If you are running from source-code (`<root dir>/yt_dlp/__main__.py`), the root directory is used instead.
|
||||||
1. **Home Configuration**: `yt-dlp.conf` in the home path given by `-P "home:<path>"`, or in the current directory if no such path is given
|
1. **Home Configuration**: `yt-dlp.conf` in the home path given by `-P`, or in the current directory if no such path is given
|
||||||
1. **User Configuration**:
|
1. **User Configuration**:
|
||||||
* `%XDG_CONFIG_HOME%/yt-dlp/config` (recommended on Linux/macOS)
|
* `%XDG_CONFIG_HOME%/yt-dlp/config` (recommended on Linux/macOS)
|
||||||
* `%XDG_CONFIG_HOME%/yt-dlp.conf`
|
* `%XDG_CONFIG_HOME%/yt-dlp.conf`
|
||||||
|
|
|
@ -220,7 +220,7 @@ def sanitize_got_info_dict(got_dict):
|
||||||
IGNORED_PREFIXES = ('', 'playlist', 'requested', 'webpage')
|
IGNORED_PREFIXES = ('', 'playlist', 'requested', 'webpage')
|
||||||
|
|
||||||
def sanitize(key, value):
|
def sanitize(key, value):
|
||||||
if isinstance(value, str) and len(value) > 100:
|
if isinstance(value, str) and len(value) > 100 and key != 'thumbnail':
|
||||||
return f'md5:{md5(value)}'
|
return f'md5:{md5(value)}'
|
||||||
elif isinstance(value, list) and len(value) > 10:
|
elif isinstance(value, list) and len(value) > 10:
|
||||||
return f'count:{len(value)}'
|
return f'count:{len(value)}'
|
||||||
|
|
|
@ -484,6 +484,7 @@ class YoutubeDL(object):
|
||||||
extractor_args: A dictionary of arguments to be passed to the extractors.
|
extractor_args: A dictionary of arguments to be passed to the extractors.
|
||||||
See "EXTRACTOR ARGUMENTS" for details.
|
See "EXTRACTOR ARGUMENTS" for details.
|
||||||
Eg: {'youtube': {'skip': ['dash', 'hls']}}
|
Eg: {'youtube': {'skip': ['dash', 'hls']}}
|
||||||
|
mark_watched: Mark videos watched (even with --simulate). Only for YouTube
|
||||||
youtube_include_dash_manifest: Deprecated - Use extractor_args instead.
|
youtube_include_dash_manifest: Deprecated - Use extractor_args instead.
|
||||||
If True (default), DASH manifests and related
|
If True (default), DASH manifests and related
|
||||||
data will be downloaded and processed by extractor.
|
data will be downloaded and processed by extractor.
|
||||||
|
@ -3504,7 +3505,7 @@ def render_formats_table(self, info_dict):
|
||||||
delim=self._format_screen('\u2500', self.Styles.DELIM, '-', test_encoding=True))
|
delim=self._format_screen('\u2500', self.Styles.DELIM, '-', test_encoding=True))
|
||||||
|
|
||||||
def render_thumbnails_table(self, info_dict):
|
def render_thumbnails_table(self, info_dict):
|
||||||
thumbnails = list(info_dict.get('thumbnails'))
|
thumbnails = list(info_dict.get('thumbnails') or [])
|
||||||
if not thumbnails:
|
if not thumbnails:
|
||||||
return None
|
return None
|
||||||
return render_table(
|
return render_table(
|
||||||
|
|
|
@ -300,7 +300,7 @@ def _real_extract(self, url):
|
||||||
unescapeHTML(webpage_data).encode('utf-8').decode('unicode_escape'), show_id)
|
unescapeHTML(webpage_data).encode('utf-8').decode('unicode_escape'), show_id)
|
||||||
video_data = video_data['route']['pageData']['_embedded']
|
video_data = video_data['route']['pageData']['_embedded']
|
||||||
|
|
||||||
highlight = try_get(video_data, lambda x: ['highlightVideo']['shareUrl'])
|
highlight = try_get(video_data, lambda x: x['highlightVideo']['shareUrl'])
|
||||||
if not self._yes_playlist(show_id, bool(highlight), video_label='highlight video'):
|
if not self._yes_playlist(show_id, bool(highlight), video_label='highlight video'):
|
||||||
return self.url_result(highlight, ie=ABCIViewIE.ie_key())
|
return self.url_result(highlight, ie=ABCIViewIE.ie_key())
|
||||||
|
|
||||||
|
|
|
@ -440,7 +440,7 @@ class YoutubeWebArchiveIE(InfoExtractor):
|
||||||
}, {
|
}, {
|
||||||
'url': 'ytarchive:BaW_jenozKc:20050214000000',
|
'url': 'ytarchive:BaW_jenozKc:20050214000000',
|
||||||
'only_matching': True
|
'only_matching': True
|
||||||
},{
|
}, {
|
||||||
'url': 'ytarchive:BaW_jenozKc',
|
'url': 'ytarchive:BaW_jenozKc',
|
||||||
'only_matching': True
|
'only_matching': True
|
||||||
},
|
},
|
||||||
|
|
|
@ -65,7 +65,7 @@ def _extract_playlist(self, season_list, video_id, program_info, prompt=True):
|
||||||
return self.playlist_result(all_episodes, content_id, episode_title)
|
return self.playlist_result(all_episodes, content_id, episode_title)
|
||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
url, data = unsmuggle_url(url, {})
|
url, smuggled_data = unsmuggle_url(url, {})
|
||||||
|
|
||||||
video_id = self._match_id(url)
|
video_id = self._match_id(url)
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
unified_strdate,
|
unified_strdate,
|
||||||
unsmuggle_url,
|
unsmuggle_url,
|
||||||
url_or_none,
|
url_or_none,
|
||||||
urljoin,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -345,7 +345,7 @@ def _dict_from_options_callback(
|
||||||
help=(
|
help=(
|
||||||
'Use the specified HTTP/HTTPS/SOCKS proxy. To enable '
|
'Use the specified HTTP/HTTPS/SOCKS proxy. To enable '
|
||||||
'SOCKS proxy, specify a proper scheme. For example '
|
'SOCKS proxy, specify a proper scheme. For example '
|
||||||
'socks5://127.0.0.1:1080/. Pass in an empty string (--proxy "") '
|
'socks5://user:pass@127.0.0.1:1080/. Pass in an empty string (--proxy "") '
|
||||||
'for direct connection'))
|
'for direct connection'))
|
||||||
network.add_option(
|
network.add_option(
|
||||||
'--socket-timeout',
|
'--socket-timeout',
|
||||||
|
|
|
@ -66,7 +66,7 @@ def f(info):
|
||||||
self.write_debug(f'Searching for {out_re.pattern!r} in {template!r}')
|
self.write_debug(f'Searching for {out_re.pattern!r} in {template!r}')
|
||||||
match = out_re.search(data_to_parse)
|
match = out_re.search(data_to_parse)
|
||||||
if match is None:
|
if match is None:
|
||||||
self.report_warning(f'Could not interpret {inp!r} as {out!r}')
|
self.to_screen(f'Could not interpret {inp!r} as {out!r}')
|
||||||
return
|
return
|
||||||
for attribute, value in match.groupdict().items():
|
for attribute, value in match.groupdict().items():
|
||||||
info[attribute] = value
|
info[attribute] = value
|
||||||
|
@ -80,7 +80,7 @@ def replacer(self, field, search, replace):
|
||||||
def f(info):
|
def f(info):
|
||||||
val = info.get(field)
|
val = info.get(field)
|
||||||
if val is None:
|
if val is None:
|
||||||
self.report_warning(f'Video does not have a {field}')
|
self.to_screen(f'Video does not have a {field}')
|
||||||
return
|
return
|
||||||
elif not isinstance(val, str):
|
elif not isinstance(val, str):
|
||||||
self.report_warning(f'Cannot replace in field {field} since it is a {type(val).__name__}')
|
self.report_warning(f'Cannot replace in field {field} since it is a {type(val).__name__}')
|
||||||
|
|
Loading…
Reference in a new issue