[kusi] Add a test for the alternative form of URL
[youtube-dl] / youtube_dl / extractor / kusi.py
1 # coding: utf-8
2 from __future__ import unicode_literals
3
4 import re
5
6 from .common import InfoExtractor
7 from ..compat import compat_urllib_parse_unquote_plus
8 from ..utils import int_or_none
9
10
11 class KUSIIE(InfoExtractor):
12     _VALID_URL = r'http://(?:www\.)?kusi\.com/(?P<path>story/.+|video\?clipId=(?P<clipId>\d+))'
13     _TESTS = [{
14         'url': 'http://www.kusi.com/story/31183873/turko-files-case-closed-put-on-hold',
15         'md5': 'f926e7684294cf8cb7bdf8858e1b3988',
16         'info_dict': {
17             'id': '12203019',
18             'ext': 'mp4',
19             'title': 'Turko Files: Case Closed! & Put On Hold!',
20             'duration': 231000,
21         },
22     }, {
23         'url': 'http://kusi.com/video?clipId=12203019',
24         'info_dict': {
25             'id': '12203019',
26             'ext': 'mp4',
27             'title': 'Turko Files: Case Closed! & Put On Hold!',
28             'duration': 231000,
29         },
30         'params': {
31             'skip_download': True,  # Same as previous one
32         },
33     }]
34
35     def _real_extract(self, url):
36         mobj = re.match(self._VALID_URL, url)
37
38         if mobj.group('clipId') is not None:
39             video_id = mobj.group('clipId')
40         else:
41             webpage = self._download_webpage(url, mobj.group('path'))
42             video_id = self._html_search_regex(r'"clipId", "(\d+)"', webpage,
43                                                'clipId')
44
45         xml_url = 'http://www.kusi.com/build.asp?buildtype=buildfeaturexml'\
46                   'request&featureType=Clip&featureid={0}&affiliateno=956&'\
47                   'clientgroupid=1&rnd=562461'.format(video_id)
48         doc = self._download_xml(xml_url, video_id,
49                                  note='Downloading video info',
50                                  errnote='Failed to download video info')
51
52         video_title = doc.find('HEADLINE').text
53         duration = int_or_none(doc.find('DURATION'), get_attr='text')
54         description = doc.find('ABSTRACT')
55
56         quality_options = doc.find('{http://search.yahoo.com/mrss/}group').findall('{http://search.yahoo.com/mrss/}content')
57         formats = []
58         for quality in quality_options:
59             if 'height' in quality.attrib:
60                 formats.append({
61                     'url': compat_urllib_parse_unquote_plus(quality.attrib['url']),
62                     'height': quality.attrib['height'],
63                 })
64         self._sort_formats(formats)
65
66         return {
67             'id': video_id,
68             'title': video_title,
69             'description': description,
70             'duration': duration,
71             'formats': formats,
72         }