]>
Raphaƫl G. Git Repositories - youtubedl/blob - youtube_dl/extractor/younow.py
2 from __future__
import unicode_literals
6 from .common
import InfoExtractor
7 from ..compat
import compat_str
14 CDN_API_BASE
= 'https://cdn.younow.com/php/api'
15 MOMENT_URL_FORMAT
= '%s/moment/fetch/id=%%s' % CDN_API_BASE
18 class YouNowLiveIE(InfoExtractor
):
19 _VALID_URL
= r
'https?://(?:www\.)?younow\.com/(?P<id>[^/?#&]+)'
21 'url': 'https://www.younow.com/AmandaPadeezy',
23 'id': 'AmandaPadeezy',
26 'title': 'March 26, 2017',
27 'thumbnail': r
're:^https?://.*\.jpg$',
29 'categories': ['girls'],
30 'uploader': 'AmandaPadeezy',
31 'uploader_id': '6716501',
32 'uploader_url': 'https://www.younow.com/AmandaPadeezy',
33 'creator': 'AmandaPadeezy',
39 def suitable(cls
, url
):
41 if YouNowChannelIE
.suitable(url
) or YouNowMomentIE
.suitable(url
)
42 else super(YouNowLiveIE
, cls
).suitable(url
))
44 def _real_extract(self
, url
):
45 username
= self
._match
_id
(url
)
47 data
= self
._download
_json
(
48 'https://api.younow.com/php/api/broadcast/info/curId=0/user=%s'
51 if data
.get('errorCode') != 0:
52 raise ExtractorError(data
['errorMsg'], expected
=True)
55 data
, lambda x
: x
['user']['profileUrlString'],
56 compat_str
) or username
61 'title': self
._live
_title
(uploader
),
62 'thumbnail': data
.get('awsUrl'),
63 'tags': data
.get('tags'),
64 'categories': data
.get('tags'),
66 'uploader_id': data
.get('userId'),
67 'uploader_url': 'https://www.younow.com/%s' % username
,
69 'view_count': int_or_none(data
.get('viewers')),
70 'like_count': int_or_none(data
.get('likes')),
72 'url': '%s/broadcast/videoPath/hls=1/broadcastId=%s/channelId=%s'
73 % (CDN_API_BASE
, data
['broadcastId'], data
['userId']),
80 def _extract_moment(item
, fatal
=True):
81 moment_id
= item
.get('momentId')
85 raise ExtractorError('Unable to extract moment id')
87 moment_id
= compat_str(moment_id
)
89 title
= item
.get('text')
91 title
= 'YouNow %s' % (
92 item
.get('momentType') or item
.get('titleType') or 'moment')
94 uploader
= try_get(item
, lambda x
: x
['owner']['name'], compat_str
)
95 uploader_id
= try_get(item
, lambda x
: x
['owner']['userId'])
96 uploader_url
= 'https://www.younow.com/%s' % uploader
if uploader
else None
99 'extractor_key': 'YouNowMoment',
102 'view_count': int_or_none(item
.get('views')),
103 'like_count': int_or_none(item
.get('likes')),
104 'timestamp': int_or_none(item
.get('created')),
106 'uploader': uploader
,
107 'uploader_id': uploader_id
,
108 'uploader_url': uploader_url
,
110 'url': 'https://hls.younow.com/momentsplaylists/live/%s/%s.m3u8'
111 % (moment_id
, moment_id
),
113 'protocol': 'm3u8_native',
120 class YouNowChannelIE(InfoExtractor
):
121 _VALID_URL
= r
'https?://(?:www\.)?younow\.com/(?P<id>[^/]+)/channel'
123 'url': 'https://www.younow.com/its_Kateee_/channel',
126 'title': 'its_Kateee_ moments'
128 'playlist_mincount': 8,
131 def _entries(self
, username
, channel_id
):
133 for page_num
in itertools
.count(1):
134 if created_before
is None:
136 info
= self
._download
_json
(
137 '%s/moment/profile/channelId=%s/createdBefore=%d/records=20'
138 % (CDN_API_BASE
, channel_id
, created_before
), username
,
139 note
='Downloading moments page %d' % page_num
)
140 items
= info
.get('items')
141 if not items
or not isinstance(items
, list):
144 if not isinstance(item
, dict):
146 item_type
= item
.get('type')
147 if item_type
== 'moment':
148 entry
= _extract_moment(item
, fatal
=False)
151 elif item_type
== 'collection':
152 moments
= item
.get('momentsIds')
153 if isinstance(moments
, list):
154 for moment_id
in moments
:
155 m
= self
._download
_json
(
156 MOMENT_URL_FORMAT
% moment_id
, username
,
157 note
='Downloading %s moment JSON' % moment_id
,
159 if m
and isinstance(m
, dict) and m
.get('item'):
160 entry
= _extract_moment(m
['item'])
163 created_before
= int_or_none(item
.get('created'))
165 def _real_extract(self
, url
):
166 username
= self
._match
_id
(url
)
167 channel_id
= compat_str(self
._download
_json
(
168 'https://api.younow.com/php/api/broadcast/info/curId=0/user=%s'
169 % username
, username
, note
='Downloading user information')['userId'])
170 return self
.playlist_result(
171 self
._entries
(username
, channel_id
), channel_id
,
172 '%s moments' % username
)
175 class YouNowMomentIE(InfoExtractor
):
176 _VALID_URL
= r
'https?://(?:www\.)?younow\.com/[^/]+/(?P<id>[^/?#&]+)'
178 'url': 'https://www.younow.com/GABO.../20712117/36319236/3b316doc/m',
179 'md5': 'a30c70eadb9fb39a1aa3c8c0d22a0807',
183 'title': 'YouNow capture',
186 'timestamp': 1490432040,
187 'upload_date': '20170325',
188 'uploader': 'GABO...',
189 'uploader_id': 35917228,
194 def suitable(cls
, url
):
196 if YouNowChannelIE
.suitable(url
)
197 else super(YouNowMomentIE
, cls
).suitable(url
))
199 def _real_extract(self
, url
):
200 video_id
= self
._match
_id
(url
)
201 item
= self
._download
_json
(MOMENT_URL_FORMAT
% video_id
, video_id
)
202 return _extract_moment(item
['item'])