[utils] Fix youtube-dl under PyPy3 on Windows
This commit is contained in:
		
							parent
							
								
									54009c246e
								
							
						
					
					
						commit
						d7cd9a9e84
					
				
					 2 changed files with 29 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -3,12 +3,14 @@ from __future__ import unicode_literals
 | 
			
		|||
 | 
			
		||||
import binascii
 | 
			
		||||
import collections
 | 
			
		||||
import ctypes
 | 
			
		||||
import email
 | 
			
		||||
import getpass
 | 
			
		||||
import io
 | 
			
		||||
import itertools
 | 
			
		||||
import optparse
 | 
			
		||||
import os
 | 
			
		||||
import platform
 | 
			
		||||
import re
 | 
			
		||||
import shlex
 | 
			
		||||
import shutil
 | 
			
		||||
| 
						 | 
				
			
			@ -2906,6 +2908,24 @@ except ImportError:  # not 2.6+ or is 3.x
 | 
			
		|||
    except ImportError:
 | 
			
		||||
        compat_zip = zip
 | 
			
		||||
 | 
			
		||||
if platform.python_implementation() == 'PyPy' and sys.pypy_version_info < (5, 4, 0):
 | 
			
		||||
    # PyPy2 prior to version 5.4.0 expects byte strings as Windows function
 | 
			
		||||
    # names, see the original PyPy issue [1] and the youtube-dl one [2].
 | 
			
		||||
    # 1. https://bitbucket.org/pypy/pypy/issues/2360/windows-ctypescdll-typeerror-function-name
 | 
			
		||||
    # 2. https://github.com/rg3/youtube-dl/pull/4392
 | 
			
		||||
    def compat_ctypes_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_ctypes_WINFUNCTYPE(*args, **kwargs):
 | 
			
		||||
        return ctypes.WINFUNCTYPE(*args, **kwargs)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
__all__ = [
 | 
			
		||||
    'compat_HTMLParseError',
 | 
			
		||||
    'compat_HTMLParser',
 | 
			
		||||
| 
						 | 
				
			
			@ -2914,6 +2934,7 @@ __all__ = [
 | 
			
		|||
    'compat_chr',
 | 
			
		||||
    'compat_cookiejar',
 | 
			
		||||
    'compat_cookies',
 | 
			
		||||
    'compat_ctypes_WINFUNCTYPE',
 | 
			
		||||
    'compat_etree_fromstring',
 | 
			
		||||
    'compat_etree_register_namespace',
 | 
			
		||||
    'compat_expanduser',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,6 +39,7 @@ from .compat import (
 | 
			
		|||
    compat_HTMLParser,
 | 
			
		||||
    compat_basestring,
 | 
			
		||||
    compat_chr,
 | 
			
		||||
    compat_ctypes_WINFUNCTYPE,
 | 
			
		||||
    compat_etree_fromstring,
 | 
			
		||||
    compat_expanduser,
 | 
			
		||||
    compat_html_entities,
 | 
			
		||||
| 
						 | 
				
			
			@ -1330,24 +1331,24 @@ def _windows_write_string(s, out):
 | 
			
		|||
    if fileno not in WIN_OUTPUT_IDS:
 | 
			
		||||
        return False
 | 
			
		||||
 | 
			
		||||
    GetStdHandle = ctypes.WINFUNCTYPE(
 | 
			
		||||
    GetStdHandle = compat_ctypes_WINFUNCTYPE(
 | 
			
		||||
        ctypes.wintypes.HANDLE, ctypes.wintypes.DWORD)(
 | 
			
		||||
        (b'GetStdHandle', ctypes.windll.kernel32))
 | 
			
		||||
        ('GetStdHandle', ctypes.windll.kernel32))
 | 
			
		||||
    h = GetStdHandle(WIN_OUTPUT_IDS[fileno])
 | 
			
		||||
 | 
			
		||||
    WriteConsoleW = ctypes.WINFUNCTYPE(
 | 
			
		||||
    WriteConsoleW = compat_ctypes_WINFUNCTYPE(
 | 
			
		||||
        ctypes.wintypes.BOOL, ctypes.wintypes.HANDLE, ctypes.wintypes.LPWSTR,
 | 
			
		||||
        ctypes.wintypes.DWORD, ctypes.POINTER(ctypes.wintypes.DWORD),
 | 
			
		||||
        ctypes.wintypes.LPVOID)((b'WriteConsoleW', ctypes.windll.kernel32))
 | 
			
		||||
        ctypes.wintypes.LPVOID)(('WriteConsoleW', ctypes.windll.kernel32))
 | 
			
		||||
    written = ctypes.wintypes.DWORD(0)
 | 
			
		||||
 | 
			
		||||
    GetFileType = ctypes.WINFUNCTYPE(ctypes.wintypes.DWORD, ctypes.wintypes.DWORD)((b'GetFileType', ctypes.windll.kernel32))
 | 
			
		||||
    GetFileType = compat_ctypes_WINFUNCTYPE(ctypes.wintypes.DWORD, ctypes.wintypes.DWORD)(('GetFileType', ctypes.windll.kernel32))
 | 
			
		||||
    FILE_TYPE_CHAR = 0x0002
 | 
			
		||||
    FILE_TYPE_REMOTE = 0x8000
 | 
			
		||||
    GetConsoleMode = ctypes.WINFUNCTYPE(
 | 
			
		||||
    GetConsoleMode = compat_ctypes_WINFUNCTYPE(
 | 
			
		||||
        ctypes.wintypes.BOOL, ctypes.wintypes.HANDLE,
 | 
			
		||||
        ctypes.POINTER(ctypes.wintypes.DWORD))(
 | 
			
		||||
        (b'GetConsoleMode', ctypes.windll.kernel32))
 | 
			
		||||
        ('GetConsoleMode', ctypes.windll.kernel32))
 | 
			
		||||
    INVALID_HANDLE_VALUE = ctypes.wintypes.DWORD(-1).value
 | 
			
		||||
 | 
			
		||||
    def not_a_console(handle):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue