mirror of
				https://gitlab.com/ytdl-org/youtube-dl.git
				synced 2025-11-04 00:57:07 -05:00 
			
		
		
		
	[YoutubeDL] Add --playlist-items option (Fixes #2662)
This commit is contained in:
		
							
								
								
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							@@ -104,3 +104,4 @@ Ondřej Caletka
 | 
			
		||||
Dinesh S
 | 
			
		||||
Johan K. Jensen
 | 
			
		||||
Yen Chi Hsuan
 | 
			
		||||
Enam Mijbah Noor
 | 
			
		||||
 
 | 
			
		||||
@@ -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" %
 | 
			
		||||
 
 | 
			
		||||
@@ -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:
 | 
			
		||||
 
 | 
			
		||||
@@ -200,6 +200,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='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',
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user