|
|
@ -0,0 +1,100 @@ |
|
|
|
# coding: utf-8 |
|
|
|
from __future__ import unicode_literals |
|
|
|
|
|
|
|
from .common import InfoExtractor |
|
|
|
from ..utils import ( |
|
|
|
ExtractorError, |
|
|
|
parse_iso8601, |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
class TV4IE(InfoExtractor): |
|
|
|
IE_DESC = 'tv4.se and tv4play.se' |
|
|
|
_VALID_URL = r'''(?x)https?://(?:www\.)? |
|
|
|
(?: |
|
|
|
tv4\.se/(?:[^/]+)/klipp/(?:.*)-| |
|
|
|
tv4play\.se/ |
|
|
|
(?: |
|
|
|
(?:program|barn)/(?:[^\?]+)\?video_id=| |
|
|
|
iframe/video/| |
|
|
|
film/| |
|
|
|
sport/| |
|
|
|
) |
|
|
|
)(?P<id>[0-9]+)''' |
|
|
|
_TESTS = [ |
|
|
|
{ |
|
|
|
'url': 'http://www.tv4.se/kalla-fakta/klipp/kalla-fakta-5-english-subtitles-2491650', |
|
|
|
'md5': '909d6454b87b10a25aa04c4bdd416a9b', |
|
|
|
'info_dict': { |
|
|
|
'id': '2491650', |
|
|
|
'ext': 'mp4', |
|
|
|
'title': 'Kalla Fakta 5 (english subtitles)', |
|
|
|
'thumbnail': 're:^https?://.*\.jpg$', |
|
|
|
'timestamp': int, |
|
|
|
'upload_date': '20131125', |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
'url': 'http://www.tv4play.se/iframe/video/3054113', |
|
|
|
'md5': '77f851c55139ffe0ebd41b6a5552489b', |
|
|
|
'info_dict': { |
|
|
|
'id': '3054113', |
|
|
|
'ext': 'mp4', |
|
|
|
'title': 'Så här jobbar ficktjuvarna - se avslöjande bilder', |
|
|
|
'thumbnail': 're:^https?://.*\.jpg$', |
|
|
|
'description': 'Unika bilder avslöjar hur turisternas fickor vittjas mitt på Stockholms central. Två experter på ficktjuvarna avslöjar knepen du ska se upp för.', |
|
|
|
'timestamp': int, |
|
|
|
'upload_date': '20150130', |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
'url': 'http://www.tv4play.se/sport/3060959', |
|
|
|
'only_matching': True, |
|
|
|
}, |
|
|
|
{ |
|
|
|
'url': 'http://www.tv4play.se/film/2378136', |
|
|
|
'only_matching': True, |
|
|
|
}, |
|
|
|
{ |
|
|
|
'url': 'http://www.tv4play.se/barn/looney-tunes?video_id=3062412', |
|
|
|
'only_matching': True, |
|
|
|
}, |
|
|
|
] |
|
|
|
|
|
|
|
def _real_extract(self, url): |
|
|
|
video_id = self._match_id(url) |
|
|
|
|
|
|
|
info = self._download_json( |
|
|
|
'http://www.tv4play.se/player/assets/%s.json' % video_id, video_id, 'Downloading video info JSON') |
|
|
|
|
|
|
|
# If is_geo_restricted is true, it doesn't neceserally mean we can't download it |
|
|
|
if info['is_geo_restricted']: |
|
|
|
self.report_warning('This content might not be available in your country due to licensing restrictions.') |
|
|
|
if info['requires_subscription']: |
|
|
|
raise ExtractorError('This content requires subscription.', expected=True) |
|
|
|
|
|
|
|
sources_data = self._download_json( |
|
|
|
'https://prima.tv4play.se/api/web/asset/%s/play.json?protocol=http&videoFormat=MP4' % video_id, video_id, 'Downloading sources JSON') |
|
|
|
sources = sources_data['playback'] |
|
|
|
|
|
|
|
formats = [] |
|
|
|
for item in sources.get('items', {}).get('item', []): |
|
|
|
ext, bitrate = item['mediaFormat'], item['bitrate'] |
|
|
|
formats.append({ |
|
|
|
'format_id': '%s_%s' % (ext, bitrate), |
|
|
|
'tbr': bitrate, |
|
|
|
'ext': ext, |
|
|
|
'url': item['url'], |
|
|
|
}) |
|
|
|
self._sort_formats(formats) |
|
|
|
|
|
|
|
return { |
|
|
|
'id': video_id, |
|
|
|
'title': info['title'], |
|
|
|
'formats': formats, |
|
|
|
'description': info.get('description'), |
|
|
|
'timestamp': parse_iso8601(info.get('broadcast_date_time')), |
|
|
|
'duration': info.get('duration'), |
|
|
|
'thumbnail': info.get('image'), |
|
|
|
'is_live': sources.get('live'), |
|
|
|
} |