]>
Commit | Line | Data |
---|---|---|
64e7ad60 PH |
1 | from __future__ import unicode_literals |
2 | ||
0c996b9f S |
3 | import re |
4 | ||
64e7ad60 | 5 | from .common import InfoExtractor |
fb97809e S |
6 | from ..compat import ( |
7 | compat_HTTPError, | |
8 | compat_urlparse, | |
9 | ) | |
10 | from ..utils import ( | |
11 | ExtractorError, | |
12 | parse_duration, | |
13 | ) | |
64e7ad60 PH |
14 | |
15 | ||
16 | class VideoLecturesNetIE(InfoExtractor): | |
08df685f | 17 | _VALID_URL = r'http://(?:www\.)?videolectures\.net/(?P<id>[^/#?]+)/*(?:[#?].*)?$' |
64e7ad60 PH |
18 | IE_NAME = 'videolectures.net' |
19 | ||
20 | _TEST = { | |
21 | 'url': 'http://videolectures.net/promogram_igor_mekjavic_eng/', | |
22 | 'info_dict': { | |
23 | 'id': 'promogram_igor_mekjavic_eng', | |
24 | 'ext': 'mp4', | |
25 | 'title': 'Automatics, robotics and biocybernetics', | |
26 | 'description': 'md5:815fc1deb6b3a2bff99de2d5325be482', | |
27 | 'upload_date': '20130627', | |
28 | 'duration': 565, | |
29 | 'thumbnail': 're:http://.*\.jpg', | |
30 | }, | |
31 | } | |
32 | ||
33 | def _real_extract(self, url): | |
acfb717a | 34 | video_id = self._match_id(url) |
64e7ad60 PH |
35 | |
36 | smil_url = 'http://videolectures.net/%s/video/1/smil.xml' % video_id | |
fb97809e S |
37 | |
38 | try: | |
39 | smil = self._download_smil(smil_url, video_id) | |
40 | except ExtractorError as e: | |
41 | if isinstance(e.cause, compat_HTTPError) and e.cause.code == 404: | |
42 | # Probably a playlist | |
43 | webpage = self._download_webpage(url, video_id) | |
44 | entries = [ | |
45 | self.url_result(compat_urlparse.urljoin(url, video_url), 'VideoLecturesNet') | |
46 | for _, video_url in re.findall(r'<a[^>]+href=(["\'])(.+?)\1[^>]+id=["\']lec=\d+', webpage)] | |
47 | playlist_title = self._html_search_meta('title', webpage, 'title', fatal=True) | |
48 | playlist_description = self._html_search_meta('description', webpage, 'description') | |
49 | return self.playlist_result(entries, video_id, playlist_title, playlist_description) | |
64e7ad60 | 50 | |
acfb717a | 51 | info = self._parse_smil(smil, smil_url, video_id) |
64e7ad60 | 52 | |
acfb717a | 53 | info['id'] = video_id |
64e7ad60 | 54 | |
acfb717a S |
55 | switch = smil.find('.//switch') |
56 | if switch is not None: | |
57 | info['duration'] = parse_duration(switch.attrib.get('dur')) | |
64e7ad60 | 58 | |
acfb717a | 59 | return info |