mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2024-11-27 02:21: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
|
||||
url: https://discord.gg/H5MNcFW63r
|
||||
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.
|
||||
To enable SOCKS proxy, specify a proper
|
||||
scheme. For example
|
||||
socks5://127.0.0.1:1080/. Pass in an empty
|
||||
string (--proxy "") for direct connection
|
||||
socks5://user:pass@127.0.0.1:1080/. Pass in
|
||||
an empty string (--proxy "") for direct
|
||||
connection
|
||||
--socket-timeout SECONDS Time to wait before giving up, in seconds
|
||||
--source-address IP Client-side IP address to bind to
|
||||
-4, --force-ipv4 Make all connections via IPv4
|
||||
|
@ -1049,7 +1050,7 @@ # CONFIGURATION
|
|||
|
||||
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. **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**:
|
||||
* `%XDG_CONFIG_HOME%/yt-dlp/config` (recommended on Linux/macOS)
|
||||
* `%XDG_CONFIG_HOME%/yt-dlp.conf`
|
||||
|
|
|
@ -220,7 +220,7 @@ def sanitize_got_info_dict(got_dict):
|
|||
IGNORED_PREFIXES = ('', 'playlist', 'requested', 'webpage')
|
||||
|
||||
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)}'
|
||||
elif isinstance(value, list) and len(value) > 10:
|
||||
return f'count:{len(value)}'
|
||||
|
|
|
@ -484,6 +484,7 @@ class YoutubeDL(object):
|
|||
extractor_args: A dictionary of arguments to be passed to the extractors.
|
||||
See "EXTRACTOR ARGUMENTS" for details.
|
||||
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.
|
||||
If True (default), DASH manifests and related
|
||||
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))
|
||||
|
||||
def render_thumbnails_table(self, info_dict):
|
||||
thumbnails = list(info_dict.get('thumbnails'))
|
||||
thumbnails = list(info_dict.get('thumbnails') or [])
|
||||
if not thumbnails:
|
||||
return None
|
||||
return render_table(
|
||||
|
|
|
@ -300,7 +300,7 @@ def _real_extract(self, url):
|
|||
unescapeHTML(webpage_data).encode('utf-8').decode('unicode_escape'), show_id)
|
||||
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'):
|
||||
return self.url_result(highlight, ie=ABCIViewIE.ie_key())
|
||||
|
||||
|
|
|
@ -440,7 +440,7 @@ class YoutubeWebArchiveIE(InfoExtractor):
|
|||
}, {
|
||||
'url': 'ytarchive:BaW_jenozKc:20050214000000',
|
||||
'only_matching': True
|
||||
},{
|
||||
}, {
|
||||
'url': 'ytarchive:BaW_jenozKc',
|
||||
'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)
|
||||
|
||||
def _real_extract(self, url):
|
||||
url, data = unsmuggle_url(url, {})
|
||||
url, smuggled_data = unsmuggle_url(url, {})
|
||||
|
||||
video_id = self._match_id(url)
|
||||
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
unified_strdate,
|
||||
unsmuggle_url,
|
||||
url_or_none,
|
||||
urljoin,
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -345,7 +345,7 @@ def _dict_from_options_callback(
|
|||
help=(
|
||||
'Use the specified HTTP/HTTPS/SOCKS proxy. To enable '
|
||||
'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'))
|
||||
network.add_option(
|
||||
'--socket-timeout',
|
||||
|
|
|
@ -66,7 +66,7 @@ def f(info):
|
|||
self.write_debug(f'Searching for {out_re.pattern!r} in {template!r}')
|
||||
match = out_re.search(data_to_parse)
|
||||
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
|
||||
for attribute, value in match.groupdict().items():
|
||||
info[attribute] = value
|
||||
|
@ -80,7 +80,7 @@ def replacer(self, field, search, replace):
|
|||
def f(info):
|
||||
val = info.get(field)
|
||||
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
|
||||
elif not isinstance(val, str):
|
||||
self.report_warning(f'Cannot replace in field {field} since it is a {type(val).__name__}')
|
||||
|
|
Loading…
Reference in a new issue