0
0
Fork 0

[teamcoco] add support for new videos(closes #23054)

main
Remita Amine 2019-11-12 10:51:54 +01:00
parent 2e9ad59a4d
commit 48970d5cc8
1 changed files with 37 additions and 31 deletions

View File

@ -84,6 +84,19 @@ class TeamcocoIE(TurnerBaseIE):
'only_matching': True, 'only_matching': True,
} }
] ]
_RECORD_TEMPL = '''id
title
teaser
publishOn
thumb {
preview
}
tags {
name
}
duration
turnerMediaId
turnerMediaAuthToken'''
def _graphql_call(self, query_template, object_type, object_id): def _graphql_call(self, query_template, object_type, object_id):
find_object = 'find' + object_type find_object = 'find' + object_type
@ -98,35 +111,35 @@ class TeamcocoIE(TurnerBaseIE):
display_id = self._match_id(url) display_id = self._match_id(url)
response = self._graphql_call('''{ response = self._graphql_call('''{
%s(slug: "%s") { %%s(slug: "%%s") {
... on RecordSlug { ... on RecordSlug {
record { record {
%s
}
}
... on PageSlug {
child {
id id
title
teaser
publishOn
thumb {
preview
}
file {
url
}
tags {
name
}
duration
turnerMediaId
turnerMediaAuthToken
} }
} }
... on NotFoundSlug { ... on NotFoundSlug {
status status
} }
} }
}''', 'Slug', display_id) }''' % self._RECORD_TEMPL, 'Slug', display_id)
if response.get('status'): if response.get('status'):
raise ExtractorError('This video is no longer available.', expected=True) raise ExtractorError('This video is no longer available.', expected=True)
child = response.get('child')
if child:
record = self._graphql_call('''{
%%s(id: "%%s") {
... on Video {
%s
}
}
}''' % self._RECORD_TEMPL, 'Record', child['id'])
else:
record = response['record'] record = response['record']
video_id = record['id'] video_id = record['id']
@ -150,25 +163,21 @@ class TeamcocoIE(TurnerBaseIE):
'accessTokenType': 'jws', 'accessTokenType': 'jws',
})) }))
else: else:
d = self._download_json( video_sources = self._download_json(
'https://teamcoco.com/_truman/d/' + video_id, 'https://teamcoco.com/_truman/d/' + video_id,
video_id, fatal=False) or {} video_id)['meta']['src']
video_sources = d.get('meta') or {} if isinstance(video_sources, dict):
if not video_sources: video_sources = video_sources.values()
video_sources = self._graphql_call('''{
%s(id: "%s") {
src
}
}''', 'RecordVideoSource', video_id) or {}
formats = [] formats = []
get_quality = qualities(['low', 'sd', 'hd', 'uhd']) get_quality = qualities(['low', 'sd', 'hd', 'uhd'])
for format_id, src in video_sources.get('src', {}).items(): for src in video_sources:
if not isinstance(src, dict): if not isinstance(src, dict):
continue continue
src_url = src.get('src') src_url = src.get('src')
if not src_url: if not src_url:
continue continue
format_id = src.get('label')
ext = determine_ext(src_url, mimetype2ext(src.get('type'))) ext = determine_ext(src_url, mimetype2ext(src.get('type')))
if format_id == 'hls' or ext == 'm3u8': if format_id == 'hls' or ext == 'm3u8':
# compat_urllib_parse.urljoin does not work here # compat_urllib_parse.urljoin does not work here
@ -190,9 +199,6 @@ class TeamcocoIE(TurnerBaseIE):
'format_id': format_id, 'format_id': format_id,
'quality': get_quality(format_id), 'quality': get_quality(format_id),
}) })
if not formats:
formats = self._extract_m3u8_formats(
record['file']['url'], video_id, 'mp4', fatal=False)
self._sort_formats(formats) self._sort_formats(formats)
info['formats'] = formats info['formats'] = formats