[americastestkitchen] Add extractor (closes #10764)
[youtube-dl] / youtube_dl / extractor / americastestkitchen.py
1 # coding: utf-8
2 from __future__ import unicode_literals
3
4 import re
5
6 from .common import InfoExtractor
7
8
9 class AmericasTestKitchenIE(InfoExtractor):
10     _VALID_URL = r'https?://(?:www\.)?americastestkitchen\.com/episode/(?P<id>\d+)'
11     _TESTS = [{
12         'url':
13         'https://www.americastestkitchen.com/episode/548-summer-dinner-party',
14         'md5': 'b861c3e365ac38ad319cfd509c30577f',
15         'info_dict': {
16             'id': '1_5g5zua6e',
17             'title': 'atk_s17_e24.mp4',
18             'ext': 'mp4',
19             'description': '<p>Host Julia Collin Davison goes into the test kitchen with test cook Dan Souza to learn how to make the ultimate Grill-Roasted Beef Tenderloin. Next, equipment expert Adam Ried reviews gas grills in the Equipment Corner. Then, gadget guru Lisa McManus uncovers the best quirky gadgets. Finally, test cook Erin McMurrer shows host Bridget Lancaster how to make an elegant Pear-Walnut Upside-Down Cake.</p>',
20             'timestamp': 1497285541,
21             'upload_date': '20170612',
22             'uploader_id': 'roger.metcalf@americastestkitchen.com',
23             'release_date': '2017-06-17',
24             'thumbnail': 'http://d3cizcpymoenau.cloudfront.net/images/35973/e24-tenderloin-16.jpg',
25             'episode_number': 24,
26             'episode': 'Summer Dinner Party',
27             'episode_id': '548-summer-dinner-party',
28             'season_number': 17
29         },
30         'params': {
31             # m3u8 download
32             'skip_download': True,
33         },
34     }, {
35         'url':
36         'https://www.americastestkitchen.com/episode/546-a-spanish-affair',
37         'only_matching':
38         True,
39     }]
40
41     def _real_extract(self, url):
42         video_id = self._match_id(url)
43         webpage = self._download_webpage(url, video_id)
44
45         partner_id = self._search_regex(
46             r'partner_id/(?P<partner_id>\d+)',
47             webpage,
48             'partner_id',
49             group='partner_id')
50
51         video_data = self._parse_json(
52             self._search_regex(
53                 r'window\.__INITIAL_STATE__\s*=\s*({.+?});\s*</script>',
54                 webpage, 'initial context'),
55             video_id)
56
57         episode_data = video_data['episodeDetail']['content']['data']
58         episode_content_meta = episode_data['full_video']
59         external_id = episode_content_meta['external_id']
60
61         # photo data
62         photo_data = episode_content_meta.get('photo')
63         thumbnail = photo_data.get('image_url') if photo_data else None
64
65         # meta
66         release_date = episode_data.get('aired_at')
67         description = episode_content_meta.get('description')
68         episode_number = int(episode_content_meta.get('episode_number'))
69         episode = episode_content_meta.get('title')
70         episode_id = episode_content_meta.get('episode_slug')
71         season_number = int(episode_content_meta.get('season_number'))
72
73         return {
74             '_type': 'url_transparent',
75             'url': 'kaltura:%s:%s' % (partner_id, external_id),
76             'ie_key': 'Kaltura',
77             'id': video_id,
78             'release_date': release_date,
79             'thumbnail': thumbnail,
80             'description': description,
81             'episode_number': episode_number,
82             'episode': episode,
83             'episode_id': episode_id,
84             'season_number': season_number
85         }