From aac67bc57639bc1d0b2f1383f23209c18ebe3e7f Mon Sep 17 00:00:00 2001 From: Enam Mijbah Noor Date: Tue, 1 Apr 2014 05:23:55 +0600 Subject: [PATCH] Added new --playlist-items option --- youtube_dl/YoutubeDL.py | 30 +++++++++++++++++++++++++++--- youtube_dl/__init__.py | 6 ++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 6646fe348..41cb439fa 100644 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -113,6 +113,7 @@ class YoutubeDL(object): nooverwrites: Prevent overwriting files. playliststart: Playlist item to start at. playlistend: Playlist item to end at. + playlistitems: Specific items of playlist to download. matchtitle: Download only matching titles. rejecttitle: Reject downloads for matching titles. logger: Log messages to a logging.Logger instance. @@ -603,17 +604,40 @@ class YoutubeDL(object): if playlistend == -1: playlistend = None + playlistitems = self.params.get('playlistitems', None) + if playlistitems: + if bool(re.compile(r'[^0-9,-]').search(playlistitems)): + raise ValueError('Invalid charecters in --playlist-items argument.') + _playlistitems = playlistitems.split(',') + playlistitems = [] + for item in _playlistitems: + if '-' in item: + start, end = item.split('-') + playlistitems.extend(list(range(int(start), int(end) + 1))) + else: + playlistitems.append(int(item)) + if isinstance(ie_result['entries'], list): n_all_entries = len(ie_result['entries']) - entries = ie_result['entries'][playliststart:playlistend] + if playlistitems: + entries = [e for i, e in enumerate(ie_result['entries'], 1) if i in playlistitems] + else: + entries = ie_result['entries'][playliststart:playlistend] n_entries = len(entries) self.to_screen( "[%s] playlist %s: Collected %d video ids (downloading %d of them)" % (ie_result['extractor'], playlist, n_all_entries, n_entries)) else: assert isinstance(ie_result['entries'], PagedList) - entries = ie_result['entries'].getslice( - playliststart, playlistend) + if playlistitems: + entries = [] + for item in playlistitems: + entries.append(ie_result.getslice( + item, item + 1 + )) + else: + entries = ie_result['entries'].getslice( + playliststart, playlistend) n_entries = len(entries) self.to_screen( "[%s] playlist %s: Downloading %d videos" % diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index 7c135db32..f1432891a 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -52,6 +52,7 @@ __authors__ = ( 'Juan C. Olivares', 'Mattias Harrysson', 'phaer', + 'Enam Mijbah Noor' ) __license__ = 'Public Domain' @@ -276,6 +277,10 @@ def parseOpts(overrideArguments=None): '--playlist-end', dest='playlistend', metavar='NUMBER', default=None, type=int, help='playlist video to end at (default is last)') + selection.add_option( + '--playlist-items', + dest='playlistitems', metavar='FORMAT', default=None, + help='playlist video items to download. Specify items seperated by commas like: "--playlist-items 1,2,5,8". You can specify range: "--playlist-items 1-4,7,10,12-15,20".') 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)') selection.add_option('--max-downloads', metavar='NUMBER', @@ -744,6 +749,7 @@ def _real_main(argv=None): 'progress_with_newline': opts.progress_with_newline, 'playliststart': opts.playliststart, 'playlistend': opts.playlistend, + 'playlistitems': opts.playlistitems, 'noplaylist': opts.noplaylist, 'logtostderr': opts.outtmpl == '-', 'consoletitle': opts.consoletitle,