diff options
| -rw-r--r-- | AUTHORS | 1 | ||||
| -rwxr-xr-x | youtube_dl/YoutubeDL.py | 38 | ||||
| -rw-r--r-- | youtube_dl/__init__.py | 1 | ||||
| -rw-r--r-- | youtube_dl/options.py | 4 | 
4 files changed, 39 insertions, 5 deletions
| @@ -104,3 +104,4 @@ Ondřej Caletka  Dinesh S  Johan K. Jensen  Yen Chi Hsuan +Enam Mijbah Noor 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" % diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index 04f668334..0bd7b68c3 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -333,6 +333,7 @@ def _real_main(argv=None):          'sleep_interval': opts.sleep_interval,          'external_downloader': opts.external_downloader,          'list_thumbnails': opts.list_thumbnails, +        'playlist_items': opts.playlist_items,      }      with YoutubeDL(ydl_opts) as ydl: diff --git a/youtube_dl/options.py b/youtube_dl/options.py index a3b012ddb..872835295 100644 --- a/youtube_dl/options.py +++ b/youtube_dl/options.py @@ -201,6 +201,10 @@ def parseOpts(overrideArguments=None):          dest='playlistend', metavar='NUMBER', default=None, type=int,          help='playlist video to end at (default is last)')      selection.add_option( +        '--playlist-items', +        dest='playlist_items', metavar='ITEM_SPEC', default=None, +        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)') | 
