mirror of
				https://github.com/ytdl-org/youtube-dl.git
				synced 2025-10-29 09:26:20 -07:00 
			
		
		
		
	[utils] Fix youtube-dl under PyPy3 on Windows
This commit is contained in:
		
				
					committed by
					
						 Sergey M․
						Sergey M․
					
				
			
			
				
	
			
			
			
						parent
						
							54009c246e
						
					
				
				
					commit
					d7cd9a9e84
				
			| @@ -3,12 +3,14 @@ from __future__ import unicode_literals | ||||
|  | ||||
| import binascii | ||||
| import collections | ||||
| import ctypes | ||||
| import email | ||||
| import getpass | ||||
| import io | ||||
| import itertools | ||||
| import optparse | ||||
| import os | ||||
| import platform | ||||
| import re | ||||
| import shlex | ||||
| import shutil | ||||
| @@ -2906,6 +2908,24 @@ except ImportError:  # not 2.6+ or is 3.x | ||||
|     except ImportError: | ||||
|         compat_zip = zip | ||||
|  | ||||
| if platform.python_implementation() == 'PyPy' and sys.pypy_version_info < (5, 4, 0): | ||||
|     # PyPy2 prior to version 5.4.0 expects byte strings as Windows function | ||||
|     # names, see the original PyPy issue [1] and the youtube-dl one [2]. | ||||
|     # 1. https://bitbucket.org/pypy/pypy/issues/2360/windows-ctypescdll-typeerror-function-name | ||||
|     # 2. https://github.com/rg3/youtube-dl/pull/4392 | ||||
|     def compat_ctypes_WINFUNCTYPE(*args, **kwargs): | ||||
|         real = ctypes.WINFUNCTYPE(*args, **kwargs) | ||||
|  | ||||
|         def resf(tpl, *args, **kwargs): | ||||
|             funcname, dll = tpl | ||||
|             return real((str(funcname), dll), *args, **kwargs) | ||||
|  | ||||
|         return resf | ||||
| else: | ||||
|     def compat_ctypes_WINFUNCTYPE(*args, **kwargs): | ||||
|         return ctypes.WINFUNCTYPE(*args, **kwargs) | ||||
|  | ||||
|  | ||||
| __all__ = [ | ||||
|     'compat_HTMLParseError', | ||||
|     'compat_HTMLParser', | ||||
| @@ -2914,6 +2934,7 @@ __all__ = [ | ||||
|     'compat_chr', | ||||
|     'compat_cookiejar', | ||||
|     'compat_cookies', | ||||
|     'compat_ctypes_WINFUNCTYPE', | ||||
|     'compat_etree_fromstring', | ||||
|     'compat_etree_register_namespace', | ||||
|     'compat_expanduser', | ||||
|   | ||||
| @@ -39,6 +39,7 @@ from .compat import ( | ||||
|     compat_HTMLParser, | ||||
|     compat_basestring, | ||||
|     compat_chr, | ||||
|     compat_ctypes_WINFUNCTYPE, | ||||
|     compat_etree_fromstring, | ||||
|     compat_expanduser, | ||||
|     compat_html_entities, | ||||
| @@ -1330,24 +1331,24 @@ def _windows_write_string(s, out): | ||||
|     if fileno not in WIN_OUTPUT_IDS: | ||||
|         return False | ||||
|  | ||||
|     GetStdHandle = ctypes.WINFUNCTYPE( | ||||
|     GetStdHandle = compat_ctypes_WINFUNCTYPE( | ||||
|         ctypes.wintypes.HANDLE, ctypes.wintypes.DWORD)( | ||||
|         (b'GetStdHandle', ctypes.windll.kernel32)) | ||||
|         ('GetStdHandle', ctypes.windll.kernel32)) | ||||
|     h = GetStdHandle(WIN_OUTPUT_IDS[fileno]) | ||||
|  | ||||
|     WriteConsoleW = ctypes.WINFUNCTYPE( | ||||
|     WriteConsoleW = compat_ctypes_WINFUNCTYPE( | ||||
|         ctypes.wintypes.BOOL, ctypes.wintypes.HANDLE, ctypes.wintypes.LPWSTR, | ||||
|         ctypes.wintypes.DWORD, ctypes.POINTER(ctypes.wintypes.DWORD), | ||||
|         ctypes.wintypes.LPVOID)((b'WriteConsoleW', ctypes.windll.kernel32)) | ||||
|         ctypes.wintypes.LPVOID)(('WriteConsoleW', ctypes.windll.kernel32)) | ||||
|     written = ctypes.wintypes.DWORD(0) | ||||
|  | ||||
|     GetFileType = ctypes.WINFUNCTYPE(ctypes.wintypes.DWORD, ctypes.wintypes.DWORD)((b'GetFileType', ctypes.windll.kernel32)) | ||||
|     GetFileType = compat_ctypes_WINFUNCTYPE(ctypes.wintypes.DWORD, ctypes.wintypes.DWORD)(('GetFileType', ctypes.windll.kernel32)) | ||||
|     FILE_TYPE_CHAR = 0x0002 | ||||
|     FILE_TYPE_REMOTE = 0x8000 | ||||
|     GetConsoleMode = ctypes.WINFUNCTYPE( | ||||
|     GetConsoleMode = compat_ctypes_WINFUNCTYPE( | ||||
|         ctypes.wintypes.BOOL, ctypes.wintypes.HANDLE, | ||||
|         ctypes.POINTER(ctypes.wintypes.DWORD))( | ||||
|         (b'GetConsoleMode', ctypes.windll.kernel32)) | ||||
|         ('GetConsoleMode', ctypes.windll.kernel32)) | ||||
|     INVALID_HANDLE_VALUE = ctypes.wintypes.DWORD(-1).value | ||||
|  | ||||
|     def not_a_console(handle): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user