|
@@ -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 {
|