From 16040f46d64bad8dcc5f948288ef469dd787d3d3 Mon Sep 17 00:00:00 2001 From: Philipp Hagemeister Date: Fri, 12 Dec 2014 04:01:08 +0100 Subject: [PATCH] [utils] Work around PyPy stupidity with Windows DLLs (Fixes #4392) --- youtube_dl/compat.py | 19 +++++++++++++++++++ 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))