summaryrefslogtreecommitdiff
path: root/youtube_dl/extractor/tvigle.py
blob: f3817ab288473a01e899f335821c241fe43d0e91 (plain)
    1 # coding: utf-8
    2 from __future__ import unicode_literals
    3 
    4 import re
    5 
    6 from .common import InfoExtractor
    7 from ..utils import (
    8     ExtractorError,
    9     float_or_none,
   10     int_or_none,
   11     parse_age_limit,
   12 )
   13 
   14 
   15 class TvigleIE(InfoExtractor):
   16     IE_NAME = 'tvigle'
   17     IE_DESC = 'Интернет-телевидение Tvigle.ru'
   18     _VALID_URL = r'https?://(?:www\.)?(?:tvigle\.ru/(?:[^/]+/)+(?P<display_id>[^/]+)/$|cloud\.tvigle\.ru/video/(?P<id>\d+))'
   19 
   20     _TESTS = [
   21         {
   22             'url': 'http://www.tvigle.ru/video/sokrat/',
   23             'md5': '36514aed3657d4f70b4b2cef8eb520cd',
   24             'info_dict': {
   25                 'id': '1848932',
   26                 'display_id': 'sokrat',
   27                 'ext': 'flv',
   28                 'title': 'Сократ',
   29                 'description': 'md5:d6b92ffb7217b4b8ebad2e7665253c17',
   30                 'duration': 6586,
   31                 'age_limit': 12,
   32             },
   33             'skip': 'georestricted',
   34         },
   35         {
   36             'url': 'http://www.tvigle.ru/video/vladimir-vysotskii/vedushchii-teleprogrammy-60-minut-ssha-o-vladimire-vysotskom/',
   37             'md5': 'e7efe5350dd5011d0de6550b53c3ba7b',
   38             'info_dict': {
   39                 'id': '5142516',
   40                 'ext': 'flv',
   41                 'title': 'Ведущий телепрограммы «60 минут» (США) о Владимире Высоцком',
   42                 'description': 'md5:027f7dc872948f14c96d19b4178428a4',
   43                 'duration': 186.080,
   44                 'age_limit': 0,
   45             },
   46             'skip': 'georestricted',
   47         }, {
   48             'url': 'https://cloud.tvigle.ru/video/5267604/',
   49             'only_matching': True,
   50         }
   51     ]
   52 
   53     def _real_extract(self, url):
   54         mobj = re.match(self._VALID_URL, url)
   55         video_id = mobj.group('id')
   56         display_id = mobj.group('display_id')
   57 
   58         if not video_id:
   59             webpage = self._download_webpage(url, display_id)
   60             video_id = self._html_search_regex(
   61                 (r'<div[^>]+class=["\']player["\'][^>]+id=["\'](\d+)',
   62                  r'var\s+cloudId\s*=\s*["\'](\d+)',
   63                  r'class="video-preview current_playing" id="(\d+)"'),
   64                 webpage, 'video id')
   65 
   66         video_data = self._download_json(
   67             'http://cloud.tvigle.ru/api/play/video/%s/' % video_id, display_id)
   68 
   69         item = video_data['playlist']['items'][0]
   70 
   71         videos = item.get('videos')
   72 
   73         error_message = item.get('errorMessage')
   74         if not videos and error_message:
   75             raise ExtractorError(
   76                 '%s returned error: %s' % (self.IE_NAME, error_message), expected=True)
   77 
   78         title = item['title']
   79         description = item.get('description')
   80         thumbnail = item.get('thumbnail')
   81         duration = float_or_none(item.get('durationMilliseconds'), 1000)
   82         age_limit = parse_age_limit(item.get('ageRestrictions'))
   83 
   84         formats = []
   85         for vcodec, fmts in item['videos'].items():
   86             if vcodec == 'hls':
   87                 continue
   88             for format_id, video_url in fmts.items():
   89                 if format_id == 'm3u8':
   90                     continue
   91                 height = self._search_regex(
   92                     r'^(\d+)[pP]$', format_id, 'height', default=None)
   93                 formats.append({
   94                     'url': video_url,
   95                     'format_id': '%s-%s' % (vcodec, format_id),
   96                     'vcodec': vcodec,
   97                     'height': int_or_none(height),
   98                     'filesize': int_or_none(item.get('video_files_size', {}).get(vcodec, {}).get(format_id)),
   99                 })
  100         self._sort_formats(formats)
  101 
  102         return {
  103             'id': video_id,
  104             'display_id': display_id,
  105             'title': title,
  106             'description': description,
  107             'thumbnail': thumbnail,
  108             'duration': duration,
  109             'age_limit': age_limit,
  110             'formats': formats,
  111         }

Generated by cgit