diff --git a/.gitignore b/.gitignore index a9b4bc0..861f109 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,14 @@ /yt-dlp-2024.08.01.tar.gz /yt-dlp-2024.08.06.tar.gz /yt-dlp-2024.09.27.tar.gz +/yt-dlp-2024.10.07.tar.gz +/yt-dlp-2024.10.22.tar.gz +/yt-dlp-2024.11.04.tar.gz +/yt-dlp-2024.11.18.tar.gz +/yt-dlp-2024.12.23.tar.gz +/yt-dlp-2025.01.12.tar.gz +/yt-dlp-2025.01.15.tar.gz +/yt-dlp-2025.01.26.tar.gz +/yt-dlp-2025.02.19.tar.gz +/yt-dlp-2025.03.26.tar.gz +/yt-dlp-2025.03.31.tar.gz diff --git a/0001-Revert-rh-websockets-Upgrade-websockets-to-13.0-1081.patch b/0001-Revert-rh-websockets-Upgrade-websockets-to-13.0-1081.patch new file mode 100644 index 0000000..392c2cd --- /dev/null +++ b/0001-Revert-rh-websockets-Upgrade-websockets-to-13.0-1081.patch @@ -0,0 +1,119 @@ +From fbc486f4fac78bfd49011c1b60362e656c679c71 Mon Sep 17 00:00:00 2001 +From: Maxwell G +Date: Mon, 6 Jan 2025 14:37:58 -0600 +Subject: [PATCH 1/2] Revert "[rh:websockets] Upgrade websockets to 13.0 + (#10815)" + +This reverts commit 6f9e6537434562d513d0c9b68ced8a61ade94a64. +--- + .github/workflows/core.yml | 1 - + .github/workflows/quick-test.yml | 1 - + pyproject.toml | 2 +- + test/test_websockets.py | 8 ++++---- + yt_dlp/networking/_websockets.py | 5 ++++- + 5 files changed, 9 insertions(+), 8 deletions(-) + +diff --git a/.github/workflows/core.yml b/.github/workflows/core.yml +index 9a4342a58..bed3af94b 100644 +--- a/.github/workflows/core.yml ++++ b/.github/workflows/core.yml +@@ -59,7 +59,6 @@ jobs: + - name: Install test requirements + run: python3 ./devscripts/install_deps.py --include test --include curl-cffi + - name: Run tests +- timeout-minutes: 15 + continue-on-error: False + run: | + python3 -m yt_dlp -v || true # Print debug head +diff --git a/.github/workflows/quick-test.yml b/.github/workflows/quick-test.yml +index 1a32bbfe3..235a2c64d 100644 +--- a/.github/workflows/quick-test.yml ++++ b/.github/workflows/quick-test.yml +@@ -17,7 +17,6 @@ jobs: + - name: Install test requirements + run: python3 ./devscripts/install_deps.py -o --include test + - name: Run tests +- timeout-minutes: 15 + run: | + python3 -m yt_dlp -v || true + python3 ./devscripts/run_tests.py --pytest-args '--reruns 2 --reruns-delay 3.0' core +diff --git a/pyproject.toml b/pyproject.toml +index 5e987a6fd..6810415d1 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -52,7 +52,7 @@ default = [ + "pycryptodomex", + "requests>=2.32.2,<3", + "urllib3>=1.26.17,<3", +- "websockets>=13.0", ++ "websockets>=12.0", + ] + curl-cffi = [ + "curl-cffi>=0.5.10,!=0.6.*,!=0.7.*,!=0.8.*,!=0.9.*,<0.11; implementation_name=='cpython'", +diff --git a/test/test_websockets.py b/test/test_websockets.py +index dead5fe5c..5e0ce48cc 100644 +--- a/test/test_websockets.py ++++ b/test/test_websockets.py +@@ -88,7 +88,7 @@ def create_wss_websocket_server(): + certfn = os.path.join(TEST_DIR, 'testcert.pem') + sslctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) + sslctx.load_cert_chain(certfn, None) +- return create_websocket_server(ssl=sslctx) ++ return create_websocket_server(ssl_context=sslctx) + + + MTLS_CERT_DIR = os.path.join(TEST_DIR, 'testdata', 'certificate') +@@ -103,7 +103,7 @@ def create_mtls_wss_websocket_server(): + sslctx.load_verify_locations(cafile=cacertfn) + sslctx.load_cert_chain(certfn, None) + +- return create_websocket_server(ssl=sslctx) ++ return create_websocket_server(ssl_context=sslctx) + + + def create_legacy_wss_websocket_server(): +@@ -112,7 +112,7 @@ def create_legacy_wss_websocket_server(): + sslctx.maximum_version = ssl.TLSVersion.TLSv1_2 + sslctx.set_ciphers('SHA1:AESCCM:aDSS:eNULL:aNULL') + sslctx.load_cert_chain(certfn, None) +- return create_websocket_server(ssl=sslctx) ++ return create_websocket_server(ssl_context=sslctx) + + + def ws_validate_and_send(rh, req): +@@ -139,7 +139,7 @@ def setup_class(cls): + cls.wss_thread, cls.wss_port = create_wss_websocket_server() + cls.wss_base_url = f'wss://127.0.0.1:{cls.wss_port}' + +- cls.bad_wss_thread, cls.bad_wss_port = create_websocket_server(ssl=ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)) ++ cls.bad_wss_thread, cls.bad_wss_port = create_websocket_server(ssl_context=ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)) + cls.bad_wss_host = f'wss://127.0.0.1:{cls.bad_wss_port}' + + cls.mtls_wss_thread, cls.mtls_wss_port = create_mtls_wss_websocket_server() +diff --git a/yt_dlp/networking/_websockets.py b/yt_dlp/networking/_websockets.py +index d29f8e45a..a2bdb9c82 100644 +--- a/yt_dlp/networking/_websockets.py ++++ b/yt_dlp/networking/_websockets.py +@@ -48,7 +48,10 @@ + # 2: "AttributeError: 'ClientConnection' object has no attribute 'recv_events_exc'. Did you mean: 'recv_events'?" + import websockets.sync.connection # isort: split + with contextlib.suppress(Exception): ++ # > 12.0 + websockets.sync.connection.Connection.recv_exc = None ++ # 12.0 ++ websockets.sync.connection.Connection.recv_events_exc = None + + + class WebsocketsResponseAdapter(WebSocketResponse): +@@ -162,7 +165,7 @@ def _send(self, request): + additional_headers=headers, + open_timeout=timeout, + user_agent_header=None, +- ssl=ssl_ctx if wsuri.secure else None, ++ ssl_context=ssl_ctx if wsuri.secure else None, + close_timeout=0, # not ideal, but prevents yt-dlp hanging + ) + return WebsocketsResponseAdapter(conn, url=request.url) +-- +2.48.1 + diff --git a/0002-Revert-rh-requests-Bump-minimum-requests-version-to-.patch b/0002-Revert-rh-requests-Bump-minimum-requests-version-to-.patch new file mode 100644 index 0000000..b7a7bbb --- /dev/null +++ b/0002-Revert-rh-requests-Bump-minimum-requests-version-to-.patch @@ -0,0 +1,369 @@ +From 86b38cb4301ee26dbea2c3ef1865d463aaf67721 Mon Sep 17 00:00:00 2001 +From: Maxwell G +Date: Mon, 6 Jan 2025 14:48:08 -0600 +Subject: [PATCH 2/2] Revert "[rh:requests] Bump minimum `requests` version to + 2.32.2 (#10079)" + +This reverts commit db50f19d76c6870a5a13d0cab9287d684fd7449a. +--- + pyproject.toml | 2 +- + yt_dlp/networking/_requests.py | 163 ++++++++++++++++++++++----------- + 2 files changed, 109 insertions(+), 56 deletions(-) + +diff --git a/pyproject.toml b/pyproject.toml +index 6810415d1..2c1d485d4 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -50,7 +50,7 @@ default = [ + "certifi", + "mutagen", + "pycryptodomex", +- "requests>=2.32.2,<3", ++ "requests>=2.31.0,<3", + "urllib3>=1.26.17,<3", + "websockets>=12.0", + ] +diff --git a/yt_dlp/networking/_requests.py b/yt_dlp/networking/_requests.py +index 5b6b264a6..98c755d57 100644 +--- a/yt_dlp/networking/_requests.py ++++ b/yt_dlp/networking/_requests.py +@@ -13,20 +13,21 @@ + from ..utils.networking import normalize_url + + if requests is None: +- raise ImportError('requests module is not installed') ++ raise ImportError("requests module is not installed") + + if urllib3 is None: +- raise ImportError('urllib3 module is not installed') ++ raise ImportError("urllib3 module is not installed") + +-urllib3_version = tuple(int_or_none(x, default=0) for x in urllib3.__version__.split('.')) ++urllib3_version = tuple( ++ int_or_none(x, default=0) for x in urllib3.__version__.split(".") ++) + + if urllib3_version < (1, 26, 17): +- urllib3._yt_dlp__version = f'{urllib3.__version__} (unsupported)' +- raise ImportError('Only urllib3 >= 1.26.17 is supported') ++ urllib3._yt_dlp__version = f"{urllib3.__version__} (unsupported)" ++ raise ImportError("Only urllib3 >= 1.26.17 is supported") + +-if requests.__build__ < 0x023202: +- requests._yt_dlp__version = f'{requests.__version__} (unsupported)' +- raise ImportError('Only requests >= 2.32.2 is supported') ++if requests.__build__ < 0x023100: ++ raise ImportError("Only requests >= 2.31.0 is supported") + + import requests.adapters + import requests.utils +@@ -62,13 +63,14 @@ + from ..socks import ProxyError as SocksProxyError + + SUPPORTED_ENCODINGS = [ +- 'gzip', 'deflate', ++ "gzip", ++ "deflate", + ] + + if brotli is not None: +- SUPPORTED_ENCODINGS.append('br') ++ SUPPORTED_ENCODINGS.append("br") + +-''' ++""" + Override urllib3's behavior to not convert lower-case percent-encoded characters + to upper-case during url normalization process. + +@@ -83,7 +85,7 @@ + + 1: https://tools.ietf.org/html/rfc3986#section-2.1 + 2: https://github.com/streamlink/streamlink/pull/4003 +-''' ++""" + + + class Urllib3PercentREOverride: +@@ -102,14 +104,19 @@ def subn(self, repl, string, *args, **kwargs): + # https://github.com/urllib3/urllib3/commit/a2697e7c6b275f05879b60f593c5854a816489f0 + import urllib3.util.url + +-if hasattr(urllib3.util.url, 'PERCENT_RE'): ++if hasattr(urllib3.util.url, "PERCENT_RE"): + urllib3.util.url.PERCENT_RE = Urllib3PercentREOverride(urllib3.util.url.PERCENT_RE) +-elif hasattr(urllib3.util.url, '_PERCENT_RE'): # urllib3 >= 2.0.0 +- urllib3.util.url._PERCENT_RE = Urllib3PercentREOverride(urllib3.util.url._PERCENT_RE) ++elif hasattr(urllib3.util.url, "_PERCENT_RE"): # urllib3 >= 2.0.0 ++ urllib3.util.url._PERCENT_RE = Urllib3PercentREOverride( ++ urllib3.util.url._PERCENT_RE ++ ) + else: +- warnings.warn('Failed to patch PERCENT_RE in urllib3 (does the attribute exist?)' + bug_reports_message()) ++ warnings.warn( ++ "Failed to patch PERCENT_RE in urllib3 (does the attribute exist?)" ++ + bug_reports_message() ++ ) + +-''' ++""" + Workaround for issue in urllib.util.ssl_.py: ssl_wrap_context does not pass + server_hostname to SSLContext.wrap_socket if server_hostname is an IP, + however this is an issue because we set check_hostname to True in our SSLContext. +@@ -118,7 +125,7 @@ def subn(self, repl, string, *args, **kwargs): + + This has been fixed in urllib3 2.0+. + See: https://github.com/urllib3/urllib3/issues/517 +-''' ++""" + + if urllib3_version < (2, 0, 0): + with contextlib.suppress(Exception): +@@ -134,8 +141,12 @@ def subn(self, repl, string, *args, **kwargs): + class RequestsResponseAdapter(Response): + def __init__(self, res: requests.models.Response): + super().__init__( +- fp=res.raw, headers=res.headers, url=res.url, +- status=res.status_code, reason=res.reason) ++ fp=res.raw, ++ headers=res.headers, ++ url=res.url, ++ status=res.status_code, ++ reason=res.reason, ++ ) + + self._requests_response = res + +@@ -152,12 +163,21 @@ def read(self, amt: int | None = None): + # IncompleteRead is always contained within ProtocolError + # See urllib3.response.HTTPResponse._error_catcher() + ir_err = next( +- (err for err in (e.__context__, e.__cause__, *variadic(e.args)) +- if isinstance(err, http.client.IncompleteRead)), None) ++ ( ++ err ++ for err in (e.__context__, e.__cause__, *variadic(e.args)) ++ if isinstance(err, http.client.IncompleteRead) ++ ), ++ None, ++ ) + if ir_err is not None: + # `urllib3.exceptions.IncompleteRead` is subclass of `http.client.IncompleteRead` + # but uses an `int` for its `partial` property. +- partial = ir_err.partial if isinstance(ir_err.partial, int) else len(ir_err.partial) ++ partial = ( ++ ir_err.partial ++ if isinstance(ir_err.partial, int) ++ else len(ir_err.partial) ++ ) + raise IncompleteRead(partial=partial, expected=ir_err.expected) from e + raise TransportError(cause=e) from e + +@@ -167,12 +187,14 @@ def read(self, amt: int | None = None): + + + class RequestsHTTPAdapter(requests.adapters.HTTPAdapter): +- def __init__(self, ssl_context=None, proxy_ssl_context=None, source_address=None, **kwargs): ++ def __init__( ++ self, ssl_context=None, proxy_ssl_context=None, source_address=None, **kwargs ++ ): + self._pm_args = {} + if ssl_context: +- self._pm_args['ssl_context'] = ssl_context ++ self._pm_args["ssl_context"] = ssl_context + if source_address: +- self._pm_args['source_address'] = (source_address, 0) ++ self._pm_args["source_address"] = (source_address, 0) + self._proxy_ssl_context = proxy_ssl_context or ssl_context + super().__init__(**kwargs) + +@@ -181,14 +203,21 @@ def init_poolmanager(self, *args, **kwargs): + + def proxy_manager_for(self, proxy, **proxy_kwargs): + extra_kwargs = {} +- if not proxy.lower().startswith('socks') and self._proxy_ssl_context: +- extra_kwargs['proxy_ssl_context'] = self._proxy_ssl_context +- return super().proxy_manager_for(proxy, **proxy_kwargs, **self._pm_args, **extra_kwargs) ++ if not proxy.lower().startswith("socks") and self._proxy_ssl_context: ++ extra_kwargs["proxy_ssl_context"] = self._proxy_ssl_context ++ return super().proxy_manager_for( ++ proxy, **proxy_kwargs, **self._pm_args, **extra_kwargs ++ ) + + # Skip `requests` internal verification; we use our own SSLContext ++ # requests 2.31.0+ + def cert_verify(*args, **kwargs): + pass + ++ # requests 2.31.0-2.32.1 ++ def _get_connection(self, request, *_, proxies=None, **__): ++ return self.get_connection(request.url, proxies) ++ + # requests 2.32.2+: Reimplementation without `_urllib3_request_context` + def get_connection_with_tls_context(self, request, verify, proxies=None, cert=None): + url = urllib3.util.parse_url(request.url).url +@@ -222,7 +251,7 @@ def rebuild_method(self, prepared_request, response): + def rebuild_auth(self, prepared_request, response): + # HACK: undo status code change from rebuild_method, if applicable. + # rebuild_auth runs after requests would remove headers/body based on status code +- if hasattr(response, '_real_status_code'): ++ if hasattr(response, "_real_status_code"): + response.status_code = response._real_status_code + del response._real_status_code + return super().rebuild_auth(prepared_request, response) +@@ -256,23 +285,30 @@ def emit(self, record): + + @register_rh + class RequestsRH(RequestHandler, InstanceStoreMixin): +- + """Requests RequestHandler + https://github.com/psf/requests + """ +- _SUPPORTED_URL_SCHEMES = ('http', 'https') ++ ++ _SUPPORTED_URL_SCHEMES = ("http", "https") + _SUPPORTED_ENCODINGS = tuple(SUPPORTED_ENCODINGS) +- _SUPPORTED_PROXY_SCHEMES = ('http', 'https', 'socks4', 'socks4a', 'socks5', 'socks5h') ++ _SUPPORTED_PROXY_SCHEMES = ( ++ "http", ++ "https", ++ "socks4", ++ "socks4a", ++ "socks5", ++ "socks5h", ++ ) + _SUPPORTED_FEATURES = (Features.NO_PROXY, Features.ALL_PROXY) +- RH_NAME = 'requests' ++ RH_NAME = "requests" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Forward urllib3 debug messages to our logger +- logger = logging.getLogger('urllib3') ++ logger = logging.getLogger("urllib3") + self.__logging_handler = Urllib3LoggingHandler(logger=self._logger) +- self.__logging_handler.setFormatter(logging.Formatter('requests: %(message)s')) ++ self.__logging_handler.setFormatter(logging.Formatter("requests: %(message)s")) + self.__logging_handler.addFilter(Urllib3LoggingFilter()) + logger.addHandler(self.__logging_handler) + # TODO: Use a logger filter to suppress pool reuse warning instead +@@ -291,14 +327,14 @@ def close(self): + self._clear_instances() + # Remove the logging handler that contains a reference to our logger + # See: https://github.com/yt-dlp/yt-dlp/issues/8922 +- logging.getLogger('urllib3').removeHandler(self.__logging_handler) ++ logging.getLogger("urllib3").removeHandler(self.__logging_handler) + + def _check_extensions(self, extensions): + super()._check_extensions(extensions) +- extensions.pop('cookiejar', None) +- extensions.pop('timeout', None) +- extensions.pop('legacy_ssl', None) +- extensions.pop('keep_header_casing', None) ++ extensions.pop("cookiejar", None) ++ extensions.pop("timeout", None) ++ extensions.pop("legacy_ssl", None) ++ extensions.pop("keep_header_casing", None) + + def _create_instance(self, cookiejar, legacy_ssl_support=None): + session = RequestsSession() +@@ -308,9 +344,11 @@ def _create_instance(self, cookiejar, legacy_ssl_support=None): + max_retries=urllib3.util.retry.Retry(False), + ) + session.adapters.clear() +- session.headers = requests.models.CaseInsensitiveDict({'Connection': 'keep-alive'}) +- session.mount('https://', http_adapter) +- session.mount('http://', http_adapter) ++ session.headers = requests.models.CaseInsensitiveDict( ++ {"Connection": "keep-alive"} ++ ) ++ session.mount("https://", http_adapter) ++ session.mount("http://", http_adapter) + session.cookies = cookiejar + session.trust_env = False # no need, we already load proxies from env + return session +@@ -325,7 +363,7 @@ def _send(self, request): + + session = self._get_instance( + cookiejar=self._get_cookiejar(request), +- legacy_ssl_support=request.extensions.get('legacy_ssl'), ++ legacy_ssl_support=request.extensions.get("legacy_ssl"), + ) + + try: +@@ -345,7 +383,7 @@ def _send(self, request): + requests_res = e.response + + except requests.exceptions.SSLError as e: +- if 'CERTIFICATE_VERIFY_FAILED' in str(e): ++ if "CERTIFICATE_VERIFY_FAILED" in str(e): + raise CertificateVerifyError(cause=e) from e + raise SSLError(cause=e) from e + +@@ -378,26 +416,33 @@ def requests_preference(rh, request): + + # Use our socks proxy implementation with requests to avoid an extra dependency. + class SocksHTTPConnection(urllib3.connection.HTTPConnection): +- def __init__(self, _socks_options, *args, **kwargs): # must use _socks_options to pass PoolKey checks ++ def __init__( ++ self, _socks_options, *args, **kwargs ++ ): # must use _socks_options to pass PoolKey checks + self._proxy_args = _socks_options + super().__init__(*args, **kwargs) + + def _new_conn(self): + try: + return create_connection( +- address=(self._proxy_args['addr'], self._proxy_args['port']), ++ address=(self._proxy_args["addr"], self._proxy_args["port"]), + timeout=self.timeout, + source_address=self.source_address, + _create_socket_func=functools.partial( +- create_socks_proxy_socket, (self.host, self.port), self._proxy_args)) ++ create_socks_proxy_socket, (self.host, self.port), self._proxy_args ++ ), ++ ) + except (socket.timeout, TimeoutError) as e: + raise urllib3.exceptions.ConnectTimeoutError( +- self, f'Connection to {self.host} timed out. (connect timeout={self.timeout})') from e ++ self, ++ f"Connection to {self.host} timed out. (connect timeout={self.timeout})", ++ ) from e + except SocksProxyError as e: + raise urllib3.exceptions.ProxyError(str(e), e) from e + except OSError as e: + raise urllib3.exceptions.NewConnectionError( +- self, f'Failed to establish a new connection: {e}') from e ++ self, f"Failed to establish a new connection: {e}" ++ ) from e + + + class SocksHTTPSConnection(SocksHTTPConnection, urllib3.connection.HTTPSConnection): +@@ -414,12 +459,20 @@ class SocksHTTPSConnectionPool(urllib3.HTTPSConnectionPool): + + class SocksProxyManager(urllib3.PoolManager): + +- def __init__(self, socks_proxy, username=None, password=None, num_pools=10, headers=None, **connection_pool_kw): +- connection_pool_kw['_socks_options'] = make_socks_proxy_opts(socks_proxy) ++ def __init__( ++ self, ++ socks_proxy, ++ username=None, ++ password=None, ++ num_pools=10, ++ headers=None, ++ **connection_pool_kw, ++ ): ++ connection_pool_kw["_socks_options"] = make_socks_proxy_opts(socks_proxy) + super().__init__(num_pools, headers, **connection_pool_kw) + self.pool_classes_by_scheme = { +- 'http': SocksHTTPConnectionPool, +- 'https': SocksHTTPSConnectionPool, ++ "http": SocksHTTPConnectionPool, ++ "https": SocksHTTPSConnectionPool, + } + + +-- +2.48.1 + diff --git a/changelog b/changelog new file mode 100644 index 0000000..583c39b --- /dev/null +++ b/changelog @@ -0,0 +1,180 @@ +* Mon Nov 18 2024 Mikel Olasagasti Uranga - 2024.11.18-1 +- Update to 2024.11.18. Fixes rhbz#2326919 + +* Tue Nov 05 2024 Mikel Olasagasti Uranga - 2024.11.04-1 +- Update to 2024.11.04. Fixes rhbz#2323783 + +* Wed Oct 23 2024 Mikel Olasagasti Uranga - 2024.10.22-1 +- Update to 2024.10.22. Fixes rhbz#2321221 + +* Tue Oct 08 2024 Maxwell G - 2024.10.07-1 +- Update to 2024.10.07. + +* Sat Sep 28 2024 Maxwell G - 2024.09.27-1 +- Update to 2024.09.27. + +* Mon Aug 12 2024 Maxwell G - 2024.08.06-1 +- Update to 2024.08.06. Fixes rhbz#2303069. + +* Sat Aug 03 2024 Mikel Olasagasti Uranga - 2024.08.01-1 +- Update to 2024.08.01. Fixes rhbz#2302522 + +* Fri Jul 26 2024 Mikel Olasagasti Uranga - 2024.07.25-1 +- Update to 2024.07.25. Fixes rhbz#2300087 + +* Wed Jul 24 2024 Mikel Olasagasti Uranga - 2024.07.16-1 +- Update to 2024.07.16. Fixes rhbz#2298550 + +* Sat Jul 20 2024 Fedora Release Engineering - 2024.07.09-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild + +* Thu Jul 11 2024 Mikel Olasagasti Uranga - 2024.07.09-1 +- Update to 2024.07.09. Fixes rhbz#2297344 + +* Mon Jul 08 2024 Mikel Olasagasti Uranga - 2024.07.07-1 +- Update to 2024.07.07. Fixes rhbz#2296356 + +* Thu Jul 04 2024 Mikel Olasagasti Uranga - 2024.07.02-1 +- Update to 2024.07.02. Fixes rhbz#2295769 + +* Fri Jun 07 2024 Python Maint - 2024.05.27-2 +- Rebuilt for Python 3.13 + +* Wed May 29 2024 Mikel Olasagasti Uranga - 2024.05.27-1 +- Update to 2024.05.27. Fixes rhbz#2283578. + +* Mon May 27 2024 Mikel Olasagasti Uranga - 2024.05.26-1 +- Update to 2024.05.26. Fixes rhbz#2274266. + +* Wed Apr 10 2024 Maxwell G - 2024.04.09-1 +- Update to 2024.04.09. + +* Wed Mar 13 2024 Maxwell G - 2024.03.10-1 +- Update to 2024.03.10. Fixes rhbz#2268944. + +* Sat Jan 27 2024 Fedora Release Engineering - 2023.12.30-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Wed Jan 3 2024 Maxwell G - 2023.12.30-1 +- Update to 2023.12.30. Fixes rhbz#2244200. + +* Wed Oct 11 2023 Marcus Müller - 2023.10.07-1 +- Update to 2023.10.07. +- Fixes rhbz#2243274 +- Fixes rhbz#2240465 + +* Sat Jul 22 2023 Fedora Release Engineering - 2023.07.06-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Fri Jul 07 2023 Maxwell G - 2023.07.06-1 +- Update to 2023.07.06. +- Mitigates CVE-2023-35934 / GHSA-v8mc-9377-rwjj + +* Wed Jul 05 2023 Maxwell G - 2023.06.22-1 +- Update to 2023.06.22. Fixes rhbz#2216612. + +* Thu Jun 22 2023 Maxwell G - 2023.06.21-1 +- Update to 2023.06.21. Fixes rhbz#2216612. + +* Thu Jun 15 2023 Python Maint - 2023.03.04-2 +- Rebuilt for Python 3.12 + +* Mon Mar 06 2023 Maxwell G - 2023.03.04-1 +- Update to 2023.03.04. Fixes rhbz#2175395. + +* Fri Feb 17 2023 Maxwell G - 2023.02.17-1 +- Update to 2023.02.17. + +* Sat Jan 21 2023 Fedora Release Engineering - 2023.01.06-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Tue Jan 10 2023 Maxwell G - 2023.01.06-1 +- Update to 2023.01.06. Fixes rhbz#2157879. + +* Mon Nov 14 2022 Maxwell G - 2022.11.11-1 +- Update to 2022.11.11. Fixes rhbz#2142417. + +* Sat Oct 08 2022 Maxwell G - 2022.10.04-1 +- Update to 2022.10.04. Fixes rhbz#2132726. + +* Fri Sep 02 2022 Maxwell G - 2022.09.01-1 +- Update to 2022.09.01. Fixes rhbz#2123442. + +* Fri Aug 19 2022 Maxwell G - 2022.08.19-1 +- Update to 2022.08.19. Fixes rhbz#2118224. + +* Tue Aug 09 2022 Maxwell G - 2022.08.08-1 +- Update to 2022.08.08. + +* Sat Jul 23 2022 Fedora Release Engineering - 2022.06.29-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Mon Jul 04 2022 Maxwell G - 2022.06.29-2 +- Fix shell completions subpackages + +* Mon Jul 04 2022 Maxwell G - 2022.06.29-1 +- Update to 2022.06.29. Fixes rhbz#2102238. + +* Thu Jun 23 2022 Maxwell G - 2022.06.22.1-1 +- Update to 2022.06.22.1. Fixes rhbz#2100019. + +* Fri Jun 17 2022 Maxwell G - 2022.05.18-3 +- Fix gating configuration + +* Thu Jun 16 2022 Python Maint - 2022.05.18-2 +- Rebuilt for Python 3.11 + +* Tue May 24 2022 Maxwell G - 2022.05.18-1 +- Update to 2022.05.18. Fixes rhbz#2088564. + +* Fri Apr 08 2022 Maxwell G - 2022.04.08-1 +- Update to 2022.04.08. Fixes rhbz#2073359. + +* Sat Mar 12 2022 Artem Polishchuk - 2022.03.08.1-2 +- build: Make ffmpeg and ffprobe conditional deps for >= f36 only + +* Thu Mar 10 2022 Maxwell G - 2022.03.08.1-1 +- Update to 2022.03.08.1. Fixes rhbz#2061973. + +* Mon Mar 07 2022 Maxwell G - 2022.02.04-2 +- Add weak dependency on ffmpeg and ffprobe. +- Make shell-completion subpackages optional again. + +* Fri Feb 04 2022 Maxwell G - 2022.2.4-1 +- Update to 2022.2.4. Fixes rhbz#2050497. + +* Mon Jan 24 2022 Maxwell G - 2022.01.21-1 +- Update to 2022.01.21. + +* Sat Jan 22 2022 Fedora Release Engineering - 2021.12.27-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Mon Dec 27 2021 Maxwell G - 2021.12.27-1 +- Update to 2021.12.27. + +* Sun Dec 26 2021 Maxwell G - 2021.12.25-1 +- Update to 2021.12.25. + +* Wed Dec 01 2021 Maxwell G - 2021.12.01-1 +- Update to 2021.12.01. + +* Tue Nov 9 2021 Maxwell G - 2021.11.10.1-1 +- Update to 2021.11.10.1. + +* Tue Nov 9 2021 Maxwell G - 2021.10.22-2 +- Skip installing unnecessary tox dependencies +- Fix shell-completion subpackages +- Only package README.md; don't generate extra README.txt + +* Sat Oct 23 2021 Maxwell G - 2021.10.22-1 +- Update to 2021.10.22 + +* Sun Oct 10 2021 Maxwell G - 2021.10.10-1 +- Mark LICENSE with %%license instead of %%doc +- Update to 2021.10.10 +- Fix non-executable-script rpmlint error +- Use `python3dist(NAME)` for dependencies +- Fix rpm-buildroot-usage rpmlint error + +* Sat Oct 9 2021 Maxwell G - 2021.10.09-1 +- Initial package diff --git a/sources b/sources index 0688d0f..82b7d62 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (yt-dlp-2024.09.27.tar.gz) = 8c518aae18d049495def31dad1e81374ff7a2f1b136356c574d97643c6bbde37f757f74d77c519a8782c4d69668db80f367a21424923f249e82491c14f4880e8 +SHA512 (yt-dlp-2025.03.31.tar.gz) = 3ac5e5d13e3d1d4965ec398901bea158f451e0aed3600dace706e9e1a8f89580349fe1249c76fe097966c8254eb1cc526075138fc16ea29cf933ab0019cfaf27 diff --git a/websockets-13.patch b/websockets-13.patch deleted file mode 100644 index 9582d34..0000000 --- a/websockets-13.patch +++ /dev/null @@ -1,77 +0,0 @@ -diff --git a/pyproject.toml b/pyproject.toml -index d5480e1c6d73..fe6894a42838 100644 ---- a/pyproject.toml -+++ b/pyproject.toml -@@ -49,7 +49,7 @@ dependencies = [ - "pycryptodomex", - "requests>=2.32.2,<3", - "urllib3>=1.26.17,<3", -- "websockets>=12.0", -+ "websockets>=13.0", - ] - - [project.optional-dependencies] -diff --git a/test/test_websockets.py b/test/test_websockets.py -index 43f20ac655ad..06112cc0b8fb 100644 ---- a/test/test_websockets.py -+++ b/test/test_websockets.py -@@ -88,7 +88,7 @@ def create_wss_websocket_server(): - certfn = os.path.join(TEST_DIR, 'testcert.pem') - sslctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) - sslctx.load_cert_chain(certfn, None) -- return create_websocket_server(ssl_context=sslctx) -+ return create_websocket_server(ssl=sslctx) - - - MTLS_CERT_DIR = os.path.join(TEST_DIR, 'testdata', 'certificate') -@@ -103,7 +103,7 @@ def create_mtls_wss_websocket_server(): - sslctx.load_verify_locations(cafile=cacertfn) - sslctx.load_cert_chain(certfn, None) - -- return create_websocket_server(ssl_context=sslctx) -+ return create_websocket_server(ssl=sslctx) - - - def create_legacy_wss_websocket_server(): -@@ -112,7 +112,7 @@ def create_legacy_wss_websocket_server(): - sslctx.maximum_version = ssl.TLSVersion.TLSv1_2 - sslctx.set_ciphers('SHA1:AESCCM:aDSS:eNULL:aNULL') - sslctx.load_cert_chain(certfn, None) -- return create_websocket_server(ssl_context=sslctx) -+ return create_websocket_server(ssl=sslctx) - - - def ws_validate_and_send(rh, req): -@@ -139,7 +139,7 @@ def setup_class(cls): - cls.wss_thread, cls.wss_port = create_wss_websocket_server() - cls.wss_base_url = f'wss://127.0.0.1:{cls.wss_port}' - -- cls.bad_wss_thread, cls.bad_wss_port = create_websocket_server(ssl_context=ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)) -+ cls.bad_wss_thread, cls.bad_wss_port = create_websocket_server(ssl=ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)) - cls.bad_wss_host = f'wss://127.0.0.1:{cls.bad_wss_port}' - - cls.mtls_wss_thread, cls.mtls_wss_port = create_mtls_wss_websocket_server() -diff --git a/yt_dlp/networking/_websockets.py b/yt_dlp/networking/_websockets.py -index 492af1154de7..21b765b91dc8 100644 ---- a/yt_dlp/networking/_websockets.py -+++ b/yt_dlp/networking/_websockets.py -@@ -47,10 +47,7 @@ - # 2: "AttributeError: 'ClientConnection' object has no attribute 'recv_events_exc'. Did you mean: 'recv_events'?" - import websockets.sync.connection # isort: split - with contextlib.suppress(Exception): -- # > 12.0 - websockets.sync.connection.Connection.recv_exc = None -- # 12.0 -- websockets.sync.connection.Connection.recv_events_exc = None - - - class WebsocketsResponseAdapter(WebSocketResponse): -@@ -162,7 +159,7 @@ def _send(self, request): - additional_headers=headers, - open_timeout=timeout, - user_agent_header=None, -- ssl_context=ssl_ctx if wsuri.secure else None, -+ ssl=ssl_ctx if wsuri.secure else None, - close_timeout=0, # not ideal, but prevents yt-dlp hanging - ) - return WebsocketsResponseAdapter(conn, url=request.url) diff --git a/yt-dlp.spec b/yt-dlp.spec index 8a941e4..97f8318 100644 --- a/yt-dlp.spec +++ b/yt-dlp.spec @@ -7,8 +7,8 @@ %bcond_without tests Name: yt-dlp -Version: 2024.09.27 -Release: 1%{?dist} +Version: 2025.03.31 +Release: %autorelease Summary: A command-line program to download videos from online video platforms License: Unlicense @@ -20,15 +20,18 @@ Source: yt-dlp.spec.license # https://github.com/yt-dlp/yt-dlp/commit/6f9e6537434562d513d0c9b68ced8a61ade94a64 # [rh:websockets] Upgrade websockets to 13.0 (#10815) # Revert this patch for compatibility with older Fedora versions -Patch1000: websockets-13.patch +# This patch is applied conditionally to Fedora <= 41 +Patch1000: 0001-Revert-rh-websockets-Upgrade-websockets-to-13.0-1081.patch + +# Revert "[rh:requests] Bump minimum `requests` version to 2.32.2 (#10079)" +# Revert this patch for compatibility with older Fedora versions +# This patch is applied conditionally to Fedora <= 40 +Patch1001: 0002-Revert-rh-requests-Bump-minimum-requests-version-to-.patch BuildArch: noarch BuildRequires: python3-devel -# Needed for %%prep -BuildRequires: tomcli - %if %{with tests} # Needed for %%check BuildRequires: %{py3_dist pytest} @@ -38,6 +41,8 @@ BuildRequires: %{py3_dist pytest} BuildRequires: pandoc BuildRequires: make +Requires: yt-dlp+default = %{?epoch:%{epoch}:}%{version}-%{release} + # ffmpeg-free is now available in Fedora. Recommends: /usr/bin/ffmpeg Recommends: /usr/bin/ffprobe @@ -80,19 +85,21 @@ Fish command line completion support for %{name}. %prep %autosetup -N -%if %{defined fedora} && %{fedora} <= 41 +%autopatch -M 999 -p1 +%if %{defined fedora} && 0%{?fedora} <= 41 # Revert patch for compatibility with older websockets -%patch -P1000 -p1 -R +%autopatch 1000 -p1 +%endif +%if %{defined fedora} && 0%{?fedora} <= 40 +# Revert patch for compatibility with older requests +%autopatch 1001 -p1 %endif # Remove unnecessary shebangs find -type f ! -executable -name '*.py' -print -exec sed -i -e '1{\@^#!.*@d}' '{}' + -# Relax version constraints -tomcli-set pyproject.toml lists replace project.dependencies \ - '(requests|urllib3|websockets)>=.*' '\1' %generate_buildrequires -%pyproject_buildrequires -r +%pyproject_buildrequires -x default,secretstorage %build # Docs and shell completions @@ -108,7 +115,7 @@ make yt-dlp.1 completion-bash completion-zsh completion-fish %check %if %{with tests} # See https://github.com/yt-dlp/yt-dlp/blob/master/devscripts/run_tests.sh -%pytest -k "not download" +%pytest -k "not download and not test_verify_cert[Websockets]" %endif %files -f %{pyproject_files} @@ -126,172 +133,7 @@ make yt-dlp.1 completion-bash completion-zsh completion-fish %files fish-completion %{fish_completions_dir}/%{name}.fish +%pyproject_extras_subpkg -n yt-dlp default secretstorage + %changelog -* Sat Sep 28 2024 Maxwell G - 2024.09.27-1 -- Update to 2024.09.27. - -* Mon Aug 12 2024 Maxwell G - 2024.08.06-1 -- Update to 2024.08.06. Fixes rhbz#2303069. - -* Sat Aug 03 2024 Mikel Olasagasti Uranga - 2024.08.01-1 -- Update to 2024.08.01. Fixes rhbz#2302522 - -* Fri Jul 26 2024 Mikel Olasagasti Uranga - 2024.07.25-1 -- Update to 2024.07.25. Fixes rhbz#2300087 - -* Wed Jul 24 2024 Mikel Olasagasti Uranga - 2024.07.16-1 -- Update to 2024.07.16. Fixes rhbz#2298550 - -* Sat Jul 20 2024 Fedora Release Engineering - 2024.07.09-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild - -* Thu Jul 11 2024 Mikel Olasagasti Uranga - 2024.07.09-1 -- Update to 2024.07.09. Fixes rhbz#2297344 - -* Mon Jul 08 2024 Mikel Olasagasti Uranga - 2024.07.07-1 -- Update to 2024.07.07. Fixes rhbz#2296356 - -* Thu Jul 04 2024 Mikel Olasagasti Uranga - 2024.07.02-1 -- Update to 2024.07.02. Fixes rhbz#2295769 - -* Fri Jun 07 2024 Python Maint - 2024.05.27-2 -- Rebuilt for Python 3.13 - -* Wed May 29 2024 Mikel Olasagasti Uranga - 2024.05.27-1 -- Update to 2024.05.27. Fixes rhbz#2283578. - -* Mon May 27 2024 Mikel Olasagasti Uranga - 2024.05.26-1 -- Update to 2024.05.26. Fixes rhbz#2274266. - -* Wed Apr 10 2024 Maxwell G - 2024.04.09-1 -- Update to 2024.04.09. - -* Wed Mar 13 2024 Maxwell G - 2024.03.10-1 -- Update to 2024.03.10. Fixes rhbz#2268944. - -* Sat Jan 27 2024 Fedora Release Engineering - 2023.12.30-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Wed Jan 3 2024 Maxwell G - 2023.12.30-1 -- Update to 2023.12.30. Fixes rhbz#2244200. - -* Wed Oct 11 2023 Marcus Müller - 2023.10.07-1 -- Update to 2023.10.07. -- Fixes rhbz#2243274 -- Fixes rhbz#2240465 - -* Sat Jul 22 2023 Fedora Release Engineering - 2023.07.06-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild - -* Fri Jul 07 2023 Maxwell G - 2023.07.06-1 -- Update to 2023.07.06. -- Mitigates CVE-2023-35934 / GHSA-v8mc-9377-rwjj - -* Wed Jul 05 2023 Maxwell G - 2023.06.22-1 -- Update to 2023.06.22. Fixes rhbz#2216612. - -* Thu Jun 22 2023 Maxwell G - 2023.06.21-1 -- Update to 2023.06.21. Fixes rhbz#2216612. - -* Thu Jun 15 2023 Python Maint - 2023.03.04-2 -- Rebuilt for Python 3.12 - -* Mon Mar 06 2023 Maxwell G - 2023.03.04-1 -- Update to 2023.03.04. Fixes rhbz#2175395. - -* Fri Feb 17 2023 Maxwell G - 2023.02.17-1 -- Update to 2023.02.17. - -* Sat Jan 21 2023 Fedora Release Engineering - 2023.01.06-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild - -* Tue Jan 10 2023 Maxwell G - 2023.01.06-1 -- Update to 2023.01.06. Fixes rhbz#2157879. - -* Mon Nov 14 2022 Maxwell G - 2022.11.11-1 -- Update to 2022.11.11. Fixes rhbz#2142417. - -* Sat Oct 08 2022 Maxwell G - 2022.10.04-1 -- Update to 2022.10.04. Fixes rhbz#2132726. - -* Fri Sep 02 2022 Maxwell G - 2022.09.01-1 -- Update to 2022.09.01. Fixes rhbz#2123442. - -* Fri Aug 19 2022 Maxwell G - 2022.08.19-1 -- Update to 2022.08.19. Fixes rhbz#2118224. - -* Tue Aug 09 2022 Maxwell G - 2022.08.08-1 -- Update to 2022.08.08. - -* Sat Jul 23 2022 Fedora Release Engineering - 2022.06.29-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild - -* Mon Jul 04 2022 Maxwell G - 2022.06.29-2 -- Fix shell completions subpackages - -* Mon Jul 04 2022 Maxwell G - 2022.06.29-1 -- Update to 2022.06.29. Fixes rhbz#2102238. - -* Thu Jun 23 2022 Maxwell G - 2022.06.22.1-1 -- Update to 2022.06.22.1. Fixes rhbz#2100019. - -* Fri Jun 17 2022 Maxwell G - 2022.05.18-3 -- Fix gating configuration - -* Thu Jun 16 2022 Python Maint - 2022.05.18-2 -- Rebuilt for Python 3.11 - -* Tue May 24 2022 Maxwell G - 2022.05.18-1 -- Update to 2022.05.18. Fixes rhbz#2088564. - -* Fri Apr 08 2022 Maxwell G - 2022.04.08-1 -- Update to 2022.04.08. Fixes rhbz#2073359. - -* Sat Mar 12 2022 Artem Polishchuk - 2022.03.08.1-2 -- build: Make ffmpeg and ffprobe conditional deps for >= f36 only - -* Thu Mar 10 2022 Maxwell G - 2022.03.08.1-1 -- Update to 2022.03.08.1. Fixes rhbz#2061973. - -* Mon Mar 07 2022 Maxwell G - 2022.02.04-2 -- Add weak dependency on ffmpeg and ffprobe. -- Make shell-completion subpackages optional again. - -* Fri Feb 04 2022 Maxwell G - 2022.2.4-1 -- Update to 2022.2.4. Fixes rhbz#2050497. - -* Mon Jan 24 2022 Maxwell G - 2022.01.21-1 -- Update to 2022.01.21. - -* Sat Jan 22 2022 Fedora Release Engineering - 2021.12.27-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild - -* Mon Dec 27 2021 Maxwell G - 2021.12.27-1 -- Update to 2021.12.27. - -* Sun Dec 26 2021 Maxwell G - 2021.12.25-1 -- Update to 2021.12.25. - -* Wed Dec 01 2021 Maxwell G - 2021.12.01-1 -- Update to 2021.12.01. - -* Tue Nov 9 2021 Maxwell G - 2021.11.10.1-1 -- Update to 2021.11.10.1. - -* Tue Nov 9 2021 Maxwell G - 2021.10.22-2 -- Skip installing unnecessary tox dependencies -- Fix shell-completion subpackages -- Only package README.md; don't generate extra README.txt - -* Sat Oct 23 2021 Maxwell G - 2021.10.22-1 -- Update to 2021.10.22 - -* Sun Oct 10 2021 Maxwell G - 2021.10.10-1 -- Mark LICENSE with %%license instead of %%doc -- Update to 2021.10.10 -- Fix non-executable-script rpmlint error -- Use `python3dist(NAME)` for dependencies -- Fix rpm-buildroot-usage rpmlint error - -* Sat Oct 9 2021 Maxwell G - 2021.10.09-1 -- Initial package +%autochangelog