[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
	 Philipp Hagemeister
					Philipp Hagemeister