Преглед на файлове

Improve and test ffmpeg version detection

Philipp Hagemeister преди 11 години
родител
ревизия
cae97f6521
променени са 2 файла, в които са добавени 37 реда и са изтрити 18 реда
  1. 25 13
      test/test_utils.py
  2. 12 5
      youtube_dl/utils.py

+ 25 - 13
test/test_utils.py

@@ -16,39 +16,40 @@ import json
 import xml.etree.ElementTree
 import xml.etree.ElementTree
 
 
 from youtube_dl.utils import (
 from youtube_dl.utils import (
+    args_to_str,
     clean_html,
     clean_html,
     DateRange,
     DateRange,
+    detect_exe_version,
     encodeFilename,
     encodeFilename,
+    escape_rfc3986,
+    escape_url,
     find_xpath_attr,
     find_xpath_attr,
     fix_xml_ampersands,
     fix_xml_ampersands,
-    orderedSet,
-    OnDemandPagedList,
     InAdvancePagedList,
     InAdvancePagedList,
+    intlist_to_bytes,
+    js_to_json,
+    limit_length,
+    OnDemandPagedList,
+    orderedSet,
     parse_duration,
     parse_duration,
+    parse_filesize,
+    parse_iso8601,
     read_batch_urls,
     read_batch_urls,
     sanitize_filename,
     sanitize_filename,
     shell_quote,
     shell_quote,
     smuggle_url,
     smuggle_url,
     str_to_int,
     str_to_int,
+    strip_jsonp,
     struct_unpack,
     struct_unpack,
     timeconvert,
     timeconvert,
     unescapeHTML,
     unescapeHTML,
     unified_strdate,
     unified_strdate,
     unsmuggle_url,
     unsmuggle_url,
+    uppercase_escape,
     url_basename,
     url_basename,
     urlencode_postdata,
     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,
     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.23.344'), (10, 23, 344))
         self.assertEqual(version_tuple('10.1-6'), (10, 1, 6))  # avconv style
         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__':
 if __name__ == '__main__':
     unittest.main()
     unittest.main()

+ 12 - 5
youtube_dl/utils.py

@@ -1262,18 +1262,25 @@ def check_executable(exe, args=[]):
 
 
 
 
 def get_exe_version(exe, args=['--version'],
 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,
     """ Returns the version of the specified executable,
     or False if the executable is not present """
     or False if the executable is not present """
     try:
     try:
-        out, err = subprocess.Popen(
+        out, _ = subprocess.Popen(
             [exe] + args,
             [exe] + args,
             stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()
             stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()
     except OSError:
     except OSError:
         return False
         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:
     if m:
         return m.group(1)
         return m.group(1)
     else:
     else: