summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorPhilipp Hagemeister <[email protected]>2014-12-12 04:01:08 +0100
committerPhilipp Hagemeister <[email protected]>2014-12-12 04:01:08 +0100
commit16040f46d64bad8dcc5f948288ef469dd787d3d3 (patch)
tree8a5316eb5c4cfafe6de58f5c84e433ec8ccd75c7
parentd068ba24f3fa247b262a0aed6d94ac7f4f43de97 (diff)
downloadyoutube-dl-16040f46d64bad8dcc5f948288ef469dd787d3d3.tar.gz
youtube-dl-16040f46d64bad8dcc5f948288ef469dd787d3d3.zip
[utils] Work around PyPy stupidity with Windows DLLs (Fixes #4392)
-rw-r--r--youtube_dl/compat.py19
-rw-r--r--youtube_dl/utils.py9
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))