3 from .common
import InfoExtractor
6 compat_urllib_parse_unquote
,
18 class KinjaEmbedIE(InfoExtractor
):
19 IENAME
= 'kinja:embed'
20 _DOMAIN_REGEX
= r
'''(?:[^.]+\.)?
32 the(?:inventory|onion|root|takeout)
39 _VALID_URL
= r
'''(?x)https?://%s%s
49 soundcloud(?:-playlist)?|
56 youtube-(?:list|video)
57 )-(?P<id>[^&]+)''' % (_DOMAIN_REGEX
, _COMMON_REGEX
)
59 'url': 'https://kinja.com/ajax/inset/iframe?id=fb-10103303356633621',
60 'only_matching': True,
62 'url': 'https://kinja.com/ajax/inset/iframe?id=kinjavideo-100313',
63 'only_matching': True,
65 'url': 'https://kinja.com/ajax/inset/iframe?id=megaphone-PPY1300931075',
66 'only_matching': True,
68 'url': 'https://kinja.com/ajax/inset/iframe?id=ooyala-xzMXhleDpopuT0u1ijt_qZj3Va-34pEX%2FZTIxYmJjZDM2NWYzZDViZGRiOWJjYzc5',
69 'only_matching': True,
71 'url': 'https://kinja.com/ajax/inset/iframe?id=soundcloud-128574047',
72 'only_matching': True,
74 'url': 'https://kinja.com/ajax/inset/iframe?id=soundcloud-playlist-317413750',
75 'only_matching': True,
77 'url': 'https://kinja.com/ajax/inset/iframe?id=tumblr-post-160130699814-daydreams-at-midnight',
78 'only_matching': True,
80 'url': 'https://kinja.com/ajax/inset/iframe?id=twitch-stream-libratus_extra',
81 'only_matching': True,
83 'url': 'https://kinja.com/ajax/inset/iframe?id=twitter-1068875942473404422',
84 'only_matching': True,
86 'url': 'https://kinja.com/ajax/inset/iframe?id=ustream-channel-10414700',
87 'only_matching': True,
89 'url': 'https://kinja.com/ajax/inset/iframe?id=vimeo-120153502',
90 'only_matching': True,
92 'url': 'https://kinja.com/ajax/inset/iframe?id=vine-5BlvV5qqPrD',
93 'only_matching': True,
95 'url': 'https://kinja.com/ajax/inset/iframe?id=youtube-list-BCQ3KyrPjgA/PLE6509247C270A72E',
96 'only_matching': True,
98 'url': 'https://kinja.com/ajax/inset/iframe?id=youtube-video-00QyL0AgPAE',
99 'only_matching': True,
101 _JWPLATFORM_PROVIDER
= ('cdn.jwplayer.com/v2/media/', 'JWPlatform')
103 'fb': ('facebook.com/video.php?v=', 'Facebook'),
104 'imgur': ('imgur.com/', 'Imgur'),
105 'instagram': ('instagram.com/p/', 'Instagram'),
106 'jwplayer-video': _JWPLATFORM_PROVIDER
,
107 'jwp-video': _JWPLATFORM_PROVIDER
,
108 'megaphone': ('player.megaphone.fm/', 'Generic'),
109 'ooyala': ('player.ooyala.com/player.js?embedCode=', 'Ooyala'),
110 'soundcloud': ('api.soundcloud.com/tracks/', 'Soundcloud'),
111 'soundcloud-playlist': ('api.soundcloud.com/playlists/', 'SoundcloudPlaylist'),
112 'tumblr-post': ('%s.tumblr.com/post/%s', 'Tumblr'),
113 'twitch-stream': ('twitch.tv/', 'TwitchStream'),
114 'twitter': ('twitter.com/i/cards/tfw/v1/', 'TwitterCard'),
115 'ustream-channel': ('ustream.tv/embed/', 'Ustream'),
116 'vimeo': ('vimeo.com/', 'Vimeo'),
117 'vine': ('vine.co/v/', 'Vine'),
118 'youtube-list': ('youtube.com/embed/%s?list=%s', 'YoutubePlaylist'),
119 'youtube-video': ('youtube.com/embed/', 'Youtube'),
123 def _extract_urls(webpage
, url
):
124 return [urljoin(url
, unescapeHTML(mobj
.group('url'))) for mobj
in re
.finditer(
125 r
'(?x)<iframe[^>]+?src=(?P<q>["\'])(?P
<url
>(?
:(?
:https?
:)?
//%s)?
%s(?
:(?
!\
1).)+)\
1' % (KinjaEmbedIE._DOMAIN_REGEX, KinjaEmbedIE._COMMON_REGEX),
128 def _real_extract(self, url):
129 video_type, video_id = self._match_valid_url(url).groups()
131 provider = self._PROVIDER_MAP.get(video_type)
133 video_id = compat_urllib_parse_unquote(video_id)
134 if video_type == 'tumblr
-post
':
135 video_id, blog = video_id.split('-', 1)
136 result_url = provider[0] % (blog, video_id)
137 elif video_type == 'youtube
-list':
138 video_id, playlist_id = video_id.split('/')
139 result_url = provider[0] % (video_id, playlist_id)
141 if video_type == 'ooyala
':
142 video_id = video_id.split('/')[0]
143 result_url = provider[0] + video_id
144 return self.url_result('http
://' + result_url, provider[1])
146 if video_type == 'kinjavideo
':
147 data = self._download_json(
148 'https
://kinja
.com
/api
/core
/video
/views
/videoById
',
149 video_id, query={'videoId': video_id})['data
']
150 title = data['title
']
153 for k in ('signedPlaylist
', 'streaming
'):
154 m3u8_url = data.get(k + 'Url
')
156 formats.extend(self._extract_m3u8_formats(
157 m3u8_url, video_id, 'mp4
', 'm3u8_native
',
158 m3u8_id='hls
', fatal=False))
159 self._sort_formats(formats)
162 poster = data.get('poster
') or {}
163 poster_id = poster.get('id')
165 thumbnail = 'https
://i
.kinja
-img
.com
/gawker
-media
/image
/upload
/%s.%s' % (poster_id, poster.get('format
') or 'jpg
')
170 'description
': strip_or_none(data.get('description
')),
172 'tags
': data.get('tags
'),
173 'timestamp
': int_or_none(try_get(
174 data, lambda x: x['postInfo
']['publishTimeMillis
']), 1000),
175 'thumbnail
': thumbnail,
176 'uploader
': data.get('network
'),
179 video_data = self._download_json(
180 'https
://api
.vmh
.univision
.com
/metadata
/v1
/content
/' + video_id,
181 video_id)['videoMetadata
']
182 iptc = video_data['photoVideoMetadataIPTC
']
183 title = iptc['title
']['en
']
184 fmg = video_data.get('photoVideoMetadata_fmg
') or {}
185 tvss_domain = fmg.get('tvssDomain
') or 'https
://auth
.univision
.com
'
186 data = self._download_json(
187 tvss_domain + '/api
/v3
/video
-auth
/url
-signature
-tokens
',
188 video_id, query={'mcpids': video_id})['data
'][0]
191 rendition_url = data.get('renditionUrl
')
193 formats = self._extract_m3u8_formats(
194 rendition_url, video_id, 'mp4
',
195 'm3u8_native
', m3u8_id='hls
', fatal=False)
197 fallback_rendition_url = data.get('fallbackRenditionUrl
')
198 if fallback_rendition_url:
200 'format_id
': 'fallback
',
201 'tbr
': int_or_none(self._search_regex(
202 r'_(\d
+)\
.mp4
', fallback_rendition_url,
203 'bitrate
', default=None)),
204 'url
': fallback_rendition_url,
207 self._sort_formats(formats)
212 'thumbnail
': try_get(iptc, lambda x: x['cloudinaryLink
']['link
'], compat_str),
213 'uploader
': fmg.get('network
'),
214 'duration
': int_or_none(iptc.get('fileDuration
')),
216 'description
': try_get(iptc, lambda x: x['description
']['en
'], compat_str),
217 'timestamp
': parse_iso8601(iptc.get('dateReleased
')),