diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 1457f2246..7f4f25e56 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -23,3 +23,5 @@ tsukumi bbepis Pccode66 Ashish +RobinD42 +hseg \ No newline at end of file diff --git a/Changelog.md b/Changelog.md index e21cc7cc2..07b34eafb 100644 --- a/Changelog.md +++ b/Changelog.md @@ -17,6 +17,27 @@ --> +### 2021.03.01 +* Allow specifying path in `--external-downloader` +* Add option `--sleep-requests` to sleep b/w requests +* Add option `--extractor-retries` to retry on known extractor errors +* Extract comments only when needed +* `--get-comments` doesn't imply `--write-info-json` if `-J`, `-j` or `--print-json` are used +* [youtube] Retry on more known errors than just HTTP-5xx +* [tennistv] Fix format sorting +* [readthedocs] Improvements by [shirt](https://github.com/shirt-dev) +* [hls] Fix bug with m3u8 format extraction +* [bilibiliaudio] Recognize the file as audio-only +* [hrfensehen] Fix wrong import +* [youtube] Fix inconsistent `webpage_url` +* [hls] Enable `--hls-use-mpegts` by default when downloading live-streams +* [viki] Fix viki play pass authentication by [RobinD42](https://github.com/RobinD42) +* [embedthumbnail] Fix bug with deleting original thumbnail +* [build] Fix completion paths, zsh pip completion install by [hseg](https://github.com/hseg) +* [ci] Disable download tests unless specifically invoked +* Cleanup some code and fix typos + + ### 2021.02.24 * Moved project to an organization [yt-dlp](https://github.com/yt-dlp) * **Completely changed project name to yt-dlp** by [Pccode66](https://github.com/Pccode66) and [pukkandan](https://github.com/pukkandan) diff --git a/README.md b/README.md index 0cc763491..22125cd6b 100644 --- a/README.md +++ b/README.md @@ -697,6 +697,8 @@ Then simply run `make`. You can also run `make yt-dlp` instead to compile only t directory ## Extractor Options: + --extractor-retries RETRIES Number of retries for known extractor + errors (default is 10), or "infinite" --allow-dynamic-mpd Process dynamic DASH manifests (default) (Alias: --no-ignore-dynamic-mpd) --ignore-dynamic-mpd Do not process dynamic DASH manifests diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index d1f365814..e58f7a32f 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -2958,7 +2958,7 @@ class YoutubeDL(object): self.to_screen('[%s] %s: Thumbnail %sis already present' % (info_dict['extractor'], info_dict['id'], thumb_display_id)) else: - self.to_screen('[%s] %s: Downloading thumbnail %s...' % + self.to_screen('[%s] %s: Downloading thumbnail %s ...' % (info_dict['extractor'], info_dict['id'], thumb_display_id)) try: uf = self.urlopen(t['url']) diff --git a/yt_dlp/downloader/common.py b/yt_dlp/downloader/common.py index 7f7296915..2a9a62df4 100644 --- a/yt_dlp/downloader/common.py +++ b/yt_dlp/downloader/common.py @@ -312,7 +312,7 @@ class FileDownloader(object): def report_retry(self, err, count, retries): """Report retry in case of HTTP error 5xx""" self.to_screen( - '[download] Got server HTTP error: %s. Retrying (attempt %d of %s)...' + '[download] Got server HTTP error: %s. Retrying (attempt %d of %s) ...' % (error_to_compat_str(err), count, self.format_retries(retries))) def report_file_already_downloaded(self, file_name): @@ -359,7 +359,7 @@ class FileDownloader(object): max_sleep_interval = self.params.get('max_sleep_interval', min_sleep_interval) sleep_interval = random.uniform(min_sleep_interval, max_sleep_interval) self.to_screen( - '[download] Sleeping %s seconds...' % ( + '[download] Sleeping %s seconds ...' % ( int(sleep_interval) if sleep_interval.is_integer() else '%.2f' % sleep_interval)) time.sleep(sleep_interval) @@ -369,7 +369,7 @@ class FileDownloader(object): sleep_interval_sub = self.params.get('sleep_interval_subtitles') if sleep_interval_sub > 0: self.to_screen( - '[download] Sleeping %s seconds...' % ( + '[download] Sleeping %s seconds ...' % ( sleep_interval_sub)) time.sleep(sleep_interval_sub) return self.real_download(filename, info_dict), True diff --git a/yt_dlp/downloader/fragment.py b/yt_dlp/downloader/fragment.py index 44beed066..a0c1d13ac 100644 --- a/yt_dlp/downloader/fragment.py +++ b/yt_dlp/downloader/fragment.py @@ -55,11 +55,11 @@ class FragmentFD(FileDownloader): def report_retry_fragment(self, err, frag_index, count, retries): self.to_screen( - '[download] Got server HTTP error: %s. Retrying fragment %d (attempt %d of %s)...' + '[download] Got server HTTP error: %s. Retrying fragment %d (attempt %d of %s) ...' % (error_to_compat_str(err), frag_index, count, self.format_retries(retries))) def report_skip_fragment(self, frag_index): - self.to_screen('[download] Skipping fragment %d...' % frag_index) + self.to_screen('[download] Skipping fragment %d ...' % frag_index) def _prepare_url(self, info_dict, url): headers = info_dict.get('http_headers') @@ -174,7 +174,7 @@ class FragmentFD(FileDownloader): '.ytdl file is corrupt' if is_corrupt else 'Inconsistent state of incomplete fragment download') self.report_warning( - '%s. Restarting from the beginning...' % message) + '%s. Restarting from the beginning ...' % message) ctx['fragment_index'] = resume_len = 0 if 'ytdl_corrupt' in ctx: del ctx['ytdl_corrupt'] diff --git a/yt_dlp/downloader/niconico.py b/yt_dlp/downloader/niconico.py index 38476783f..dc49dff58 100644 --- a/yt_dlp/downloader/niconico.py +++ b/yt_dlp/downloader/niconico.py @@ -29,7 +29,7 @@ class NiconicoDmcFD(FileDownloader): heartbeat_url = heartbeat_info_dict['url'] heartbeat_data = heartbeat_info_dict['data'] heartbeat_interval = heartbeat_info_dict.get('interval', 30) - self.to_screen('[%s] Heartbeat with %s second interval...' % (self.FD_NAME, heartbeat_interval)) + self.to_screen('[%s] Heartbeat with %s second interval ...' % (self.FD_NAME, heartbeat_interval)) def heartbeat(): try: diff --git a/yt_dlp/extractor/common.py b/yt_dlp/extractor/common.py index 3326d436b..45bc229ff 100644 --- a/yt_dlp/extractor/common.py +++ b/yt_dlp/extractor/common.py @@ -617,7 +617,7 @@ class InfoExtractor(object): if not self._downloader._first_webpage_request: sleep_interval = float_or_none(self._downloader.params.get('sleep_interval_requests')) or 0 if sleep_interval > 0: - self.to_screen('Sleeping %s seconds...' % sleep_interval) + self.to_screen('Sleeping %s seconds ...' % sleep_interval) time.sleep(sleep_interval) else: self._downloader._first_webpage_request = False diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py index 2e4ce4c12..8b0d12bb5 100644 --- a/yt_dlp/extractor/youtube.py +++ b/yt_dlp/extractor/youtube.py @@ -3020,7 +3020,8 @@ class YoutubeTabIE(YoutubeBaseInfoExtractor): # See: https://github.com/yt-dlp/yt-dlp/issues/116 if count: self.report_warning('Incomplete yt initial data recieved. Retrying ...') - webpage = self._download_webpage(url, item_id, + webpage = self._download_webpage( + url, item_id, 'Downloading webpage%s' % ' (retry #%d)' % count if count else '') identity_token = self._extract_identity_token(webpage, item_id) data = self._extract_yt_initial_data(item_id, webpage)