aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey M․ <dstftw@gmail.com>2015-06-07 04:01:28 +0600
committerSergey M․ <dstftw@gmail.com>2015-06-07 04:01:28 +0600
commit717b0239fd63aad32a67988dec457250f1893958 (patch)
tree51d4ad97e78b95dda1034a641611b4ab7084c593
parent3d8e9573a470594df6fa471dc33c4c4b938b668a (diff)
parentd00735a0c5aabd38b37bfea76a93ae8c47a8d419 (diff)
Merge branch 'ruutu' of https://github.com/hlintala/youtube-dl into hlintala-ruutu
-rw-r--r--youtube_dl/extractor/__init__.py1
-rw-r--r--youtube_dl/extractor/ruutu.py90
2 files changed, 91 insertions, 0 deletions
diff --git a/youtube_dl/extractor/__init__.py b/youtube_dl/extractor/__init__.py
index 67eb96057..631381eea 100644
--- a/youtube_dl/extractor/__init__.py
+++ b/youtube_dl/extractor/__init__.py
@@ -453,6 +453,7 @@ from .rutube import (
RutubePersonIE,
)
from .rutv import RUTVIE
+from .ruutu import RuutuIE
from .sandia import SandiaIE
from .safari import (
SafariIE,
diff --git a/youtube_dl/extractor/ruutu.py b/youtube_dl/extractor/ruutu.py
new file mode 100644
index 000000000..59e0b12fd
--- /dev/null
+++ b/youtube_dl/extractor/ruutu.py
@@ -0,0 +1,90 @@
+# coding: utf-8
+from __future__ import unicode_literals
+
+from .common import InfoExtractor
+from ..compat import compat_urllib_parse_urlparse
+import re
+
+
+class RuutuIE(InfoExtractor):
+ _VALID_URL = r'http://(www\.)?ruutu\.fi/ohjelmat/(?:[^/]+/)?(?P<id>.*)$'
+ _TESTS = [
+ {
+ 'url': 'http://www.ruutu.fi/ohjelmat/oletko-aina-halunnut-tietaa-mita-tapahtuu-vain-hetki-ennen-lahetysta-nyt-se-selvisi',
+ 'md5': 'ab2093f39be1ca8581963451b3c0234f',
+ 'info_dict': {
+ 'id': 'oletko-aina-halunnut-tietaa-mita-tapahtuu-vain-hetki-ennen-lahetysta-nyt-se-selvisi',
+ 'ext': 'mp4',
+ 'title': 'Oletko aina halunnut tietää mitä tapahtuu vain hetki ennen lähetystä? - Nyt se selvisi!',
+ '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ä.',
+ },
+ 'params': {
+ 'format': 'http-1000',
+ }
+ },
+ {
+ 'url': 'http://www.ruutu.fi/ohjelmat/superpesis/superpesis-katso-koko-kausi-ruudussa',
+ 'md5': '065a10ae4d5b8cfd9d0c3d332465e3d9',
+ 'info_dict': {
+ 'id': 'superpesis-katso-koko-kausi-ruudussa',
+ 'ext': 'mp4',
+ 'title': 'Superpesis: katso koko kausi Ruudussa',
+ 'description': 'Huippujännittävän Superpesiksen suoria ottelulähetyksiä seurataan Ruudussa kauden alusta viimeiseen finaaliin asti. Katso lisätiedot osoitteesta ruutu.fi/superpesis.',
+ },
+ 'params': {
+ 'format': 'http-1000',
+ }
+ },
+ ]
+
+ def _real_extract(self, url):
+ mobj = re.match(self._VALID_URL, url)
+
+ video_id = mobj.group('id')
+ webpage = self._download_webpage(url, video_id)
+ media_id = self._html_search_regex(r'data-media-id="(\d+)"', webpage, 'media_id')
+ media_json = self._parse_json(self._search_regex(r'jQuery.extend\([^,]+, (.*)\);', webpage, 'media_data'), video_id)
+ xml_url = media_json['ruutuplayer']['xmlUrl'].replace('{ID}', media_id)
+ media_xml = self._download_xml(xml_url, media_id)
+
+ formats = []
+ parsed_urls = []
+ for fmt in media_xml.findall('.//Clip//'):
+ url = fmt.text
+ if not fmt.tag.endswith('File') or url in parsed_urls or \
+ 'NOT_USED' in url:
+ continue
+
+ if url.endswith('m3u8'):
+ formats.extend(self._extract_m3u8_formats(url, media_id, m3u8_id='hls'))
+ parsed_urls.append(url)
+ elif url.endswith('f4m'):
+ formats.extend(self._extract_f4m_formats(url, media_id, f4m_id='hds'))
+ parsed_urls.append(url)
+ else:
+ if not fmt.tag.startswith('HTTP'):
+ continue
+ proto = compat_urllib_parse_urlparse(url).scheme
+ width_str, height_str = fmt.get('resolution').split('x')
+ tbr = int(fmt.get('bitrate', 0))
+ formats.append({
+ 'format_id': '%s-%d' % (proto, tbr),
+ 'url': url,
+ 'width': int(width_str),
+ 'height': int(height_str),
+ 'tbr': tbr,
+ 'ext': url.rsplit('.', 1)[-1],
+ 'live': True,
+ 'protocol': proto,
+ })
+ self._sort_formats(formats)
+
+ return {
+ 'id': video_id,
+ 'title': self._og_search_title(webpage),
+ 'formats': formats,
+ 'description': self._og_search_description(webpage),
+ 'thumbnail': self._og_search_thumbnail(webpage),
+ 'duration': int(media_xml.find('.//Runtime').text),
+ 'age_limit': int(media_xml.find('.//AgeLimit').text),
+ }