]> jfr.im git - yt-dlp.git/blame - youtube_dl/extractor/ruutu.py
Merge branch 'ruutu' of https://github.com/hlintala/youtube-dl into hlintala-ruutu
[yt-dlp.git] / youtube_dl / extractor / ruutu.py
CommitLineData
22354455
HL
1# coding: utf-8
2from __future__ import unicode_literals
3
4from .common import InfoExtractor
5from ..compat import compat_urllib_parse_urlparse
6import re
7
8
9class RuutuIE(InfoExtractor):
10 _VALID_URL = r'http://(www\.)?ruutu\.fi/ohjelmat/(?:[^/]+/)?(?P<id>.*)$'
11 _TESTS = [
12 {
13 'url': 'http://www.ruutu.fi/ohjelmat/oletko-aina-halunnut-tietaa-mita-tapahtuu-vain-hetki-ennen-lahetysta-nyt-se-selvisi',
14 'md5': 'ab2093f39be1ca8581963451b3c0234f',
15 'info_dict': {
16 'id': 'oletko-aina-halunnut-tietaa-mita-tapahtuu-vain-hetki-ennen-lahetysta-nyt-se-selvisi',
17 'ext': 'mp4',
18 'title': 'Oletko aina halunnut tietää mitä tapahtuu vain hetki ennen lähetystä? - Nyt se selvisi!',
19 'description': 'Toinen toistaan huikeampia ohjelmaideoita ja täysin päätöntä sekoilua? No sitä juuri nimenomaan. Metro Helsingin Iltapäivän vieraaksi saapui Tuomas Kauhanen ja he Petra Kalliomaan kanssa keskustelivat hieman ennen lähetyksen alkua, mutta kamerat olivatkin jo päällä.',
20 },
21 'params': {
22 'format': 'http-1000',
23 }
24 },
25 {
26 'url': 'http://www.ruutu.fi/ohjelmat/superpesis/superpesis-katso-koko-kausi-ruudussa',
27 'md5': '065a10ae4d5b8cfd9d0c3d332465e3d9',
28 'info_dict': {
29 'id': 'superpesis-katso-koko-kausi-ruudussa',
30 'ext': 'mp4',
31 'title': 'Superpesis: katso koko kausi Ruudussa',
32 'description': 'Huippujännittävän Superpesiksen suoria ottelulähetyksiä seurataan Ruudussa kauden alusta viimeiseen finaaliin asti. Katso lisätiedot osoitteesta ruutu.fi/superpesis.',
33 },
34 'params': {
35 'format': 'http-1000',
36 }
37 },
38 ]
39
40 def _real_extract(self, url):
41 mobj = re.match(self._VALID_URL, url)
42
43 video_id = mobj.group('id')
44 webpage = self._download_webpage(url, video_id)
45 media_id = self._html_search_regex(r'data-media-id="(\d+)"', webpage, 'media_id')
46 media_json = self._parse_json(self._search_regex(r'jQuery.extend\([^,]+, (.*)\);', webpage, 'media_data'), video_id)
47 xml_url = media_json['ruutuplayer']['xmlUrl'].replace('{ID}', media_id)
48 media_xml = self._download_xml(xml_url, media_id)
49
50 formats = []
51 parsed_urls = []
52 for fmt in media_xml.findall('.//Clip//'):
53 url = fmt.text
54 if not fmt.tag.endswith('File') or url in parsed_urls or \
55 'NOT_USED' in url:
56 continue
57
58 if url.endswith('m3u8'):
59 formats.extend(self._extract_m3u8_formats(url, media_id, m3u8_id='hls'))
60 parsed_urls.append(url)
61 elif url.endswith('f4m'):
62 formats.extend(self._extract_f4m_formats(url, media_id, f4m_id='hds'))
63 parsed_urls.append(url)
64 else:
d00735a0
HL
65 if not fmt.tag.startswith('HTTP'):
66 continue
22354455
HL
67 proto = compat_urllib_parse_urlparse(url).scheme
68 width_str, height_str = fmt.get('resolution').split('x')
69 tbr = int(fmt.get('bitrate', 0))
70 formats.append({
71 'format_id': '%s-%d' % (proto, tbr),
72 'url': url,
73 'width': int(width_str),
74 'height': int(height_str),
75 'tbr': tbr,
76 'ext': url.rsplit('.', 1)[-1],
77 'live': True,
78 'protocol': proto,
79 })
80 self._sort_formats(formats)
81
82 return {
83 'id': video_id,
84 'title': self._og_search_title(webpage),
85 'formats': formats,
86 'description': self._og_search_description(webpage),
87 'thumbnail': self._og_search_thumbnail(webpage),
88 'duration': int(media_xml.find('.//Runtime').text),
89 'age_limit': int(media_xml.find('.//AgeLimit').text),
90 }