]>
jfr.im git - yt-dlp.git/blob - yt_dlp/extractor/younow.py
3 from .common
import InfoExtractor
4 from ..compat
import compat_str
13 CDN_API_BASE
= 'https://cdn.younow.com/php/api'
14 MOMENT_URL_FORMAT
= '%s/moment/fetch/id=%%s' % CDN_API_BASE
17 class YouNowLiveIE(InfoExtractor
):
18 _VALID_URL
= r
'https?://(?:www\.)?younow\.com/(?P<id>[^/?#&]+)'
20 'url': 'https://www.younow.com/AmandaPadeezy',
22 'id': 'AmandaPadeezy',
25 'title': 'March 26, 2017',
26 'thumbnail': r
're:^https?://.*\.jpg$',
28 'categories': ['girls'],
29 'uploader': 'AmandaPadeezy',
30 'uploader_id': '6716501',
31 'uploader_url': 'https://www.younow.com/AmandaPadeezy',
32 'creator': 'AmandaPadeezy',
38 def suitable(cls
, url
):
40 if YouNowChannelIE
.suitable(url
) or YouNowMomentIE
.suitable(url
)
41 else super(YouNowLiveIE
, cls
).suitable(url
))
43 def _real_extract(self
, url
):
44 username
= self
._match
_id
(url
)
46 data
= self
._download
_json
(
47 'https://api.younow.com/php/api/broadcast/info/curId=0/user=%s'
50 if data
.get('errorCode') != 0:
51 raise ExtractorError(data
['errorMsg'], expected
=True)
54 data
, lambda x
: x
['user']['profileUrlString'],
55 compat_str
) or username
61 'thumbnail': data
.get('awsUrl'),
62 'tags': data
.get('tags'),
63 'categories': data
.get('tags'),
65 'uploader_id': data
.get('userId'),
66 'uploader_url': 'https://www.younow.com/%s' % username
,
68 'view_count': int_or_none(data
.get('viewers')),
69 'like_count': int_or_none(data
.get('likes')),
71 'url': '%s/broadcast/videoPath/hls=1/broadcastId=%s/channelId=%s'
72 % (CDN_API_BASE
, data
['broadcastId'], data
['userId']),
79 def _extract_moment(item
, fatal
=True):
80 moment_id
= item
.get('momentId')
84 raise ExtractorError('Unable to extract moment id')
86 moment_id
= compat_str(moment_id
)
88 title
= item
.get('text')
90 title
= 'YouNow %s' % (
91 item
.get('momentType') or item
.get('titleType') or 'moment')
93 uploader
= try_get(item
, lambda x
: x
['owner']['name'], compat_str
)
94 uploader_id
= try_get(item
, lambda x
: x
['owner']['userId'])
95 uploader_url
= format_field(uploader
, None, 'https://www.younow.com/%s')
98 'extractor_key': 'YouNowMoment',
101 'view_count': int_or_none(item
.get('views')),
102 'like_count': int_or_none(item
.get('likes')),
103 'timestamp': int_or_none(item
.get('created')),
105 'uploader': uploader
,
106 'uploader_id': str_or_none(uploader_id
),
107 'uploader_url': uploader_url
,
109 'url': 'https://hls.younow.com/momentsplaylists/live/%s/%s.m3u8'
110 % (moment_id
, moment_id
),
112 'protocol': 'm3u8_native',
119 class YouNowChannelIE(InfoExtractor
):
120 _VALID_URL
= r
'https?://(?:www\.)?younow\.com/(?P<id>[^/]+)/channel'
122 'url': 'https://www.younow.com/its_Kateee_/channel',
125 'title': 'its_Kateee_ moments'
127 'playlist_mincount': 8,
130 def _entries(self
, username
, channel_id
):
132 for page_num
in itertools
.count(1):
133 if created_before
is None:
135 info
= self
._download
_json
(
136 '%s/moment/profile/channelId=%s/createdBefore=%d/records=20'
137 % (CDN_API_BASE
, channel_id
, created_before
), username
,
138 note
='Downloading moments page %d' % page_num
)
139 items
= info
.get('items')
140 if not items
or not isinstance(items
, list):
143 if not isinstance(item
, dict):
145 item_type
= item
.get('type')
146 if item_type
== 'moment':
147 entry
= _extract_moment(item
, fatal
=False)
150 elif item_type
== 'collection':
151 moments
= item
.get('momentsIds')
152 if isinstance(moments
, list):
153 for moment_id
in moments
:
154 m
= self
._download
_json
(
155 MOMENT_URL_FORMAT
% moment_id
, username
,
156 note
='Downloading %s moment JSON' % moment_id
,
158 if m
and isinstance(m
, dict) and m
.get('item'):
159 entry
= _extract_moment(m
['item'])
162 created_before
= int_or_none(item
.get('created'))
164 def _real_extract(self
, url
):
165 username
= self
._match
_id
(url
)
166 channel_id
= compat_str(self
._download
_json
(
167 'https://api.younow.com/php/api/broadcast/info/curId=0/user=%s'
168 % username
, username
, note
='Downloading user information')['userId'])
169 return self
.playlist_result(
170 self
._entries
(username
, channel_id
), channel_id
,
171 '%s moments' % username
)
174 class YouNowMomentIE(InfoExtractor
):
175 _VALID_URL
= r
'https?://(?:www\.)?younow\.com/[^/]+/(?P<id>[^/?#&]+)'
177 'url': 'https://www.younow.com/GABO.../20712117/36319236/3b316doc/m',
178 'md5': 'a30c70eadb9fb39a1aa3c8c0d22a0807',
182 'title': 'YouNow capture',
185 'timestamp': 1490432040,
186 'upload_date': '20170325',
187 'uploader': 'GABO...',
188 'uploader_id': '35917228',
193 def suitable(cls
, url
):
195 if YouNowChannelIE
.suitable(url
)
196 else super(YouNowMomentIE
, cls
).suitable(url
))
198 def _real_extract(self
, url
):
199 video_id
= self
._match
_id
(url
)
200 item
= self
._download
_json
(MOMENT_URL_FORMAT
% video_id
, video_id
)
201 return _extract_moment(item
['item'])