mirror of
				https://gitlab.com/ytdl-org/youtube-dl.git
				synced 2025-11-04 00:27:07 -05: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