diff options
Diffstat (limited to 'youtube_dl/extractor/udemy.py')
| -rw-r--r-- | youtube_dl/extractor/udemy.py | 55 | 
1 files changed, 36 insertions, 19 deletions
| diff --git a/youtube_dl/extractor/udemy.py b/youtube_dl/extractor/udemy.py index dae1aa3c6..207c4a6a7 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, @@ -52,6 +53,10 @@ class UdemyIE(InfoExtractor):          # new URL schema          'url': 'https://www.udemy.com/electric-bass-right-from-the-start/learn/v4/t/lecture/4580906',          'only_matching': True, +    }, { +        # no url in outputs format entry +        'url': 'https://www.udemy.com/learn-web-development-complete-step-by-step-guide-to-success/learn/v4/t/lecture/4125812', +        'only_matching': True,      }]      def _extract_course_info(self, webpage, video_id): @@ -69,7 +74,7 @@ class UdemyIE(InfoExtractor):              return compat_urlparse.urljoin(base_url, url) if not url.startswith('http') else url          checkout_url = unescapeHTML(self._search_regex( -            r'href=(["\'])(?P<url>(?:https?://(?:www\.)?udemy\.com)?/payment/checkout/.+?)\1', +            r'href=(["\'])(?P<url>(?:https?://(?:www\.)?udemy\.com)?/(?:payment|cart)/checkout/.+?)\1',              webpage, 'checkout url', group='url', default=None))          if checkout_url:              raise ExtractorError( @@ -219,7 +224,7 @@ class UdemyIE(InfoExtractor):          def extract_output_format(src, f_id):              return { -                'url': src['url'], +                'url': src.get('url'),                  'format_id': '%sp' % (src.get('height') or f_id),                  'width': int_or_none(src.get('width')),                  'height': int_or_none(src.get('height')), @@ -264,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')) @@ -311,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')) | 
