import re
from .common import InfoExtractor
-from ..aes import aes_cbc_decrypt_bytes, unpad_pkcs7
-from ..compat import (
- compat_b64decode,
- compat_str,
-)
-from ..utils import (
- ExtractorError,
- int_or_none,
- strip_or_none,
-)
+from ..utils import int_or_none
class RTL2IE(InfoExtractor):
'duration': int_or_none(video_info.get('duration')),
'formats': formats,
}
-
-
-class RTL2YouBaseIE(InfoExtractor):
- _BACKWERK_BASE_URL = 'https://p-you-backwerk.rtl2apps.de/'
-
-
-class RTL2YouIE(RTL2YouBaseIE):
- IE_NAME = 'rtl2:you'
- _VALID_URL = r'http?://you\.rtl2\.de/(?:video/\d+/|youplayer/index\.html\?.*?\bvid=)(?P<id>\d+)'
- _TESTS = [{
- 'url': 'http://you.rtl2.de/video/3002/15740/MJUNIK%20%E2%80%93%20Home%20of%20YOU/307-hirn-wo-bist-du',
- 'info_dict': {
- 'id': '15740',
- 'ext': 'mp4',
- 'title': 'MJUNIK – Home of YOU - #307 Hirn, wo bist du?!',
- 'description': 'md5:ddaa95c61b372b12b66e115b2772fe01',
- 'age_limit': 12,
- },
- }, {
- 'url': 'http://you.rtl2.de/youplayer/index.html?vid=15712',
- 'only_matching': True,
- }]
- _AES_KEY = b'\xe9W\xe4.<*\xb8\x1a\xd2\xb6\x92\xf3C\xd3\xefL\x1b\x03*\xbbbH\xc0\x03\xffo\xc2\xf2(\xaa\xaa!'
- _GEO_COUNTRIES = ['DE']
-
- def _real_extract(self, url):
- video_id = self._match_id(url)
-
- stream_data = self._download_json(
- self._BACKWERK_BASE_URL + 'stream/video/' + video_id, video_id)
-
- data, iv = compat_b64decode(stream_data['streamUrl']).decode().split(':')
- stream_url = unpad_pkcs7(aes_cbc_decrypt_bytes(
- compat_b64decode(data), self._AES_KEY, compat_b64decode(iv)))
- if b'rtl2_you_video_not_found' in stream_url:
- raise ExtractorError('video not found', expected=True)
-
- formats = self._extract_m3u8_formats(stream_url.decode(), video_id, 'mp4', 'm3u8_native')
-
- video_data = self._download_json(
- self._BACKWERK_BASE_URL + 'video/' + video_id, video_id)
-
- series = video_data.get('formatTitle')
- title = episode = video_data.get('title') or series
- if series and series != title:
- title = '%s - %s' % (series, title)
-
- return {
- 'id': video_id,
- 'title': title,
- 'formats': formats,
- 'description': strip_or_none(video_data.get('description')),
- 'thumbnail': video_data.get('image'),
- 'duration': int_or_none(stream_data.get('duration') or video_data.get('duration'), 1000),
- 'series': series,
- 'episode': episode,
- 'age_limit': int_or_none(video_data.get('minimumAge')),
- }
-
-
-class RTL2YouSeriesIE(RTL2YouBaseIE):
- IE_NAME = 'rtl2:you:series'
- _VALID_URL = r'http?://you\.rtl2\.de/videos/(?P<id>\d+)'
- _TEST = {
- 'url': 'http://you.rtl2.de/videos/115/dragon-ball',
- 'info_dict': {
- 'id': '115',
- },
- 'playlist_mincount': 5,
- }
-
- def _real_extract(self, url):
- series_id = self._match_id(url)
- stream_data = self._download_json(
- self._BACKWERK_BASE_URL + 'videos',
- series_id, query={
- 'formatId': series_id,
- 'limit': 1000000000,
- })
-
- entries = []
- for video in stream_data.get('videos', []):
- video_id = compat_str(video['videoId'])
- if not video_id:
- continue
- entries.append(self.url_result(
- 'http://you.rtl2.de/video/%s/%s' % (series_id, video_id),
- 'RTL2You', video_id))
- return self.playlist_result(entries, series_id)