]>
Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/extractor/videomore.py
   2 from __future__ 
import unicode_literals
 
   6 from .common 
import InfoExtractor
 
  15 class VideomoreIE(InfoExtractor
): 
  17     _VALID_URL 
= r
'videomore:(?P<sid>\d+)$|https?://videomore\.ru/(?:(?:embed|[^/]+/[^/]+)/|[^/]+\?.*\btrack_id=)(?P<id>\d+)(?:[/?#&]|\.(?:xml|json)|$)' 
  19         'url': 'http://videomore.ru/kino_v_detalayah/5_sezon/367617', 
  20         'md5': '70875fbf57a1cd004709920381587185', 
  24             'title': 'В гостях Алексей Чумаков и Юлия Ковальчук', 
  25             'description': 'В гостях – лучшие романтические комедии года, «Выживший» Иньярриту и «Стив Джобс» Дэнни Бойла.', 
  26             'series': 'Кино в деталях', 
  27             'episode': 'В гостях Алексей Чумаков и Юлия Ковальчук', 
  28             'episode_number': None, 
  29             'season': 'Сезон 2015', 
  31             'thumbnail': 're:^https?://.*\.jpg', 
  37         'url': 'http://videomore.ru/embed/259974', 
  42             'description': '«Медведей» ждет решающий матч. Макеев выясняет отношения со Стрельцовым. Парни узнают подробности прошлого Макеева.', 
  43             'series': 'Молодежка', 
  44             'episode': '80 серия', 
  48             'thumbnail': 're:^https?://.*\.jpg', 
  54             'skip_download': True, 
  57         'url': 'http://videomore.ru/molodezhka/sezon_promo/341073', 
  61             'title': 'Команда проиграла из-за Бакина?', 
  62             'description': 'Молодежка 3 сезон скоро', 
  63             'series': 'Молодежка', 
  64             'episode': 'Команда проиграла из-за Бакина?', 
  65             'episode_number': None, 
  68             'thumbnail': 're:^https?://.*\.jpg', 
  74             'skip_download': True, 
  77         'url': 'http://videomore.ru/elki_3?track_id=364623', 
  78         'only_matching': True, 
  80         'url': 'http://videomore.ru/embed/364623', 
  81         'only_matching': True, 
  83         'url': 'http://videomore.ru/video/tracks/364623.xml', 
  84         'only_matching': True, 
  86         'url': 'http://videomore.ru/video/tracks/364623.json', 
  87         'only_matching': True, 
  89         'url': 'http://videomore.ru/video/tracks/158031/quotes/33248', 
  90         'only_matching': True, 
  92         'url': 'videomore:367617', 
  93         'only_matching': True, 
  97     def _extract_url(webpage
): 
  99             r
'<object[^>]+data=(["\'])https?
://videomore
.ru
/player\
.swf
\?.*config
=(?P
<url
>https?
://videomore\
.ru
/(?
:[^
/]+/)+\d
+\
.xml
).*\
1', 
 102             return mobj.group('url
') 
 104     def _real_extract(self, url): 
 105         mobj = re.match(self._VALID_URL, url) 
 106         video_id = mobj.group('sid
') or mobj.group('id') 
 108         video = self._download_xml( 
 109             'http
://videomore
.ru
/video
/tracks
/%s.xml
' % video_id, 
 110             video_id, 'Downloading video XML
') 
 112         video_url = xpath_text(video, './/video_url
', 'video url
', fatal=True) 
 113         formats = self._extract_f4m_formats(video_url, video_id, f4m_id='hds
') 
 115         data = self._download_json( 
 116             'http
://videomore
.ru
/video
/tracks
/%s.json
' % video_id, 
 117             video_id, 'Downloading video JSON
') 
 119         title = data.get('title
') or data['project_title
'] 
 120         description = data.get('description
') or data.get('description_raw
') 
 121         timestamp = parse_iso8601(data.get('published_at
')) 
 122         duration = int_or_none(data.get('duration
')) 
 123         view_count = int_or_none(data.get('views
')) 
 124         age_limit = parse_age_limit(data.get('min_age
')) 
 127         } for thumbnail in data.get('big_thumbnail_urls
', [])] 
 129         series = data.get('project_title
') 
 130         episode = data.get('title
') 
 131         episode_number = int_or_none(data.get('episode_of_season
') or None) 
 132         season = data.get('season_title
') 
 133         season_number = int_or_none(data.get('season_pos
') or None) 
 138             'description
': description, 
 141             'episode_number
': episode_number, 
 143             'season_number
': season_number, 
 144             'thumbnails
': thumbnails, 
 145             'timestamp
': timestamp, 
 146             'duration
': duration, 
 147             'view_count
': view_count, 
 148             'age_limit
': age_limit, 
 153 class VideomoreVideoIE(InfoExtractor): 
 154     IE_NAME = 'videomore
:video
' 
 155     _VALID_URL = r'https?
://videomore\
.ru
/(?
:(?
:[^
/]+/){2}
)?
(?P
<id>[^
/?
#&]+)[/?#&]*$' 
 157         # single video with og:video:iframe 
 158         'url': 'http://videomore.ru/elki_3', 
 164             'thumbnail': 're:^https?://.*\.jpg', 
 170             'skip_download': True, 
 173         # season single series with og:video:iframe 
 174         'url': 'http://videomore.ru/poslednii_ment/1_sezon/14_seriya', 
 175         'only_matching': True, 
 177         'url': 'http://videomore.ru/sejchas_v_seti/serii_221-240/226_vypusk', 
 178         'only_matching': True, 
 180         # single video without og:video:iframe 
 181         'url': 'http://videomore.ru/marin_i_ego_druzya', 
 185             'title': '1 серия. Здравствуй, Аквавилль!', 
 186             'description': 'md5:c6003179538b5d353e7bcd5b1372b2d7', 
 187             'thumbnail': 're:^https?://.*\.jpg', 
 193             'skip_download': True, 
 198     def suitable(cls
, url
): 
 199         return False if VideomoreIE
.suitable(url
) else super(VideomoreVideoIE
, cls
).suitable(url
) 
 201     def _real_extract(self
, url
): 
 202         display_id 
= self
._match
_id
(url
) 
 204         webpage 
= self
._download
_webpage
(url
, display_id
) 
 206         video_url 
= self
._og
_search
_property
( 
 207             'video:iframe', webpage
, 'video url', default
=None) 
 210             video_id 
= self
._search
_regex
( 
 211                 (r
'config\s*:\s*["\']https?
://videomore\
.ru
/video
/tracks
/(\d
+)\
.xml
', 
 212                  r'track
-id=["\'](\d+)', 
 213                  r'xcnt_product_id\s*=\s*(\d+)'), webpage, 'video id') 
 214             video_url = 'videomore:%s' % video_id 
 216         return self.url_result(video_url, VideomoreIE.ie_key()) 
 219 class VideomoreSeasonIE(InfoExtractor): 
 220     IE_NAME = 'videomore:season' 
 221     _VALID_URL = r'https?://videomore\.ru/(?!embed)(?P<id>[^/]+/[^/?#&]+)[/?#&]*$' 
 223         'url': 'http://videomore.ru/molodezhka/sezon_promo', 
 225             'id': 'molodezhka/sezon_promo', 
 226             'title': 'Молодежка Промо', 
 228         'playlist_mincount': 12, 
 231     def _real_extract(self, url): 
 232         display_id = self._match_id(url) 
 234         webpage = self._download_webpage(url, display_id) 
 236         title = self._og_search_title(webpage) 
 239             self.url_result(item) for item in re.findall( 
 240                 r'<a[^>]+href="((?
:https?
:)?
//videomore\
.ru
/%s/[^
/]+)"[^>]+class="widget
-item
-desc
"' 
 241                 % display_id, webpage)] 
 243         return self.playlist_result(entries, display_id, title)