mirror of
				https://gitlab.com/ytdl-org/youtube-dl.git
				synced 2025-11-03 20:07:08 -05:00 
			
		
		
		
	Improve and test ffmpeg version detection
This commit is contained in:
		@@ -16,39 +16,40 @@ import json
 | 
			
		||||
import xml.etree.ElementTree
 | 
			
		||||
 | 
			
		||||
from youtube_dl.utils import (
 | 
			
		||||
    args_to_str,
 | 
			
		||||
    clean_html,
 | 
			
		||||
    DateRange,
 | 
			
		||||
    detect_exe_version,
 | 
			
		||||
    encodeFilename,
 | 
			
		||||
    escape_rfc3986,
 | 
			
		||||
    escape_url,
 | 
			
		||||
    find_xpath_attr,
 | 
			
		||||
    fix_xml_ampersands,
 | 
			
		||||
    orderedSet,
 | 
			
		||||
    OnDemandPagedList,
 | 
			
		||||
    InAdvancePagedList,
 | 
			
		||||
    intlist_to_bytes,
 | 
			
		||||
    js_to_json,
 | 
			
		||||
    limit_length,
 | 
			
		||||
    OnDemandPagedList,
 | 
			
		||||
    orderedSet,
 | 
			
		||||
    parse_duration,
 | 
			
		||||
    parse_filesize,
 | 
			
		||||
    parse_iso8601,
 | 
			
		||||
    read_batch_urls,
 | 
			
		||||
    sanitize_filename,
 | 
			
		||||
    shell_quote,
 | 
			
		||||
    smuggle_url,
 | 
			
		||||
    str_to_int,
 | 
			
		||||
    strip_jsonp,
 | 
			
		||||
    struct_unpack,
 | 
			
		||||
    timeconvert,
 | 
			
		||||
    unescapeHTML,
 | 
			
		||||
    unified_strdate,
 | 
			
		||||
    unsmuggle_url,
 | 
			
		||||
    uppercase_escape,
 | 
			
		||||
    url_basename,
 | 
			
		||||
    urlencode_postdata,
 | 
			
		||||
    xpath_with_ns,
 | 
			
		||||
    parse_iso8601,
 | 
			
		||||
    strip_jsonp,
 | 
			
		||||
    uppercase_escape,
 | 
			
		||||
    limit_length,
 | 
			
		||||
    escape_rfc3986,
 | 
			
		||||
    escape_url,
 | 
			
		||||
    js_to_json,
 | 
			
		||||
    intlist_to_bytes,
 | 
			
		||||
    args_to_str,
 | 
			
		||||
    parse_filesize,
 | 
			
		||||
    version_tuple,
 | 
			
		||||
    xpath_with_ns,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -390,5 +391,16 @@ class TestUtil(unittest.TestCase):
 | 
			
		||||
        self.assertEqual(version_tuple('10.23.344'), (10, 23, 344))
 | 
			
		||||
        self.assertEqual(version_tuple('10.1-6'), (10, 1, 6))  # avconv style
 | 
			
		||||
 | 
			
		||||
    def test_detect_exe_version(self):
 | 
			
		||||
        self.assertEqual(detect_exe_version('''ffmpeg version 1.2.1
 | 
			
		||||
built on May 27 2013 08:37:26 with gcc 4.7 (Debian 4.7.3-4)
 | 
			
		||||
configuration: --prefix=/usr --extra-'''), '1.2.1')
 | 
			
		||||
        self.assertEqual(detect_exe_version('''ffmpeg version N-63176-g1fb4685
 | 
			
		||||
built on May 15 2014 22:09:06 with gcc 4.8.2 (GCC)'''), 'N-63176-g1fb4685')
 | 
			
		||||
        self.assertEqual(detect_exe_version('''X server found. dri2 connection failed!
 | 
			
		||||
Trying to open render node...
 | 
			
		||||
Success at /dev/dri/renderD128.
 | 
			
		||||
ffmpeg version 2.4.4 Copyright (c) 2000-2014 the FFmpeg ...'''), '2.4.4')
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    unittest.main()
 | 
			
		||||
 
 | 
			
		||||
@@ -1262,18 +1262,25 @@ def check_executable(exe, args=[]):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_exe_version(exe, args=['--version'],
 | 
			
		||||
                    version_re=r'version\s+([0-9._-a-zA-Z]+)',
 | 
			
		||||
                    unrecognized='present'):
 | 
			
		||||
                    version_re=None, unrecognized='present'):
 | 
			
		||||
    """ Returns the version of the specified executable,
 | 
			
		||||
    or False if the executable is not present """
 | 
			
		||||
    try:
 | 
			
		||||
        out, err = subprocess.Popen(
 | 
			
		||||
        out, _ = subprocess.Popen(
 | 
			
		||||
            [exe] + args,
 | 
			
		||||
            stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()
 | 
			
		||||
    except OSError:
 | 
			
		||||
        return False
 | 
			
		||||
    firstline = out.partition(b'\n')[0].decode('ascii', 'ignore')
 | 
			
		||||
    m = re.search(version_re, firstline)
 | 
			
		||||
    if isinstance(out, bytes):  # Python 2.x
 | 
			
		||||
        out = out.decode('ascii', 'ignore')
 | 
			
		||||
    return detect_exe_version(out, version_re, unrecognized)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def detect_exe_version(output, version_re=None, unrecognized='present'):
 | 
			
		||||
    assert isinstance(output, compat_str)
 | 
			
		||||
    if version_re is None:
 | 
			
		||||
        version_re = r'version\s+([-0-9._a-zA-Z]+)'
 | 
			
		||||
    m = re.search(version_re, output)
 | 
			
		||||
    if m:
 | 
			
		||||
        return m.group(1)
 | 
			
		||||
    else:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user