aboutsummaryrefslogtreecommitdiffstats
path: root/hypervideo_dl/extractor/twitcasting.py
diff options
context:
space:
mode:
Diffstat (limited to 'hypervideo_dl/extractor/twitcasting.py')
-rw-r--r--hypervideo_dl/extractor/twitcasting.py33
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 = {