1 from .common
import InfoExtractor
4 compat_urllib_parse_unquote
,
14 class KinjaEmbedIE(InfoExtractor
):
15 IENAME
= 'kinja:embed'
16 _DOMAIN_REGEX
= r
'''(?:[^.]+\.)?
28 the(?:inventory|onion|root|takeout)
35 _VALID_URL
= r
'''(?x)https?://%s%s
45 soundcloud(?:-playlist)?|
52 youtube-(?:list|video)
53 )-(?P<id>[^&]+)''' % (_DOMAIN_REGEX
, _COMMON_REGEX
)
54 _EMBED_REGEX
= [rf
'(?x)<iframe[^>]+?src=(?P<q>["\'])(?P<url>(?:(?:https?:)?//{_DOMAIN_REGEX})?{_COMMON_REGEX}(?:(?!\1).)+)\1']
56 'url': 'https://kinja.com/ajax/inset/iframe?id=fb-10103303356633621',
57 'only_matching': True,
59 'url': 'https://kinja.com/ajax/inset/iframe?id=kinjavideo-100313',
60 'only_matching': True,
62 'url': 'https://kinja.com/ajax/inset/iframe?id=megaphone-PPY1300931075',
63 'only_matching': True,
65 'url': 'https://kinja.com/ajax/inset/iframe?id=ooyala-xzMXhleDpopuT0u1ijt_qZj3Va-34pEX%2FZTIxYmJjZDM2NWYzZDViZGRiOWJjYzc5',
66 'only_matching': True,
68 'url': 'https://kinja.com/ajax/inset/iframe?id=soundcloud-128574047',
69 'only_matching': True,
71 'url': 'https://kinja.com/ajax/inset/iframe?id=soundcloud-playlist-317413750',
72 'only_matching': True,
74 'url': 'https://kinja.com/ajax/inset/iframe?id=tumblr-post-160130699814-daydreams-at-midnight',
75 'only_matching': True,
77 'url': 'https://kinja.com/ajax/inset/iframe?id=twitch-stream-libratus_extra',
78 'only_matching': True,
80 'url': 'https://kinja.com/ajax/inset/iframe?id=twitter-1068875942473404422',
81 'only_matching': True,
83 'url': 'https://kinja.com/ajax/inset/iframe?id=ustream-channel-10414700',
84 'only_matching': True,
86 'url': 'https://kinja.com/ajax/inset/iframe?id=vimeo-120153502',
87 'only_matching': True,
89 'url': 'https://kinja.com/ajax/inset/iframe?id=vine-5BlvV5qqPrD',
90 'only_matching': True,
92 'url': 'https://kinja.com/ajax/inset/iframe?id=youtube-list-BCQ3KyrPjgA/PLE6509247C270A72E',
93 'only_matching': True,
95 'url': 'https://kinja.com/ajax/inset/iframe?id=youtube-video-00QyL0AgPAE',
96 'only_matching': True,
98 _JWPLATFORM_PROVIDER
= ('cdn.jwplayer.com/v2/media/', 'JWPlatform')
100 'fb': ('facebook.com/video.php?v=', 'Facebook'),
101 'imgur': ('imgur.com/', 'Imgur'),
102 'instagram': ('instagram.com/p/', 'Instagram'),
103 'jwplayer-video': _JWPLATFORM_PROVIDER
,
104 'jwp-video': _JWPLATFORM_PROVIDER
,
105 'megaphone': ('player.megaphone.fm/', 'Generic'),
106 'ooyala': ('player.ooyala.com/player.js?embedCode=', 'Ooyala'),
107 'soundcloud': ('api.soundcloud.com/tracks/', 'Soundcloud'),
108 'soundcloud-playlist': ('api.soundcloud.com/playlists/', 'SoundcloudPlaylist'),
109 'tumblr-post': ('%s.tumblr.com/post/%s', 'Tumblr'),
110 'twitch-stream': ('twitch.tv/', 'TwitchStream'),
111 'twitter': ('twitter.com/i/cards/tfw/v1/', 'TwitterCard'),
112 'ustream-channel': ('ustream.tv/embed/', 'Ustream'),
113 'vimeo': ('vimeo.com/', 'Vimeo'),
114 'vine': ('vine.co/v/', 'Vine'),
115 'youtube-list': ('youtube.com/embed/%s?list=%s', 'YoutubePlaylist'),
116 'youtube-video': ('youtube.com/embed/', 'Youtube'),
119 def _real_extract(self
, url
):
120 video_type
, video_id
= self
._match
_valid
_url
(url
).groups()
122 provider
= self
._PROVIDER
_MAP
.get(video_type
)
124 video_id
= compat_urllib_parse_unquote(video_id
)
125 if video_type
== 'tumblr-post':
126 video_id
, blog
= video_id
.split('-', 1)
127 result_url
= provider
[0] % (blog
, video_id
)
128 elif video_type
== 'youtube-list':
129 video_id
, playlist_id
= video_id
.split('/')
130 result_url
= provider
[0] % (video_id
, playlist_id
)
132 if video_type
== 'ooyala':
133 video_id
= video_id
.split('/')[0]
134 result_url
= provider
[0] + video_id
135 return self
.url_result('http://' + result_url
, provider
[1])
137 if video_type
== 'kinjavideo':
138 data
= self
._download
_json
(
139 'https://kinja.com/api/core/video/views/videoById',
140 video_id
, query
={'videoId': video_id}
)['data']
141 title
= data
['title']
144 for k
in ('signedPlaylist', 'streaming'):
145 m3u8_url
= data
.get(k
+ 'Url')
147 formats
.extend(self
._extract
_m
3u8_formats
(
148 m3u8_url
, video_id
, 'mp4', 'm3u8_native',
149 m3u8_id
='hls', fatal
=False))
152 poster
= data
.get('poster') or {}
153 poster_id
= poster
.get('id')
155 thumbnail
= 'https://i.kinja-img.com/gawker-media/image/upload/%s.%s' % (poster_id
, poster
.get('format') or 'jpg')
160 'description': strip_or_none(data
.get('description')),
162 'tags': data
.get('tags'),
163 'timestamp': int_or_none(try_get(
164 data
, lambda x
: x
['postInfo']['publishTimeMillis']), 1000),
165 'thumbnail': thumbnail
,
166 'uploader': data
.get('network'),
169 video_data
= self
._download
_json
(
170 'https://api.vmh.univision.com/metadata/v1/content/' + video_id
,
171 video_id
)['videoMetadata']
172 iptc
= video_data
['photoVideoMetadataIPTC']
173 title
= iptc
['title']['en']
174 fmg
= video_data
.get('photoVideoMetadata_fmg') or {}
175 tvss_domain
= fmg
.get('tvssDomain') or 'https://auth.univision.com'
176 data
= self
._download
_json
(
177 tvss_domain
+ '/api/v3/video-auth/url-signature-tokens',
178 video_id
, query
={'mcpids': video_id}
)['data'][0]
181 rendition_url
= data
.get('renditionUrl')
183 formats
= self
._extract
_m
3u8_formats
(
184 rendition_url
, video_id
, 'mp4',
185 'm3u8_native', m3u8_id
='hls', fatal
=False)
187 fallback_rendition_url
= data
.get('fallbackRenditionUrl')
188 if fallback_rendition_url
:
190 'format_id': 'fallback',
191 'tbr': int_or_none(self
._search
_regex
(
192 r
'_(\d+)\.mp4', fallback_rendition_url
,
193 'bitrate', default
=None)),
194 'url': fallback_rendition_url
,
200 'thumbnail': try_get(iptc
, lambda x
: x
['cloudinaryLink']['link'], compat_str
),
201 'uploader': fmg
.get('network'),
202 'duration': int_or_none(iptc
.get('fileDuration')),
204 'description': try_get(iptc
, lambda x
: x
['description']['en'], compat_str
),
205 'timestamp': parse_iso8601(iptc
.get('dateReleased')),