[dplay] add support for it.dplay.com and dplay.dk
[youtube-dl] / youtube_dl / extractor / dplay.py
1 # encoding: utf-8
2 from __future__ import unicode_literals
3
4 import time
5
6 from .common import InfoExtractor
7 from ..utils import int_or_none
8 from ..compat import compat_urlparse
9
10 class DPlayIE(InfoExtractor):
11     _VALID_URL = r'(?P<domain>http://(?:it|www)\.dplay\.(?:com|dk|se))/[^/]+/(?P<id>[^/?#]+)'
12
13     _TESTS = [
14         {
15             'url': 'http://it.dplay.com/take-me-out/stagione-1-episodio-25/',
16             'info_dict': {
17                 'id': '1255600',
18                 'ext': 'mp4',
19                 'display_id': 'stagione-1-episodio-25',
20                 'title': 'Episodio 25',
21                 'duration': 2761,
22                 'description': "Gabriele Corsi conduce un nuovo provocante e divertente dating show. 30 ragazze single hanno l'opportunità di conoscere un ragazzo e decidere se tenerlo in gioco oppure no accendendo o spegnendo le luci.",
23                 'season_number': 1,
24                 'episode_number': 25,
25             },
26         },
27         {
28             'url': 'http://www.dplay.se/nugammalt-77-handelser-som-format-sverige/season-1-svensken-lar-sig-njuta-av-livet/',
29             'info_dict': {
30                 'id': '3172',
31                 'ext': 'mp4',
32                 'display_id': 'season-1-svensken-lar-sig-njuta-av-livet',
33                 'title': 'Svensken lär sig njuta av livet',
34                 'duration': 2650,
35                 'description': "\"Svensken lär sig njuta av livet\". Införandet av systembolaget, industrisemestern och Skarastadgan. Med hjälp av arkivmaterial, experter och fakta ska händelserna dissekeras, analyseras och dras till sin absoluta underhållningsspets.",
36                 'season_number': 1,
37                 'episode_number': 1,
38             },
39         },
40         {
41             'url': 'http://www.dplay.dk/mig-og-min-mor/season-6-episode-12/',
42             'info_dict': {
43                 'id': '70816',
44                 'ext': 'mp4',
45                 'display_id': 'season-6-episode-12',
46                 'title': 'Episode 12',
47                 'duration': 2563,
48                 'description': " I sæsonafslutningen sker der store ting for mor og datter.\nDagen er endelig kommet for den højgravide Irina - hun skal føde! Men det bliver en lang og sej kamp for Irina, som selvfølgelig har mor Mila med som støtte hele vejen.\nMor Jette og Jessica er igen hjemme i Danmark efter deres store USA-eventyr. Og for at holde fast i den amerikanske ånd, tager pigerne i dag til gospel-undervisning. \nOg så skal Joy og mor Mia under kniven  - de skal nemlig have gjort lårene mindre og ballerne større. \n ",
49                 'season_number': 6,
50                 'episode_number': 12,
51             },
52         }
53     ]
54
55     def _real_extract(self, url):
56         #this extrator works with it.dplay.com, www.dplay.se and www.dplay.dk
57         # so we need to determine the domain to send the requests to
58         domain = self._search_regex(self._VALID_URL, url, 'domain')
59         display_id = self._match_id(url)
60         webpage = self._download_webpage(url, display_id)
61         video_id = self._search_regex(
62             r'data-video-id="(\d+)"', webpage, 'video id')
63
64         video_url = compat_urlparse.urljoin(domain, 'api/v2/ajax/videos?video_id=')
65
66         info = self._download_json(video_url + video_id,
67             video_id)['data'][0]
68
69         # TODO: consider adding support for 'stream_type=hds', it seems to
70         # require setting some cookies
71         # get url's TLD to determine which cookie and url to use
72         domain_tld = domain.split('.')[-1]
73         if domain_tld == 'se' or domain_tld == 'dk':
74             self._set_cookie(
75                 'secure.dplay.%s' % domain_tld, 'dsc-geo',
76                 '{"countryCode":"%s","expiry":%d}' % (domain_tld.upper(), ((time.time() + 20 * 60) * 1000)))
77
78             manifest_url = self._download_json(
79                 'https://secure.dplay.%s/secure/api/v2/user/authorization/stream/%s?stream_type=hls' % (domain_tld, video_id),
80                 video_id, 'Getting manifest url for hls stream')['hls']
81         else:
82             #.it requires no cookies at this point
83             manifest_url = info['hls']
84
85         formats = self._extract_m3u8_formats(
86             manifest_url, video_id, ext='mp4', entry_protocol='m3u8_native')
87
88         return {
89             'id': video_id,
90             'display_id': display_id,
91             'title': info['title'],
92             'formats': formats,
93             'duration': int_or_none(info.get('video_metadata_length'), scale=1000),
94             'description': info.get('video_metadata_longDescription'),
95             'season_number': int_or_none(info.get('season')),
96             'episode_number': int_or_none(info.get('episode')),
97         }