Merge branch 'master' into BlenderCloud-issue-13282
This commit is contained in:
commit
f0c9c86a71
6
.github/ISSUE_TEMPLATE.md
vendored
6
.github/ISSUE_TEMPLATE.md
vendored
@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Make sure you are using the *latest* version: run `youtube-dl --version` and ensure your version is *2017.06.23*. If it's not read [this FAQ entry](https://github.com/rg3/youtube-dl/blob/master/README.md#how-do-i-update-youtube-dl) and update. Issues with outdated version will be rejected.
|
### Make sure you are using the *latest* version: run `youtube-dl --version` and ensure your version is *2017.06.25*. If it's not read [this FAQ entry](https://github.com/rg3/youtube-dl/blob/master/README.md#how-do-i-update-youtube-dl) and update. Issues with outdated version will be rejected.
|
||||||
- [ ] I've **verified** and **I assure** that I'm running youtube-dl **2017.06.23**
|
- [ ] I've **verified** and **I assure** that I'm running youtube-dl **2017.06.25**
|
||||||
|
|
||||||
### Before submitting an *issue* make sure you have:
|
### Before submitting an *issue* make sure you have:
|
||||||
- [ ] At least skimmed through [README](https://github.com/rg3/youtube-dl/blob/master/README.md) and **most notably** [FAQ](https://github.com/rg3/youtube-dl#faq) and [BUGS](https://github.com/rg3/youtube-dl#bugs) sections
|
- [ ] At least skimmed through [README](https://github.com/rg3/youtube-dl/blob/master/README.md) and **most notably** [FAQ](https://github.com/rg3/youtube-dl#faq) and [BUGS](https://github.com/rg3/youtube-dl#bugs) sections
|
||||||
@ -35,7 +35,7 @@ $ youtube-dl -v <your command line>
|
|||||||
[debug] User config: []
|
[debug] User config: []
|
||||||
[debug] Command-line args: [u'-v', u'http://www.youtube.com/watch?v=BaW_jenozKcj']
|
[debug] Command-line args: [u'-v', u'http://www.youtube.com/watch?v=BaW_jenozKcj']
|
||||||
[debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
|
[debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
|
||||||
[debug] youtube-dl version 2017.06.23
|
[debug] youtube-dl version 2017.06.25
|
||||||
[debug] Python version 2.7.11 - Windows-2003Server-5.2.3790-SP2
|
[debug] Python version 2.7.11 - Windows-2003Server-5.2.3790-SP2
|
||||||
[debug] exe versions: ffmpeg N-75573-g1d0487f, ffprobe N-75573-g1d0487f, rtmpdump 2.4
|
[debug] exe versions: ffmpeg N-75573-g1d0487f, ffprobe N-75573-g1d0487f, rtmpdump 2.4
|
||||||
[debug] Proxy map: {}
|
[debug] Proxy map: {}
|
||||||
|
17
ChangeLog
17
ChangeLog
@ -1,3 +1,20 @@
|
|||||||
|
version 2017.06.25
|
||||||
|
|
||||||
|
Core
|
||||||
|
+ [adobepass] Add support for DIRECTV NOW (mso ATTOTT) (#13472)
|
||||||
|
* [YoutubeDL] Skip malformed formats for better extraction robustness
|
||||||
|
|
||||||
|
Extractors
|
||||||
|
+ [wsj] Add support for barrons.com (#13470)
|
||||||
|
+ [ign] Add another video id pattern (#13328)
|
||||||
|
+ [raiplay:live] Add support for live streams (#13414)
|
||||||
|
+ [redbulltv] Add support for live videos and segments (#13486)
|
||||||
|
+ [onetpl] Add support for videos embedded via pulsembed (#13482)
|
||||||
|
* [ooyala] Make more robust
|
||||||
|
* [ooyala] Skip empty format URLs (#13471, #13476)
|
||||||
|
* [hgtv.com:show] Fix typo
|
||||||
|
|
||||||
|
|
||||||
version 2017.06.23
|
version 2017.06.23
|
||||||
|
|
||||||
Core
|
Core
|
||||||
|
@ -644,6 +644,7 @@
|
|||||||
- **RadioJavan**
|
- **RadioJavan**
|
||||||
- **Rai**
|
- **Rai**
|
||||||
- **RaiPlay**
|
- **RaiPlay**
|
||||||
|
- **RaiPlayLive**
|
||||||
- **RBMARadio**
|
- **RBMARadio**
|
||||||
- **RDS**: RDS.ca
|
- **RDS**: RDS.ca
|
||||||
- **RedBullTV**
|
- **RedBullTV**
|
||||||
|
@ -15,6 +15,7 @@ from ..utils import (
|
|||||||
urlencode_postdata,
|
urlencode_postdata,
|
||||||
unified_timestamp,
|
unified_timestamp,
|
||||||
ExtractorError,
|
ExtractorError,
|
||||||
|
NO_DEFAULT,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -24,6 +25,11 @@ MSO_INFO = {
|
|||||||
'username_field': 'username',
|
'username_field': 'username',
|
||||||
'password_field': 'password',
|
'password_field': 'password',
|
||||||
},
|
},
|
||||||
|
'ATTOTT': {
|
||||||
|
'name': 'DIRECTV NOW',
|
||||||
|
'username_field': 'email',
|
||||||
|
'password_field': 'loginpassword',
|
||||||
|
},
|
||||||
'Rogers': {
|
'Rogers': {
|
||||||
'name': 'Rogers',
|
'name': 'Rogers',
|
||||||
'username_field': 'UserName',
|
'username_field': 'UserName',
|
||||||
@ -1316,6 +1322,8 @@ class AdobePassIE(InfoExtractor):
|
|||||||
_USER_AGENT = 'Mozilla/5.0 (X11; Linux i686; rv:47.0) Gecko/20100101 Firefox/47.0'
|
_USER_AGENT = 'Mozilla/5.0 (X11; Linux i686; rv:47.0) Gecko/20100101 Firefox/47.0'
|
||||||
_MVPD_CACHE = 'ap-mvpd'
|
_MVPD_CACHE = 'ap-mvpd'
|
||||||
|
|
||||||
|
_DOWNLOADING_LOGIN_PAGE = 'Downloading Provider Login Page'
|
||||||
|
|
||||||
def _download_webpage_handle(self, *args, **kwargs):
|
def _download_webpage_handle(self, *args, **kwargs):
|
||||||
headers = kwargs.get('headers', {})
|
headers = kwargs.get('headers', {})
|
||||||
headers.update(self.geo_verification_headers())
|
headers.update(self.geo_verification_headers())
|
||||||
@ -1365,6 +1373,21 @@ class AdobePassIE(InfoExtractor):
|
|||||||
'Use --ap-mso to specify Adobe Pass Multiple-system operator Identifier '
|
'Use --ap-mso to specify Adobe Pass Multiple-system operator Identifier '
|
||||||
'and --ap-username and --ap-password or --netrc to provide account credentials.', expected=True)
|
'and --ap-username and --ap-password or --netrc to provide account credentials.', expected=True)
|
||||||
|
|
||||||
|
def extract_redirect_url(html, url=None, fatal=False):
|
||||||
|
# TODO: eliminate code duplication with generic extractor and move
|
||||||
|
# redirection code into _download_webpage_handle
|
||||||
|
REDIRECT_REGEX = r'[0-9]{,2};\s*(?:URL|url)=\'?([^\'"]+)'
|
||||||
|
redirect_url = self._search_regex(
|
||||||
|
r'(?i)<meta\s+(?=(?:[a-z-]+="[^"]+"\s+)*http-equiv="refresh")'
|
||||||
|
r'(?:[a-z-]+="[^"]+"\s+)*?content="%s' % REDIRECT_REGEX,
|
||||||
|
html, 'meta refresh redirect',
|
||||||
|
default=NO_DEFAULT if fatal else None, fatal=fatal)
|
||||||
|
if not redirect_url:
|
||||||
|
return None
|
||||||
|
if url:
|
||||||
|
redirect_url = compat_urlparse.urljoin(url, unescapeHTML(redirect_url))
|
||||||
|
return redirect_url
|
||||||
|
|
||||||
mvpd_headers = {
|
mvpd_headers = {
|
||||||
'ap_42': 'anonymous',
|
'ap_42': 'anonymous',
|
||||||
'ap_11': 'Linux i686',
|
'ap_11': 'Linux i686',
|
||||||
@ -1414,16 +1437,15 @@ class AdobePassIE(InfoExtractor):
|
|||||||
if '<form name="signin"' in provider_redirect_page:
|
if '<form name="signin"' in provider_redirect_page:
|
||||||
provider_login_page_res = provider_redirect_page_res
|
provider_login_page_res = provider_redirect_page_res
|
||||||
elif 'http-equiv="refresh"' in provider_redirect_page:
|
elif 'http-equiv="refresh"' in provider_redirect_page:
|
||||||
oauth_redirect_url = self._html_search_regex(
|
oauth_redirect_url = extract_redirect_url(
|
||||||
r'content="0;\s*url=([^\'"]+)',
|
provider_redirect_page, fatal=True)
|
||||||
provider_redirect_page, 'meta refresh redirect')
|
|
||||||
provider_login_page_res = self._download_webpage_handle(
|
provider_login_page_res = self._download_webpage_handle(
|
||||||
oauth_redirect_url, video_id,
|
oauth_redirect_url, video_id,
|
||||||
'Downloading Provider Login Page')
|
self._DOWNLOADING_LOGIN_PAGE)
|
||||||
else:
|
else:
|
||||||
provider_login_page_res = post_form(
|
provider_login_page_res = post_form(
|
||||||
provider_redirect_page_res,
|
provider_redirect_page_res,
|
||||||
'Downloading Provider Login Page')
|
self._DOWNLOADING_LOGIN_PAGE)
|
||||||
|
|
||||||
mvpd_confirm_page_res = post_form(
|
mvpd_confirm_page_res = post_form(
|
||||||
provider_login_page_res, 'Logging in', {
|
provider_login_page_res, 'Logging in', {
|
||||||
@ -1470,8 +1492,17 @@ class AdobePassIE(InfoExtractor):
|
|||||||
'Content-Type': 'application/x-www-form-urlencoded'
|
'Content-Type': 'application/x-www-form-urlencoded'
|
||||||
})
|
})
|
||||||
else:
|
else:
|
||||||
|
# Some providers (e.g. DIRECTV NOW) have another meta refresh
|
||||||
|
# based redirect that should be followed.
|
||||||
|
provider_redirect_page, urlh = provider_redirect_page_res
|
||||||
|
provider_refresh_redirect_url = extract_redirect_url(
|
||||||
|
provider_redirect_page, url=urlh.geturl())
|
||||||
|
if provider_refresh_redirect_url:
|
||||||
|
provider_redirect_page_res = self._download_webpage_handle(
|
||||||
|
provider_refresh_redirect_url, video_id,
|
||||||
|
'Downloading Provider Redirect Page (meta refresh)')
|
||||||
provider_login_page_res = post_form(
|
provider_login_page_res = post_form(
|
||||||
provider_redirect_page_res, 'Downloading Provider Login Page')
|
provider_redirect_page_res, self._DOWNLOADING_LOGIN_PAGE)
|
||||||
mvpd_confirm_page_res = post_form(provider_login_page_res, 'Logging in', {
|
mvpd_confirm_page_res = post_form(provider_login_page_res, 'Logging in', {
|
||||||
mso_info.get('username_field', 'username'): username,
|
mso_info.get('username_field', 'username'): username,
|
||||||
mso_info.get('password_field', 'password'): password,
|
mso_info.get('password_field', 'password'): password,
|
||||||
|
@ -828,6 +828,7 @@ from .radiobremen import RadioBremenIE
|
|||||||
from .radiofrance import RadioFranceIE
|
from .radiofrance import RadioFranceIE
|
||||||
from .rai import (
|
from .rai import (
|
||||||
RaiPlayIE,
|
RaiPlayIE,
|
||||||
|
RaiPlayLiveIE,
|
||||||
RaiIE,
|
RaiIE,
|
||||||
)
|
)
|
||||||
from .rbmaradio import RBMARadioIE
|
from .rbmaradio import RBMARadioIE
|
||||||
|
@ -89,6 +89,11 @@ class IGNIE(InfoExtractor):
|
|||||||
'url': 'http://me.ign.com/ar/angry-birds-2/106533/video/lrd-ldyy-lwl-lfylm-angry-birds',
|
'url': 'http://me.ign.com/ar/angry-birds-2/106533/video/lrd-ldyy-lwl-lfylm-angry-birds',
|
||||||
'only_matching': True,
|
'only_matching': True,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
# videoId pattern
|
||||||
|
'url': 'http://www.ign.com/articles/2017/06/08/new-ducktales-short-donalds-birthday-doesnt-go-as-planned',
|
||||||
|
'only_matching': True,
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
def _find_video_id(self, webpage):
|
def _find_video_id(self, webpage):
|
||||||
@ -98,6 +103,8 @@ class IGNIE(InfoExtractor):
|
|||||||
r'data-video-id="(.+?)"',
|
r'data-video-id="(.+?)"',
|
||||||
r'<object id="vid_(.+?)"',
|
r'<object id="vid_(.+?)"',
|
||||||
r'<meta name="og:image" content=".*/(.+?)-(.+?)/.+.jpg"',
|
r'<meta name="og:image" content=".*/(.+?)-(.+?)/.+.jpg"',
|
||||||
|
r'videoId"\s*:\s*"(.+?)"',
|
||||||
|
r'videoId["\']\s*:\s*["\']([^"\']+?)["\']',
|
||||||
]
|
]
|
||||||
return self._search_regex(res_id, webpage, 'video id', default=None)
|
return self._search_regex(res_id, webpage, 'video id', default=None)
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ from ..utils import (
|
|||||||
get_element_by_class,
|
get_element_by_class,
|
||||||
int_or_none,
|
int_or_none,
|
||||||
js_to_json,
|
js_to_json,
|
||||||
|
NO_DEFAULT,
|
||||||
parse_iso8601,
|
parse_iso8601,
|
||||||
remove_start,
|
remove_start,
|
||||||
strip_or_none,
|
strip_or_none,
|
||||||
@ -198,6 +199,19 @@ class OnetPlIE(InfoExtractor):
|
|||||||
'upload_date': '20170214',
|
'upload_date': '20170214',
|
||||||
'timestamp': 1487078046,
|
'timestamp': 1487078046,
|
||||||
},
|
},
|
||||||
|
}, {
|
||||||
|
# embedded via pulsembed
|
||||||
|
'url': 'http://film.onet.pl/pensjonat-nad-rozlewiskiem-relacja-z-planu-serialu/y428n0',
|
||||||
|
'info_dict': {
|
||||||
|
'id': '501235.965429946',
|
||||||
|
'ext': 'mp4',
|
||||||
|
'title': '"Pensjonat nad rozlewiskiem": relacja z planu serialu',
|
||||||
|
'upload_date': '20170622',
|
||||||
|
'timestamp': 1498159955,
|
||||||
|
},
|
||||||
|
'params': {
|
||||||
|
'skip_download': True,
|
||||||
|
},
|
||||||
}, {
|
}, {
|
||||||
'url': 'http://film.onet.pl/zwiastuny/ghost-in-the-shell-drugi-zwiastun-pl/5q6yl3',
|
'url': 'http://film.onet.pl/zwiastuny/ghost-in-the-shell-drugi-zwiastun-pl/5q6yl3',
|
||||||
'only_matching': True,
|
'only_matching': True,
|
||||||
@ -212,13 +226,25 @@ class OnetPlIE(InfoExtractor):
|
|||||||
'only_matching': True,
|
'only_matching': True,
|
||||||
}]
|
}]
|
||||||
|
|
||||||
|
def _search_mvp_id(self, webpage, default=NO_DEFAULT):
|
||||||
|
return self._search_regex(
|
||||||
|
r'data-(?:params-)?mvp=["\'](\d+\.\d+)', webpage, 'mvp id',
|
||||||
|
default=default)
|
||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
video_id = self._match_id(url)
|
video_id = self._match_id(url)
|
||||||
|
|
||||||
webpage = self._download_webpage(url, video_id)
|
webpage = self._download_webpage(url, video_id)
|
||||||
|
|
||||||
mvp_id = self._search_regex(
|
mvp_id = self._search_mvp_id(webpage, default=None)
|
||||||
r'data-params-mvp=["\'](\d+\.\d+)', webpage, 'mvp id')
|
|
||||||
|
if not mvp_id:
|
||||||
|
pulsembed_url = self._search_regex(
|
||||||
|
r'data-src=(["\'])(?P<url>(?:https?:)?//pulsembed\.eu/.+?)\1',
|
||||||
|
webpage, 'pulsembed url', group='url')
|
||||||
|
webpage = self._download_webpage(
|
||||||
|
pulsembed_url, video_id, 'Downloading pulsembed webpage')
|
||||||
|
mvp_id = self._search_mvp_id(webpage)
|
||||||
|
|
||||||
return self.url_result(
|
return self.url_result(
|
||||||
'onetmvp:%s' % mvp_id, OnetMVPIE.ie_key(), video_id=mvp_id)
|
'onetmvp:%s' % mvp_id, OnetMVPIE.ie_key(), video_id=mvp_id)
|
||||||
|
@ -191,11 +191,12 @@ class RaiPlayIE(RaiBaseIE):
|
|||||||
|
|
||||||
info = {
|
info = {
|
||||||
'id': video_id,
|
'id': video_id,
|
||||||
'title': title,
|
'title': self._live_title(title) if relinker_info.get(
|
||||||
|
'is_live') else title,
|
||||||
'alt_title': media.get('subtitle'),
|
'alt_title': media.get('subtitle'),
|
||||||
'description': media.get('description'),
|
'description': media.get('description'),
|
||||||
'uploader': media.get('channel'),
|
'uploader': strip_or_none(media.get('channel')),
|
||||||
'creator': media.get('editor'),
|
'creator': strip_or_none(media.get('editor')),
|
||||||
'duration': parse_duration(video.get('duration')),
|
'duration': parse_duration(video.get('duration')),
|
||||||
'timestamp': timestamp,
|
'timestamp': timestamp,
|
||||||
'thumbnails': thumbnails,
|
'thumbnails': thumbnails,
|
||||||
@ -208,10 +209,46 @@ class RaiPlayIE(RaiBaseIE):
|
|||||||
}
|
}
|
||||||
|
|
||||||
info.update(relinker_info)
|
info.update(relinker_info)
|
||||||
|
|
||||||
return info
|
return info
|
||||||
|
|
||||||
|
|
||||||
|
class RaiPlayLiveIE(RaiBaseIE):
|
||||||
|
_VALID_URL = r'https?://(?:www\.)?raiplay\.it/dirette/(?P<id>[^/?#&]+)'
|
||||||
|
_TEST = {
|
||||||
|
'url': 'http://www.raiplay.it/dirette/rainews24',
|
||||||
|
'info_dict': {
|
||||||
|
'id': 'd784ad40-e0ae-4a69-aa76-37519d238a9c',
|
||||||
|
'display_id': 'rainews24',
|
||||||
|
'ext': 'mp4',
|
||||||
|
'title': 're:^Diretta di Rai News 24 [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$',
|
||||||
|
'description': 'md5:6eca31500550f9376819f174e5644754',
|
||||||
|
'uploader': 'Rai News 24',
|
||||||
|
'creator': 'Rai News 24',
|
||||||
|
'is_live': True,
|
||||||
|
},
|
||||||
|
'params': {
|
||||||
|
'skip_download': True,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
def _real_extract(self, url):
|
||||||
|
display_id = self._match_id(url)
|
||||||
|
|
||||||
|
webpage = self._download_webpage(url, display_id)
|
||||||
|
|
||||||
|
video_id = self._search_regex(
|
||||||
|
r'data-uniquename=["\']ContentItem-(%s)' % RaiBaseIE._UUID_RE,
|
||||||
|
webpage, 'content id')
|
||||||
|
|
||||||
|
return {
|
||||||
|
'_type': 'url_transparent',
|
||||||
|
'ie_key': RaiPlayIE.ie_key(),
|
||||||
|
'url': 'http://www.raiplay.it/dirette/ContentItem-%s.html' % video_id,
|
||||||
|
'id': video_id,
|
||||||
|
'display_id': display_id,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class RaiIE(RaiBaseIE):
|
class RaiIE(RaiBaseIE):
|
||||||
_VALID_URL = r'https?://[^/]+\.(?:rai\.(?:it|tv)|rainews\.it)/dl/.+?-(?P<id>%s)(?:-.+?)?\.html' % RaiBaseIE._UUID_RE
|
_VALID_URL = r'https?://[^/]+\.(?:rai\.(?:it|tv)|rainews\.it)/dl/.+?-(?P<id>%s)(?:-.+?)?\.html' % RaiBaseIE._UUID_RE
|
||||||
_TESTS = [{
|
_TESTS = [{
|
||||||
|
@ -13,7 +13,7 @@ from ..utils import (
|
|||||||
|
|
||||||
|
|
||||||
class RedBullTVIE(InfoExtractor):
|
class RedBullTVIE(InfoExtractor):
|
||||||
_VALID_URL = r'https?://(?:www\.)?redbull\.tv/(?:video|film)/(?P<id>AP-\w+)'
|
_VALID_URL = r'https?://(?:www\.)?redbull\.tv/(?:video|film|live)/(?:AP-\w+/segment/)?(?P<id>AP-\w+)'
|
||||||
_TESTS = [{
|
_TESTS = [{
|
||||||
# film
|
# film
|
||||||
'url': 'https://www.redbull.tv/video/AP-1Q756YYX51W11/abc-of-wrc',
|
'url': 'https://www.redbull.tv/video/AP-1Q756YYX51W11/abc-of-wrc',
|
||||||
@ -42,6 +42,22 @@ class RedBullTVIE(InfoExtractor):
|
|||||||
'season_number': 2,
|
'season_number': 2,
|
||||||
'episode_number': 4,
|
'episode_number': 4,
|
||||||
},
|
},
|
||||||
|
'params': {
|
||||||
|
'skip_download': True,
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
# segment
|
||||||
|
'url': 'https://www.redbull.tv/live/AP-1R5DX49XS1W11/segment/AP-1QSAQJ6V52111/semi-finals',
|
||||||
|
'info_dict': {
|
||||||
|
'id': 'AP-1QSAQJ6V52111',
|
||||||
|
'ext': 'mp4',
|
||||||
|
'title': 'Semi Finals - Vans Park Series Pro Tour',
|
||||||
|
'description': 'md5:306a2783cdafa9e65e39aa62f514fd97',
|
||||||
|
'duration': 11791.991,
|
||||||
|
},
|
||||||
|
'params': {
|
||||||
|
'skip_download': True,
|
||||||
|
},
|
||||||
}, {
|
}, {
|
||||||
'url': 'https://www.redbull.tv/film/AP-1MSKKF5T92111/in-motion',
|
'url': 'https://www.redbull.tv/film/AP-1MSKKF5T92111/in-motion',
|
||||||
'only_matching': True,
|
'only_matching': True,
|
||||||
@ -82,7 +98,8 @@ class RedBullTVIE(InfoExtractor):
|
|||||||
title = info['title'].strip()
|
title = info['title'].strip()
|
||||||
|
|
||||||
formats = self._extract_m3u8_formats(
|
formats = self._extract_m3u8_formats(
|
||||||
video['url'], video_id, 'mp4', 'm3u8_native')
|
video['url'], video_id, 'mp4', entry_protocol='m3u8_native',
|
||||||
|
m3u8_id='hls')
|
||||||
self._sort_formats(formats)
|
self._sort_formats(formats)
|
||||||
|
|
||||||
subtitles = {}
|
subtitles = {}
|
||||||
|
@ -13,7 +13,7 @@ class WSJIE(InfoExtractor):
|
|||||||
_VALID_URL = r'''(?x)
|
_VALID_URL = r'''(?x)
|
||||||
(?:
|
(?:
|
||||||
https?://video-api\.wsj\.com/api-video/player/iframe\.html\?.*?\bguid=|
|
https?://video-api\.wsj\.com/api-video/player/iframe\.html\?.*?\bguid=|
|
||||||
https?://(?:www\.)?wsj\.com/video/[^/]+/|
|
https?://(?:www\.)?(?:wsj|barrons)\.com/video/[^/]+/|
|
||||||
wsj:
|
wsj:
|
||||||
)
|
)
|
||||||
(?P<id>[a-fA-F0-9-]{36})
|
(?P<id>[a-fA-F0-9-]{36})
|
||||||
@ -35,6 +35,9 @@ class WSJIE(InfoExtractor):
|
|||||||
}, {
|
}, {
|
||||||
'url': 'http://www.wsj.com/video/can-alphabet-build-a-smarter-city/359DDAA8-9AC1-489C-82E6-0429C1E430E0.html',
|
'url': 'http://www.wsj.com/video/can-alphabet-build-a-smarter-city/359DDAA8-9AC1-489C-82E6-0429C1E430E0.html',
|
||||||
'only_matching': True,
|
'only_matching': True,
|
||||||
|
}, {
|
||||||
|
'url': 'http://www.barrons.com/video/capitalism-deserves-more-respect-from-millennials/F301217E-6F46-43AE-B8D2-B7180D642EE9.html',
|
||||||
|
'only_matching': True,
|
||||||
}]
|
}]
|
||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
__version__ = '2017.06.23'
|
__version__ = '2017.06.25'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user