Browse Source

[screencastomatic] Add new extractor (Fixes #4497)

Philipp Hagemeister 11 years ago
parent
commit
6e1b9395c6
2 changed files with 51 additions and 0 deletions
  1. 1 0
      youtube_dl/extractor/__init__.py
  2. 50 0
      youtube_dl/extractor/screencastomatic.py

+ 1 - 0
youtube_dl/extractor/__init__.py

@@ -342,6 +342,7 @@ from .savefrom import SaveFromIE
 from .sbs import SBSIE
 from .sbs import SBSIE
 from .scivee import SciVeeIE
 from .scivee import SciVeeIE
 from .screencast import ScreencastIE
 from .screencast import ScreencastIE
+from .screencastomatic import ScreencastOMaticIE
 from .screenwavemedia import CinemassacreIE, ScreenwaveMediaIE, TeamFourIE
 from .screenwavemedia import CinemassacreIE, ScreenwaveMediaIE, TeamFourIE
 from .servingsys import ServingSysIE
 from .servingsys import ServingSysIE
 from .sexu import SexuIE
 from .sexu import SexuIE

+ 50 - 0
youtube_dl/extractor/screencastomatic.py

@@ -0,0 +1,50 @@
+# coding: utf-8
+from __future__ import unicode_literals
+
+from .common import InfoExtractor
+from ..compat import compat_urlparse
+from ..utils import (
+    ExtractorError,
+    js_to_json,
+)
+
+
+class ScreencastOMaticIE(InfoExtractor):
+    _VALID_URL = r'https?://screencast-o-matic\.com/watch/(?P<id>[0-9a-zA-Z]+)'
+    _TEST = {
+        'url': 'http://screencast-o-matic.com/watch/c2lD3BeOPl',
+        'md5': '483583cb80d92588f15ccbedd90f0c18',
+        'info_dict': {
+            'id': 'c2lD3BeOPl',
+            'ext': 'mp4',
+            'title': 'Welcome to 3-4 Philosophy @ DECV!',
+            'thumbnail': 're:^https?://.*\.jpg$',
+            'description': 'as the title says! also: some general info re 1) VCE philosophy and 2) distance learning.',
+        }
+    }
+
+    def _real_extract(self, url):
+        video_id = self._match_id(url)
+        webpage = self._download_webpage(url, video_id)
+
+        setup_js = self._search_regex(
+            r"(?s)jwplayer\('mp4Player'\).setup\((\{.*?\})\);",
+            webpage, 'setup code')
+        data = self._parse_json(setup_js, video_id, transform_source=js_to_json)
+        modes = data['modes']
+        try:
+            video_data = next(
+                m for m in data['modes'] if m.get('type') == 'html5')
+        except StopIteration:
+            raise ExtractorError('Could not find any video entries!')
+        video_url = compat_urlparse.urljoin(url, video_data['config']['file'])
+        thumbnail = data.get('image')
+
+        return {
+            'id': video_id,
+            'title': self._og_search_title(webpage),
+            'description': self._og_search_description(webpage),
+            'url': video_url,
+            'ext': 'mp4',
+            'thumbnail': thumbnail,
+        }