From cb1f1571f7abac302f64f8a17a058621bd3daa4f Mon Sep 17 00:00:00 2001 From: Alfonso Date: Mon, 6 Feb 2023 16:49:10 +0100 Subject: [PATCH] [StreamsbIE] Add extractor for streamsb.com (viewsb.com) --- youtube_dl/extractor/extractors.py | 1 + youtube_dl/extractor/streamsb.py | 52 ++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 youtube_dl/extractor/streamsb.py diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index 96b27b179..d67261cef 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -1200,6 +1200,7 @@ from .storyfire import ( from .streamable import StreamableIE from .streamcloud import StreamcloudIE from .streamcz import StreamCZIE +from .streamsb import StreamsbIE from .streetvoice import StreetVoiceIE from .stretchinternet import StretchInternetIE from .stv import STVPlayerIE diff --git a/youtube_dl/extractor/streamsb.py b/youtube_dl/extractor/streamsb.py new file mode 100644 index 000000000..715489b94 --- /dev/null +++ b/youtube_dl/extractor/streamsb.py @@ -0,0 +1,52 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import random +import string + +from .common import InfoExtractor + + +def to_ascii_hex(str1): + return ''.join([format(ord(c), 'x') for c in str1]) + + +def generate_random_string(length): + return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length)) + + +class StreamsbIE(InfoExtractor): + domain = 'viewsb.com' + _VALID_URL = r'https://' + domain + '/(?P.+)' + _TEST = { + 'url': 'https://viewsb.com/dxfvlu4qanjx', + 'md5': '488d111a63415369bf90ea83adc8a325', + 'info_dict': { + 'id': 'dxfvlu4qanjx', + 'ext': 'mp4', + 'title': 'Sintel' + } + } + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + + iframe_url = self._search_regex(r'IFRAME SRC=\"(.*)\"', webpage, 'iframe') + video_code = self._search_regex(r"(\w*).html", iframe_url, 'video_code') + + length = 12 + req = generate_random_string(length) + '||' + video_code + '||' + generate_random_string(length) + '||streamsb' + ereq = 'https://' + self.domain + '/sources50/' + to_ascii_hex(req) + + video_data = self._download_webpage(ereq, video_id, headers={ + 'Referer': iframe_url, + 'watchsb': 'sbstream'} + ) + player_data = self._parse_json(video_data, video_id) + formats = self._extract_m3u8_formats(player_data['stream_data']['file'], video_id, ext='mp4', entry_protocol='m3u8_native', m3u8_id='hls', fatal=False) + return { + 'id': video_id, + 'formats': formats, + 'title': player_data['stream_data']['title'] + }