diff options
Diffstat (limited to 'youtube_dl/YoutubeDL.py')
| -rwxr-xr-x | youtube_dl/YoutubeDL.py | 38 | 
1 files changed, 33 insertions, 5 deletions
diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 0e73dc8ff..b7e93b8dd 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -137,6 +137,7 @@ class YoutubeDL(object):      nooverwrites:      Prevent overwriting files.      playliststart:     Playlist item to start at.      playlistend:       Playlist item to end at. +    playlist_items:    Specific indices of playlist to download.      playlistreverse:   Download playlist items in reverse order.      matchtitle:        Download only matching titles.      rejecttitle:       Reject downloads for matching titles. @@ -703,24 +704,51 @@ class YoutubeDL(object):              if playlistend == -1:                  playlistend = None +            playlistitems_str = self.params.get('playlist_items', None) +            playlistitems = None +            if playlistitems_str is not None: +                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_str) +              ie_entries = ie_result['entries']              if isinstance(ie_entries, list):                  n_all_entries = len(ie_entries) -                entries = ie_entries[playliststart:playlistend] +                if playlistitems: +                    entries = [ie_entries[i - 1] for i in playlistitems] +                else: +                    entries = ie_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))              elif isinstance(ie_entries, PagedList): -                entries = ie_entries.getslice( -                    playliststart, playlistend) +                if playlistitems: +                    entries = [] +                    for item in playlistitems: +                        entries.extend(ie_entries.getslice( +                            item - 1, item +                        )) +                else: +                    entries = ie_entries.getslice( +                        playliststart, playlistend)                  n_entries = len(entries)                  self.to_screen(                      "[%s] playlist %s: Downloading %d videos" %                      (ie_result['extractor'], playlist, n_entries))              else:  # iterable -                entries = list(itertools.islice( -                    ie_entries, playliststart, playlistend)) +                if playlistitems: +                    entry_list = list(ie_entries) +                    entries = [entry_list[i - 1] for i in playlistitems] +                else: +                    entries = list(itertools.islice( +                        ie_entries, playliststart, playlistend))                  n_entries = len(entries)                  self.to_screen(                      "[%s] playlist %s: Downloading %d videos" %  | 
