[tvplay] Add extractor (Closes #3245)
This commit is contained in:
		
							parent
							
								
									8f3034d871
								
							
						
					
					
						commit
						1220352ff7
					
				| @ -322,6 +322,7 @@ from .tumblr import TumblrIE | |||||||
| from .tutv import TutvIE | from .tutv import TutvIE | ||||||
| from .tvigle import TvigleIE | from .tvigle import TvigleIE | ||||||
| from .tvp import TvpIE | from .tvp import TvpIE | ||||||
|  | from .tvplay import TVPlayIE | ||||||
| from .udemy import ( | from .udemy import ( | ||||||
|     UdemyIE, |     UdemyIE, | ||||||
|     UdemyCourseIE |     UdemyCourseIE | ||||||
|  | |||||||
							
								
								
									
										85
									
								
								youtube_dl/extractor/tvplay.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								youtube_dl/extractor/tvplay.py
									
									
									
									
									
										Normal file
									
								
							| @ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user