aboutsummaryrefslogtreecommitdiffstats
path: root/hypervideo_dl/extractor/trovo.py
diff options
context:
space:
mode:
Diffstat (limited to 'hypervideo_dl/extractor/trovo.py')
-rw-r--r--hypervideo_dl/extractor/trovo.py43
1 files changed, 23 insertions, 20 deletions
diff --git a/hypervideo_dl/extractor/trovo.py b/hypervideo_dl/extractor/trovo.py
index ec55f41..65ea13d 100644
--- a/hypervideo_dl/extractor/trovo.py
+++ b/hypervideo_dl/extractor/trovo.py
@@ -7,6 +7,7 @@ import json
from .common import InfoExtractor
from ..utils import (
ExtractorError,
+ format_field,
int_or_none,
str_or_none,
try_get,
@@ -17,13 +18,18 @@ class TrovoBaseIE(InfoExtractor):
_VALID_URL_BASE = r'https?://(?:www\.)?trovo\.live/'
_HEADERS = {'Origin': 'https://trovo.live'}
+ def _call_api(self, video_id, query=None, data=None):
+ return self._download_json(
+ 'https://gql.trovo.live/', video_id, query=query, data=data,
+ headers={'Accept': 'application/json'})
+
def _extract_streamer_info(self, data):
streamer_info = data.get('streamerInfo') or {}
username = streamer_info.get('userName')
return {
'uploader': streamer_info.get('nickName'),
'uploader_id': str_or_none(streamer_info.get('uid')),
- 'uploader_url': 'https://trovo.live/' + username if username else None,
+ 'uploader_url': format_field(username, template='https://trovo.live/%s'),
}
@@ -32,9 +38,8 @@ class TrovoIE(TrovoBaseIE):
def _real_extract(self, url):
username = self._match_id(url)
- live_info = self._download_json(
- 'https://gql.trovo.live/', username, query={
- 'query': '''{
+ live_info = self._call_api(username, query={
+ 'query': '''{
getLiveInfo(params: {userName: "%s"}) {
isLive
programInfo {
@@ -53,12 +58,12 @@ class TrovoIE(TrovoBaseIE):
}
}
}''' % username,
- })['data']['getLiveInfo']
+ })['data']['getLiveInfo']
if live_info.get('isLive') == 0:
raise ExtractorError('%s is offline' % username, expected=True)
program_info = live_info['programInfo']
program_id = program_info['id']
- title = self._live_title(program_info['title'])
+ title = program_info['title']
formats = []
for stream_info in (program_info.get('streamInfo') or []):
@@ -104,6 +109,7 @@ class TrovoVodIE(TrovoBaseIE):
'comments': 'mincount:8',
'categories': ['Grand Theft Auto V'],
},
+ 'skip': '404'
}, {
'url': 'https://trovo.live/clip/lc-5285890810184026005',
'only_matching': True,
@@ -111,15 +117,14 @@ class TrovoVodIE(TrovoBaseIE):
def _real_extract(self, url):
vid = self._match_id(url)
- resp = self._download_json(
- 'https://gql.trovo.live/', vid, data=json.dumps([{
- 'query': '''{
+ resp = self._call_api(vid, data=json.dumps([{
+ 'query': '''{
batchGetVodDetailInfo(params: {vids: ["%s"]}) {
VodDetailInfos
}
}''' % vid,
- }, {
- 'query': '''{
+ }, {
+ 'query': '''{
getCommentList(params: {appInfo: {postID: "%s"}, pageSize: 1000000000, preview: {}}) {
commentList {
author {
@@ -133,9 +138,7 @@ class TrovoVodIE(TrovoBaseIE):
}
}
}''' % vid,
- }]).encode(), headers={
- 'Content-Type': 'application/json',
- })
+ }]).encode())
vod_detail_info = resp[0]['data']['batchGetVodDetailInfo']['VodDetailInfos'][vid]
vod_info = vod_detail_info['vodInfo']
title = vod_info['title']
@@ -197,7 +200,7 @@ class TrovoVodIE(TrovoBaseIE):
return info
-class TrovoChannelBaseIE(InfoExtractor):
+class TrovoChannelBaseIE(TrovoBaseIE):
def _get_vod_json(self, page, uid):
raise NotImplementedError('This method must be implemented by subclasses')
@@ -215,7 +218,7 @@ class TrovoChannelBaseIE(InfoExtractor):
def _real_extract(self, url):
id = self._match_id(url)
- uid = str(self._download_json('https://gql.trovo.live/', id, query={
+ uid = str(self._call_api(id, query={
'query': '{getLiveInfo(params:{userName:"%s"}){streamerInfo{uid}}}' % id
})['data']['getLiveInfo']['streamerInfo']['uid'])
return self.playlist_result(self._entries(uid), playlist_id=uid)
@@ -223,7 +226,7 @@ class TrovoChannelBaseIE(InfoExtractor):
class TrovoChannelVodIE(TrovoChannelBaseIE):
_VALID_URL = r'trovovod:(?P<id>[^\s]+)'
- IE_DESC = 'All VODs of a trovo.live channel, "trovovod" keyword'
+ IE_DESC = 'All VODs of a trovo.live channel; "trovovod:" prefix'
_TESTS = [{
'url': 'trovovod:OneTappedYou',
@@ -237,14 +240,14 @@ class TrovoChannelVodIE(TrovoChannelBaseIE):
_TYPE = 'video'
def _get_vod_json(self, page, uid):
- return self._download_json('https://gql.trovo.live/', uid, query={
+ return self._call_api(uid, query={
'query': self._QUERY % (page, uid)
})['data']['getChannelLtvVideoInfos']
class TrovoChannelClipIE(TrovoChannelBaseIE):
_VALID_URL = r'trovoclip:(?P<id>[^\s]+)'
- IE_DESC = 'All Clips of a trovo.live channel, "trovoclip" keyword'
+ IE_DESC = 'All Clips of a trovo.live channel; "trovoclip:" prefix'
_TESTS = [{
'url': 'trovoclip:OneTappedYou',
@@ -258,6 +261,6 @@ class TrovoChannelClipIE(TrovoChannelBaseIE):
_TYPE = 'clip'
def _get_vod_json(self, page, uid):
- return self._download_json('https://gql.trovo.live/', uid, query={
+ return self._call_api(uid, query={
'query': self._QUERY % (page, uid)
})['data']['getChannelClipVideoInfos']