1 from __future__ 
import unicode_literals
 
   3 from .common 
import InfoExtractor
 
   4 from ..utils 
import ExtractorError
 
   7 class ChaturbateIE(InfoExtractor
): 
   8     _VALID_URL 
= r
'https?://(?:[^/]+\.)?chaturbate\.com/(?P<id>[^/?#]+)' 
  10         'url': 'https://www.chaturbate.com/siswet19/', 
  14             'title': 're:^siswet19 [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$', 
  19             'skip_download': True, 
  22         'url': 'https://en.chaturbate.com/siswet19/', 
  23         'only_matching': True, 
  26     _ROOM_OFFLINE 
= 'Room is currently offline' 
  28     def _real_extract(self
, url
): 
  29         video_id 
= self
._match
_id
(url
) 
  31         webpage 
= self
._download
_webpage
(url
, video_id
) 
  33         m3u8_url 
= self
._search
_regex
( 
  34             r
'src=(["\'])(?P
<url
>http
.+?\
.m3u8
.*?
)\
1', webpage, 
  35             'playlist
', default=None, group='url
') 
  38             error = self._search_regex( 
  39                 [r'<span
[^
>]+class=(["\'])desc_span\1[^>]*>(?P<error>[^<]+)</span>', 
  40                  r'<div[^>]+id=(["\'])defchat\
1[^
>]*>\s
*<p
><strong
>(?P
<error
>[^
<]+)<'], 
  41                 webpage, 'error
', group='error
', default=None) 
  43                 if any(p not in webpage for p in ( 
  44                         self._ROOM_OFFLINE, 'offline_tipping
', 'tip_offline
')): 
  45                     error = self._ROOM_OFFLINE 
  47                 raise ExtractorError(error, expected=True) 
  48             raise ExtractorError('Unable to find stream URL
') 
  50         formats = self._extract_m3u8_formats(m3u8_url, video_id, ext='mp4
') 
  54             'title
': self._live_title(video_id), 
  55             'thumbnail
': 'https
://cdn
-s
.highwebmedia
.com
/uHK3McUtGCG3SMFcd4ZJsRv8
/roomimage
/%s.jpg
' % video_id, 
  56             'age_limit
': self._rta_search(webpage),