]>
Raphaƫl G. Git Repositories - youtubedl/blob - devscripts/make_lazy_extractors.py
19114d30d1aa59e394e0c35e7ec9446eb4969c56
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
())
63 # find the correct sorting and add the required base classes so that sublcasses
64 # can be correctly created
65 classes
= _ALL_CLASSES
[:-1]
69 bases
= set(c
.__bases
__) - set((object, InfoExtractor
, SearchInfoExtractor
))
72 if b
not in classes
and b
not in ordered_cls
:
73 if b
.__name
__ == 'GenericIE':
79 if all(b
in ordered_cls
for b
in bases
):
83 ordered_cls
.append(_ALL_CLASSES
[-1])
86 for ie
in ordered_cls
:
88 src
= build_lazy_ie(ie
, name
)
89 module_contents
.append(src
)
90 if ie
in _ALL_CLASSES
:
93 module_contents
.append(
94 '_ALL_CLASSES = [{0}]'.format(', '.join(names
)))
96 module_src
= '\n'.join(module_contents
) + '\n'
98 with open(lazy_extractors_filename
, 'wt') as f
: