@@ -4657,7 +4657,7 @@ def filter_using_list(row, filterArray):
46574657 return '\n ' .join (format_str % tuple (row ) for row in table )
46584658
46594659
4660- def _match_one (filter_part , dct ):
4660+ def _match_one (filter_part , dct , incomplete ):
46614661 # TODO: Generalize code with YoutubeDL._build_format_filter
46624662 STRING_OPERATORS = {
46634663 '*=' : operator .contains ,
@@ -4718,7 +4718,7 @@ def _match_one(filter_part, dct):
47184718 'Invalid integer value %r in filter part %r' % (
47194719 m .group ('intval' ), filter_part ))
47204720 if actual_value is None :
4721- return m .group ('none_inclusive' )
4721+ return incomplete or m .group ('none_inclusive' )
47224722 return op (actual_value , comparison_value )
47234723
47244724 UNARY_OPERATORS = {
@@ -4733,22 +4733,25 @@ def _match_one(filter_part, dct):
47334733 if m :
47344734 op = UNARY_OPERATORS [m .group ('op' )]
47354735 actual_value = dct .get (m .group ('key' ))
4736+ if incomplete and actual_value is None :
4737+ return True
47364738 return op (actual_value )
47374739
47384740 raise ValueError ('Invalid filter part %r' % filter_part )
47394741
47404742
4741- def match_str (filter_str , dct ):
4742- """ Filter a dictionary with a simple string syntax. Returns True (=passes filter) or false """
4743-
4743+ def match_str (filter_str , dct , incomplete = False ):
4744+ """ Filter a dictionary with a simple string syntax. Returns True (=passes filter) or false
4745+ When incomplete, all conditions passes on missing fields
4746+ """
47444747 return all (
4745- _match_one (filter_part .replace (r'\&' , '&' ), dct )
4748+ _match_one (filter_part .replace (r'\&' , '&' ), dct , incomplete )
47464749 for filter_part in re .split (r'(?<!\\)&' , filter_str ))
47474750
47484751
47494752def match_filter_func (filter_str ):
4750- def _match_func (info_dict ):
4751- if match_str (filter_str , info_dict ):
4753+ def _match_func (info_dict , * args , ** kwargs ):
4754+ if match_str (filter_str , info_dict , * args , ** kwargs ):
47524755 return None
47534756 else :
47544757 video_title = info_dict .get ('title' , info_dict .get ('id' , 'video' ))
0 commit comments