diff options
Diffstat (limited to 'youtube_dl/extractor')
| -rw-r--r-- | youtube_dl/extractor/udemy.py | 47 | 
1 files changed, 30 insertions, 17 deletions
| diff --git a/youtube_dl/extractor/udemy.py b/youtube_dl/extractor/udemy.py index 160be1b1b..3b02f43e3 100644 --- a/youtube_dl/extractor/udemy.py +++ b/youtube_dl/extractor/udemy.py @@ -15,6 +15,7 @@ from ..utils import (      ExtractorError,      float_or_none,      int_or_none, +    js_to_json,      sanitized_Request,      unescapeHTML,      urlencode_postdata, @@ -268,6 +269,25 @@ class UdemyIE(InfoExtractor):                      f = add_output_format_meta(f, format_id)                  formats.append(f) +        def extract_subtitles(track_list): +            if not isinstance(track_list, list): +                return +            for track in track_list: +                if not isinstance(track, dict): +                    continue +                if track.get('kind') != 'captions': +                    continue +                src = track.get('src') +                if not src or not isinstance(src, compat_str): +                    continue +                lang = track.get('language') or track.get( +                    'srclang') or track.get('label') +                sub_dict = automatic_captions if track.get( +                    'autogenerated') is True else subtitles +                sub_dict.setdefault(lang, []).append({ +                    'url': src, +                }) +          download_urls = asset.get('download_urls')          if isinstance(download_urls, dict):              extract_formats(download_urls.get('Video')) @@ -315,23 +335,16 @@ class UdemyIE(InfoExtractor):                  extract_formats(data.get('sources'))                  if not duration:                      duration = int_or_none(data.get('duration')) -                tracks = data.get('tracks') -                if isinstance(tracks, list): -                    for track in tracks: -                        if not isinstance(track, dict): -                            continue -                        if track.get('kind') != 'captions': -                            continue -                        src = track.get('src') -                        if not src or not isinstance(src, compat_str): -                            continue -                        lang = track.get('language') or track.get( -                            'srclang') or track.get('label') -                        sub_dict = automatic_captions if track.get( -                            'autogenerated') is True else subtitles -                        sub_dict.setdefault(lang, []).append({ -                            'url': src, -                        }) +                extract_subtitles(data.get('tracks')) + +            if not subtitles and not automatic_captions: +                text_tracks = self._parse_json( +                    self._search_regex( +                        r'text-tracks=(["\'])(?P<data>\[.+?\])\1', view_html, +                        'text tracks', default='{}', group='data'), video_id, +                    transform_source=lambda s: js_to_json(unescapeHTML(s)), +                    fatal=False) +                extract_subtitles(text_tracks)          self._sort_formats(formats, field_preference=('height', 'width', 'tbr', 'format_id')) | 
