]>
Raphaƫl G. Git Repositories - youtubedl/blob - devscripts/make_lazy_extractors.py
9a79c2bc5a6d57f6de31be45b29807e36bd8e12f
   1 from __future__ 
import unicode_literals
, print_function
 
   3 from inspect 
import getsource
 
   5 from os
.path 
import dirname 
as dirn
 
   8 print('WARNING: Lazy loading extractors is an experimental feature that may not always work', file=sys
.stderr
) 
  10 sys
.path
.insert(0, dirn(dirn((os
.path
.abspath(__file__
))))) 
  12 lazy_extractors_filename 
= sys
.argv
[1] 
  13 if os
.path
.exists(lazy_extractors_filename
): 
  14     os
.remove(lazy_extractors_filename
) 
  16 from youtube_dl
.extractor 
import _ALL_CLASSES
 
  17 from youtube_dl
.extractor
.common 
import InfoExtractor
, SearchInfoExtractor
 
  19 with open('devscripts/lazy_load_template.py', 'rt') as f
: 
  20     module_template 
= f
.read() 
  23     module_template 
+ '\n' + getsource(InfoExtractor
.suitable
) + '\n', 
  24     'class LazyLoadSearchExtractor(LazyLoadExtractor):\n    pass\n'] 
  27 class {name}({bases}): 
  28     _VALID_URL = {valid_url!r} 
  32 make_valid_template 
= ''' 
  34     def _make_valid_url(cls): 
  39 def get_base_name(base
): 
  40     if base 
is InfoExtractor
: 
  41         return 'LazyLoadExtractor' 
  42     elif base 
is SearchInfoExtractor
: 
  43         return 'LazyLoadSearchExtractor' 
  48 def build_lazy_ie(ie
, name
): 
  49     valid_url 
= getattr(ie
, '_VALID_URL', None) 
  50     s 
= ie_template
.format( 
  52         bases
=', '.join(map(get_base_name
, ie
.__bases
__)), 
  55     if ie
.suitable
.__func
__ is not InfoExtractor
.suitable
.__func
__: 
  56         s 
+= '\n' + getsource(ie
.suitable
) 
  57     if hasattr(ie
, '_make_valid_url'): 
  59         s 
+= make_valid_template
.format(valid_url
=ie
._make
_valid
_url
()) 
  62 # find the correct sorting and add the required base classes so that sublcasses 
  63 # can be correctly created 
  64 classes 
= _ALL_CLASSES
[:-1] 
  68         bases 
= set(c
.__bases
__) - set((object, InfoExtractor
, SearchInfoExtractor
)) 
  71             if b 
not in classes 
and b 
not in ordered_cls
: 
  72                 if b
.__name
__ == 'GenericIE': 
  78         if all(b 
in ordered_cls 
for b 
in bases
): 
  82 ordered_cls
.append(_ALL_CLASSES
[-1]) 
  85 for ie 
in ordered_cls
: 
  87     src 
= build_lazy_ie(ie
, name
) 
  88     module_contents
.append(src
) 
  89     if ie 
in _ALL_CLASSES
: 
  92 module_contents
.append( 
  93     '_ALL_CLASSES = [{0}]'.format(', '.join(names
))) 
  95 module_src 
= '\n'.join(module_contents
) + '\n' 
  97 with open(lazy_extractors_filename
, 'wt') as f
: