adds almost all valid characters for a valid youtube playlist name to the match filter options

This commit is contained in:
Gilles Habran 2016-03-03 09:21:23 +01:00
parent 9fe112c222
commit 49abafd765
3 changed files with 23 additions and 4 deletions

View File

@ -152,7 +152,9 @@ which means you can modify it, redistribute it or use it however you like.
be evaluated. For example, the youtube be evaluated. For example, the youtube
playlist 'Liked videos' will not be playlist 'Liked videos' will not be
downloaded with the following filter : downloaded with the following filter :
--match-filter "playlist_title != Liked videos" --match-filter "playlist_title != Liked videos".
Most valid characters for a valid youtube
playlist name in English can also be used.
--no-playlist Download only the video, if the URL refers --no-playlist Download only the video, if the URL refers
to a video and a playlist. to a video and a playlist.
--yes-playlist Download the playlist, if the URL refers to --yes-playlist Download the playlist, if the URL refers to

View File

@ -715,6 +715,21 @@ ffmpeg version 2.4.4 Copyright (c) 2000-2014 the FFmpeg ...'''), '2.4.4')
self.assertFalse(match_str( self.assertFalse(match_str(
'playlist_title != some playlist with space & playlist_title != foobar', 'playlist_title != some playlist with space & playlist_title != foobar',
{'playlist_title': 'some playlist with space'})) {'playlist_title': 'some playlist with space'}))
self.assertFalse(match_str(
'playlist_title != some playlist with space & playlist_title != foobar',
{'playlist_title': ' some playlist with space '}))
self.assertTrue(match_str(
'playlist_title != some playlist with space & playlist_title != foobar',
{'playlist_title': ' some playlist with space but other name '}))
self.assertTrue(match_str(
"playlist_title = It's a playlist with quote",
{'playlist_title': "It's a playlist with quote"}))
self.assertTrue(match_str(
"playlist_title = playlist with {}[]/\()",
{'playlist_title': "playlist with {}[]/\()"}))
self.assertTrue(match_str(
"playlist_title = playlist with valid characters +~#^!?§:;.",
{'playlist_title': "playlist with valid characters +~#^!?§:;."}))
def test_parse_dfxp_time_expr(self): def test_parse_dfxp_time_expr(self):
self.assertEqual(parse_dfxp_time_expr(None), None) self.assertEqual(parse_dfxp_time_expr(None), None)

View File

@ -1962,7 +1962,7 @@ def _match_one(filter_part, dct):
\s*(?P<op>%s)(?P<none_inclusive>\s*\?)?\s* \s*(?P<op>%s)(?P<none_inclusive>\s*\?)?\s*
(?: (?:
(?P<intval>[0-9.]+(?:[kKmMgGtTpPeEzZyY]i?[Bb]?)?)| (?P<intval>[0-9.]+(?:[kKmMgGtTpPeEzZyY]i?[Bb]?)?)|
(?P<strval>(?![0-9.])[a-z0-9A-Z\s_-]*) (?P<strval>(?![0-9.])[a-z0-9A-Z\.\'\(\)\{\}\[\]/\\\^\?:;~#!§+\s_-]*)
) )
\s*$ \s*$
''' % '|'.join(map(re.escape, COMPARISON_OPERATORS.keys()))) ''' % '|'.join(map(re.escape, COMPARISON_OPERATORS.keys())))
@ -1973,7 +1973,7 @@ def _match_one(filter_part, dct):
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').strip()
else: else:
try: try:
comparison_value = int(m.group('intval')) comparison_value = int(m.group('intval'))
@ -1988,6 +1988,8 @@ def _match_one(filter_part, dct):
actual_value = dct.get(m.group('key')) 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')
if isinstance(actual_value, compat_basestring):
actual_value = actual_value.strip()
return op(actual_value, comparison_value) return op(actual_value, comparison_value)
UNARY_OPERATORS = { UNARY_OPERATORS = {
@ -2011,7 +2013,7 @@ def match_str(filter_str, dct):
""" Filter a dictionary with a simple string syntax. Returns True (=passes filter) or false """ """ Filter a dictionary with a simple string syntax. Returns True (=passes filter) or false """
return all( return all(
_match_one(filter_part.strip(), dct) for filter_part in filter_str.split('&')) _match_one(filter_part, dct) for filter_part in filter_str.split('&'))
def match_filter_func(filter_str): def match_filter_func(filter_str):