[mediaset] Improve extraction (closes #12708, closes #12964)
[youtube-dl] / youtube_dl / extractor / mediaset.py
1 # coding: utf-8
2 from __future__ import unicode_literals
3
4 from .common import InfoExtractor
5 from ..compat import compat_str
6 from ..utils import (
7     determine_ext,
8     parse_duration,
9     try_get,
10     unified_strdate,
11 )
12
13
14 class MediasetIE(InfoExtractor):
15     _VALID_URL = r'''(?x)
16                     https?://
17                         (?:www\.)?video\.mediaset\.it/
18                         (?:
19                             (?:video|on-demand)/(?:[^/]+/)+[^/]+_|
20                             player/playerIFrame(?:Twitter)?\.shtml\?.*?\bid=
21                         )(?P<id>[0-9]+)
22                     '''
23     _TESTS = [{
24         # full episode
25         'url': 'http://www.video.mediaset.it/video/hello_goodbye/full/quarta-puntata_661824.html',
26         'md5': '9b75534d42c44ecef7bf1ffeacb7f85d',
27         'info_dict': {
28             'id': '661824',
29             'ext': 'mp4',
30             'title': 'Quarta puntata',
31             'description': 'md5:7183696d6df570e3412a5ef74b27c5e2',
32             'thumbnail': r're:^https?://.*\.jpg$',
33             'duration': 1414,
34             'creator': 'mediaset',
35             'release_date': '20161107',
36             'series': 'Hello Goodbye',
37             'categories': ['reality'],
38         },
39         'expected_warnings': ['is not a supported codec'],
40     }, {
41         # clip
42         'url': 'http://www.video.mediaset.it/video/gogglebox/clip/un-grande-classico-della-commedia-sexy_661680.html',
43         'only_matching': True,
44     }, {
45         # iframe simple
46         'url': 'http://www.video.mediaset.it/player/playerIFrame.shtml?id=665924&autoplay=true',
47         'only_matching': True,
48     }, {
49         # iframe twitter (from http://www.wittytv.it/se-prima-mi-fidavo-zero/)
50         'url': 'https://www.video.mediaset.it/player/playerIFrameTwitter.shtml?id=665104&playrelated=false&autoplay=false&related=true&hidesocial=true',
51         'only_matching': True,
52     }]
53
54     def _real_extract(self, url):
55         video_id = self._match_id(url)
56
57         video_list = self._download_json(
58             'http://cdnsel01.mediaset.net/GetCdn.aspx',
59             video_id, 'Downloading video CDN JSON', query={
60                 'streamid': video_id,
61                 'format': 'json',
62             })['videoList']
63
64         formats = []
65         for format_url in video_list:
66             if '.ism' in format_url:
67                 formats.extend(self._extract_ism_formats(
68                     format_url, video_id, ism_id='mss', fatal=False))
69             else:
70                 formats.append({
71                     'url': format_url,
72                     'format_id': determine_ext(format_url),
73                 })
74         self._sort_formats(formats)
75
76         mediainfo = self._download_json(
77             'http://plr.video.mediaset.it/html/metainfo.sjson',
78             video_id, 'Downloading video info JSON', query={
79                 'id': video_id,
80             })['video']
81
82         title = mediainfo['title']
83
84         creator = try_get(
85             mediainfo, lambda x: x['brand-info']['publisher'], compat_str)
86         category = try_get(
87             mediainfo, lambda x: x['brand-info']['category'], compat_str)
88         categories = [category] if category else None
89
90         return {
91             'id': video_id,
92             'title': title,
93             'description': mediainfo.get('short-description'),
94             'thumbnail': mediainfo.get('thumbnail'),
95             'duration': parse_duration(mediainfo.get('duration')),
96             'creator': creator,
97             'release_date': unified_strdate(mediainfo.get('production-date')),
98             'webpage_url': mediainfo.get('url'),
99             'series': mediainfo.get('brand-value'),
100             'categories': categories,
101             'formats': formats,
102         }