[muenchentv] Add support (Fixes #3507)
This commit is contained in:
		| @@ -221,6 +221,7 @@ from .mtv import ( | |||||||
|     MTVServicesEmbeddedIE, |     MTVServicesEmbeddedIE, | ||||||
|     MTVIggyIE, |     MTVIggyIE, | ||||||
| ) | ) | ||||||
|  | from .muenchentv import MuenchenTVIE | ||||||
| from .musicplayon import MusicPlayOnIE | from .musicplayon import MusicPlayOnIE | ||||||
| from .musicvault import MusicVaultIE | from .musicvault import MusicVaultIE | ||||||
| from .muzu import MuzuTVIE | from .muzu import MuzuTVIE | ||||||
|   | |||||||
| @@ -130,6 +130,8 @@ class InfoExtractor(object): | |||||||
|                     by YoutubeDL if it's missing) |                     by YoutubeDL if it's missing) | ||||||
|     categories:     A list of categories that the video falls in, for example |     categories:     A list of categories that the video falls in, for example | ||||||
|                     ["Sports", "Berlin"] |                     ["Sports", "Berlin"] | ||||||
|  |     is_live:        True, False, or None (=unknown). Whether this video is a | ||||||
|  |                     live stream that goes on instead of a fixed-length video. | ||||||
|  |  | ||||||
|     Unless mentioned otherwise, the fields should be Unicode strings. |     Unless mentioned otherwise, the fields should be Unicode strings. | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										77
									
								
								youtube_dl/extractor/muenchentv.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								youtube_dl/extractor/muenchentv.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | |||||||
|  | # coding: utf-8 | ||||||
|  | from __future__ import unicode_literals | ||||||
|  |  | ||||||
|  | import datetime | ||||||
|  | import json | ||||||
|  |  | ||||||
|  | from .common import InfoExtractor | ||||||
|  | from ..utils import ( | ||||||
|  |     determine_ext, | ||||||
|  |     int_or_none, | ||||||
|  |     js_to_json, | ||||||
|  | ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class MuenchenTVIE(InfoExtractor): | ||||||
|  |     _VALID_URL = r'https?://(?:www\.)?muenchen\.tv/livestream' | ||||||
|  |     IE_DESC = 'münchen.tv' | ||||||
|  |     _TEST = { | ||||||
|  |         'url': 'http://www.muenchen.tv/livestream/', | ||||||
|  |         'info_dict': { | ||||||
|  |             'id': '5334', | ||||||
|  |             'display_id': 'live', | ||||||
|  |             'ext': 'mp4', | ||||||
|  |             'title': 're:^münchen.tv-Livestream [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$', | ||||||
|  |             'is_live': True, | ||||||
|  |         }, | ||||||
|  |         'params': { | ||||||
|  |             'skip_download': True, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     def _real_extract(self, url): | ||||||
|  |         display_id = 'live' | ||||||
|  |         webpage = self._download_webpage(url, display_id) | ||||||
|  |  | ||||||
|  |         now = datetime.datetime.now() | ||||||
|  |         now_str = now.strftime("%Y-%m-%d %H:%M") | ||||||
|  |         title = self._og_search_title(webpage) + ' ' + now_str | ||||||
|  |  | ||||||
|  |         data_js = self._search_regex( | ||||||
|  |             r'(?s)\nplaylist:\s*(\[.*?}\]),related:', | ||||||
|  |             webpage, 'playlist configuration') | ||||||
|  |         data_json = js_to_json(data_js) | ||||||
|  |         data = json.loads(data_json)[0] | ||||||
|  |  | ||||||
|  |         video_id = data['mediaid'] | ||||||
|  |         thumbnail = data.get('image') | ||||||
|  |  | ||||||
|  |         formats = [] | ||||||
|  |         for format_num, s in enumerate(data['sources']): | ||||||
|  |             ext = determine_ext(s['file'], None) | ||||||
|  |             label_str = s.get('label') | ||||||
|  |             if label_str is None: | ||||||
|  |                 label_str = '_%d' % format_num | ||||||
|  |  | ||||||
|  |             if ext is None: | ||||||
|  |                 format_id = label_str | ||||||
|  |             else: | ||||||
|  |                 format_id = '%s-%s' % (ext, label_str) | ||||||
|  |  | ||||||
|  |             formats.append({ | ||||||
|  |                 'url': s['file'], | ||||||
|  |                 'tbr': int_or_none(s.get('label')), | ||||||
|  |                 'ext': 'mp4', | ||||||
|  |                 'format_id': format_id, | ||||||
|  |                 'preference': -100 if '.smil' in s['file'] else 0, | ||||||
|  |             }) | ||||||
|  |         self._sort_formats(formats) | ||||||
|  |  | ||||||
|  |         return { | ||||||
|  |             'id': video_id, | ||||||
|  |             'display_id': display_id, | ||||||
|  |             'title': title, | ||||||
|  |             'formats': formats, | ||||||
|  |             'is_live': True, | ||||||
|  |         } | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user
	 Philipp Hagemeister
					Philipp Hagemeister