]>
Commit | Line | Data |
---|---|---|
1 | from __future__ import unicode_literals | |
2 | ||
3 | import re | |
4 | ||
5 | from .common import InfoExtractor | |
6 | from ..compat import compat_urlparse | |
7 | from ..utils import ( | |
8 | ExtractorError, | |
9 | NO_DEFAULT, | |
10 | encode_dict, | |
11 | sanitized_Request, | |
12 | urlencode_postdata, | |
13 | ) | |
14 | ||
15 | ||
16 | class NovaMovIE(InfoExtractor): | |
17 | IE_NAME = 'novamov' | |
18 | IE_DESC = 'NovaMov' | |
19 | ||
20 | _VALID_URL_TEMPLATE = r'http://(?:(?:www\.)?%(host)s/(?:file|video|mobile/#/videos)/|(?:(?:embed|www)\.)%(host)s/embed\.php\?(?:.*?&)?v=)(?P<id>[a-z\d]{13})' | |
21 | _VALID_URL = _VALID_URL_TEMPLATE % {'host': 'novamov\.com'} | |
22 | ||
23 | _HOST = 'www.novamov.com' | |
24 | ||
25 | _FILE_DELETED_REGEX = r'This file no longer exists on our servers!</h2>' | |
26 | _FILEKEY_REGEX = r'flashvars\.filekey=(?P<filekey>"?[^"]+"?);' | |
27 | _TITLE_REGEX = r'(?s)<div class="v_tab blockborder rounded5" id="v_tab1">\s*<h3>([^<]+)</h3>' | |
28 | _DESCRIPTION_REGEX = r'(?s)<div class="v_tab blockborder rounded5" id="v_tab1">\s*<h3>[^<]+</h3><p>([^<]+)</p>' | |
29 | _URL_TEMPLATE = 'http://%s/video/%s' | |
30 | ||
31 | _TEST = { | |
32 | 'url': 'http://www.novamov.com/video/4rurhn9x446jj', | |
33 | 'md5': '7205f346a52bbeba427603ba10d4b935', | |
34 | 'info_dict': { | |
35 | 'id': '4rurhn9x446jj', | |
36 | 'ext': 'flv', | |
37 | 'title': 'search engine optimization', | |
38 | 'description': 'search engine optimization is used to rank the web page in the google search engine' | |
39 | }, | |
40 | 'skip': '"Invalid token" errors abound (in web interface as well as youtube-dl, there is nothing we can do about it.)' | |
41 | } | |
42 | ||
43 | def _check_existence(self, webpage, video_id): | |
44 | if re.search(self._FILE_DELETED_REGEX, webpage) is not None: | |
45 | raise ExtractorError('Video %s does not exist' % video_id, expected=True) | |
46 | ||
47 | def _real_extract(self, url): | |
48 | video_id = self._match_id(url) | |
49 | ||
50 | url = self._URL_TEMPLATE % (self._HOST, video_id) | |
51 | ||
52 | webpage = self._download_webpage( | |
53 | url, video_id, 'Downloading video page') | |
54 | ||
55 | self._check_existence(webpage, video_id) | |
56 | ||
57 | def extract_filekey(default=NO_DEFAULT): | |
58 | filekey = self._search_regex( | |
59 | self._FILEKEY_REGEX, webpage, 'filekey', default=default) | |
60 | if filekey is not default and (filekey[0] != '"' or filekey[-1] != '"'): | |
61 | return self._search_regex( | |
62 | r'var\s+%s\s*=\s*"([^"]+)"' % re.escape(filekey), webpage, 'filekey', default=default) | |
63 | else: | |
64 | return filekey | |
65 | ||
66 | filekey = extract_filekey(default=None) | |
67 | ||
68 | if not filekey: | |
69 | fields = self._hidden_inputs(webpage) | |
70 | post_url = self._search_regex( | |
71 | r'<form[^>]+action=(["\'])(?P<url>.+?)\1', webpage, | |
72 | 'post url', default=url, group='url') | |
73 | if not post_url.startswith('http'): | |
74 | post_url = compat_urlparse.urljoin(url, post_url) | |
75 | request = sanitized_Request( | |
76 | post_url, urlencode_postdata(encode_dict(fields))) | |
77 | request.add_header('Content-Type', 'application/x-www-form-urlencoded') | |
78 | request.add_header('Referer', post_url) | |
79 | webpage = self._download_webpage( | |
80 | request, video_id, 'Downloading continue to the video page') | |
81 | self._check_existence(webpage, video_id) | |
82 | ||
83 | filekey = extract_filekey() | |
84 | ||
85 | title = self._html_search_regex(self._TITLE_REGEX, webpage, 'title', fatal=False) | |
86 | description = self._html_search_regex(self._DESCRIPTION_REGEX, webpage, 'description', default='', fatal=False) | |
87 | ||
88 | api_response = self._download_webpage( | |
89 | 'http://%s/api/player.api.php?key=%s&file=%s' % (self._HOST, filekey, video_id), video_id, | |
90 | 'Downloading video api response') | |
91 | ||
92 | response = compat_urlparse.parse_qs(api_response) | |
93 | ||
94 | if 'error_msg' in response: | |
95 | raise ExtractorError('%s returned error: %s' % (self.IE_NAME, response['error_msg'][0]), expected=True) | |
96 | ||
97 | video_url = response['url'][0] | |
98 | ||
99 | return { | |
100 | 'id': video_id, | |
101 | 'url': video_url, | |
102 | 'title': title, | |
103 | 'description': description | |
104 | } | |
105 | ||
106 | ||
107 | class WholeCloudIE(NovaMovIE): | |
108 | IE_NAME = 'wholecloud' | |
109 | IE_DESC = 'WholeCloud' | |
110 | ||
111 | _VALID_URL = NovaMovIE._VALID_URL_TEMPLATE % {'host': '(?:wholecloud\.net|movshare\.(?:net|sx|ag))'} | |
112 | ||
113 | _HOST = 'www.wholecloud.net' | |
114 | ||
115 | _FILE_DELETED_REGEX = r'>This file no longer exists on our servers.<' | |
116 | _TITLE_REGEX = r'<strong>Title:</strong> ([^<]+)</p>' | |
117 | _DESCRIPTION_REGEX = r'<strong>Description:</strong> ([^<]+)</p>' | |
118 | ||
119 | _TEST = { | |
120 | 'url': 'http://www.wholecloud.net/video/559e28be54d96', | |
121 | 'md5': 'abd31a2132947262c50429e1d16c1bfd', | |
122 | 'info_dict': { | |
123 | 'id': '559e28be54d96', | |
124 | 'ext': 'flv', | |
125 | 'title': 'dissapeared image', | |
126 | 'description': 'optical illusion dissapeared image magic illusion', | |
127 | } | |
128 | } | |
129 | ||
130 | ||
131 | class NowVideoIE(NovaMovIE): | |
132 | IE_NAME = 'nowvideo' | |
133 | IE_DESC = 'NowVideo' | |
134 | ||
135 | _VALID_URL = NovaMovIE._VALID_URL_TEMPLATE % {'host': 'nowvideo\.(?:to|ch|ec|sx|eu|at|ag|co|li)'} | |
136 | ||
137 | _HOST = 'www.nowvideo.to' | |
138 | ||
139 | _FILE_DELETED_REGEX = r'>This file no longer exists on our servers.<' | |
140 | _TITLE_REGEX = r'<h4>([^<]+)</h4>' | |
141 | _DESCRIPTION_REGEX = r'</h4>\s*<p>([^<]+)</p>' | |
142 | ||
143 | _TEST = { | |
144 | 'url': 'http://www.nowvideo.sx/video/f1d6fce9a968b', | |
145 | 'md5': '12c82cad4f2084881d8bc60ee29df092', | |
146 | 'info_dict': { | |
147 | 'id': 'f1d6fce9a968b', | |
148 | 'ext': 'flv', | |
149 | 'title': 'youtubedl test video BaWjenozKc', | |
150 | 'description': 'Description', | |
151 | }, | |
152 | } | |
153 | ||
154 | ||
155 | class VideoWeedIE(NovaMovIE): | |
156 | IE_NAME = 'videoweed' | |
157 | IE_DESC = 'VideoWeed' | |
158 | ||
159 | _VALID_URL = NovaMovIE._VALID_URL_TEMPLATE % {'host': 'videoweed\.(?:es|com)'} | |
160 | ||
161 | _HOST = 'www.videoweed.es' | |
162 | ||
163 | _FILE_DELETED_REGEX = r'>This file no longer exists on our servers.<' | |
164 | _TITLE_REGEX = r'<h1 class="text_shadow">([^<]+)</h1>' | |
165 | _URL_TEMPLATE = 'http://%s/file/%s' | |
166 | ||
167 | _TEST = { | |
168 | 'url': 'http://www.videoweed.es/file/b42178afbea14', | |
169 | 'md5': 'abd31a2132947262c50429e1d16c1bfd', | |
170 | 'info_dict': { | |
171 | 'id': 'b42178afbea14', | |
172 | 'ext': 'flv', | |
173 | 'title': 'optical illusion dissapeared image magic illusion', | |
174 | 'description': '' | |
175 | }, | |
176 | } | |
177 | ||
178 | ||
179 | class CloudTimeIE(NovaMovIE): | |
180 | IE_NAME = 'cloudtime' | |
181 | IE_DESC = 'CloudTime' | |
182 | ||
183 | _VALID_URL = NovaMovIE._VALID_URL_TEMPLATE % {'host': 'cloudtime\.to'} | |
184 | ||
185 | _HOST = 'www.cloudtime.to' | |
186 | ||
187 | _FILE_DELETED_REGEX = r'>This file no longer exists on our servers.<' | |
188 | _TITLE_REGEX = r'<div[^>]+class=["\']video_det["\'][^>]*>\s*<strong>([^<]+)</strong>' | |
189 | ||
190 | _TEST = None |