]>
Commit | Line | Data |
---|---|---|
20ff802c | 1 | # coding: utf-8 |
2 | from __future__ import unicode_literals | |
3 | ||
4 | import re | |
5 | ||
6 | from .common import InfoExtractor | |
8c25f81b | 7 | from ..compat import ( |
20ff802c | 8 | compat_parse_qs, |
eb3bd7ba | 9 | compat_HTTPError, |
20ff802c | 10 | ) |
8c25f81b PH |
11 | from ..utils import ( |
12 | ExtractorError, | |
13 | HEADRequest, | |
14 | remove_end, | |
15 | ) | |
20ff802c | 16 | |
17 | ||
18 | class CloudyIE(InfoExtractor): | |
998895df | 19 | _IE_DESC = 'cloudy.ec' |
20ff802c | 20 | _VALID_URL = r'''(?x) |
998895df | 21 | https?://(?:www\.)?cloudy\.ec/ |
20ff802c | 22 | (?:v/|embed\.php\?id=) |
23 | (?P<id>[A-Za-z0-9]+) | |
24 | ''' | |
998895df YCH |
25 | _EMBED_URL = 'http://www.cloudy.ec/embed.php?id=%s' |
26 | _API_URL = 'http://www.cloudy.ec/api/player.api.php' | |
eb3bd7ba | 27 | _MAX_TRIES = 2 |
998895df YCH |
28 | _TEST = { |
29 | 'url': 'https://www.cloudy.ec/v/af511e2527aac', | |
30 | 'md5': '5cb253ace826a42f35b4740539bedf07', | |
31 | 'info_dict': { | |
32 | 'id': 'af511e2527aac', | |
33 | 'ext': 'flv', | |
34 | 'title': 'Funny Cats and Animals Compilation june 2013', | |
20ff802c | 35 | } |
998895df | 36 | } |
20ff802c | 37 | |
998895df | 38 | def _extract_video(self, video_id, file_key, error_url=None, try_num=0): |
20ff802c | 39 | |
eb3bd7ba S |
40 | if try_num > self._MAX_TRIES - 1: |
41 | raise ExtractorError('Unable to extract video URL', expected=True) | |
20ff802c | 42 | |
eb3bd7ba | 43 | form = { |
20ff802c | 44 | 'file': video_id, |
45 | 'key': file_key, | |
eb3bd7ba S |
46 | } |
47 | ||
48 | if error_url: | |
49 | form.update({ | |
50 | 'numOfErrors': try_num, | |
51 | 'errorCode': '404', | |
52 | 'errorUrl': error_url, | |
53 | }) | |
54 | ||
20ff802c | 55 | player_data = self._download_webpage( |
998895df | 56 | self._API_URL, video_id, 'Downloading player data', query=form) |
20ff802c | 57 | data = compat_parse_qs(player_data) |
58 | ||
eb3bd7ba S |
59 | try_num += 1 |
60 | ||
20ff802c | 61 | if 'error' in data: |
62 | raise ExtractorError( | |
63 | '%s error: %s' % (self.IE_NAME, ' '.join(data['error_msg'])), | |
64 | expected=True) | |
65 | ||
66 | title = data.get('title', [None])[0] | |
67 | if title: | |
5dbf3b5c | 68 | title = remove_end(title, '&asdasdas').strip() |
20ff802c | 69 | |
5dbf3b5c | 70 | video_url = data.get('url', [None])[0] |
eb3bd7ba | 71 | |
5dbf3b5c | 72 | if video_url: |
eb3bd7ba S |
73 | try: |
74 | self._request_webpage(HEADRequest(video_url), video_id, 'Checking video URL') | |
75 | except ExtractorError as e: | |
76 | if isinstance(e.cause, compat_HTTPError) and e.cause.code in [404, 410]: | |
77 | self.report_warning('Invalid video URL, requesting another', video_id) | |
998895df | 78 | return self._extract_video(video_id, file_key, video_url, try_num) |
20ff802c | 79 | |
80 | return { | |
81 | 'id': video_id, | |
eb3bd7ba | 82 | 'url': video_url, |
20ff802c | 83 | 'title': title, |
20ff802c | 84 | } |
eb3bd7ba S |
85 | |
86 | def _real_extract(self, url): | |
87 | mobj = re.match(self._VALID_URL, url) | |
eb3bd7ba S |
88 | video_id = mobj.group('id') |
89 | ||
998895df | 90 | url = self._EMBED_URL % video_id |
eb3bd7ba S |
91 | webpage = self._download_webpage(url, video_id) |
92 | ||
93 | file_key = self._search_regex( | |
ec1b9577 S |
94 | [r'key\s*:\s*"([^"]+)"', r'filekey\s*=\s*"([^"]+)"'], |
95 | webpage, 'file_key') | |
eb3bd7ba | 96 | |
998895df | 97 | return self._extract_video(video_id, file_key) |