[mangomolo] add support for Mangomolo embeds
This commit is contained in:
parent
6ad0219556
commit
7d273a387a
4 changed files with 111 additions and 39 deletions
|
@ -50,25 +50,6 @@ class AWAANBaseIE(InfoExtractor):
|
||||||
'is_live': is_live,
|
'is_live': is_live,
|
||||||
}
|
}
|
||||||
|
|
||||||
def _extract_video_formats(self, webpage, video_id, m3u8_entry_protocol):
|
|
||||||
formats = []
|
|
||||||
format_url_base = 'http' + self._html_search_regex(
|
|
||||||
[
|
|
||||||
r'file\s*:\s*"https?(://[^"]+)/playlist.m3u8',
|
|
||||||
r'<a[^>]+href="rtsp(://[^"]+)"'
|
|
||||||
], webpage, 'format url')
|
|
||||||
formats.extend(self._extract_mpd_formats(
|
|
||||||
format_url_base + '/manifest.mpd',
|
|
||||||
video_id, mpd_id='dash', fatal=False))
|
|
||||||
formats.extend(self._extract_m3u8_formats(
|
|
||||||
format_url_base + '/playlist.m3u8', video_id, 'mp4',
|
|
||||||
m3u8_entry_protocol, m3u8_id='hls', fatal=False))
|
|
||||||
formats.extend(self._extract_f4m_formats(
|
|
||||||
format_url_base + '/manifest.f4m',
|
|
||||||
video_id, f4m_id='hds', fatal=False))
|
|
||||||
self._sort_formats(formats)
|
|
||||||
return formats
|
|
||||||
|
|
||||||
|
|
||||||
class AWAANVideoIE(AWAANBaseIE):
|
class AWAANVideoIE(AWAANBaseIE):
|
||||||
IE_NAME = 'awaan:video'
|
IE_NAME = 'awaan:video'
|
||||||
|
@ -99,16 +80,18 @@ class AWAANVideoIE(AWAANBaseIE):
|
||||||
video_id, headers={'Origin': 'http://awaan.ae'})
|
video_id, headers={'Origin': 'http://awaan.ae'})
|
||||||
info = self._parse_video_data(video_data, video_id, False)
|
info = self._parse_video_data(video_data, video_id, False)
|
||||||
|
|
||||||
webpage = self._download_webpage(
|
embed_url = 'http://admin.mangomolo.com/analytics/index.php/customers/embed/video?' + compat_urllib_parse_urlencode({
|
||||||
'http://admin.mangomolo.com/analytics/index.php/customers/embed/video?' +
|
'id': video_data['id'],
|
||||||
compat_urllib_parse_urlencode({
|
'user_id': video_data['user_id'],
|
||||||
'id': video_data['id'],
|
'signature': video_data['signature'],
|
||||||
'user_id': video_data['user_id'],
|
'countries': 'Q0M=',
|
||||||
'signature': video_data['signature'],
|
'filter': 'DENY',
|
||||||
'countries': 'Q0M=',
|
})
|
||||||
'filter': 'DENY',
|
info.update({
|
||||||
}), video_id)
|
'_type': 'url_transparent',
|
||||||
info['formats'] = self._extract_video_formats(webpage, video_id, 'm3u8_native')
|
'url': embed_url,
|
||||||
|
'ie_key': 'MangomoloVideo',
|
||||||
|
})
|
||||||
return info
|
return info
|
||||||
|
|
||||||
|
|
||||||
|
@ -138,16 +121,18 @@ class AWAANLiveIE(AWAANBaseIE):
|
||||||
channel_id, headers={'Origin': 'http://awaan.ae'})
|
channel_id, headers={'Origin': 'http://awaan.ae'})
|
||||||
info = self._parse_video_data(channel_data, channel_id, True)
|
info = self._parse_video_data(channel_data, channel_id, True)
|
||||||
|
|
||||||
webpage = self._download_webpage(
|
embed_url = 'http://admin.mangomolo.com/analytics/index.php/customers/embed/index?' + compat_urllib_parse_urlencode({
|
||||||
'http://admin.mangomolo.com/analytics/index.php/customers/embed/index?' +
|
'id': base64.b64encode(channel_data['user_id'].encode()).decode(),
|
||||||
compat_urllib_parse_urlencode({
|
'channelid': base64.b64encode(channel_data['id'].encode()).decode(),
|
||||||
'id': base64.b64encode(channel_data['user_id'].encode()).decode(),
|
'signature': channel_data['signature'],
|
||||||
'channelid': base64.b64encode(channel_data['id'].encode()).decode(),
|
'countries': 'Q0M=',
|
||||||
'signature': channel_data['signature'],
|
'filter': 'DENY',
|
||||||
'countries': 'Q0M=',
|
})
|
||||||
'filter': 'DENY',
|
info.update({
|
||||||
}), channel_id)
|
'_type': 'url_transparent',
|
||||||
info['formats'] = self._extract_video_formats(webpage, channel_id, 'm3u8')
|
'url': embed_url,
|
||||||
|
'ie_key': 'MangomoloLive',
|
||||||
|
})
|
||||||
return info
|
return info
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -472,6 +472,10 @@ from .macgamestore import MacGameStoreIE
|
||||||
from .mailru import MailRuIE
|
from .mailru import MailRuIE
|
||||||
from .makerschannel import MakersChannelIE
|
from .makerschannel import MakersChannelIE
|
||||||
from .makertv import MakerTVIE
|
from .makertv import MakerTVIE
|
||||||
|
from .mangomolo import (
|
||||||
|
MangomoloVideoIE,
|
||||||
|
MangomoloLiveIE,
|
||||||
|
)
|
||||||
from .matchtv import MatchTVIE
|
from .matchtv import MatchTVIE
|
||||||
from .mdr import MDRIE
|
from .mdr import MDRIE
|
||||||
from .meta import METAIE
|
from .meta import METAIE
|
||||||
|
|
|
@ -2254,6 +2254,35 @@ class GenericIE(InfoExtractor):
|
||||||
return self.url_result(
|
return self.url_result(
|
||||||
self._proto_relative_url(unescapeHTML(mobj.group('url'))), 'VODPlatform')
|
self._proto_relative_url(unescapeHTML(mobj.group('url'))), 'VODPlatform')
|
||||||
|
|
||||||
|
# Look for Mangomolo embeds
|
||||||
|
mobj = re.search(
|
||||||
|
r'''(?x)<iframe[^>]+src=(["\'])(?P<url>(?:https?:)?//(?:www\.)?admin\.mangomolo.com/analytics/index\.php/customers/embed/
|
||||||
|
(?:
|
||||||
|
video\?.*?\bid=(?P<video_id>\d+)|
|
||||||
|
index\?.*?\bchannelid=(?P<channel_id>(?:[A-Za-z0-9+/=]|%2B|%2F|%3D)+)
|
||||||
|
).+?)\1''', webpage)
|
||||||
|
if mobj is not None:
|
||||||
|
info = {
|
||||||
|
'_type': 'url_transparent',
|
||||||
|
'url': self._proto_relative_url(unescapeHTML(mobj.group('url'))),
|
||||||
|
'title': video_title,
|
||||||
|
'description': video_description,
|
||||||
|
'thumbnail': video_thumbnail,
|
||||||
|
'uploader': video_uploader,
|
||||||
|
}
|
||||||
|
video_id = mobj.group('video_id')
|
||||||
|
if video_id:
|
||||||
|
info.update({
|
||||||
|
'ie_key': 'MangomoloVideo',
|
||||||
|
'id': video_id,
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
info.update({
|
||||||
|
'ie_key': 'MangomoloLive',
|
||||||
|
'id': mobj.group('channel_id'),
|
||||||
|
})
|
||||||
|
return info
|
||||||
|
|
||||||
# Look for Instagram embeds
|
# Look for Instagram embeds
|
||||||
instagram_embed_url = InstagramIE._extract_embed_url(webpage)
|
instagram_embed_url = InstagramIE._extract_embed_url(webpage)
|
||||||
if instagram_embed_url is not None:
|
if instagram_embed_url is not None:
|
||||||
|
|
54
youtube_dl/extractor/mangomolo.py
Normal file
54
youtube_dl/extractor/mangomolo.py
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
# coding: utf-8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import base64
|
||||||
|
|
||||||
|
from .common import InfoExtractor
|
||||||
|
from ..compat import compat_urllib_parse_unquote
|
||||||
|
from ..utils import (
|
||||||
|
int_or_none,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class MangomoloBaseIE(InfoExtractor):
|
||||||
|
def _get_real_id(self, page_id):
|
||||||
|
return page_id
|
||||||
|
|
||||||
|
def _real_extract(self, url):
|
||||||
|
page_id = self._get_real_id(self._match_id(url))
|
||||||
|
webpage = self._download_webpage(url, page_id)
|
||||||
|
hidden_inputs = self._hidden_inputs(webpage)
|
||||||
|
m3u8_entry_protocol = 'm3u8' if self._IS_LIVE else 'm3u8_native'
|
||||||
|
|
||||||
|
format_url = self._html_search_regex(
|
||||||
|
[
|
||||||
|
r'file\s*:\s*"(https?://[^"]+?/playlist.m3u8)',
|
||||||
|
r'<a[^>]+href="(rtsp://[^"]+)"'
|
||||||
|
], webpage, 'format url')
|
||||||
|
formats = self._extract_wowza_formats(
|
||||||
|
format_url, page_id, m3u8_entry_protocol, ['smil'])
|
||||||
|
self._sort_formats(formats)
|
||||||
|
|
||||||
|
return {
|
||||||
|
'id': page_id,
|
||||||
|
'title': self._live_title(page_id) if self._IS_LIVE else page_id,
|
||||||
|
'uploader_id': hidden_inputs.get('userid'),
|
||||||
|
'duration': int_or_none(hidden_inputs.get('duration')),
|
||||||
|
'is_live': self._IS_LIVE,
|
||||||
|
'formats': formats,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class MangomoloVideoIE(MangomoloBaseIE):
|
||||||
|
IENAME = 'mangomolo:video'
|
||||||
|
_VALID_URL = r'https?://admin\.mangomolo.com/analytics/index\.php/customers/embed/video\?.*?\bid=(?P<id>\d+)'
|
||||||
|
_IS_LIVE = False
|
||||||
|
|
||||||
|
|
||||||
|
class MangomoloLiveIE(MangomoloBaseIE):
|
||||||
|
IENAME = 'mangomolo:live'
|
||||||
|
_VALID_URL = r'https?://admin\.mangomolo.com/analytics/index\.php/customers/embed/index\?.*?\bchannelid=(?P<id>(?:[A-Za-z0-9+/=]|%2B|%2F|%3D)+)'
|
||||||
|
_IS_LIVE = True
|
||||||
|
|
||||||
|
def _get_real_id(self, page_id):
|
||||||
|
return base64.b64decode(compat_urllib_parse_unquote(page_id).encode()).decode()
|
Loading…
Reference in a new issue