[utils] Work around PyPy stupidity with Windows DLLs (Fixes #4392)
This commit is contained in:
		| @@ -1,8 +1,10 @@ | |||||||
| from __future__ import unicode_literals | from __future__ import unicode_literals | ||||||
|  |  | ||||||
|  | import ctypes | ||||||
| import getpass | import getpass | ||||||
| import optparse | import optparse | ||||||
| import os | import os | ||||||
|  | import platform | ||||||
| import re | import re | ||||||
| import subprocess | import subprocess | ||||||
| import sys | import sys | ||||||
| @@ -326,6 +328,22 @@ def workaround_optparse_bug9161(): | |||||||
|         optparse.OptionGroup.add_option = _compat_add_option |         optparse.OptionGroup.add_option = _compat_add_option | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if platform.python_implementation() == 'PyPy': | ||||||
|  |     # PyPy expects byte strings as Windows function names | ||||||
|  |     # https://github.com/rg3/youtube-dl/pull/4392 | ||||||
|  |     def compat_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_WINFUNCTYPE(*args, **kwargs): | ||||||
|  |         return ctypes.WINFUNCTYPE(*args, **kwargs) | ||||||
|  |  | ||||||
|  |  | ||||||
| __all__ = [ | __all__ = [ | ||||||
|     'compat_HTTPError', |     'compat_HTTPError', | ||||||
|     'compat_chr', |     'compat_chr', | ||||||
| @@ -349,6 +367,7 @@ __all__ = [ | |||||||
|     'compat_urllib_request', |     'compat_urllib_request', | ||||||
|     'compat_urlparse', |     'compat_urlparse', | ||||||
|     'compat_urlretrieve', |     'compat_urlretrieve', | ||||||
|  |     'compat_WINFUNCTYPE', | ||||||
|     'compat_xml_parse_error', |     'compat_xml_parse_error', | ||||||
|     'shlex_quote', |     'shlex_quote', | ||||||
|     'subprocess_check_output', |     'subprocess_check_output', | ||||||
|   | |||||||
| @@ -41,6 +41,7 @@ from .compat import ( | |||||||
|     compat_urllib_parse_urlparse, |     compat_urllib_parse_urlparse, | ||||||
|     compat_urllib_request, |     compat_urllib_request, | ||||||
|     compat_urlparse, |     compat_urlparse, | ||||||
|  |     compat_WINFUNCTYPE, | ||||||
|     shlex_quote, |     shlex_quote, | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -817,21 +818,21 @@ def _windows_write_string(s, out): | |||||||
|     if fileno not in WIN_OUTPUT_IDS: |     if fileno not in WIN_OUTPUT_IDS: | ||||||
|         return False |         return False | ||||||
|  |  | ||||||
|     GetStdHandle = ctypes.WINFUNCTYPE( |     GetStdHandle = compat_WINFUNCTYPE( | ||||||
|         ctypes.wintypes.HANDLE, ctypes.wintypes.DWORD)( |         ctypes.wintypes.HANDLE, ctypes.wintypes.DWORD)( | ||||||
|         ("GetStdHandle", ctypes.windll.kernel32)) |         ("GetStdHandle", ctypes.windll.kernel32)) | ||||||
|     h = GetStdHandle(WIN_OUTPUT_IDS[fileno]) |     h = GetStdHandle(WIN_OUTPUT_IDS[fileno]) | ||||||
|  |  | ||||||
|     WriteConsoleW = ctypes.WINFUNCTYPE( |     WriteConsoleW = compat_WINFUNCTYPE( | ||||||
|         ctypes.wintypes.BOOL, ctypes.wintypes.HANDLE, ctypes.wintypes.LPWSTR, |         ctypes.wintypes.BOOL, ctypes.wintypes.HANDLE, ctypes.wintypes.LPWSTR, | ||||||
|         ctypes.wintypes.DWORD, ctypes.POINTER(ctypes.wintypes.DWORD), |         ctypes.wintypes.DWORD, ctypes.POINTER(ctypes.wintypes.DWORD), | ||||||
|         ctypes.wintypes.LPVOID)(("WriteConsoleW", ctypes.windll.kernel32)) |         ctypes.wintypes.LPVOID)(("WriteConsoleW", ctypes.windll.kernel32)) | ||||||
|     written = ctypes.wintypes.DWORD(0) |     written = ctypes.wintypes.DWORD(0) | ||||||
|  |  | ||||||
|     GetFileType = ctypes.WINFUNCTYPE(ctypes.wintypes.DWORD, ctypes.wintypes.DWORD)(("GetFileType", ctypes.windll.kernel32)) |     GetFileType = compat_WINFUNCTYPE(ctypes.wintypes.DWORD, ctypes.wintypes.DWORD)(("GetFileType", ctypes.windll.kernel32)) | ||||||
|     FILE_TYPE_CHAR = 0x0002 |     FILE_TYPE_CHAR = 0x0002 | ||||||
|     FILE_TYPE_REMOTE = 0x8000 |     FILE_TYPE_REMOTE = 0x8000 | ||||||
|     GetConsoleMode = ctypes.WINFUNCTYPE( |     GetConsoleMode = compat_WINFUNCTYPE( | ||||||
|         ctypes.wintypes.BOOL, ctypes.wintypes.HANDLE, |         ctypes.wintypes.BOOL, ctypes.wintypes.HANDLE, | ||||||
|         ctypes.POINTER(ctypes.wintypes.DWORD))( |         ctypes.POINTER(ctypes.wintypes.DWORD))( | ||||||
|         ("GetConsoleMode", ctypes.windll.kernel32)) |         ("GetConsoleMode", ctypes.windll.kernel32)) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Philipp Hagemeister
					Philipp Hagemeister