]>
Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/extractor/lifenews.py 
afce2010eafadc3ceaab1eaa7d846e5e6360d547
   2  from  __future__ 
import  unicode_literals
   6  from  . common 
import  InfoExtractor
  20  class  LifeNewsIE ( InfoExtractor
):   23      _VALID_URL 
=  r
'https?://life\.ru/t/[^/]+/(?P<id>\d+)'   26          # single video embedded via video/source   27          'url' :  'https://life.ru/t/новости/98736' ,   28          'md5' :  '77c95eaefaca216e32a76a343ad89d23' ,   32              'title' :  'Мужчина нашел дома архив оборонного завода' ,   33              'description' :  'md5:3b06b1b39b5e2bea548e403d99b8bf26' ,   34              'timestamp' :  1344154740 ,   35              'upload_date' :  '20120805' ,   39          # single video embedded via iframe   40          'url' :  'https://life.ru/t/новости/152125' ,   41          'md5' :  '77d19a6f0886cd76bdbf44b4d971a273' ,   45              'title' :  'В Сети появилось видео захвата «Правым сектором» колхозных полей ' ,   46              'description' :  'Жители двух поселков Днепропетровской области не простили радикалам угрозу лишения плодородных земель и пошли в лобовую. ' ,   47              'timestamp' :  1427961840 ,   48              'upload_date' :  '20150402' ,   52          # two videos embedded via iframe   53          'url' :  'https://life.ru/t/новости/153461' ,   56              'title' :  'В Москве спасли потерявшегося медвежонка, который спрятался на дереве' ,   57              'description' :  'Маленький хищник не смог найти дорогу домой и обрел временное убежище на тополе недалеко от жилого массива, пока его не нашла соседская собака.' ,   58              'timestamp' :  1430825520 ,   62              'md5' :  '9b6ef8bc0ffa25aebc8bdb40d89ab795' ,   64                  'id' :  '153461-video1' ,   66                  'title' :  'В Москве спасли потерявшегося медвежонка, который спрятался на дереве (Видео 1)' ,   67                  'description' :  'Маленький хищник не смог найти дорогу домой и обрел временное убежище на тополе недалеко от жилого массива, пока его не нашла соседская собака.' ,   68                  'timestamp' :  1430825520 ,   69                  'upload_date' :  '20150505' ,   72              'md5' :  'ebb3bf3b1ce40e878d0d628e93eb0322' ,   74                  'id' :  '153461-video2' ,   76                  'title' :  'В Москве спасли потерявшегося медвежонка, который спрятался на дереве (Видео 2)' ,   77                  'description' :  'Маленький хищник не смог найти дорогу домой и обрел временное убежище на тополе недалеко от жилого массива, пока его не нашла соседская собака.' ,   78                  'timestamp' :  1430825520 ,   79                  'upload_date' :  '20150505' ,   83          'url' :  'https://life.ru/t/новости/213035' ,   84          'only_matching' :  True ,   86          'url' :  'https://life.ru/t/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/153461' ,   87          'only_matching' :  True ,   89          'url' :  'https://life.ru/t/новости/411489/manuel_vals_nazval_frantsiiu_tsieliu_nomier_odin_dlia_ighil' ,   90          'only_matching' :  True ,   93      def  _real_extract ( self
,  url
):   94          video_id 
=  self
._ match
_ id
( url
)   96          webpage 
=  self
._ download
_ webpage
( url
,  video_id
)   98          video_urls 
=  re
. findall (   99              r
'<video[^>]+><source[^>]+src=["\' ](.+ ?
)[ " \' ]', webpage)  101          iframe_links = re.findall(  102              r'<iframe[^>]+src=[" \' ](( ?
: https?
:) ?
// embed\
. life\
. ru
/( ?
: embed|video
)/.+ ?
)[ " \' ]',  105          if not video_urls and not iframe_links:  106              raise ExtractorError('No media links available for  %s ' % video_id)  109              self._og_search_title(webpage),  112          description = self._og_search_description(webpage)  114          view_count = self._html_search_regex(  115              r'<div[^>]+class=([" \' ]).* ?
\b hits
- count
\b .* ?\
1 [ ^
>]*> \s
*( ?P
< value
> \d
+) \s
*</ div
> ',  116              webpage, ' view count
', fatal=False, group=' value
')  118          timestamp = parse_iso8601(self._search_regex(  119              r' < time
[ ^
>]+ datetime
=([ " \' ])(?P<value>.+?)\1',  120              webpage, 'upload date', fatal=False, group='value'))  123              'description': description,  124              'view_count': int_or_none(view_count),  125              'timestamp': timestamp,  128          def make_entry(video_id, video_url, index=None):  129              cur_info = dict(common_info)  131                  'id': video_id if not index else ' %s- video %s ' % (video_id, index),  133                  'title': title if not index else ' %s  (Видео  %s )' % (title, index),  137          def make_video_entry(video_id, video_url, index=None):  138              video_url = compat_urlparse.urljoin(url, video_url)  139              return make_entry(video_id, video_url, index)  141          def make_iframe_entry(video_id, video_url, index=None):  142              video_url = self._proto_relative_url(video_url, 'http:')  143              cur_info = make_entry(video_id, video_url, index)  144              cur_info['_type'] = 'url_transparent'  147          if len(video_urls) == 1 and not iframe_links:  148              return make_video_entry(video_id, video_urls[0])  150          if len(iframe_links) == 1 and not video_urls:  151              return make_iframe_entry(video_id, iframe_links[0])  156              for num, video_url in enumerate(video_urls, 1):  157                  entries.append(make_video_entry(video_id, video_url, num))  160              for num, iframe_link in enumerate(iframe_links, len(video_urls) + 1):  161                  entries.append(make_iframe_entry(video_id, iframe_link, num))  163          playlist = common_info.copy()  164          playlist.update(self.playlist_result(entries, video_id, title, description))  168  class LifeEmbedIE(InfoExtractor):  169      IE_NAME = 'life:embed'  170      _VALID_URL = r'https?://embed\.life\.ru/(?:embed|video)/(?P<id>[\da-f] {32} )'  173          'url': 'http://embed.life.ru/embed/e50c2dec2867350528e2574c899b8291',  174          'md5': 'b889715c9e49cb1981281d0e5458fbbe',  176              'id': 'e50c2dec2867350528e2574c899b8291',  178              'title': 'e50c2dec2867350528e2574c899b8291',  179              'thumbnail': 're:http://.*\.jpg',  183          'url': 'https://embed.life.ru/video/e50c2dec2867350528e2574c899b8291',  184          'only_matching': True,  187      def _real_extract(self, url):  188          video_id = self._match_id(url)  190          webpage = self._download_webpage(url, video_id)  195          def extract_m3u8(manifest_url):  196              formats.extend(self._extract_m3u8_formats(  197                  manifest_url, video_id, 'mp4',  198                  entry_protocol='m3u8_native', m3u8_id='m3u8'))  200          def extract_original(original_url):  203                  'format_id': determine_ext(original_url, None),  207          playlist = self._parse_json(  209                  r'options\s*=\s*({.+?});', webpage, 'options', default='{}'),  210              video_id).get('playlist', {})  212              master = playlist.get('master')  213              if isinstance(master, compat_str) and determine_ext(master) == 'm3u8':  214                  extract_m3u8(compat_urlparse.urljoin(url, master))  215              original = playlist.get('original')  216              if isinstance(original, compat_str):  217                  extract_original(original)  218              thumbnail = playlist.get('image')  220          # Old rendition fallback  222              for video_url in re.findall(r'" file "\s*:\s*" ([ ^
"]+)', webpage):  223                  video_url = compat_urlparse.urljoin(url, video_url)  224                  if determine_ext(video_url) == 'm3u8':  225                      extract_m3u8(video_url)  227                      extract_original(video_url)  229          self._sort_formats(formats)  231          thumbnail = thumbnail or self._search_regex(  232              r'" image
"\s*:\s*" ([ ^
"]+)', webpage, 'thumbnail', default=None)  237              'thumbnail': thumbnail,