]>
Commit | Line | Data |
---|---|---|
db182c63 YCH |
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_urlparse | |
8 | from ..utils import ( | |
8fffac69 | 9 | extract_attributes, |
db182c63 YCH |
10 | get_element_by_class, |
11 | urlencode_postdata, | |
12 | ) | |
13 | ||
14 | ||
15 | class NJPWWorldIE(InfoExtractor): | |
16 | _VALID_URL = r'https?://njpwworld\.com/p/(?P<id>[a-z0-9_]+)' | |
17 | IE_DESC = '新日本プロレスワールド' | |
18 | _NETRC_MACHINE = 'njpwworld' | |
19 | ||
20 | _TEST = { | |
21 | 'url': 'http://njpwworld.com/p/s_series_00155_1_9/', | |
22 | 'info_dict': { | |
23 | 'id': 's_series_00155_1_9', | |
24 | 'ext': 'mp4', | |
25 | 'title': '第9試合 ランディ・サベージ vs リック・スタイナー', | |
26 | 'tags': list, | |
27 | }, | |
28 | 'params': { | |
29 | 'skip_download': True, # AES-encrypted m3u8 | |
30 | }, | |
31 | 'skip': 'Requires login', | |
32 | } | |
33 | ||
34 | def _real_initialize(self): | |
35 | self._login() | |
36 | ||
37 | def _login(self): | |
38 | username, password = self._get_login_info() | |
39 | # No authentication to be performed | |
40 | if not username: | |
41 | return True | |
42 | ||
43 | webpage, urlh = self._download_webpage_handle( | |
44 | 'https://njpwworld.com/auth/login', None, | |
45 | note='Logging in', errnote='Unable to login', | |
cc7f6c72 S |
46 | data=urlencode_postdata({'login_id': username, 'pw': password}), |
47 | headers={'Referer': 'https://njpwworld.com/auth'}) | |
db182c63 YCH |
48 | # /auth/login will return 302 for successful logins |
49 | if urlh.geturl() == 'https://njpwworld.com/auth/login': | |
50 | self.report_warning('unable to login') | |
51 | return False | |
52 | ||
53 | return True | |
54 | ||
55 | def _real_extract(self, url): | |
56 | video_id = self._match_id(url) | |
57 | ||
58 | webpage = self._download_webpage(url, video_id) | |
59 | ||
60 | formats = [] | |
8fffac69 S |
61 | for mobj in re.finditer(r'<a[^>]+\bhref=(["\'])/player.+?[^>]*>', webpage): |
62 | player = extract_attributes(mobj.group(0)) | |
63 | player_path = player.get('href') | |
64 | if not player_path: | |
65 | continue | |
66 | kind = self._search_regex( | |
67 | r'(low|high)$', player.get('class') or '', 'kind', | |
68 | default='low') | |
69 | player_url = compat_urlparse.urljoin(url, player_path) | |
db182c63 YCH |
70 | player_page = self._download_webpage( |
71 | player_url, video_id, note='Downloading player page') | |
db182c63 YCH |
72 | entries = self._parse_html5_media_entries( |
73 | player_url, player_page, video_id, m3u8_id='hls-%s' % kind, | |
8fffac69 S |
74 | m3u8_entry_protocol='m3u8_native') |
75 | kind_formats = entries[0]['formats'] | |
76 | for f in kind_formats: | |
77 | f['quality'] = 2 if kind == 'high' else 1 | |
78 | formats.extend(kind_formats) | |
db182c63 YCH |
79 | |
80 | self._sort_formats(formats) | |
81 | ||
82 | post_content = get_element_by_class('post-content', webpage) | |
83 | tags = re.findall( | |
84 | r'<li[^>]+class="tag-[^"]+"><a[^>]*>([^<]+)</a></li>', post_content | |
85 | ) if post_content else None | |
86 | ||
87 | return { | |
88 | 'id': video_id, | |
89 | 'title': self._og_search_title(webpage), | |
90 | 'formats': formats, | |
91 | 'tags': tags, | |
92 | } |