2 from __future__
import unicode_literals
4 from .common
import InfoExtractor
14 class EllenTubeBaseIE(InfoExtractor
):
15 def _extract_data_config(self
, webpage
, video_id
):
16 details
= self
._search
_regex
(
17 r
'(<[^>]+\bdata-component=(["\'])[Dd
]etails
.+?
></div
>)', webpage,
19 return self._parse_json(
20 extract_attributes(details)['data
-config
'], video_id)
22 def _extract_video(self, data, video_id):
27 for entry in data.get('media
'):
28 if entry.get('id') == 'm3u8
':
29 formats = self._extract_m3u8_formats(
30 entry['url
'], video_id, 'mp4
',
31 entry_protocol='m3u8_native
', m3u8_id='hls
')
32 duration = int_or_none(entry.get('duration
'))
34 self._sort_formats(formats)
36 def get_insight(kind):
37 return int_or_none(try_get(
38 data, lambda x: x['insight
']['%ss' % kind]))
41 'extractor_key
': EllenTubeIE.ie_key(),
44 'description
': data.get('description
'),
46 'thumbnail
': data.get('thumbnail
'),
47 'timestamp
': float_or_none(data.get('publishTime
'), scale=1000),
48 'view_count
': get_insight('view
'),
49 'like_count
': get_insight('like
'),
54 class EllenTubeIE(EllenTubeBaseIE):
58 https://api-prod\.ellentube\.com/ellenapi/api/item/
60 (?P<id>[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12})
63 'url
': 'https
://api
-prod
.ellentube
.com
/ellenapi
/api
/item
/0822171c
-3829-43bf
-b99f
-d77358ae75e3
',
64 'md5
': '2fabc277131bddafdd120e0fc0f974c9
',
66 'id': '0822171c
-3829-43bf
-b99f
-d77358ae75e3
',
68 'title
': 'Ellen Meets Las Vegas Survivors Jesus Campos
and Stephen Schuck
',
69 'description
': 'md5
:76e3355e2242a78ad9e3858e5616923f
',
70 'thumbnail
': r're
:^https?
://.+?
',
72 'timestamp
': 1508505120,
73 'upload_date
': '20171020',
78 'url
': 'ellentube
:734a3353
-f697
-4e79
-9ca9
-bfc3002dc1e0
',
79 'only_matching
': True,
82 def _real_extract(self, url):
83 video_id = self._match_id(url)
84 data = self._download_json(
85 'https
://api
-prod
.ellentube
.com
/ellenapi
/api
/item
/%s' % video_id,
87 return self._extract_video(data, video_id)
90 class EllenTubeVideoIE(EllenTubeBaseIE):
91 _VALID_URL = r'https?
://(?
:www\
.)?ellentube\
.com
/video
/(?P
<id>.+?
)\
.html
'
93 'url
': 'https
://www
.ellentube
.com
/video
/ellen
-meets
-las
-vegas
-survivors
-jesus
-campos
-and-stephen
-schuck
.html
',
94 'only_matching
': True,
97 def _real_extract(self, url):
98 display_id = self._match_id(url)
99 webpage = self._download_webpage(url, display_id)
100 video_id = self._extract_data_config(webpage, display_id)['id']
101 return self.url_result(
102 'ellentube
:%s' % video_id, ie=EllenTubeIE.ie_key(),
106 class EllenTubePlaylistIE(EllenTubeBaseIE):
107 _VALID_URL = r'https?
://(?
:www\
.)?ellentube\
.com
/(?
:episode|studios
)/(?P
<id>.+?
)\
.html
'
109 'url
': 'https
://www
.ellentube
.com
/episode
/dax
-shepard
-jordan
-fisher
-haim
.html
',
111 'id': 'dax
-shepard
-jordan
-fisher
-haim
',
112 'title
': "Dax Shepard, 'DWTS
' Team Jordan Fisher & Lindsay Arnold, HAIM",
113 'description
': 'md5
:bfc982194dabb3f4e325e43aa6b2e21c
',
117 'url
': 'https
://www
.ellentube
.com
/studios
/macey
-goes
-rving0
.html
',
118 'only_matching
': True,
121 def _real_extract(self, url):
122 display_id = self._match_id(url)
123 webpage = self._download_webpage(url, display_id)
124 data = self._extract_data_config(webpage, display_id)['data
']
125 feed = self._download_json(
126 'https
://api
-prod
.ellentube
.com
/ellenapi
/api
/feed
/?
%s'
127 % data['filter'], display_id)
129 self._extract_video(elem, elem['id'])
130 for elem in feed if elem.get('type') == 'VIDEO
' and elem.get('id')]
131 return self.playlist_result(
132 entries, display_id, data.get('title
'),
133 clean_html(data.get('description
')))