From fd8a7484935f9abfcad78cd9e823386310d79911 Mon Sep 17 00:00:00 2001 From: sepro Date: Tue, 5 Aug 2025 20:51:20 +0200 Subject: [PATCH] Warn on severely outdated yt-dlp version --- yt_dlp/YoutubeDL.py | 6 ++++++ yt_dlp/__init__.py | 1 + yt_dlp/update.py | 25 +++++++++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index a9f347bf4..5bfab3a7d 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -73,6 +73,7 @@ from .update import ( REPOSITORY, _get_system_deprecation, + _get_version_age_warning, _make_label, current_git_head, detect_variant, @@ -704,6 +705,11 @@ def process_color_policy(stream): if system_deprecation: self.deprecated_feature(system_deprecation.replace('\n', '\n ')) + if self.params.get('update_self') is None: + version_age_warning = _get_version_age_warning() + if version_age_warning: + self.report_warning(version_age_warning) + if self.params.get('allow_unplayable_formats'): self.report_warning( f'You have asked for {self._format_err("UNPLAYABLE", self.Styles.EMPHASIS)} formats to be listed/downloaded. ' diff --git a/yt_dlp/__init__.py b/yt_dlp/__init__.py index 2e7646b7e..4b63ed63a 100644 --- a/yt_dlp/__init__.py +++ b/yt_dlp/__init__.py @@ -974,6 +974,7 @@ def parse_options(argv=None): '_warnings': warnings, '_deprecation_warnings': deprecation_warnings, 'compat_opts': opts.compat_opts, + 'update_self': opts.update_self, }) diff --git a/yt_dlp/update.py b/yt_dlp/update.py index 30cbf538e..ebe609769 100644 --- a/yt_dlp/update.py +++ b/yt_dlp/update.py @@ -2,6 +2,7 @@ import atexit import contextlib +import datetime as dt import functools import hashlib import json @@ -171,6 +172,30 @@ def _get_system_deprecation(): return f'Support for Python version {major}.{minor} has been deprecated. {PYTHON_MSG}' +def _get_version_age_warning(): + # Only yt-dlp guarantees a stable release at least every 3 months + if not ORIGIN.startswith('yt-dlp/'): + return None + + try: + version_parts = __version__.split('.') + if len(version_parts) < 3: + return None + + year, month, day = map(int, version_parts[:3]) + version_date = dt.date(year, month, day) + + if version_date < dt.date.today() - dt.timedelta(days=90): + return ('\n '.join(( + f'Your yt-dlp version ({__version__}) is older than 90 days!', + 'It is strongly recommeded to always use the latest versions, as sites regularly change and extractors need to be adjusted.', + 'Run "yt-dlp --update" to update. To suppress this warning, add "--no-update" to your command/config.'))) + except (ValueError, TypeError): + pass + + return None + + def _sha256_file(path): h = hashlib.sha256() mv = memoryview(bytearray(128 * 1024))