mirror of
				https://github.com/ytdl-org/youtube-dl.git
				synced 2025-11-01 09:26:45 -07:00 
			
		
		
		
	YoutubeIE: reuse instances of InfoExtractors (closes #998)
When a IE is added to the list, it's also added to a dictionary. When a IE is requested it first looks in the dictionary and if there's no instance it will create a new one. That way _real_initialize is only called once for each IE, saving time if it needs to login for example.
This commit is contained in:
		@@ -97,6 +97,7 @@ class YoutubeDL(object):
 | 
			
		||||
    def __init__(self, params):
 | 
			
		||||
        """Create a FileDownloader object with the given options."""
 | 
			
		||||
        self._ies = []
 | 
			
		||||
        self._ies_instances = {}
 | 
			
		||||
        self._pps = []
 | 
			
		||||
        self._progress_hooks = []
 | 
			
		||||
        self._download_retcode = 0
 | 
			
		||||
@@ -111,8 +112,21 @@ class YoutubeDL(object):
 | 
			
		||||
    def add_info_extractor(self, ie):
 | 
			
		||||
        """Add an InfoExtractor object to the end of the list."""
 | 
			
		||||
        self._ies.append(ie)
 | 
			
		||||
        self._ies_instances[ie.ie_key()] = ie
 | 
			
		||||
        ie.set_downloader(self)
 | 
			
		||||
 | 
			
		||||
    def get_info_extractor(self, ie_key):
 | 
			
		||||
        """
 | 
			
		||||
        Get an instance of an IE with name ie_key, it will try to get one from
 | 
			
		||||
        the _ies list, if there's no instance it will create a new one and add
 | 
			
		||||
        it to the extractor list.
 | 
			
		||||
        """
 | 
			
		||||
        ie = self._ies_instances.get(ie_key)
 | 
			
		||||
        if ie is None:
 | 
			
		||||
            ie = get_info_extractor(ie_key)()
 | 
			
		||||
            self.add_info_extractor(ie)
 | 
			
		||||
        return ie
 | 
			
		||||
 | 
			
		||||
    def add_default_info_extractors(self):
 | 
			
		||||
        """
 | 
			
		||||
        Add the InfoExtractors returned by gen_extractors to the end of the list
 | 
			
		||||
@@ -294,9 +308,7 @@ class YoutubeDL(object):
 | 
			
		||||
         '''
 | 
			
		||||
        
 | 
			
		||||
        if ie_key:
 | 
			
		||||
            ie = get_info_extractor(ie_key)()
 | 
			
		||||
            ie.set_downloader(self)
 | 
			
		||||
            ies = [ie]
 | 
			
		||||
            ies = [self.get_info_extractor(ie_key)]
 | 
			
		||||
        else:
 | 
			
		||||
            ies = self._ies
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -106,6 +106,11 @@ class InfoExtractor(object):
 | 
			
		||||
        """Real extraction process. Redefine in subclasses."""
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def ie_key(cls):
 | 
			
		||||
        """A string for getting the InfoExtractor with get_info_extractor"""
 | 
			
		||||
        return cls.__name__[:-2]
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def IE_NAME(self):
 | 
			
		||||
        return type(self).__name__[:-2]
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user