|
|
|
@ -4,7 +4,10 @@ from __future__ import unicode_literals
|
|
|
|
|
import re
|
|
|
|
|
|
|
|
|
|
from .common import InfoExtractor
|
|
|
|
|
from ..compat import compat_urlparse
|
|
|
|
|
from ..compat import (
|
|
|
|
|
compat_str,
|
|
|
|
|
compat_urlparse,
|
|
|
|
|
)
|
|
|
|
|
from ..utils import (
|
|
|
|
|
determine_ext,
|
|
|
|
|
ExtractorError,
|
|
|
|
@ -96,7 +99,7 @@ class LifeNewsIE(InfoExtractor):
|
|
|
|
|
r'<video[^>]+><source[^>]+src=["\'](.+?)["\']', webpage)
|
|
|
|
|
|
|
|
|
|
iframe_links = re.findall(
|
|
|
|
|
r'<iframe[^>]+src=["\']((?:https?:)?//embed\.life\.ru/embed/.+?)["\']',
|
|
|
|
|
r'<iframe[^>]+src=["\']((?:https?:)?//embed\.life\.ru/(?:embed|video)/.+?)["\']',
|
|
|
|
|
webpage)
|
|
|
|
|
|
|
|
|
|
if not video_urls and not iframe_links:
|
|
|
|
@ -164,9 +167,9 @@ class LifeNewsIE(InfoExtractor):
|
|
|
|
|
|
|
|
|
|
class LifeEmbedIE(InfoExtractor):
|
|
|
|
|
IE_NAME = 'life:embed'
|
|
|
|
|
_VALID_URL = r'https?://embed\.life\.ru/embed/(?P<id>[\da-f]{32})'
|
|
|
|
|
_VALID_URL = r'https?://embed\.life\.ru/(?:embed|video)/(?P<id>[\da-f]{32})'
|
|
|
|
|
|
|
|
|
|
_TEST = {
|
|
|
|
|
_TESTS = [{
|
|
|
|
|
'url': 'http://embed.life.ru/embed/e50c2dec2867350528e2574c899b8291',
|
|
|
|
|
'md5': 'b889715c9e49cb1981281d0e5458fbbe',
|
|
|
|
|
'info_dict': {
|
|
|
|
@ -175,30 +178,57 @@ class LifeEmbedIE(InfoExtractor):
|
|
|
|
|
'title': 'e50c2dec2867350528e2574c899b8291',
|
|
|
|
|
'thumbnail': 're:http://.*\.jpg',
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}, {
|
|
|
|
|
# with 1080p
|
|
|
|
|
'url': 'https://embed.life.ru/video/e50c2dec2867350528e2574c899b8291',
|
|
|
|
|
'only_matching': True,
|
|
|
|
|
}]
|
|
|
|
|
|
|
|
|
|
def _real_extract(self, url):
|
|
|
|
|
video_id = self._match_id(url)
|
|
|
|
|
|
|
|
|
|
webpage = self._download_webpage(url, video_id)
|
|
|
|
|
|
|
|
|
|
thumbnail = None
|
|
|
|
|
formats = []
|
|
|
|
|
for video_url in re.findall(r'"file"\s*:\s*"([^"]+)', webpage):
|
|
|
|
|
video_url = compat_urlparse.urljoin(url, video_url)
|
|
|
|
|
ext = determine_ext(video_url)
|
|
|
|
|
if ext == 'm3u8':
|
|
|
|
|
formats.extend(self._extract_m3u8_formats(
|
|
|
|
|
video_url, video_id, 'mp4',
|
|
|
|
|
entry_protocol='m3u8_native', m3u8_id='m3u8'))
|
|
|
|
|
else:
|
|
|
|
|
formats.append({
|
|
|
|
|
'url': video_url,
|
|
|
|
|
'format_id': ext,
|
|
|
|
|
'preference': 1,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
def extract_m3u8(manifest_url):
|
|
|
|
|
formats.extend(self._extract_m3u8_formats(
|
|
|
|
|
manifest_url, video_id, 'mp4',
|
|
|
|
|
entry_protocol='m3u8_native', m3u8_id='m3u8'))
|
|
|
|
|
|
|
|
|
|
def extract_original(original_url):
|
|
|
|
|
formats.append({
|
|
|
|
|
'url': original_url,
|
|
|
|
|
'format_id': determine_ext(original_url, None),
|
|
|
|
|
'preference': 1,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
playlist = self._parse_json(
|
|
|
|
|
self._search_regex(
|
|
|
|
|
r'options\s*=\s*({.+?});', webpage, 'options', default='{}'),
|
|
|
|
|
video_id).get('playlist', {})
|
|
|
|
|
if playlist:
|
|
|
|
|
master = playlist.get('master')
|
|
|
|
|
if isinstance(master, compat_str) and determine_ext(master) == 'm3u8':
|
|
|
|
|
extract_m3u8(compat_urlparse.urljoin(url, master))
|
|
|
|
|
original = playlist.get('original')
|
|
|
|
|
if isinstance(original, compat_str):
|
|
|
|
|
extract_original(original)
|
|
|
|
|
thumbnail = playlist.get('image')
|
|
|
|
|
|
|
|
|
|
# Old rendition fallback
|
|
|
|
|
if not formats:
|
|
|
|
|
for video_url in re.findall(r'"file"\s*:\s*"([^"]+)', webpage):
|
|
|
|
|
video_url = compat_urlparse.urljoin(url, video_url)
|
|
|
|
|
if determine_ext(video_url) == 'm3u8':
|
|
|
|
|
extract_m3u8(video_url)
|
|
|
|
|
else:
|
|
|
|
|
extract_original(video_url)
|
|
|
|
|
|
|
|
|
|
self._sort_formats(formats)
|
|
|
|
|
|
|
|
|
|
thumbnail = self._search_regex(
|
|
|
|
|
thumbnail = thumbnail or self._search_regex(
|
|
|
|
|
r'"image"\s*:\s*"([^"]+)', webpage, 'thumbnail', default=None)
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|