diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 3d168fc73..9cdffa4b1 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -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 diff --git a/README.md b/README.md index 5641a868f..db31c55ee 100644 --- a/README.md +++ b/README.md @@ -379,8 +379,9 @@ You can also fork the project on github and run your fork's [build workflow](.gi --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 @@ You can configure yt-dlp by placing any supported command line option to a confi 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 (`/yt_dlp/__main__.py`), the root directory is used instead. -1. **Home Configuration**: `yt-dlp.conf` in the home path given by `-P "home:"`, 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` diff --git a/test/helper.py b/test/helper.py index ce751462e..1070e0668 100644 --- a/test/helper.py +++ b/test/helper.py @@ -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)}' diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index 97f9099ff..4af77cae2 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -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 @@ class YoutubeDL(object): 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( diff --git a/yt_dlp/extractor/abc.py b/yt_dlp/extractor/abc.py index 0dde4a9a5..9d6f5a435 100644 --- a/yt_dlp/extractor/abc.py +++ b/yt_dlp/extractor/abc.py @@ -300,7 +300,7 @@ class ABCIViewShowSeriesIE(InfoExtractor): 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()) diff --git a/yt_dlp/extractor/archiveorg.py b/yt_dlp/extractor/archiveorg.py index 85d5c29fa..2a25c0713 100644 --- a/yt_dlp/extractor/archiveorg.py +++ b/yt_dlp/extractor/archiveorg.py @@ -440,7 +440,7 @@ class YoutubeWebArchiveIE(InfoExtractor): }, { 'url': 'ytarchive:BaW_jenozKc:20050214000000', 'only_matching': True - },{ + }, { 'url': 'ytarchive:BaW_jenozKc', 'only_matching': True }, diff --git a/yt_dlp/extractor/litv.py b/yt_dlp/extractor/litv.py index 73822def1..16b475a44 100644 --- a/yt_dlp/extractor/litv.py +++ b/yt_dlp/extractor/litv.py @@ -65,7 +65,7 @@ class LiTVIE(InfoExtractor): 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) diff --git a/yt_dlp/extractor/orf.py b/yt_dlp/extractor/orf.py index 3c68326bc..0628977a0 100644 --- a/yt_dlp/extractor/orf.py +++ b/yt_dlp/extractor/orf.py @@ -22,7 +22,6 @@ from ..utils import ( unified_strdate, unsmuggle_url, url_or_none, - urljoin, ) diff --git a/yt_dlp/options.py b/yt_dlp/options.py index df8fb6f63..5622100bb 100644 --- a/yt_dlp/options.py +++ b/yt_dlp/options.py @@ -345,7 +345,7 @@ def create_parser(): 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', diff --git a/yt_dlp/postprocessor/metadataparser.py b/yt_dlp/postprocessor/metadataparser.py index 646659e75..5452b92d8 100644 --- a/yt_dlp/postprocessor/metadataparser.py +++ b/yt_dlp/postprocessor/metadataparser.py @@ -66,7 +66,7 @@ class MetadataParserPP(PostProcessor): 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 @@ class MetadataParserPP(PostProcessor): 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__}')