From aac67bc57639bc1d0b2f1383f23209c18ebe3e7f Mon Sep 17 00:00:00 2001 From: Enam Mijbah Noor Date: Tue, 1 Apr 2014 05:23:55 +0600 Subject: [PATCH 1/3] 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, From 5f465e5a07fcfdc3ebddeba5020fd688ad3079da Mon Sep 17 00:00:00 2001 From: Enam Mijbah Noor Date: Thu, 3 Apr 2014 04:00:05 +0600 Subject: [PATCH 2/3] Fixed issues of --playlist-items option --- youtube_dl/YoutubeDL.py | 25 +++++++++++++------------ youtube_dl/__init__.py | 2 +- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 41cb439fa..33e60201a 100644 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -113,7 +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. + playlistitems: Specific indices of playlist to download. matchtitle: Download only matching titles. rejecttitle: Reject downloads for matching titles. logger: Log messages to a logging.Logger instance. @@ -604,23 +604,24 @@ class YoutubeDL(object): if playlistend == -1: playlistend = None + print ie_result['entries'] 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)) + def iter_playlistitems(format): + for string_segment in format.split(','): + if '-' in string_segment: + start, end = string_segment.split('-') + for item in range(int(start), int(end) + 1): + yield int(item) + else: + yield int(string_segment) + playlistitems = iter_playlistitems(playlistitems) if isinstance(ie_result['entries'], list): n_all_entries = len(ie_result['entries']) if playlistitems: - entries = [e for i, e in enumerate(ie_result['entries'], 1) if i in playlistitems] + entries = [ie_result['entries'][i-1] for i in playlistitems] + print entries else: entries = ie_result['entries'][playliststart:playlistend] n_entries = len(entries) diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index f1432891a..ee180282c 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -280,7 +280,7 @@ def parseOpts(overrideArguments=None): 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".') + help='playlist video items to download. Specify indices of the videos in the playlist seperated by commas like: "--playlist-items 1,2,5,8" if you want to download videos indexed 1, 2, 5, 8 in the playlist. You can specify range: "--playlist-items 1-3,7,10-13", it will download the videos at index 1, 2, 3, 7, 10, 11, 12 and 13.') 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', From 5c3c20f419a21280eca3f00f9b095afd76502260 Mon Sep 17 00:00:00 2001 From: Enam Mijbah Noor Date: Thu, 3 Apr 2014 04:05:29 +0600 Subject: [PATCH 3/3] Removed debug print statements --- youtube_dl/YoutubeDL.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 33e60201a..b655fec31 100644 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -604,7 +604,6 @@ class YoutubeDL(object): if playlistend == -1: playlistend = None - print ie_result['entries'] playlistitems = self.params.get('playlistitems', None) if playlistitems: def iter_playlistitems(format): @@ -621,7 +620,6 @@ class YoutubeDL(object): n_all_entries = len(ie_result['entries']) if playlistitems: entries = [ie_result['entries'][i-1] for i in playlistitems] - print entries else: entries = ie_result['entries'][playliststart:playlistend] n_entries = len(entries)