[utils] Fix --match-filter for int-like strings (closes #11082)
This commit is contained in:
parent
2c6da7df4a
commit
e5a088dc4b
2 changed files with 15 additions and 3 deletions
|
@ -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),
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue