mirror of
				https://gitlab.com/ytdl-org/youtube-dl.git
				synced 2025-11-04 04:57:07 -05:00 
			
		
		
		
	[utils] Work around PyPy stupidity with Windows DLLs (Fixes #4392)
This commit is contained in:
		@@ -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',
 | 
			
		||||
 
 | 
			
		||||
@@ -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))
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user