`extract_info` now expects `ie.extract` to return a list in the format proposed in...
authorJaime Marquínez Ferrándiz <jaimemf93@gmail.com>
Tue, 5 Mar 2013 19:14:32 +0000 (20:14 +0100)
committerJaime Marquínez Ferrándiz <jaimemf93@gmail.com>
Tue, 5 Mar 2013 19:14:32 +0000 (20:14 +0100)
Each element should have a '_type' key specifying if it's a video, an url or a playlist.
`extract_info` will process each element to get the full info

youtube_dl/FileDownloader.py

index 9b630c123f23d0c54daf56906a92d952904a9455..68fad11bc72bf4f84b5d36266afbef403facb30e 100644 (file)
@@ -410,12 +410,9 @@ class FileDownloader(object):
 
             # Extract information from URL and process it
             try:
-                videos = ie.extract(url)
-                for video in videos or []:
-                    if not 'extractor' in video:
-                        #The extractor has already been set somewher else
-                        video['extractor'] = ie.IE_NAME
-                return videos
+                ie_results = ie.extract(url)
+                results = self.process_ie_results(ie_results, ie)
+                return results
             except ExtractorError as de: # An error we somewhat expected
                 self.trouble(u'ERROR: ' + compat_str(de), de.format_traceback())
                 break
@@ -435,6 +432,29 @@ class FileDownloader(object):
         for url in urls:
             results.extend(self.extract_info(url))
         return results
+        
+    def process_ie_results(self, ie_results, ie):
+        """
+        Take the results of the ie and return a list of videos.
+        For url elements it will seartch the suitable ie and get the videos
+        For playlist elements it will process each of the elements of the 'entries' key
+        """
+        results = [] 
+        for result in ie_results or []:
+            result_type = result.get('_type', 'video') #If not given we suppose it's a video, support the dafault old system
+            if result_type == 'video':
+                if not 'extractor' in result:
+                    #The extractor has already been set somewhere else
+                    result['extractor'] = ie.IE_NAME
+                results.append(result)
+            elif result_type == 'url':
+                #We get the videos pointed by the url
+                results.extend(self.extract_info(result['url']))
+            elif result_type == 'playlist':
+                #We process each entry in the playlist
+                entries_result = self.process_ie_results(result['entries'], ie)
+                results.extend(entries_result)
+        return results
 
     def process_info(self, info_dict):
         """Process a single dictionary returned by an InfoExtractor."""