mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-30 22:25:19 +00:00 
			
		
		
		
	Allow iterators for playlist result entries
This commit is contained in:
		| @@ -7,6 +7,7 @@ import collections | ||||
| import datetime | ||||
| import errno | ||||
| import io | ||||
| import itertools | ||||
| import json | ||||
| import locale | ||||
| import os | ||||
| @@ -654,21 +655,28 @@ class YoutubeDL(object): | ||||
|             if playlistend == -1: | ||||
|                 playlistend = None | ||||
|  | ||||
|             if isinstance(ie_result['entries'], list): | ||||
|                 n_all_entries = len(ie_result['entries']) | ||||
|                 entries = ie_result['entries'][playliststart:playlistend] | ||||
|             ie_entries = ie_result['entries'] | ||||
|             if isinstance(ie_entries, list): | ||||
|                 n_all_entries = len(ie_entries) | ||||
|                 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)) | ||||
|             else: | ||||
|                 assert isinstance(ie_result['entries'], PagedList) | ||||
|                 entries = ie_result['entries'].getslice( | ||||
|             elif isinstance(ie_entries, PagedList): | ||||
|                 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)) | ||||
|                 n_entries = len(entries) | ||||
|                 self.to_screen( | ||||
|                     "[%s] playlist %s: Downloading %d videos" % | ||||
|                     (ie_result['extractor'], playlist, n_entries)) | ||||
|  | ||||
|             for i, entry in enumerate(entries, 1): | ||||
|                 self.to_screen('[download] Downloading video #%s of %s' % (i, n_entries)) | ||||
|   | ||||
| @@ -158,8 +158,8 @@ class InfoExtractor(object): | ||||
|  | ||||
|  | ||||
|     _type "playlist" indicates multiple videos. | ||||
|     There must be a key "entries", which is a list or a PagedList object, each | ||||
|     element of which is a valid dictionary under this specfication. | ||||
|     There must be a key "entries", which is a list, an iterable, or a PagedList | ||||
|     object, each element of which is a valid dictionary by this specification. | ||||
|  | ||||
|     Additionally, playlists can have "title" and "id" attributes with the same | ||||
|     semantics as videos (see above). | ||||
|   | ||||
| @@ -1262,8 +1262,12 @@ class YoutubeChannelIE(InfoExtractor): | ||||
|             # The videos are contained in a single page | ||||
|             # the ajax pages can't be used, they are empty | ||||
|             video_ids = self.extract_videos_from_page(channel_page) | ||||
|         else: | ||||
|             # Download all channel pages using the json-based channel_ajax query | ||||
|             entries = [ | ||||
|                 self.url_result(video_id, 'Youtube', video_id=video_id) | ||||
|                 for video_id in video_ids] | ||||
|             return self.playlist_result(entries, channel_id) | ||||
|  | ||||
|         def _entries(): | ||||
|             for pagenum in itertools.count(1): | ||||
|                 url = self._MORE_PAGES_URL % (pagenum, channel_id) | ||||
|                 page = self._download_json( | ||||
| @@ -1271,16 +1275,14 @@ class YoutubeChannelIE(InfoExtractor): | ||||
|                     transform_source=uppercase_escape) | ||||
|  | ||||
|                 ids_in_page = self.extract_videos_from_page(page['content_html']) | ||||
|                 video_ids.extend(ids_in_page) | ||||
|                 for video_id in ids_in_page: | ||||
|                     yield self.url_result( | ||||
|                         video_id, 'Youtube', video_id=video_id) | ||||
|  | ||||
|                 if self._MORE_PAGES_INDICATOR not in page['load_more_widget_html']: | ||||
|                     break | ||||
|  | ||||
|         self._downloader.to_screen('[youtube] Channel %s: Found %i videos' % (channel_id, len(video_ids))) | ||||
|  | ||||
|         url_entries = [self.url_result(video_id, 'Youtube', video_id=video_id) | ||||
|                        for video_id in video_ids] | ||||
|         return self.playlist_result(url_entries, channel_id) | ||||
|         return self.playlist_result(_entries(), channel_id) | ||||
|  | ||||
|  | ||||
| class YoutubeUserIE(InfoExtractor): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Philipp Hagemeister
					Philipp Hagemeister