| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  | # coding: utf-8 | 
					
						
							| 
									
										
										
										
											2014-10-28 16:51:32 +01:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import re | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from .common import InfoExtractor | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  | from ..compat import ( | 
					
						
							| 
									
										
										
										
											2016-03-26 01:46:57 +06:00
										 |  |  |     compat_urllib_parse_urlencode, | 
					
						
							| 
									
										
										
										
											2016-02-09 16:25:30 +01:00
										 |  |  |     compat_urlparse, | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  | ) | 
					
						
							|  |  |  | from ..utils import ( | 
					
						
							| 
									
										
										
										
											2015-02-23 20:45:36 +02:00
										 |  |  |     ExtractorError, | 
					
						
							| 
									
										
										
										
											2016-02-09 16:25:30 +01:00
										 |  |  |     sanitized_Request, | 
					
						
							|  |  |  |     unified_strdate, | 
					
						
							|  |  |  |     urlencode_postdata, | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |     xpath_element, | 
					
						
							|  |  |  |     xpath_text, | 
					
						
							| 
									
										
										
										
											2015-02-23 20:45:36 +02:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2014-10-28 16:51:32 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Laola1TvIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2016-03-22 22:32:59 +06:00
										 |  |  |     _VALID_URL = r'https?://(?:www\.)?laola1\.tv/(?P<lang>[a-z]+)-(?P<portal>[a-z]+)/(?P<kind>[^/]+)/(?P<slug>[^/?#&]+)' | 
					
						
							| 
									
										
										
										
											2016-02-09 16:25:30 +01:00
										 |  |  |     _TESTS = [{ | 
					
						
							| 
									
										
										
										
											2015-02-23 20:45:36 +02:00
										 |  |  |         'url': 'http://www.laola1.tv/de-de/video/straubing-tigers-koelner-haie/227883.html', | 
					
						
							| 
									
										
										
										
											2014-10-28 16:51:32 +01:00
										 |  |  |         'info_dict': { | 
					
						
							| 
									
										
										
										
											2015-02-23 20:45:36 +02:00
										 |  |  |             'id': '227883', | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |             'display_id': 'straubing-tigers-koelner-haie', | 
					
						
							|  |  |  |             'ext': 'flv', | 
					
						
							| 
									
										
										
										
											2015-02-23 20:45:36 +02:00
										 |  |  |             'title': 'Straubing Tigers - Kölner Haie', | 
					
						
							| 
									
										
										
										
											2016-02-09 16:25:30 +01:00
										 |  |  |             'upload_date': '20140912', | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |             'is_live': False, | 
					
						
							|  |  |  |             'categories': ['Eishockey'], | 
					
						
							| 
									
										
										
										
											2016-02-09 16:25:30 +01:00
										 |  |  |         }, | 
					
						
							|  |  |  |         'params': { | 
					
						
							|  |  |  |             'skip_download': True, | 
					
						
							| 
									
										
										
										
											2016-03-22 22:32:59 +06:00
										 |  |  |         }, | 
					
						
							| 
									
										
										
										
											2016-02-09 16:25:30 +01:00
										 |  |  |     }, { | 
					
						
							|  |  |  |         'url': 'http://www.laola1.tv/de-de/video/straubing-tigers-koelner-haie', | 
					
						
							|  |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': '464602', | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |             'display_id': 'straubing-tigers-koelner-haie', | 
					
						
							|  |  |  |             'ext': 'flv', | 
					
						
							| 
									
										
										
										
											2016-02-09 16:25:30 +01:00
										 |  |  |             'title': 'Straubing Tigers - Kölner Haie', | 
					
						
							|  |  |  |             'upload_date': '20160129', | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |             'is_live': False, | 
					
						
							|  |  |  |             'categories': ['Eishockey'], | 
					
						
							| 
									
										
										
										
											2014-10-28 16:51:32 +01:00
										 |  |  |         }, | 
					
						
							|  |  |  |         'params': { | 
					
						
							|  |  |  |             'skip_download': True, | 
					
						
							| 
									
										
										
										
											2016-03-22 22:32:59 +06:00
										 |  |  |         }, | 
					
						
							|  |  |  |     }, { | 
					
						
							|  |  |  |         'url': 'http://www.laola1.tv/de-de/livestream/2016-03-22-belogorie-belgorod-trentino-diatec-lde', | 
					
						
							|  |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': '487850', | 
					
						
							|  |  |  |             'display_id': '2016-03-22-belogorie-belgorod-trentino-diatec-lde', | 
					
						
							|  |  |  |             'ext': 'flv', | 
					
						
							|  |  |  |             'title': 'Belogorie BELGOROD - TRENTINO Diatec', | 
					
						
							|  |  |  |             'upload_date': '20160322', | 
					
						
							|  |  |  |             'uploader': 'CEV - Europäischer Volleyball Verband', | 
					
						
							|  |  |  |             'is_live': True, | 
					
						
							|  |  |  |             'categories': ['Volleyball'], | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         'params': { | 
					
						
							|  |  |  |             'skip_download': True, | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2016-04-14 14:11:28 +08:00
										 |  |  |         'skip': 'This live stream has already finished.', | 
					
						
							| 
									
										
										
										
											2016-02-09 16:25:30 +01:00
										 |  |  |     }] | 
					
						
							| 
									
										
										
										
											2014-10-28 16:51:32 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _real_extract(self, url): | 
					
						
							|  |  |  |         mobj = re.match(self._VALID_URL, url) | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |         display_id = mobj.group('slug') | 
					
						
							| 
									
										
										
										
											2016-03-22 22:32:59 +06:00
										 |  |  |         kind = mobj.group('kind') | 
					
						
							| 
									
										
										
										
											2014-10-28 16:51:32 +01:00
										 |  |  |         lang = mobj.group('lang') | 
					
						
							|  |  |  |         portal = mobj.group('portal') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |         webpage = self._download_webpage(url, display_id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-14 14:11:28 +08:00
										 |  |  |         if 'Dieser Livestream ist bereits beendet.' in webpage: | 
					
						
							|  |  |  |             raise ExtractorError('This live stream has already finished.', expected=True) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-28 16:51:32 +01:00
										 |  |  |         iframe_url = self._search_regex( | 
					
						
							| 
									
										
										
										
											2016-02-09 16:25:30 +01:00
										 |  |  |             r'<iframe[^>]*?id="videoplayer"[^>]*?src="([^"]+)"', | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |             webpage, 'iframe url') | 
					
						
							| 
									
										
										
										
											2014-10-28 16:51:32 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 16:25:30 +01:00
										 |  |  |         video_id = self._search_regex( | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |             r'videoid=(\d+)', iframe_url, 'video id') | 
					
						
							| 
									
										
										
										
											2016-02-09 16:25:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         iframe = self._download_webpage(compat_urlparse.urljoin( | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |             url, iframe_url), display_id, 'Downloading iframe') | 
					
						
							| 
									
										
										
										
											2014-10-28 16:51:32 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-23 20:45:36 +02:00
										 |  |  |         partner_id = self._search_regex( | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |             r'partnerid\s*:\s*(["\'])(?P<partner_id>.+?)\1', | 
					
						
							|  |  |  |             iframe, 'partner id', group='partner_id') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         hd_doc = self._download_xml( | 
					
						
							|  |  |  |             'http://www.laola1.tv/server/hd_video.php?%s' | 
					
						
							| 
									
										
										
										
											2016-03-26 01:46:57 +06:00
										 |  |  |             % compat_urllib_parse_urlencode({ | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |                 'play': video_id, | 
					
						
							|  |  |  |                 'partner': partner_id, | 
					
						
							|  |  |  |                 'portal': portal, | 
					
						
							|  |  |  |                 'lang': lang, | 
					
						
							|  |  |  |                 'v5ident': '', | 
					
						
							|  |  |  |             }), display_id) | 
					
						
							| 
									
										
										
										
											2014-10-28 16:51:32 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 16:25:30 +01:00
										 |  |  |         _v = lambda x, **k: xpath_text(hd_doc, './/video/' + x, **k) | 
					
						
							|  |  |  |         title = _v('title', fatal=True) | 
					
						
							| 
									
										
										
										
											2015-02-23 20:45:36 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-22 22:32:59 +06:00
										 |  |  |         VS_TARGETS = { | 
					
						
							|  |  |  |             'video': '2', | 
					
						
							|  |  |  |             'livestream': '17', | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |         req = sanitized_Request( | 
					
						
							|  |  |  |             'https://club.laola1.tv/sp/laola1/api/v3/user/session/premium/player/stream-access?%s' % | 
					
						
							| 
									
										
										
										
											2016-03-26 01:46:57 +06:00
										 |  |  |             compat_urllib_parse_urlencode({ | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |                 'videoId': video_id, | 
					
						
							| 
									
										
										
										
											2016-03-22 22:32:59 +06:00
										 |  |  |                 'target': VS_TARGETS.get(kind, '2'), | 
					
						
							|  |  |  |                 'label': _v('label'), | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |                 'area': _v('area'), | 
					
						
							|  |  |  |             }), | 
					
						
							|  |  |  |             urlencode_postdata( | 
					
						
							|  |  |  |                 dict((i, v) for i, v in enumerate(_v('req_liga_abos').split(','))))) | 
					
						
							| 
									
										
										
										
											2014-10-28 16:51:32 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |         token_url = self._download_json(req, display_id)['data']['stream-access'][0] | 
					
						
							|  |  |  |         token_doc = self._download_xml(token_url, display_id, 'Downloading token') | 
					
						
							| 
									
										
										
										
											2016-02-09 16:25:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         token_attrib = xpath_element(token_doc, './/token').attrib | 
					
						
							|  |  |  |         token_auth = token_attrib['auth'] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |         if token_auth in ('blocked', 'restricted', 'error'): | 
					
						
							| 
									
										
										
										
											2015-02-23 20:45:36 +02:00
										 |  |  |             raise ExtractorError( | 
					
						
							| 
									
										
										
										
											2016-02-09 16:25:30 +01:00
										 |  |  |                 'Token error: %s' % token_attrib['comment'], expected=True) | 
					
						
							| 
									
										
										
										
											2014-10-28 16:51:32 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |         formats = self._extract_f4m_formats( | 
					
						
							|  |  |  |             '%s?hdnea=%s&hdcore=3.2.0' % (token_attrib['url'], token_auth), | 
					
						
							|  |  |  |             video_id, f4m_id='hds') | 
					
						
							| 
									
										
										
										
											2016-03-27 07:03:08 +06:00
										 |  |  |         self._sort_formats(formats) | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  | 
 | 
					
						
							|  |  |  |         categories_str = _v('meta_sports') | 
					
						
							|  |  |  |         categories = categories_str.split(',') if categories_str else [] | 
					
						
							| 
									
										
										
										
											2014-10-28 16:51:32 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |             'id': video_id, | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |             'display_id': display_id, | 
					
						
							| 
									
										
										
										
											2014-10-28 16:51:32 +01:00
										 |  |  |             'title': title, | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |             'upload_date': unified_strdate(_v('time_date')), | 
					
						
							| 
									
										
										
										
											2016-02-09 16:25:30 +01:00
										 |  |  |             'uploader': _v('meta_organisation'), | 
					
						
							| 
									
										
										
										
											2016-02-14 23:40:26 +06:00
										 |  |  |             'categories': categories, | 
					
						
							|  |  |  |             'is_live': _v('islive') == 'true', | 
					
						
							|  |  |  |             'formats': formats, | 
					
						
							| 
									
										
										
										
											2014-10-28 16:51:32 +01:00
										 |  |  |         } |