2014-01-31 04:48:00 +08:00
# encoding: utf-8
from __future__ import unicode_literals
import re
from . common import InfoExtractor
2015-05-10 03:03:26 +08:00
from . . compat import compat_urlparse
2014-02-10 22:07:41 +08:00
from . . utils import (
2015-05-10 03:03:26 +08:00
determine_ext ,
2016-05-23 05:44:04 +08:00
ExtractorError ,
2014-02-10 22:07:41 +08:00
int_or_none ,
2016-05-23 05:44:04 +08:00
parse_iso8601 ,
2015-06-17 22:28:47 +08:00
remove_end ,
2014-02-10 22:07:41 +08:00
)
2014-01-31 04:48:00 +08:00
class LifeNewsIE ( InfoExtractor ) :
2016-05-23 06:00:08 +08:00
IE_NAME = ' life '
IE_DESC = ' Life.ru '
_VALID_URL = r ' https?://life \ .ru/t/[^/]+/(?P<id> \ d+) '
2014-02-10 22:07:41 +08:00
2015-05-04 01:24:19 +08:00
_TESTS = [ {
2016-03-02 00:59:11 +08:00
# single video embedded via video/source
2016-05-23 06:00:08 +08:00
' url ' : ' https://life.ru/t/новости/98736 ' ,
2016-03-02 00:59:11 +08:00
' md5 ' : ' 77c95eaefaca216e32a76a343ad89d23 ' ,
2014-01-31 04:48:00 +08:00
' info_dict ' : {
2016-03-02 00:59:11 +08:00
' id ' : ' 98736 ' ,
2014-02-10 22:07:41 +08:00
' ext ' : ' mp4 ' ,
2016-03-02 00:59:11 +08:00
' title ' : ' Мужчина нашел дома архив оборонного завода ' ,
' description ' : ' md5:3b06b1b39b5e2bea548e403d99b8bf26 ' ,
2016-05-23 05:44:04 +08:00
' timestamp ' : 1344154740 ,
2016-03-02 00:59:11 +08:00
' upload_date ' : ' 20120805 ' ,
2016-05-23 05:44:04 +08:00
' view_count ' : int ,
2014-01-31 04:48:00 +08:00
}
2015-05-04 01:24:19 +08:00
} , {
2016-03-02 00:59:11 +08:00
# single video embedded via iframe
2016-05-23 06:00:08 +08:00
' url ' : ' https://life.ru/t/новости/152125 ' ,
2015-05-04 01:24:19 +08:00
' md5 ' : ' 77d19a6f0886cd76bdbf44b4d971a273 ' ,
' info_dict ' : {
' id ' : ' 152125 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' В Сети появилось видео захвата «Правым сектором» колхозных полей ' ,
' description ' : ' Жители двух поселков Днепропетровской области не простили радикалам угрозу лишения плодородных земель и пошли в лобовую. ' ,
2016-05-23 05:44:04 +08:00
' timestamp ' : 1427961840 ,
2015-05-04 01:24:19 +08:00
' upload_date ' : ' 20150402 ' ,
2016-05-23 05:44:04 +08:00
' view_count ' : int ,
2015-05-04 01:24:19 +08:00
}
2015-05-05 23:39:54 +08:00
} , {
2016-03-02 00:59:11 +08:00
# two videos embedded via iframe
2016-05-23 06:00:08 +08:00
' url ' : ' https://life.ru/t/новости/153461 ' ,
2015-05-05 23:39:54 +08:00
' info_dict ' : {
' id ' : ' 153461 ' ,
' title ' : ' В Москве спасли потерявшегося медвежонка, который спрятался на дереве' ,
' description ' : ' Маленький хищник не смог найти дорогу домой и обрел временное убежище на тополе недалеко от жилого массива, пока е г о не нашла соседская собака. ' ,
2016-05-23 05:44:04 +08:00
' timestamp ' : 1430825520 ,
' view_count ' : int ,
2016-03-02 00:59:11 +08:00
} ,
' playlist ' : [ {
' md5 ' : ' 9b6ef8bc0ffa25aebc8bdb40d89ab795 ' ,
' info_dict ' : {
' id ' : ' 153461-video1 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' В Москве спасли потерявшегося медвежонка, который спрятался на дереве (Видео 1)' ,
' description ' : ' Маленький хищник не смог найти дорогу домой и обрел временное убежище на тополе недалеко от жилого массива, пока е г о не нашла соседская собака. ' ,
2016-05-23 05:44:04 +08:00
' timestamp ' : 1430825520 ,
2016-03-02 00:59:11 +08:00
' upload_date ' : ' 20150505 ' ,
} ,
} , {
' md5 ' : ' ebb3bf3b1ce40e878d0d628e93eb0322 ' ,
' info_dict ' : {
' id ' : ' 153461-video2 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' В Москве спасли потерявшегося медвежонка, который спрятался на дереве (Видео 2)' ,
' description ' : ' Маленький хищник не смог найти дорогу домой и обрел временное убежище на тополе недалеко от жилого массива, пока е г о не нашла соседская собака. ' ,
2016-05-23 05:44:04 +08:00
' timestamp ' : 1430825520 ,
2016-03-02 00:59:11 +08:00
' upload_date ' : ' 20150505 ' ,
} ,
} ] ,
2015-05-10 02:27:49 +08:00
} , {
2016-05-23 06:00:08 +08:00
' url ' : ' https://life.ru/t/новости/213035 ' ,
' only_matching ' : True ,
} , {
' url ' : ' https://life.ru/t/ % D0 % BD % D0 % BE % D0 % B2 % D0 % BE % D1 %81% D1 %82% D0 % B8/153461 ' ,
' only_matching ' : True ,
} , {
' url ' : ' https://life.ru/t/новости/411489/manuel_vals_nazval_frantsiiu_tsieliu_nomier_odin_dlia_ighil ' ,
2015-05-10 02:27:49 +08:00
' only_matching ' : True ,
2015-05-04 01:24:19 +08:00
} ]
2014-01-31 04:48:00 +08:00
def _real_extract ( self , url ) :
2016-05-23 06:00:08 +08:00
video_id = self . _match_id ( url )
2014-01-31 04:48:00 +08:00
2016-05-23 06:00:08 +08:00
webpage = self . _download_webpage ( url , video_id )
2014-01-31 04:48:00 +08:00
2016-03-02 00:59:11 +08:00
video_urls = re . findall (
r ' <video[^>]+><source[^>]+src=[ " \' ](.+?)[ " \' ] ' , webpage )
iframe_links = re . findall (
r ' <iframe[^>]+src=[ " \' ]((?:https?:)?//embed \ .life \ .ru/embed/.+?)[ " \' ] ' ,
webpage )
if not video_urls and not iframe_links :
2014-02-28 23:52:06 +08:00
raise ExtractorError ( ' No media links available for %s ' % video_id )
2014-01-31 04:48:00 +08:00
2015-06-17 22:28:47 +08:00
title = remove_end (
self . _og_search_title ( webpage ) ,
2016-05-23 06:00:08 +08:00
' - Life.ru ' )
2014-01-31 04:48:00 +08:00
description = self . _og_search_description ( webpage )
view_count = self . _html_search_regex (
2016-05-23 05:44:04 +08:00
r ' <div[^>]+class=([ " \' ]).*? \ bhits-count \ b.*? \ 1[^>]*> \ s*(?P<value> \ d+) \ s*</div> ' ,
webpage , ' view count ' , fatal = False , group = ' value ' )
2014-01-31 04:48:00 +08:00
2016-05-23 05:44:04 +08:00
timestamp = parse_iso8601 ( self . _search_regex (
r ' <time[^>]+datetime=([ " \' ])(?P<value>.+?) \ 1 ' ,
webpage , ' upload date ' , fatal = False , group = ' value ' ) )
2014-01-31 04:48:00 +08:00
2015-05-04 01:24:19 +08:00
common_info = {
' description ' : description ,
' view_count ' : int_or_none ( view_count ) ,
2016-05-23 05:44:04 +08:00
' timestamp ' : timestamp ,
2015-05-04 01:24:19 +08:00
}
2016-03-02 00:59:11 +08:00
def make_entry ( video_id , video_url , index = None ) :
2015-05-04 01:24:19 +08:00
cur_info = dict ( common_info )
cur_info . update ( {
2016-03-02 00:59:11 +08:00
' id ' : video_id if not index else ' %s -video %s ' % ( video_id , index ) ,
' url ' : video_url ,
' title ' : title if not index else ' %s (Видео %s ) ' % ( title , index ) ,
2015-05-04 01:24:19 +08:00
} )
return cur_info
2016-03-02 00:59:11 +08:00
def make_video_entry ( video_id , video_url , index = None ) :
video_url = compat_urlparse . urljoin ( url , video_url )
return make_entry ( video_id , video_url , index )
def make_iframe_entry ( video_id , video_url , index = None ) :
video_url = self . _proto_relative_url ( video_url , ' http: ' )
cur_info = make_entry ( video_id , video_url , index )
cur_info [ ' _type ' ] = ' url_transparent '
2015-05-04 01:24:19 +08:00
return cur_info
2014-02-28 23:52:06 +08:00
2016-03-02 00:59:11 +08:00
if len ( video_urls ) == 1 and not iframe_links :
return make_video_entry ( video_id , video_urls [ 0 ] )
if len ( iframe_links ) == 1 and not video_urls :
return make_iframe_entry ( video_id , iframe_links [ 0 ] )
entries = [ ]
if video_urls :
for num , video_url in enumerate ( video_urls , 1 ) :
entries . append ( make_video_entry ( video_id , video_url , num ) )
if iframe_links :
for num , iframe_link in enumerate ( iframe_links , len ( video_urls ) + 1 ) :
entries . append ( make_iframe_entry ( video_id , iframe_link , num ) )
playlist = common_info . copy ( )
playlist . update ( self . playlist_result ( entries , video_id , title , description ) )
return playlist
2015-05-10 03:03:26 +08:00
class LifeEmbedIE ( InfoExtractor ) :
IE_NAME = ' life:embed '
2016-03-21 23:36:32 +08:00
_VALID_URL = r ' https?://embed \ .life \ .ru/embed/(?P<id>[ \ da-f] {32} ) '
2015-05-10 03:03:26 +08:00
_TEST = {
' url ' : ' http://embed.life.ru/embed/e50c2dec2867350528e2574c899b8291 ' ,
' md5 ' : ' b889715c9e49cb1981281d0e5458fbbe ' ,
' info_dict ' : {
' id ' : ' e50c2dec2867350528e2574c899b8291 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' e50c2dec2867350528e2574c899b8291 ' ,
' thumbnail ' : ' re:http://.* \ .jpg ' ,
}
}
def _real_extract ( self , url ) :
video_id = self . _match_id ( url )
webpage = self . _download_webpage ( url , video_id )
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 (
2016-05-23 06:22:09 +08:00
video_url , video_id , ' mp4 ' ,
entry_protocol = ' m3u8_native ' , m3u8_id = ' m3u8 ' ) )
2015-05-10 03:03:26 +08:00
else :
formats . append ( {
' url ' : video_url ,
' format_id ' : ext ,
' preference ' : 1 ,
} )
2015-05-10 10:54:50 +08:00
self . _sort_formats ( formats )
2015-05-10 03:03:26 +08:00
thumbnail = self . _search_regex (
r ' " image " \ s*: \ s* " ([^ " ]+) ' , webpage , ' thumbnail ' , default = None )
return {
' id ' : video_id ,
' title ' : video_id ,
' thumbnail ' : thumbnail ,
' formats ' : formats ,
}