]>
Commit | Line | Data |
---|---|---|
0f61db44 | 1 | from __future__ import unicode_literals |
1bd39035 P |
2 | |
3 | from .common import InfoExtractor | |
0f61db44 | 4 | from ..utils import ExtractorError |
1bd39035 P |
5 | |
6 | ||
7 | class ChaturbateIE(InfoExtractor): | |
0f61db44 S |
8 | _VALID_URL = r'https?://(?:[^/]+\.)?chaturbate\.com/(?P<id>[^/?#]+)' |
9 | _TESTS = [{ | |
10 | 'url': 'https://www.chaturbate.com/siswet19/', | |
11 | 'info_dict': { | |
12 | 'id': 'siswet19', | |
13 | 'ext': 'mp4', | |
14 | 'title': 're:^siswet19 [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$', | |
15 | 'age_limit': 18, | |
16 | 'is_live': True, | |
17 | }, | |
18 | 'params': { | |
19 | 'skip_download': True, | |
20 | } | |
21 | }, { | |
22 | 'url': 'https://en.chaturbate.com/siswet19/', | |
23 | 'only_matching': True, | |
24 | }] | |
1bd39035 P |
25 | |
26 | def _real_extract(self, url): | |
27 | video_id = self._match_id(url) | |
0f61db44 | 28 | |
1bd39035 P |
29 | webpage = self._download_webpage(url, video_id) |
30 | ||
0f61db44 S |
31 | m3u8_url = self._search_regex( |
32 | r'src=(["\'])(?P<url>http.+?\.m3u8.*?)\1', webpage, | |
33 | 'playlist', default=None, group='url') | |
34 | ||
35 | if not m3u8_url: | |
36 | error = self._search_regex( | |
37 | r'<span[^>]+class=(["\'])desc_span\1[^>]*>(?P<error>[^<]+)</span>', | |
38 | webpage, 'error', group='error') | |
39 | raise ExtractorError(error, expected=True) | |
1bd39035 P |
40 | |
41 | formats = self._extract_m3u8_formats(m3u8_url, video_id, ext='mp4') | |
42 | ||
43 | return { | |
44 | 'id': video_id, | |
45 | 'title': self._live_title(video_id), | |
0f61db44 S |
46 | 'thumbnail': 'https://cdn-s.highwebmedia.com/uHK3McUtGCG3SMFcd4ZJsRv8/roomimage/%s.jpg' % video_id, |
47 | 'age_limit': self._rta_search(webpage), | |
1bd39035 | 48 | 'is_live': True, |
1bd39035 P |
49 | 'formats': formats, |
50 | } |