]>
jfr.im git - yt-dlp.git/blob - yt_dlp/extractor/younow.py
3 from .common
import InfoExtractor
4 from ..compat
import compat_str
12 CDN_API_BASE
= 'https://cdn.younow.com/php/api'
13 MOMENT_URL_FORMAT
= '%s/moment/fetch/id=%%s' % CDN_API_BASE
16 class YouNowLiveIE(InfoExtractor
):
17 _VALID_URL
= r
'https?://(?:www\.)?younow\.com/(?P<id>[^/?#&]+)'
19 'url': 'https://www.younow.com/AmandaPadeezy',
21 'id': 'AmandaPadeezy',
24 'title': 'March 26, 2017',
25 'thumbnail': r
're:^https?://.*\.jpg$',
27 'categories': ['girls'],
28 'uploader': 'AmandaPadeezy',
29 'uploader_id': '6716501',
30 'uploader_url': 'https://www.younow.com/AmandaPadeezy',
31 'creator': 'AmandaPadeezy',
37 def suitable(cls
, url
):
39 if YouNowChannelIE
.suitable(url
) or YouNowMomentIE
.suitable(url
)
40 else super(YouNowLiveIE
, cls
).suitable(url
))
42 def _real_extract(self
, url
):
43 username
= self
._match
_id
(url
)
45 data
= self
._download
_json
(
46 'https://api.younow.com/php/api/broadcast/info/curId=0/user=%s'
49 if data
.get('errorCode') != 0:
50 raise ExtractorError(data
['errorMsg'], expected
=True)
53 data
, lambda x
: x
['user']['profileUrlString'],
54 compat_str
) or username
60 'thumbnail': data
.get('awsUrl'),
61 'tags': data
.get('tags'),
62 'categories': data
.get('tags'),
64 'uploader_id': data
.get('userId'),
65 'uploader_url': 'https://www.younow.com/%s' % username
,
67 'view_count': int_or_none(data
.get('viewers')),
68 'like_count': int_or_none(data
.get('likes')),
70 'url': '%s/broadcast/videoPath/hls=1/broadcastId=%s/channelId=%s'
71 % (CDN_API_BASE
, data
['broadcastId'], data
['userId']),
78 def _extract_moment(item
, fatal
=True):
79 moment_id
= item
.get('momentId')
83 raise ExtractorError('Unable to extract moment id')
85 moment_id
= compat_str(moment_id
)
87 title
= item
.get('text')
89 title
= 'YouNow %s' % (
90 item
.get('momentType') or item
.get('titleType') or 'moment')
92 uploader
= try_get(item
, lambda x
: x
['owner']['name'], compat_str
)
93 uploader_id
= try_get(item
, lambda x
: x
['owner']['userId'])
94 uploader_url
= format_field(uploader
, None, 'https://www.younow.com/%s')
97 'extractor_key': 'YouNowMoment',
100 'view_count': int_or_none(item
.get('views')),
101 'like_count': int_or_none(item
.get('likes')),
102 'timestamp': int_or_none(item
.get('created')),
104 'uploader': uploader
,
105 'uploader_id': uploader_id
,
106 'uploader_url': uploader_url
,
108 'url': 'https://hls.younow.com/momentsplaylists/live/%s/%s.m3u8'
109 % (moment_id
, moment_id
),
111 'protocol': 'm3u8_native',
118 class YouNowChannelIE(InfoExtractor
):
119 _VALID_URL
= r
'https?://(?:www\.)?younow\.com/(?P<id>[^/]+)/channel'
121 'url': 'https://www.younow.com/its_Kateee_/channel',
124 'title': 'its_Kateee_ moments'
126 'playlist_mincount': 8,
129 def _entries(self
, username
, channel_id
):
131 for page_num
in itertools
.count(1):
132 if created_before
is None:
134 info
= self
._download
_json
(
135 '%s/moment/profile/channelId=%s/createdBefore=%d/records=20'
136 % (CDN_API_BASE
, channel_id
, created_before
), username
,
137 note
='Downloading moments page %d' % page_num
)
138 items
= info
.get('items')
139 if not items
or not isinstance(items
, list):
142 if not isinstance(item
, dict):
144 item_type
= item
.get('type')
145 if item_type
== 'moment':
146 entry
= _extract_moment(item
, fatal
=False)
149 elif item_type
== 'collection':
150 moments
= item
.get('momentsIds')
151 if isinstance(moments
, list):
152 for moment_id
in moments
:
153 m
= self
._download
_json
(
154 MOMENT_URL_FORMAT
% moment_id
, username
,
155 note
='Downloading %s moment JSON' % moment_id
,
157 if m
and isinstance(m
, dict) and m
.get('item'):
158 entry
= _extract_moment(m
['item'])
161 created_before
= int_or_none(item
.get('created'))
163 def _real_extract(self
, url
):
164 username
= self
._match
_id
(url
)
165 channel_id
= compat_str(self
._download
_json
(
166 'https://api.younow.com/php/api/broadcast/info/curId=0/user=%s'
167 % username
, username
, note
='Downloading user information')['userId'])
168 return self
.playlist_result(
169 self
._entries
(username
, channel_id
), channel_id
,
170 '%s moments' % username
)
173 class YouNowMomentIE(InfoExtractor
):
174 _VALID_URL
= r
'https?://(?:www\.)?younow\.com/[^/]+/(?P<id>[^/?#&]+)'
176 'url': 'https://www.younow.com/GABO.../20712117/36319236/3b316doc/m',
177 'md5': 'a30c70eadb9fb39a1aa3c8c0d22a0807',
181 'title': 'YouNow capture',
184 'timestamp': 1490432040,
185 'upload_date': '20170325',
186 'uploader': 'GABO...',
187 'uploader_id': 35917228,
192 def suitable(cls
, url
):
194 if YouNowChannelIE
.suitable(url
)
195 else super(YouNowMomentIE
, cls
).suitable(url
))
197 def _real_extract(self
, url
):
198 video_id
= self
._match
_id
(url
)
199 item
= self
._download
_json
(MOMENT_URL_FORMAT
% video_id
, video_id
)
200 return _extract_moment(item
['item'])