diff options
author | Philipp Hagemeister <[email protected]> | 2014-12-12 04:01:08 +0100 |
---|---|---|
committer | Philipp Hagemeister <[email protected]> | 2014-12-12 04:01:08 +0100 |
commit | 16040f46d64bad8dcc5f948288ef469dd787d3d3 (patch) | |
tree | 8a5316eb5c4cfafe6de58f5c84e433ec8ccd75c7 | |
parent | d068ba24f3fa247b262a0aed6d94ac7f4f43de97 (diff) | |
download | youtube-dl-16040f46d64bad8dcc5f948288ef469dd787d3d3.tar.gz youtube-dl-16040f46d64bad8dcc5f948288ef469dd787d3d3.zip |
[utils] Work around PyPy stupidity with Windows DLLs (Fixes #4392)
-rw-r--r-- | youtube_dl/compat.py | 19 | ||||
-rw-r--r-- | youtube_dl/utils.py | 9 |
2 files changed, 24 insertions, 4 deletions
diff --git a/youtube_dl/compat.py b/youtube_dl/compat.py index f4a85443e..cd46693b3 100644 --- a/youtube_dl/compat.py +++ b/youtube_dl/compat.py @@ -1,8 +1,10 @@ from __future__ import unicode_literals +import ctypes import getpass import optparse import os +import platform import re import subprocess import sys @@ -326,6 +328,22 @@ def workaround_optparse_bug9161(): 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__ = [ 'compat_HTTPError', 'compat_chr', @@ -349,6 +367,7 @@ __all__ = [ 'compat_urllib_request', 'compat_urlparse', 'compat_urlretrieve', + 'compat_WINFUNCTYPE', 'compat_xml_parse_error', 'shlex_quote', 'subprocess_check_output', diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 4b0567c93..bbe554a65 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -41,6 +41,7 @@ from .compat import ( compat_urllib_parse_urlparse, compat_urllib_request, compat_urlparse, + compat_WINFUNCTYPE, shlex_quote, ) @@ -817,21 +818,21 @@ def _windows_write_string(s, out): if fileno not in WIN_OUTPUT_IDS: return False - GetStdHandle = ctypes.WINFUNCTYPE( + GetStdHandle = compat_WINFUNCTYPE( ctypes.wintypes.HANDLE, ctypes.wintypes.DWORD)( ("GetStdHandle", ctypes.windll.kernel32)) h = GetStdHandle(WIN_OUTPUT_IDS[fileno]) - WriteConsoleW = ctypes.WINFUNCTYPE( + WriteConsoleW = compat_WINFUNCTYPE( ctypes.wintypes.BOOL, ctypes.wintypes.HANDLE, ctypes.wintypes.LPWSTR, ctypes.wintypes.DWORD, ctypes.POINTER(ctypes.wintypes.DWORD), ctypes.wintypes.LPVOID)(("WriteConsoleW", ctypes.windll.kernel32)) 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_REMOTE = 0x8000 - GetConsoleMode = ctypes.WINFUNCTYPE( + GetConsoleMode = compat_WINFUNCTYPE( ctypes.wintypes.BOOL, ctypes.wintypes.HANDLE, ctypes.POINTER(ctypes.wintypes.DWORD))( ("GetConsoleMode", ctypes.windll.kernel32)) |