From a8f3795198b819c305d40a3754e454aaa2a892c5 Mon Sep 17 00:00:00 2001
From: Simon Sawicki <contact@grub4k.xyz>
Date: Sun, 23 Feb 2025 17:04:55 +0100
Subject: [PATCH] [utils] Add `WINDOWS_VT_MODE` to globals

---
 test/test_compat.py      |  3 ---
 yt_dlp/YoutubeDL.py      |  4 ++--
 yt_dlp/compat/_legacy.py |  2 +-
 yt_dlp/globals.py        |  2 ++
 yt_dlp/utils/_utils.py   | 10 +++-------
 5 files changed, 8 insertions(+), 13 deletions(-)

diff --git a/test/test_compat.py b/test/test_compat.py
index b1cc2a8187..3aa9c0c518 100644
--- a/test/test_compat.py
+++ b/test/test_compat.py
@@ -21,9 +21,6 @@ class TestCompat(unittest.TestCase):
         with self.assertWarns(DeprecationWarning):
             _ = compat.compat_basestring
 
-        with self.assertWarns(DeprecationWarning):
-            _ = compat.WINDOWS_VT_MODE
-
         self.assertEqual(urllib.request.getproxies, getproxies)
 
         with self.assertWarns(DeprecationWarning):
diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py
index 8790b326b7..4cdfabb1a3 100644
--- a/yt_dlp/YoutubeDL.py
+++ b/yt_dlp/YoutubeDL.py
@@ -36,6 +36,7 @@ from .extractor.openload import PhantomJSwrapper
 from .globals import (
     IN_CLI,
     LAZY_EXTRACTORS,
+    WINDOWS_VT_MODE,
     plugin_ies,
     plugin_ies_overrides,
     plugin_pps,
@@ -4013,8 +4014,7 @@ class YoutubeDL:
             if os.environ.get('TERM', '').lower() == 'dumb':
                 additional_info.append('dumb')
             if not supports_terminal_sequences(stream):
-                from .utils import WINDOWS_VT_MODE  # Must be imported locally
-                additional_info.append('No VT' if WINDOWS_VT_MODE is False else 'No ANSI')
+                additional_info.append('No VT' if WINDOWS_VT_MODE.value is False else 'No ANSI')
             if additional_info:
                 ret = f'{ret} ({",".join(additional_info)})'
             return ret
diff --git a/yt_dlp/compat/_legacy.py b/yt_dlp/compat/_legacy.py
index dae2c14592..2f3e35d4a8 100644
--- a/yt_dlp/compat/_legacy.py
+++ b/yt_dlp/compat/_legacy.py
@@ -37,7 +37,7 @@ from ..dependencies import websockets as compat_websockets  # noqa: F401
 from ..dependencies.Cryptodome import AES as compat_pycrypto_AES  # noqa: F401
 from ..networking.exceptions import HTTPError as compat_HTTPError
 
-passthrough_module(__name__, '...utils', ('WINDOWS_VT_MODE', 'windows_enable_vt_mode'))
+passthrough_module(__name__, '...utils', ('windows_enable_vt_mode',))
 
 
 # compat_ctypes_WINFUNCTYPE = ctypes.WINFUNCTYPE
diff --git a/yt_dlp/globals.py b/yt_dlp/globals.py
index 0cf276cc9e..81ad004480 100644
--- a/yt_dlp/globals.py
+++ b/yt_dlp/globals.py
@@ -1,3 +1,4 @@
+import os
 from collections import defaultdict
 
 # Please Note: Due to necessary changes and the complex nature involved in the plugin/globals system,
@@ -28,3 +29,4 @@ plugin_ies_overrides = Indirect(defaultdict(list))
 # Misc
 IN_CLI = Indirect(False)
 LAZY_EXTRACTORS = Indirect(None)  # `False`=force, `None`=disabled, `True`=enabled
+WINDOWS_VT_MODE = Indirect(False if os.name == 'nt' else None)
diff --git a/yt_dlp/utils/_utils.py b/yt_dlp/utils/_utils.py
index 4093c238c2..5fa39fcfd0 100644
--- a/yt_dlp/utils/_utils.py
+++ b/yt_dlp/utils/_utils.py
@@ -52,7 +52,7 @@ from ..compat import (
     compat_HTMLParseError,
 )
 from ..dependencies import xattr
-from ..globals import IN_CLI
+from ..globals import IN_CLI, WINDOWS_VT_MODE
 
 __name__ = __name__.rsplit('.', 1)[0]  # noqa: A001: Pretend to be the parent module
 
@@ -4763,13 +4763,10 @@ def jwt_decode_hs256(jwt):
     return json.loads(base64.urlsafe_b64decode(f'{payload_b64}==='))
 
 
-WINDOWS_VT_MODE = False if os.name == 'nt' else None
-
-
 @functools.cache
 def supports_terminal_sequences(stream):
     if os.name == 'nt':
-        if not WINDOWS_VT_MODE:
+        if not WINDOWS_VT_MODE.value:
             return False
     elif not os.getenv('TERM'):
         return False
@@ -4806,8 +4803,7 @@ def windows_enable_vt_mode():
     finally:
         os.close(handle)
 
-    global WINDOWS_VT_MODE
-    WINDOWS_VT_MODE = True
+    WINDOWS_VT_MODE.value = True
     supports_terminal_sequences.cache_clear()