mirror of
				https://gitlab.com/ytdl-org/youtube-dl.git
				synced 2025-11-04 03:37:08 -05:00 
			
		
		
		
	Add new --encoding option (Fixes #2650)
This commit is contained in:
		@@ -8,6 +8,7 @@ import datetime
 | 
			
		||||
import errno
 | 
			
		||||
import io
 | 
			
		||||
import json
 | 
			
		||||
import locale
 | 
			
		||||
import os
 | 
			
		||||
import platform
 | 
			
		||||
import re
 | 
			
		||||
@@ -159,6 +160,7 @@ class YoutubeDL(object):
 | 
			
		||||
    include_ads:       Download ads as well
 | 
			
		||||
    default_search:    Prepend this string if an input url is not valid.
 | 
			
		||||
                       'auto' for elaborate guessing
 | 
			
		||||
    encoding:          Use this encoding instead of the system-specified.
 | 
			
		||||
 | 
			
		||||
    The following parameters are not used by YoutubeDL itself, they are used by
 | 
			
		||||
    the FileDownloader:
 | 
			
		||||
@@ -1200,6 +1202,9 @@ class YoutubeDL(object):
 | 
			
		||||
    def print_debug_header(self):
 | 
			
		||||
        if not self.params.get('verbose'):
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        write_string('[debug] Encodings: locale %s, fs %s, out %s, pref %s\n' %
 | 
			
		||||
                 (locale.getpreferredencoding(), sys.getfilesystemencoding(), sys.stdout.encoding, self.get_encoding()))
 | 
			
		||||
        write_string('[debug] youtube-dl version ' + __version__ + '\n')
 | 
			
		||||
        try:
 | 
			
		||||
            sp = subprocess.Popen(
 | 
			
		||||
@@ -1264,3 +1269,19 @@ class YoutubeDL(object):
 | 
			
		||||
        # (See https://github.com/rg3/youtube-dl/issues/1309 for details)
 | 
			
		||||
        opener.addheaders = []
 | 
			
		||||
        self._opener = opener
 | 
			
		||||
 | 
			
		||||
    def encode(self, s):
 | 
			
		||||
        if isinstance(s, bytes):
 | 
			
		||||
            return s  # Already encoded
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            return s.encode(self.get_encoding())
 | 
			
		||||
        except UnicodeEncodeError as err:
 | 
			
		||||
            err.reason = err.reason + '. Check your system encoding configuration or use the --encoding option.'
 | 
			
		||||
            raise
 | 
			
		||||
 | 
			
		||||
    def get_encoding(self):
 | 
			
		||||
        encoding = self.params.get('encoding')
 | 
			
		||||
        if encoding is None:
 | 
			
		||||
            encoding = preferredencoding()
 | 
			
		||||
        return encoding
 | 
			
		||||
 
 | 
			
		||||
@@ -263,6 +263,9 @@ def parseOpts(overrideArguments=None):
 | 
			
		||||
        '--ignore-config',
 | 
			
		||||
        action='store_true',
 | 
			
		||||
        help='Do not read configuration files. When given in the global configuration file /etc/youtube-dl.conf: do not read the user configuration in ~/.config/youtube-dl.conf (%APPDATA%/youtube-dl/config.txt on Windows)')
 | 
			
		||||
    general.add_option(
 | 
			
		||||
        '--encoding', dest='encoding', metavar='ENCODING',
 | 
			
		||||
        help='Force the specified encoding (experimental)')
 | 
			
		||||
 | 
			
		||||
    selection.add_option(
 | 
			
		||||
        '--playlist-start',
 | 
			
		||||
@@ -540,8 +543,6 @@ def parseOpts(overrideArguments=None):
 | 
			
		||||
            write_string(u'[debug] System config: ' + repr(_hide_login_info(systemConf)) + '\n')
 | 
			
		||||
            write_string(u'[debug] User config: ' + repr(_hide_login_info(userConf)) + '\n')
 | 
			
		||||
            write_string(u'[debug] Command-line args: ' + repr(_hide_login_info(commandLineConf)) + '\n')
 | 
			
		||||
            write_string(u'[debug] Encodings: locale %r, fs %r, out %r, pref: %r\n' %
 | 
			
		||||
                         (locale.getpreferredencoding(), sys.getfilesystemencoding(), sys.stdout.encoding, preferredencoding()))
 | 
			
		||||
 | 
			
		||||
    return parser, opts, args
 | 
			
		||||
 | 
			
		||||
@@ -786,6 +787,7 @@ def _real_main(argv=None):
 | 
			
		||||
        'include_ads': opts.include_ads,
 | 
			
		||||
        'default_search': opts.default_search,
 | 
			
		||||
        'youtube_include_dash_manifest': opts.youtube_include_dash_manifest,
 | 
			
		||||
        'encoding': opts.encoding,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    with YoutubeDL(ydl_opts) as ydl:
 | 
			
		||||
 
 | 
			
		||||
@@ -53,8 +53,9 @@ class FFmpegPostProcessor(PostProcessor):
 | 
			
		||||
 | 
			
		||||
        if self._downloader.params.get('verbose', False):
 | 
			
		||||
            self._downloader.to_screen(u'[debug] ffmpeg command line: %s' % shell_quote(cmd))
 | 
			
		||||
        p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 | 
			
		||||
        stdout,stderr = p.communicate()
 | 
			
		||||
        bcmd = [self._downloader.encode(c) for c in cmd]
 | 
			
		||||
        p = subprocess.Popen(bcmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 | 
			
		||||
        stdout, stderr = p.communicate()
 | 
			
		||||
        if p.returncode != 0:
 | 
			
		||||
            stderr = stderr.decode('utf-8', 'replace')
 | 
			
		||||
            msg = stderr.strip().split('\n')[-1]
 | 
			
		||||
 
 | 
			
		||||
@@ -539,7 +539,6 @@ def encodeFilename(s, for_subprocess=False):
 | 
			
		||||
        encoding = 'utf-8'
 | 
			
		||||
    return s.encode(encoding, 'ignore')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def decodeOption(optval):
 | 
			
		||||
    if optval is None:
 | 
			
		||||
        return optval
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user