| 
									
										
										
										
											2016-02-10 14:01:31 +01:00
										 |  |  | from __future__ import unicode_literals, print_function | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from inspect import getsource | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | from os.path import dirname as dirn | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | print('WARNING: Lazy loading extractors is an experimental feature that may not always work', file=sys.stderr) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | sys.path.insert(0, dirn(dirn((os.path.abspath(__file__))))) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | lazy_extractors_filename = sys.argv[1] | 
					
						
							|  |  |  | if os.path.exists(lazy_extractors_filename): | 
					
						
							|  |  |  |     os.remove(lazy_extractors_filename) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from youtube_dl.extractor import _ALL_CLASSES | 
					
						
							| 
									
										
										
										
											2016-06-22 19:13:46 +02:00
										 |  |  | from youtube_dl.extractor.common import InfoExtractor, SearchInfoExtractor | 
					
						
							| 
									
										
										
										
											2016-02-10 14:01:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | with open('devscripts/lazy_load_template.py', 'rt') as f: | 
					
						
							|  |  |  |     module_template = f.read() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-22 19:13:46 +02:00
										 |  |  | module_contents = [ | 
					
						
							|  |  |  |     module_template + '\n' + getsource(InfoExtractor.suitable) + '\n', | 
					
						
							|  |  |  |     'class LazyLoadSearchExtractor(LazyLoadExtractor):\n    pass\n'] | 
					
						
							| 
									
										
										
										
											2016-02-10 14:01:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | ie_template = '''
 | 
					
						
							| 
									
										
										
										
											2016-06-22 19:13:46 +02:00
										 |  |  | class {name}({bases}): | 
					
						
							| 
									
										
										
										
											2016-02-10 14:01:31 +01:00
										 |  |  |     _VALID_URL = {valid_url!r} | 
					
						
							|  |  |  |     _module = '{module}' | 
					
						
							|  |  |  | '''
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | make_valid_template = '''
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def _make_valid_url(cls): | 
					
						
							| 
									
										
										
										
											2016-02-21 11:53:48 +01:00
										 |  |  |         return {valid_url!r} | 
					
						
							| 
									
										
										
										
											2016-02-10 14:01:31 +01:00
										 |  |  | '''
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-22 19:13:46 +02:00
										 |  |  | def get_base_name(base): | 
					
						
							|  |  |  |     if base is InfoExtractor: | 
					
						
							|  |  |  |         return 'LazyLoadExtractor' | 
					
						
							|  |  |  |     elif base is SearchInfoExtractor: | 
					
						
							|  |  |  |         return 'LazyLoadSearchExtractor' | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         return base.__name__ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 14:01:31 +01:00
										 |  |  | def build_lazy_ie(ie, name): | 
					
						
							|  |  |  |     valid_url = getattr(ie, '_VALID_URL', None) | 
					
						
							|  |  |  |     s = ie_template.format( | 
					
						
							|  |  |  |         name=name, | 
					
						
							| 
									
										
										
										
											2016-06-22 19:13:46 +02:00
										 |  |  |         bases=', '.join(map(get_base_name, ie.__bases__)), | 
					
						
							| 
									
										
										
										
											2016-02-10 14:01:31 +01:00
										 |  |  |         valid_url=valid_url, | 
					
						
							|  |  |  |         module=ie.__module__) | 
					
						
							|  |  |  |     if ie.suitable.__func__ is not InfoExtractor.suitable.__func__: | 
					
						
							| 
									
										
										
										
											2016-02-21 12:22:12 +01:00
										 |  |  |         s += '\n' + getsource(ie.suitable) | 
					
						
							| 
									
										
										
										
											2016-02-10 14:01:31 +01:00
										 |  |  |     if hasattr(ie, '_make_valid_url'): | 
					
						
							|  |  |  |         # search extractors | 
					
						
							| 
									
										
										
										
											2016-02-21 11:53:48 +01:00
										 |  |  |         s += make_valid_template.format(valid_url=ie._make_valid_url()) | 
					
						
							| 
									
										
										
										
											2016-02-10 14:01:31 +01:00
										 |  |  |     return s | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-22 19:13:46 +02:00
										 |  |  | # find the correct sorting and add the required base classes so that sublcasses | 
					
						
							|  |  |  | # can be correctly created | 
					
						
							|  |  |  | classes = _ALL_CLASSES[:-1] | 
					
						
							|  |  |  | ordered_cls = [] | 
					
						
							|  |  |  | while classes: | 
					
						
							|  |  |  |     for c in classes[:]: | 
					
						
							|  |  |  |         bases = set(c.__bases__) - set((object, InfoExtractor, SearchInfoExtractor)) | 
					
						
							|  |  |  |         stop = False | 
					
						
							|  |  |  |         for b in bases: | 
					
						
							|  |  |  |             if b not in classes and b not in ordered_cls: | 
					
						
							|  |  |  |                 if b.__name__ == 'GenericIE': | 
					
						
							|  |  |  |                     exit() | 
					
						
							|  |  |  |                 classes.insert(0, b) | 
					
						
							|  |  |  |                 stop = True | 
					
						
							|  |  |  |         if stop: | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  |         if all(b in ordered_cls for b in bases): | 
					
						
							|  |  |  |             ordered_cls.append(c) | 
					
						
							|  |  |  |             classes.remove(c) | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  | ordered_cls.append(_ALL_CLASSES[-1]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 14:01:31 +01:00
										 |  |  | names = [] | 
					
						
							| 
									
										
										
										
											2016-06-22 19:13:46 +02:00
										 |  |  | for ie in ordered_cls: | 
					
						
							|  |  |  |     name = ie.__name__ | 
					
						
							| 
									
										
										
										
											2016-02-10 14:01:31 +01:00
										 |  |  |     src = build_lazy_ie(ie, name) | 
					
						
							|  |  |  |     module_contents.append(src) | 
					
						
							| 
									
										
										
										
											2016-06-22 19:13:46 +02:00
										 |  |  |     if ie in _ALL_CLASSES: | 
					
						
							|  |  |  |         names.append(name) | 
					
						
							| 
									
										
										
										
											2016-02-10 14:01:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | module_contents.append( | 
					
						
							| 
									
										
										
										
											2016-02-21 11:53:48 +01:00
										 |  |  |     '_ALL_CLASSES = [{0}]'.format(', '.join(names))) | 
					
						
							| 
									
										
										
										
											2016-02-10 14:01:31 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-21 12:22:12 +01:00
										 |  |  | module_src = '\n'.join(module_contents) + '\n' | 
					
						
							| 
									
										
										
										
											2016-02-10 14:01:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | with open(lazy_extractors_filename, 'wt') as f: | 
					
						
							|  |  |  |     f.write(module_src) |