Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Yen Chi Hsuan 2016-01-30 16:25:55 +08:00
commit 8bf39420b4
8 changed files with 47 additions and 9 deletions

View file

@ -56,7 +56,7 @@ def test_youtube_channel_matching(self):
assertChannel('https://www.youtube.com/channel/HCtnHdj3df7iM/videos') assertChannel('https://www.youtube.com/channel/HCtnHdj3df7iM/videos')
def test_youtube_user_matching(self): def test_youtube_user_matching(self):
self.assertMatch('www.youtube.com/NASAgovVideo/videos', ['youtube:user']) self.assertMatch('http://www.youtube.com/NASAgovVideo/videos', ['youtube:user'])
def test_youtube_feeds(self): def test_youtube_feeds(self):
self.assertMatch('https://www.youtube.com/feed/watch_later', ['youtube:watchlater']) self.assertMatch('https://www.youtube.com/feed/watch_later', ['youtube:watchlater'])

View file

@ -50,7 +50,7 @@
from .atttechchannel import ATTTechChannelIE from .atttechchannel import ATTTechChannelIE
from .audimedia import AudiMediaIE from .audimedia import AudiMediaIE
from .audiomack import AudiomackIE, AudiomackAlbumIE from .audiomack import AudiomackIE, AudiomackAlbumIE
from .azubu import AzubuIE from .azubu import AzubuIE, AzubuLiveIE
from .baidu import BaiduVideoIE from .baidu import BaiduVideoIE
from .bambuser import BambuserIE, BambuserChannelIE from .bambuser import BambuserIE, BambuserChannelIE
from .bandcamp import BandcampIE, BandcampAlbumIE from .bandcamp import BandcampIE, BandcampAlbumIE

View file

@ -3,7 +3,11 @@
import json import json
from .common import InfoExtractor from .common import InfoExtractor
from ..utils import float_or_none from ..utils import (
ExtractorError,
float_or_none,
sanitized_Request,
)
class AzubuIE(InfoExtractor): class AzubuIE(InfoExtractor):
@ -91,3 +95,37 @@ def _real_extract(self, url):
'view_count': view_count, 'view_count': view_count,
'formats': formats, 'formats': formats,
} }
class AzubuLiveIE(InfoExtractor):
_VALID_URL = r'http://www.azubu.tv/(?P<id>[^/]+)$'
_TEST = {
'url': 'http://www.azubu.tv/MarsTVMDLen',
'only_matching': True,
}
def _real_extract(self, url):
user = self._match_id(url)
info = self._download_json(
'http://api.azubu.tv/public/modules/last-video/{0}/info'.format(user),
user)['data']
if info['type'] != 'STREAM':
raise ExtractorError('{0} is not streaming live'.format(user), expected=True)
req = sanitized_Request(
'https://edge-elb.api.brightcove.com/playback/v1/accounts/3361910549001/videos/ref:' + info['reference_id'])
req.add_header('Accept', 'application/json;pk=BCpkADawqM1gvI0oGWg8dxQHlgT8HkdE2LnAlWAZkOlznO39bSZX726u4JqnDsK3MDXcO01JxXK2tZtJbgQChxgaFzEVdHRjaDoxaOu8hHOO8NYhwdxw9BzvgkvLUlpbDNUuDoc4E4wxDToV')
bc_info = self._download_json(req, user)
m3u8_url = next(source['src'] for source in bc_info['sources'] if source['container'] == 'M2TS')
formats = self._extract_m3u8_formats(m3u8_url, user, ext='mp4')
return {
'id': info['id'],
'title': self._live_title(info['title']),
'uploader_id': user,
'formats': formats,
'is_live': True,
'thumbnail': bc_info['poster'],
}

View file

@ -828,7 +828,7 @@ def _sort_formats(self, formats, field_preference=None):
for f in formats: for f in formats:
# Automatically determine tbr when missing based on abr and vbr (improves # Automatically determine tbr when missing based on abr and vbr (improves
# formats sorting in some cases) # formats sorting in some cases)
if 'tbr' not in f and 'abr' in f and 'vbr' in f: if 'tbr' not in f and f.get('abr') is not None and f.get('vbr') is not None:
f['tbr'] = f['abr'] + f['vbr'] f['tbr'] = f['abr'] + f['vbr']
def _formats_key(f): def _formats_key(f):

View file

@ -113,7 +113,7 @@ def get_text_attr(d, attr):
'tbr': int_or_none(get_text_attr(quality, 'bitrate')), 'tbr': int_or_none(get_text_attr(quality, 'bitrate')),
}) })
if not formats: if not formats:
path = get_text_attr(f, 'path') path = unescapeHTML(get_text_attr(f, 'path'))
if not path: if not path:
continue continue
formats = self._extract_m3u8_formats( formats = self._extract_m3u8_formats(

View file

@ -53,8 +53,8 @@ def _real_extract(self, url):
webpage = self._download_webpage(url, video_id) webpage = self._download_webpage(url, video_id)
video_id = self._search_regex( video_id = self._search_regex(
r'class="video-play-button"[^>]+data-id="(\d+)', r'class=(["\']).*?video-play-button.*?\1[^>]+data-id=["\'](?P<id>\d+)',
webpage, 'video id') webpage, 'video id', group='id')
cms = 'espn' cms = 'espn'
if 'data-source="intl"' in webpage: if 'data-source="intl"' in webpage:

View file

@ -1846,7 +1846,7 @@ def _real_extract(self, url):
class YoutubeUserIE(YoutubeChannelIE): class YoutubeUserIE(YoutubeChannelIE):
IE_DESC = 'YouTube.com user videos (URL or "ytuser" keyword)' IE_DESC = 'YouTube.com user videos (URL or "ytuser" keyword)'
_VALID_URL = r'(?:(?:(?:https?://)?(?:\w+\.)?youtube\.com/(?:user/)?(?!(?:attribution_link|watch|results)(?:$|[^a-z_A-Z0-9-])))|ytuser:)(?!feed/)(?P<id>[A-Za-z0-9_-]+)' _VALID_URL = r'(?:(?:https?://(?:\w+\.)?youtube\.com/(?:user/)?(?!(?:attribution_link|watch|results)(?:$|[^a-z_A-Z0-9-])))|ytuser:)(?!feed/)(?P<id>[A-Za-z0-9_-]+)'
_TEMPLATE_URL = 'https://www.youtube.com/user/%s/videos' _TEMPLATE_URL = 'https://www.youtube.com/user/%s/videos'
IE_NAME = 'youtube:user' IE_NAME = 'youtube:user'

View file

@ -1,3 +1,3 @@
from __future__ import unicode_literals from __future__ import unicode_literals
__version__ = '2016.01.27' __version__ = '2016.01.29'