You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
4.1 KiB
125 lines
4.1 KiB
# coding: utf-8 |
|
from __future__ import unicode_literals |
|
|
|
import re |
|
|
|
from .common import InfoExtractor |
|
from ..compat import compat_urlparse |
|
from ..utils import ( |
|
determine_ext, |
|
ExtractorError, |
|
int_or_none, |
|
xpath_text, |
|
qualities, |
|
) |
|
|
|
|
|
class PladformIE(InfoExtractor): |
|
_VALID_URL = r'''(?x) |
|
https?:// |
|
(?: |
|
(?: |
|
out\.pladform\.ru/player| |
|
static\.pladform\.ru/player\.swf |
|
) |
|
\?.*\bvideoid=| |
|
video\.pladform\.ru/catalog/video/videoid/ |
|
) |
|
(?P<id>\d+) |
|
''' |
|
_TESTS = [{ |
|
'url': 'https://out.pladform.ru/player?pl=64471&videoid=3777899&vk_puid15=0&vk_puid34=0', |
|
'md5': '53362fac3a27352da20fa2803cc5cd6f', |
|
'info_dict': { |
|
'id': '3777899', |
|
'ext': 'mp4', |
|
'title': 'СТУДИЯ СОЮЗ • Шоу Студия Союз, 24 выпуск (01.02.2018) Нурлан Сабуров и Слава Комиссаренко', |
|
'description': 'md5:05140e8bf1b7e2d46e7ba140be57fd95', |
|
'thumbnail': r're:^https?://.*\.jpg$', |
|
'duration': 3190, |
|
}, |
|
}, { |
|
'url': 'http://static.pladform.ru/player.swf?pl=21469&videoid=100183293&vkcid=0', |
|
'only_matching': True, |
|
}, { |
|
'url': 'http://video.pladform.ru/catalog/video/videoid/100183293/vkcid/0', |
|
'only_matching': True, |
|
}] |
|
|
|
@staticmethod |
|
def _extract_url(webpage): |
|
mobj = re.search( |
|
r'<iframe[^>]+src=(["\'])(?P<url>(?:https?:)?//out\.pladform\.ru/player\?.+?)\1', webpage) |
|
if mobj: |
|
return mobj.group('url') |
|
|
|
def _real_extract(self, url): |
|
video_id = self._match_id(url) |
|
|
|
qs = compat_urlparse.parse_qs(compat_urlparse.urlparse(url).query) |
|
pl = qs.get('pl', ['1'])[0] |
|
|
|
video = self._download_xml( |
|
'http://out.pladform.ru/getVideo', video_id, query={ |
|
'pl': pl, |
|
'videoid': video_id, |
|
}) |
|
|
|
def fail(text): |
|
raise ExtractorError( |
|
'%s returned error: %s' % (self.IE_NAME, text), |
|
expected=True) |
|
|
|
if video.tag == 'error': |
|
fail(video.text) |
|
|
|
quality = qualities(('ld', 'sd', 'hd')) |
|
|
|
formats = [] |
|
for src in video.findall('./src'): |
|
if src is None: |
|
continue |
|
format_url = src.text |
|
if not format_url: |
|
continue |
|
if src.get('type') == 'hls' or determine_ext(format_url) == 'm3u8': |
|
formats.extend(self._extract_m3u8_formats( |
|
format_url, video_id, 'mp4', entry_protocol='m3u8_native', |
|
m3u8_id='hls', fatal=False)) |
|
else: |
|
formats.append({ |
|
'url': src.text, |
|
'format_id': src.get('quality'), |
|
'quality': quality(src.get('quality')), |
|
}) |
|
|
|
if not formats: |
|
error = xpath_text(video, './cap', 'error', default=None) |
|
if error: |
|
fail(error) |
|
|
|
self._sort_formats(formats) |
|
|
|
webpage = self._download_webpage( |
|
'http://video.pladform.ru/catalog/video/videoid/%s' % video_id, |
|
video_id) |
|
|
|
title = self._og_search_title(webpage, fatal=False) or xpath_text( |
|
video, './/title', 'title', fatal=True) |
|
description = self._search_regex( |
|
r'</h3>\s*<p>([^<]+)</p>', webpage, 'description', fatal=False) |
|
thumbnail = self._og_search_thumbnail(webpage) or xpath_text( |
|
video, './/cover', 'cover') |
|
|
|
duration = int_or_none(xpath_text(video, './/time', 'duration')) |
|
age_limit = int_or_none(xpath_text(video, './/age18', 'age limit')) |
|
|
|
return { |
|
'id': video_id, |
|
'title': title, |
|
'description': description, |
|
'thumbnail': thumbnail, |
|
'duration': duration, |
|
'age_limit': age_limit, |
|
'formats': formats, |
|
}
|
|
|