[tvplay] Add extractor (Closes #3245)
parent
8f3034d871
commit
1220352ff7
2 changed files with 86 additions and 0 deletions
@ -0,0 +1,85 @@ |
|||||||
|
# coding: utf-8 |
||||||
|
from __future__ import unicode_literals |
||||||
|
|
||||||
|
import re |
||||||
|
|
||||||
|
from .common import InfoExtractor |
||||||
|
from ..utils import ( |
||||||
|
ExtractorError, |
||||||
|
parse_iso8601, |
||||||
|
qualities, |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
class TVPlayIE(InfoExtractor): |
||||||
|
_VALID_URL = r'http://(?:www\.)?tvplay\.lv/parraides/[^/]+/(?P<id>\d+)' |
||||||
|
_TESTS = [ |
||||||
|
{ |
||||||
|
'url': 'http://www.tvplay.lv/parraides/vinas-melo-labak/418113?autostart=true', |
||||||
|
'info_dict': { |
||||||
|
'id': '418113', |
||||||
|
'ext': 'flv', |
||||||
|
'title': 'Kādi ir īri? - Viņas melo labāk', |
||||||
|
'description': 'Baiba apsmej īrus, kādi tie ir un ko viņi dara.', |
||||||
|
'duration': 25, |
||||||
|
'timestamp': 1406097056, |
||||||
|
'upload_date': '20140723', |
||||||
|
}, |
||||||
|
'params': { |
||||||
|
# rtmp download |
||||||
|
'skip_download': True, |
||||||
|
}, |
||||||
|
}, |
||||||
|
] |
||||||
|
|
||||||
|
def _real_extract(self, url): |
||||||
|
mobj = re.match(self._VALID_URL, url) |
||||||
|
video_id = mobj.group('id') |
||||||
|
|
||||||
|
video = self._download_json( |
||||||
|
'http://playapi.mtgx.tv/v1/videos/%s' % video_id, video_id, 'Downloading video JSON') |
||||||
|
|
||||||
|
if video['is_geo_blocked']: |
||||||
|
raise ExtractorError( |
||||||
|
'This content is not available in your country due to copyright reasons', expected=True) |
||||||
|
|
||||||
|
streams = self._download_json( |
||||||
|
'http://playapi.mtgx.tv/v1/videos/stream/%s' % video_id, video_id, 'Downloading streams JSON') |
||||||
|
|
||||||
|
quality = qualities(['hls', 'medium', 'high']) |
||||||
|
formats = [] |
||||||
|
for format_id, video_url in streams['streams'].items(): |
||||||
|
if not video_url: |
||||||
|
continue |
||||||
|
fmt = { |
||||||
|
'format_id': format_id, |
||||||
|
'preference': quality(format_id), |
||||||
|
} |
||||||
|
if video_url.startswith('rtmp'): |
||||||
|
m = re.search(r'^(?P<url>rtmp://[^/]+/(?P<app>[^/]+))/(?P<playpath>.+)$', video_url) |
||||||
|
if not m: |
||||||
|
continue |
||||||
|
fmt.update({ |
||||||
|
'ext': 'flv', |
||||||
|
'url': m.group('url'), |
||||||
|
'app': m.group('app'), |
||||||
|
'play_path': m.group('playpath'), |
||||||
|
}) |
||||||
|
else: |
||||||
|
fmt.update({ |
||||||
|
'url': video_url, |
||||||
|
}) |
||||||
|
formats.append(fmt) |
||||||
|
|
||||||
|
self._sort_formats(formats) |
||||||
|
|
||||||
|
return { |
||||||
|
'id': video_id, |
||||||
|
'title': video['title'], |
||||||
|
'description': video['description'], |
||||||
|
'duration': video['duration'], |
||||||
|
'timestamp': parse_iso8601(video['created_at']), |
||||||
|
'view_count': video['views']['total'], |
||||||
|
'age_limit': video.get('age_limit', 0), |
||||||
|
'formats': formats, |
||||||
|
} |
Loading…
Reference in new issue