|
|
|
@ -18,6 +18,7 @@ from ..utils import (
|
|
|
|
|
OnDemandPagedList,
|
|
|
|
|
bool_or_none,
|
|
|
|
|
clean_html,
|
|
|
|
|
determine_ext,
|
|
|
|
|
filter_dict,
|
|
|
|
|
float_or_none,
|
|
|
|
|
format_field,
|
|
|
|
@ -1658,19 +1659,34 @@ class BiliIntlBaseIE(InfoExtractor):
|
|
|
|
|
'aid': aid,
|
|
|
|
|
})) or {}
|
|
|
|
|
subtitles = {}
|
|
|
|
|
for sub in sub_json.get('subtitles') or []:
|
|
|
|
|
sub_url = sub.get('url')
|
|
|
|
|
if not sub_url:
|
|
|
|
|
fetched_urls = set()
|
|
|
|
|
for sub in traverse_obj(sub_json, (('subtitles', 'video_subtitle'), ..., {dict})):
|
|
|
|
|
for url in traverse_obj(sub, ((None, 'ass', 'srt'), 'url', {url_or_none})):
|
|
|
|
|
if url in fetched_urls:
|
|
|
|
|
continue
|
|
|
|
|
fetched_urls.add(url)
|
|
|
|
|
sub_ext = determine_ext(url)
|
|
|
|
|
sub_lang = sub.get('lang_key') or 'en'
|
|
|
|
|
|
|
|
|
|
if sub_ext == 'ass':
|
|
|
|
|
subtitles.setdefault(sub_lang, []).append({
|
|
|
|
|
'ext': 'ass',
|
|
|
|
|
'url': url,
|
|
|
|
|
})
|
|
|
|
|
elif sub_ext == 'json':
|
|
|
|
|
sub_data = self._download_json(
|
|
|
|
|
sub_url, ep_id or aid, errnote='Unable to download subtitles', fatal=False,
|
|
|
|
|
note='Downloading subtitles%s' % f' for {sub["lang"]}' if sub.get('lang') else '')
|
|
|
|
|
if not sub_data:
|
|
|
|
|
continue
|
|
|
|
|
subtitles.setdefault(sub.get('lang_key', 'en'), []).append({
|
|
|
|
|
url, ep_id or aid, fatal=False,
|
|
|
|
|
note=f'Downloading subtitles{format_field(sub, "lang", " for %s")} ({sub_lang})',
|
|
|
|
|
errnote='Unable to download subtitles')
|
|
|
|
|
|
|
|
|
|
if sub_data:
|
|
|
|
|
subtitles.setdefault(sub_lang, []).append({
|
|
|
|
|
'ext': 'srt',
|
|
|
|
|
'data': self.json2srt(sub_data)
|
|
|
|
|
'data': self.json2srt(sub_data),
|
|
|
|
|
})
|
|
|
|
|
else:
|
|
|
|
|
self.report_warning('Unexpected subtitle extension', ep_id or aid)
|
|
|
|
|
|
|
|
|
|
return subtitles
|
|
|
|
|
|
|
|
|
|
def _get_formats(self, *, ep_id=None, aid=None):
|
|
|
|
|