[sbs] improve extraction(fixes #3811)

- extract error messages
- force the platform smil url(previously the manifest param
in the query is not respected which make theplatform return non working
mp4 files for some videos)
This commit is contained in:
remitamine 2016-03-17 02:02:18 +01:00
parent 63f41d3821
commit a646a8cf98

View File

@ -2,6 +2,10 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from .common import InfoExtractor from .common import InfoExtractor
from ..utils import (
smuggle_url,
ExtractorError,
)
class SBSIE(InfoExtractor): class SBSIE(InfoExtractor):
@ -31,21 +35,28 @@ class SBSIE(InfoExtractor):
def _real_extract(self, url): def _real_extract(self, url):
video_id = self._match_id(url) video_id = self._match_id(url)
player_params = self._download_json(
'http://www.sbs.com.au/api/video_pdkvars/id/%s?form=json' % video_id, video_id)
webpage = self._download_webpage( error = player_params.get('error')
'http://www.sbs.com.au/ondemand/video/single/%s?context=web' % video_id, video_id) if error:
error_message = 'Sorry, The video you are looking for does not exist.'
player_params = self._parse_json( video_data = error.get('results') or {}
self._search_regex( error_code = error.get('errorCode')
r'(?s)var\s+playerParams\s*=\s*({.+?});', webpage, 'playerParams'), if error_code == 'ComingSoon':
video_id) error_message = '%s is not yet available.' % video_data.get('title', '')
elif error_code in ('Forbidden', 'intranetAccessOnly'):
error_message = 'Sorry, This video cannot be accessed via this website'
elif error_code == 'Expired':
error_message = 'Sorry, %s is no longer available.' % video_data.get('title', '')
raise ExtractorError('%s said: %s' % (self.IE_NAME, error_message), expected=True)
urls = player_params['releaseUrls'] urls = player_params['releaseUrls']
theplatform_url = (urls.get('progressive') or urls.get('standard') or theplatform_url = (urls.get('progressive') or urls.get('html') or
urls.get('html') or player_params['relatedItemsURL']) urls.get('standard') or player_params['relatedItemsURL'])
return { return {
'_type': 'url_transparent', '_type': 'url_transparent',
'id': video_id, 'id': video_id,
'url': theplatform_url, 'url': smuggle_url(theplatform_url, {'force_smil_url': True}),
} }