Add --match-title and --reject-title (Closes #132)
authorAnand Babu Periasamy <ab@unlocksmith.org>
Sat, 23 Jul 2011 07:51:06 +0000 (00:51 -0700)
committerPhilipp Hagemeister <phihag@phihag.de>
Wed, 14 Sep 2011 20:54:51 +0000 (22:54 +0200)
youtube-dl

index 719edeb9b557caf4bf345cea0dc3066acfc64e39..0973cc4ada77dbebeb5d1ce58bbae2245bd42823 100755 (executable)
@@ -438,6 +438,8 @@ class FileDownloader(object):
        noprogress:       Do not print the progress bar.
        playliststart:    Playlist item to start at.
        playlistend:      Playlist item to end at.
+       matchtitle:       Download only matching titles.
+       rejecttitle:      Reject downloads for matching titles.
        logtostderr:      Log messages to stderr instead of stdout.
        consoletitle:     Display progress in console window's titlebar.
        nopart:           Do not use temporary .part files.
@@ -713,6 +715,17 @@ class FileDownloader(object):
 
                if filename is None:
                        return
+
+               matchtitle=self.params.get('matchtitle',False)
+               rejecttitle=self.params.get('rejecttitle',False)
+               title=info_dict['title'].encode(preferredencoding(), 'xmlcharrefreplace')
+               if matchtitle and not re.search(matchtitle, title, re.IGNORECASE):
+                       self.to_screen(u'[download] "%s" title did not match pattern "%s"' % (title, matchtitle))
+                       return
+               if rejecttitle and re.search(rejecttitle, title, re.IGNORECASE):
+                       self.to_screen(u'[download] "%s" title matched reject pattern "%s"' % (title, rejecttitle))
+                       return
+                       
                if self.params.get('nooverwrites', False) and os.path.exists(filename):
                        self.to_stderr(u'WARNING: file exists and will be skipped')
                        return
@@ -3487,6 +3500,7 @@ def parseOpts():
 
        # option groups
        general        = optparse.OptionGroup(parser, 'General Options')
+       selection      = optparse.OptionGroup(parser, 'Video Selection')
        authentication = optparse.OptionGroup(parser, 'Authentication Options')
        video_format   = optparse.OptionGroup(parser, 'Video Format Options')
        postproc       = optparse.OptionGroup(parser, 'Post-processing Options')
@@ -3505,14 +3519,17 @@ def parseOpts():
                        dest='ratelimit', metavar='LIMIT', help='download rate limit (e.g. 50k or 44.6m)')
        general.add_option('-R', '--retries',
                        dest='retries', metavar='RETRIES', help='number of retries (default is 10)', default=10)
-       general.add_option('--playlist-start',
-                       dest='playliststart', metavar='NUMBER', help='playlist video to start at (default is 1)', default=1)
-       general.add_option('--playlist-end',
-                       dest='playlistend', metavar='NUMBER', help='playlist video to end at (default is last)', default=-1)
        general.add_option('--dump-user-agent',
                        action='store_true', dest='dump_user_agent',
                        help='display the current browser identification', default=False)
 
+       selection.add_option('--playlist-start',
+                       dest='playliststart', metavar='NUMBER', help='playlist video to start at (default is 1)', default=1)
+       selection.add_option('--playlist-end',
+                       dest='playlistend', metavar='NUMBER', help='playlist video to end at (default is last)', default=-1)
+       selection.add_option('--match-title', dest='matchtitle', metavar='REGEX',help='download only matching titles (regex or caseless sub-string)')
+       selection.add_option('--reject-title', dest='rejecttitle', metavar='REGEX',help='skip download for matching titles (regex or caseless sub-string)')
+
        authentication.add_option('-u', '--username',
                        dest='username', metavar='USERNAME', help='account username')
        authentication.add_option('-p', '--password',
@@ -3590,6 +3607,7 @@ def parseOpts():
 
 
        parser.add_option_group(general)
+       parser.add_option_group(selection)
        parser.add_option_group(filesystem)
        parser.add_option_group(verbosity)
        parser.add_option_group(video_format)
@@ -3742,6 +3760,8 @@ def main():
                'updatetime': opts.updatetime,
                'writedescription': opts.writedescription,
                'writeinfojson': opts.writeinfojson,
+               'matchtitle': opts.matchtitle,
+               'rejecttitle': opts.rejecttitle,
                })
        for extractor in extractors:
                fd.add_info_extractor(extractor)