diff options
Diffstat (limited to 'hypervideo_dl/extractor/twitcasting.py')
-rw-r--r-- | hypervideo_dl/extractor/twitcasting.py | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/hypervideo_dl/extractor/twitcasting.py b/hypervideo_dl/extractor/twitcasting.py index 5c4d26c..30bc987 100644 --- a/hypervideo_dl/extractor/twitcasting.py +++ b/hypervideo_dl/extractor/twitcasting.py @@ -1,11 +1,9 @@ -# coding: utf-8 -from __future__ import unicode_literals - +import base64 import itertools import re from .common import InfoExtractor -from ..downloader.websocket import has_websockets +from ..dependencies import websockets from ..utils import ( clean_html, ExtractorError, @@ -77,6 +75,16 @@ class TwitCastingIE(InfoExtractor): 'playlist_mincount': 2, }] + def _parse_data_movie_playlist(self, dmp, video_id): + # attempt 1: parse as JSON directly + try: + return self._parse_json(dmp, video_id) + except ExtractorError: + pass + # attempt 2: decode reversed base64 + decoded = base64.b64decode(dmp[::-1]) + return self._parse_json(decoded, video_id) + def _real_extract(self, url): uploader_id, video_id = self._match_valid_url(url).groups() @@ -103,7 +111,7 @@ class TwitCastingIE(InfoExtractor): video_js_data = try_get( webpage, - lambda x: self._parse_json(self._search_regex( + lambda x: self._parse_data_movie_playlist(self._search_regex( r'data-movie-playlist=\'([^\']+?)\'', x, 'movie playlist', default=None), video_id)['2'], list) @@ -164,7 +172,7 @@ class TwitCastingIE(InfoExtractor): note='Downloading source quality m3u8', headers=self._M3U8_HEADERS, fatal=False)) - if has_websockets: + if websockets: qq = qualities(['base', 'mobilesource', 'main']) streams = traverse_obj(stream_server_data, ('llfmp4', 'streams')) or {} for mode, ws_url in streams.items(): @@ -178,10 +186,17 @@ class TwitCastingIE(InfoExtractor): 'protocol': 'websocket_frag', }) - self._sort_formats(formats, ('source',)) - infodict = { - 'formats': formats + 'formats': formats, + '_format_sort_fields': ('source', ), + } + elif len(m3u8_urls) == 1: + formats = self._extract_m3u8_formats( + m3u8_urls[0], video_id, 'mp4', headers=self._M3U8_HEADERS) + infodict = { + # No problem here since there's only one manifest + 'formats': formats, + 'http_headers': self._M3U8_HEADERS, } else: infodict = { |