diff options
| author | Philipp Hagemeister <phihag@phihag.de> | 2014-01-03 13:24:29 +0100 | 
|---|---|---|
| committer | Philipp Hagemeister <phihag@phihag.de> | 2014-01-03 13:24:29 +0100 | 
| commit | a7c26e7338ceed06b579775f315b078644a7482b (patch) | |
| tree | 7b9d57e5b65c5fa6e67a9fcca57b08c7de0c6da3 | |
| parent | c8805576667f316b34f0a9a81d32da7d24dc754c (diff) | |
| parent | c7f8537dd9752e83661b69e46a4f113222c7a503 (diff) | |
[lynda] minor changes
| -rw-r--r-- | youtube_dl/extractor/__init__.py | 4 | ||||
| -rw-r--r-- | youtube_dl/extractor/lynda.py | 102 | 
2 files changed, 106 insertions, 0 deletions
| diff --git a/youtube_dl/extractor/__init__.py b/youtube_dl/extractor/__init__.py index 31bbda46f..21d564dba 100644 --- a/youtube_dl/extractor/__init__.py +++ b/youtube_dl/extractor/__init__.py @@ -102,6 +102,10 @@ from .kickstarter import KickStarterIE  from .keek import KeekIE  from .liveleak import LiveLeakIE  from .livestream import LivestreamIE, LivestreamOriginalIE +from .lynda import ( +    LyndaIE, +    LyndaCourseIE +)  from .macgamestore import MacGameStoreIE  from .mdr import MDRIE  from .metacafe import MetacafeIE diff --git a/youtube_dl/extractor/lynda.py b/youtube_dl/extractor/lynda.py new file mode 100644 index 000000000..592ed747a --- /dev/null +++ b/youtube_dl/extractor/lynda.py @@ -0,0 +1,102 @@ +from __future__ import unicode_literals + +import re +import json + +from .common import InfoExtractor +from ..utils import ExtractorError + + +class LyndaIE(InfoExtractor): +    IE_NAME = 'lynda' +    IE_DESC = 'lynda.com videos' +    _VALID_URL = r'https?://www\.lynda\.com/[^/]+/[^/]+/\d+/(\d+)-\d\.html' + +    _TEST = { +        'url': 'http://www.lynda.com/Bootstrap-tutorials/Using-exercise-files/110885/114408-4.html', +        'file': '114408.mp4', +        'md5': 'ecfc6862da89489161fb9cd5f5a6fac1', +        u"info_dict": { +            'title': 'Using the exercise files', +            'duration': 68 +        } +    } + +    def _real_extract(self, url): +        mobj = re.match(self._VALID_URL, url) +        video_id = mobj.group(1) + +        page = self._download_webpage('http://www.lynda.com/ajax/player?videoId=%s&type=video' % video_id, +                                      video_id, 'Downloading video JSON') +        video_json = json.loads(page) + +        if 'Status' in video_json and video_json['Status'] == 'NotFound': +            raise ExtractorError('Video %s does not exist' % video_id, expected=True) + +        if video_json['HasAccess'] is False: +            raise ExtractorError('Video %s is only available for members' % video_id, expected=True) + +        video_id = video_json['ID'] +        duration = video_json['DurationInSeconds'] +        title = video_json['Title'] + +        formats = [{'url': fmt['Url'], +                    'ext': fmt['Extension'], +                    'width': fmt['Width'], +                    'height': fmt['Height'], +                    'filesize': fmt['FileSize'], +                    'format_id': fmt['Resolution'] +                    } for fmt in video_json['Formats']] + +        self._sort_formats(formats) + +        return { +            'id': video_id, +            'title': title, +            'duration': duration, +            'formats': formats +        } + + +class LyndaCourseIE(InfoExtractor): +    IE_NAME = 'lynda:course' +    IE_DESC = 'lynda.com online courses' + +    # Course link equals to welcome/introduction video link of same course +    # We will recognize it as course link +    _VALID_URL = r'https?://(?:www|m)\.lynda\.com/(?P<coursepath>[^/]+/[^/]+/(?P<courseid>\d+))-\d\.html' + +    def _real_extract(self, url): +        mobj = re.match(self._VALID_URL, url) +        course_path = mobj.group('coursepath') +        course_id = mobj.group('courseid') + +        page = self._download_webpage('http://www.lynda.com/ajax/player?courseId=%s&type=course' % course_id, +                                      course_id, 'Downloading course JSON') +        course_json = json.loads(page) + +        if 'Status' in course_json and course_json['Status'] == 'NotFound': +            raise ExtractorError('Course %s does not exist' % course_id, expected=True) + +        unaccessible_videos = 0 +        videos = [] + +        for chapter in course_json['Chapters']: +            for video in chapter['Videos']: +                if video['HasAccess'] is not True: +                    unaccessible_videos += 1 +                    continue +                videos.append(video['ID']) + +        if unaccessible_videos > 0: +            self._downloader.report_warning('%s videos are only available for members and will not be downloaded' % unaccessible_videos) + +        entries = [ +            self.url_result('http://www.lynda.com/%s/%s-4.html' % +                            (course_path, video_id), +                            'Lynda') +            for video_id in videos] + +        course_title = course_json['Title'] + +        return self.playlist_result(entries, course_id, course_title) | 
