]>
Commit | Line | Data |
---|---|---|
b1b01841 CC |
1 | from __future__ import unicode_literals |
2 | ||
3 | import re | |
4 | ||
5 | from .common import InfoExtractor | |
7bb49d10 S |
6 | from ..utils import ( |
7 | parse_duration, | |
8 | parse_iso8601, | |
7bb49d10 | 9 | ) |
b1b01841 CC |
10 | |
11 | ||
7bb49d10 | 12 | class MLBIE(InfoExtractor): |
d1feb308 S |
13 | _VALID_URL = r'''(?x) |
14 | https?:// | |
3800b908 | 15 | (?:[\da-z_-]+\.)*mlb\.com/ |
d1feb308 S |
16 | (?: |
17 | (?: | |
11a6793f | 18 | (?:.*?/)?video/(?:topic/[\da-z_-]+/)?(?:v|.*?/c-)| |
d1feb308 S |
19 | (?: |
20 | shared/video/embed/(?:embed|m-internal-embed)\.html| | |
3800b908 | 21 | (?:[^/]+/)+(?:play|index)\.jsp| |
d1feb308 S |
22 | )\?.*?\bcontent_id= |
23 | ) | |
24 | (?P<id>n?\d+)| | |
4e6e9d21 | 25 | (?:[^/]+/)*(?P<path>[^/]+) |
d1feb308 S |
26 | ) |
27 | ''' | |
7bb49d10 | 28 | _TESTS = [ |
07cc63f3 CC |
29 | { |
30 | 'url': 'http://m.mlb.com/sea/video/topic/51231442/v34698933/nymsea-ackley-robs-a-home-run-with-an-amazing-catch/?c_id=sea', | |
31 | 'md5': 'ff56a598c2cf411a9a38a69709e97079', | |
32 | 'info_dict': { | |
33 | 'id': '34698933', | |
34 | 'ext': 'mp4', | |
35 | 'title': "Ackley's spectacular catch", | |
36 | 'description': 'md5:7f5a981eb4f3cbc8daf2aeffa2215bf0', | |
37 | 'duration': 66, | |
38 | 'timestamp': 1405980600, | |
39 | 'upload_date': '20140721', | |
ec85ded8 | 40 | 'thumbnail': r're:^https?://.*\.jpg$', |
07cc63f3 CC |
41 | }, |
42 | }, | |
7bb49d10 S |
43 | { |
44 | 'url': 'http://m.mlb.com/video/topic/81536970/v34496663/mianym-stanton-practices-for-the-home-run-derby', | |
45 | 'md5': 'd9c022c10d21f849f49c05ae12a8a7e9', | |
46 | 'info_dict': { | |
47 | 'id': '34496663', | |
48 | 'ext': 'mp4', | |
49 | 'title': 'Stanton prepares for Derby', | |
50 | 'description': 'md5:d00ce1e5fd9c9069e9c13ab4faedfa57', | |
51 | 'duration': 46, | |
52 | 'timestamp': 1405105800, | |
53 | 'upload_date': '20140711', | |
ec85ded8 | 54 | 'thumbnail': r're:^https?://.*\.jpg$', |
7bb49d10 | 55 | }, |
b1b01841 | 56 | }, |
7bb49d10 S |
57 | { |
58 | 'url': 'http://m.mlb.com/video/topic/vtp_hrd_sponsor/v34578115/hrd-cespedes-wins-2014-gillette-home-run-derby', | |
59 | 'md5': '0e6e73d509321e142409b695eadd541f', | |
60 | 'info_dict': { | |
61 | 'id': '34578115', | |
62 | 'ext': 'mp4', | |
63 | 'title': 'Cespedes repeats as Derby champ', | |
64 | 'description': 'md5:08df253ce265d4cf6fb09f581fafad07', | |
65 | 'duration': 488, | |
66 | 'timestamp': 1405399936, | |
67 | 'upload_date': '20140715', | |
ec85ded8 | 68 | 'thumbnail': r're:^https?://.*\.jpg$', |
7bb49d10 S |
69 | }, |
70 | }, | |
71 | { | |
72 | 'url': 'http://m.mlb.com/video/v34577915/bautista-on-derby-captaining-duties-his-performance', | |
73 | 'md5': 'b8fd237347b844365d74ea61d4245967', | |
74 | 'info_dict': { | |
75 | 'id': '34577915', | |
76 | 'ext': 'mp4', | |
77 | 'title': 'Bautista on Home Run Derby', | |
78 | 'description': 'md5:b80b34031143d0986dddc64a8839f0fb', | |
79 | 'duration': 52, | |
80 | 'timestamp': 1405390722, | |
81 | 'upload_date': '20140715', | |
ec85ded8 | 82 | 'thumbnail': r're:^https?://.*\.jpg$', |
7bb49d10 S |
83 | }, |
84 | }, | |
3b5f65a6 JMF |
85 | { |
86 | 'url': 'http://m.mlb.com/news/article/118550098/blue-jays-kevin-pillar-goes-spidey-up-the-wall-to-rob-tim-beckham-of-a-homer', | |
bbbe1ceb | 87 | 'md5': 'aafaf5b0186fee8f32f20508092f8111', |
3b5f65a6 JMF |
88 | 'info_dict': { |
89 | 'id': '75609783', | |
90 | 'ext': 'mp4', | |
91 | 'title': 'Must C: Pillar climbs for catch', | |
92 | 'description': '4/15/15: Blue Jays outfielder Kevin Pillar continues his defensive dominance by climbing the wall in left to rob Tim Beckham of a home run', | |
93 | 'timestamp': 1429124820, | |
94 | 'upload_date': '20150415', | |
95 | } | |
96 | }, | |
11a6793f MC |
97 | { |
98 | 'url': 'https://www.mlb.com/video/hargrove-homers-off-caldwell/c-1352023483?tid=67793694', | |
99 | 'only_matching': True, | |
100 | }, | |
1a94ff68 S |
101 | { |
102 | 'url': 'http://m.mlb.com/shared/video/embed/embed.html?content_id=35692085&topic_id=6479266&width=400&height=224&property=mlb', | |
103 | 'only_matching': True, | |
104 | }, | |
b2a68d14 S |
105 | { |
106 | 'url': 'http://mlb.mlb.com/shared/video/embed/embed.html?content_id=36599553', | |
107 | 'only_matching': True, | |
108 | }, | |
109 | { | |
110 | 'url': 'http://mlb.mlb.com/es/video/play.jsp?content_id=36599553', | |
111 | 'only_matching': True, | |
112 | }, | |
9f790b99 S |
113 | { |
114 | 'url': 'http://m.cardinals.mlb.com/stl/video/v51175783/atlstl-piscotty-makes-great-sliding-catch-on-line/?partnerId=as_mlb_20150321_42500876&adbid=579409712979910656&adbpl=tw&adbpr=52847728', | |
115 | 'only_matching': True, | |
3e7202c1 YCH |
116 | }, |
117 | { | |
118 | # From http://m.mlb.com/news/article/118550098/blue-jays-kevin-pillar-goes-spidey-up-the-wall-to-rob-tim-beckham-of-a-homer | |
119 | 'url': 'http://mlb.mlb.com/shared/video/embed/m-internal-embed.html?content_id=75609783&property=mlb&autoplay=true&hashmode=false&siteSection=mlb/multimedia/article_118550098/article_embed&club=mlb', | |
120 | 'only_matching': True, | |
3800b908 S |
121 | }, |
122 | { | |
123 | 'url': 'http://washington.nationals.mlb.com/mlb/gameday/index.jsp?c_id=was&gid=2015_05_09_atlmlb_wasmlb_1&lang=en&content_id=108309983&mode=video#', | |
124 | 'only_matching': True, | |
9f790b99 | 125 | } |
7bb49d10 | 126 | ] |
b1b01841 CC |
127 | |
128 | def _real_extract(self, url): | |
129 | mobj = re.match(self._VALID_URL, url) | |
130 | video_id = mobj.group('id') | |
131 | ||
d1feb308 S |
132 | if not video_id: |
133 | video_path = mobj.group('path') | |
134 | webpage = self._download_webpage(url, video_path) | |
135 | video_id = self._search_regex( | |
3800b908 | 136 | [r'data-video-?id="(\d+)"', r'content_id=(\d+)'], webpage, 'video id') |
d1feb308 | 137 | |
7bb49d10 S |
138 | detail = self._download_xml( |
139 | 'http://m.mlb.com/gen/multimedia/detail/%s/%s/%s/%s.xml' | |
140 | % (video_id[-3], video_id[-2], video_id[-1], video_id), video_id) | |
141 | ||
142 | title = detail.find('./headline').text | |
143 | description = detail.find('./big-blurb').text | |
144 | duration = parse_duration(detail.find('./duration').text) | |
145 | timestamp = parse_iso8601(detail.attrib['date'][:-5]) | |
146 | ||
385009fc S |
147 | thumbnails = [{ |
148 | 'url': thumbnail.text, | |
149 | } for thumbnail in detail.findall('./thumbnailScenarios/thumbnailScenario')] | |
b1b01841 | 150 | |
7bb49d10 S |
151 | formats = [] |
152 | for media_url in detail.findall('./url'): | |
153 | playback_scenario = media_url.attrib['playback_scenario'] | |
154 | fmt = { | |
155 | 'url': media_url.text, | |
156 | 'format_id': playback_scenario, | |
157 | } | |
158 | m = re.search(r'(?P<vbr>\d+)K_(?P<width>\d+)X(?P<height>\d+)', playback_scenario) | |
159 | if m: | |
160 | fmt.update({ | |
161 | 'vbr': int(m.group('vbr')) * 1000, | |
162 | 'width': int(m.group('width')), | |
163 | 'height': int(m.group('height')), | |
164 | }) | |
165 | formats.append(fmt) | |
172240c0 | 166 | |
7bb49d10 | 167 | self._sort_formats(formats) |
172240c0 | 168 | |
b1b01841 CC |
169 | return { |
170 | 'id': video_id, | |
b1b01841 | 171 | 'title': title, |
b1b01841 | 172 | 'description': description, |
7bb49d10 S |
173 | 'duration': duration, |
174 | 'timestamp': timestamp, | |
175 | 'formats': formats, | |
385009fc | 176 | 'thumbnails': thumbnails, |
b1b01841 | 177 | } |