diff options
| author | Jaime Marquínez Ferrándiz <jaime.marquinez.ferrandiz@gmail.com> | 2016-06-22 19:13:46 +0200 | 
|---|---|---|
| committer | Jaime Marquínez Ferrándiz <jaime.marquinez.ferrandiz@gmail.com> | 2016-06-22 19:20:50 +0200 | 
| commit | 169d836feb9d796205a02713db33eafcbb49f1e6 (patch) | |
| tree | a6ea8c40ca19997e9295b766103ba47cbdcf6a73 | |
| parent | 6ae938b295eaca06944f66faa7c6d668c6c5866c (diff) | |
lazy-extractors: Fix after commit 6e6b9f600f2f447604f6108fb6486b73cc25def1
The problem was in the following code:
    class ArteTVPlus7IE(ArteTVBaseIE):
        ...
        @classmethod
        def suitable(cls, url):
            return False if ArteTVPlaylistIE.suitable(url) else super(ArteTVPlus7IE, cls).suitable(url)
And its sublcasses like ArteTVCinemaIE.
Since in the lazy_extractors.py file ArteTVCinemaIE was not a subclass of ArteTVPlus7IE, super(ArteTVPlus7IE, cls) failed.
To fix it we have to make it a subclass. Since the order of _ALL_CLASSES is arbitrary we must sort them so that the base classes are defined first. We also must add base classes like YoutubeBaseInfoExtractor.
| -rw-r--r-- | devscripts/make_lazy_extractors.py | 47 | 
1 files changed, 41 insertions, 6 deletions
diff --git a/devscripts/make_lazy_extractors.py b/devscripts/make_lazy_extractors.py index b5a8b9190..9a79c2bc5 100644 --- a/devscripts/make_lazy_extractors.py +++ b/devscripts/make_lazy_extractors.py @@ -14,15 +14,17 @@ if os.path.exists(lazy_extractors_filename):      os.remove(lazy_extractors_filename)  from youtube_dl.extractor import _ALL_CLASSES -from youtube_dl.extractor.common import InfoExtractor +from youtube_dl.extractor.common import InfoExtractor, SearchInfoExtractor  with open('devscripts/lazy_load_template.py', 'rt') as f:      module_template = f.read() -module_contents = [module_template + '\n' + getsource(InfoExtractor.suitable)] +module_contents = [ +    module_template + '\n' + getsource(InfoExtractor.suitable) + '\n', +    'class LazyLoadSearchExtractor(LazyLoadExtractor):\n    pass\n']  ie_template = ''' -class {name}(LazyLoadExtractor): +class {name}({bases}):      _VALID_URL = {valid_url!r}      _module = '{module}'  ''' @@ -34,10 +36,20 @@ make_valid_template = '''  ''' +def get_base_name(base): +    if base is InfoExtractor: +        return 'LazyLoadExtractor' +    elif base is SearchInfoExtractor: +        return 'LazyLoadSearchExtractor' +    else: +        return base.__name__ + +  def build_lazy_ie(ie, name):      valid_url = getattr(ie, '_VALID_URL', None)      s = ie_template.format(          name=name, +        bases=', '.join(map(get_base_name, ie.__bases__)),          valid_url=valid_url,          module=ie.__module__)      if ie.suitable.__func__ is not InfoExtractor.suitable.__func__: @@ -47,12 +59,35 @@ def build_lazy_ie(ie, name):          s += make_valid_template.format(valid_url=ie._make_valid_url())      return s +# 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]) +  names = [] -for ie in list(sorted(_ALL_CLASSES[:-1], key=lambda cls: cls.ie_key())) + _ALL_CLASSES[-1:]: -    name = ie.ie_key() + 'IE' +for ie in ordered_cls: +    name = ie.__name__      src = build_lazy_ie(ie, name)      module_contents.append(src) -    names.append(name) +    if ie in _ALL_CLASSES: +        names.append(name)  module_contents.append(      '_ALL_CLASSES = [{0}]'.format(', '.join(names)))  | 
