浏览代码

[utils] Fix --match-filter for int-like strings (closes #11082)

Sergey M․ 8 年之前
父节点
当前提交
e5a088dc4b
共有 2 个文件被更改,包括 15 次插入3 次删除
  1. 6 0
      test/test_YoutubeDL.py
  2. 9 3
      youtube_dl/utils.py

+ 6 - 0
test/test_YoutubeDL.py

@@ -605,6 +605,7 @@ class TestYoutubeDL(unittest.TestCase):
             'extractor': 'TEST',
             'extractor': 'TEST',
             'duration': 30,
             'duration': 30,
             'filesize': 10 * 1024,
             'filesize': 10 * 1024,
+            'playlist_id': '42',
         }
         }
         second = {
         second = {
             'id': '2',
             'id': '2',
@@ -614,6 +615,7 @@ class TestYoutubeDL(unittest.TestCase):
             'duration': 10,
             'duration': 10,
             'description': 'foo',
             'description': 'foo',
             'filesize': 5 * 1024,
             'filesize': 5 * 1024,
+            'playlist_id': '43',
         }
         }
         videos = [first, second]
         videos = [first, second]
 
 
@@ -650,6 +652,10 @@ class TestYoutubeDL(unittest.TestCase):
         res = get_videos(f)
         res = get_videos(f)
         self.assertEqual(res, ['1'])
         self.assertEqual(res, ['1'])
 
 
+        f = match_filter_func('playlist_id = 42')
+        res = get_videos(f)
+        self.assertEqual(res, ['1'])
+
     def test_playlist_items_selection(self):
     def test_playlist_items_selection(self):
         entries = [{
         entries = [{
             'id': compat_str(i),
             'id': compat_str(i),

+ 9 - 3
youtube_dl/utils.py

@@ -2345,11 +2345,18 @@ def _match_one(filter_part, dct):
     m = operator_rex.search(filter_part)
     m = operator_rex.search(filter_part)
     if m:
     if m:
         op = COMPARISON_OPERATORS[m.group('op')]
         op = COMPARISON_OPERATORS[m.group('op')]
-        if m.group('strval') is not None:
+        actual_value = dct.get(m.group('key'))
+        if (m.group('strval') is not None or
+            # If the original field is a string and matching comparisonvalue is
+            # a number we should respect the origin of the original field
+            # and process comparison value as a string (see
+            # https://github.com/rg3/youtube-dl/issues/11082).
+            actual_value is not None and m.group('intval') is not None and
+                isinstance(actual_value, compat_str)):
             if m.group('op') not in ('=', '!='):
             if m.group('op') not in ('=', '!='):
                 raise ValueError(
                 raise ValueError(
                     'Operator %s does not support string values!' % m.group('op'))
                     'Operator %s does not support string values!' % m.group('op'))
-            comparison_value = m.group('strval')
+            comparison_value = m.group('strval') or m.group('intval')
         else:
         else:
             try:
             try:
                 comparison_value = int(m.group('intval'))
                 comparison_value = int(m.group('intval'))
@@ -2361,7 +2368,6 @@ def _match_one(filter_part, dct):
                     raise ValueError(
                     raise ValueError(
                         'Invalid integer value %r in filter part %r' % (
                         'Invalid integer value %r in filter part %r' % (
                             m.group('intval'), filter_part))
                             m.group('intval'), filter_part))
-        actual_value = dct.get(m.group('key'))
         if actual_value is None:
         if actual_value is None:
             return m.group('none_inclusive')
             return m.group('none_inclusive')
         return op(actual_value, comparison_value)
         return op(actual_value, comparison_value)