Compare commits

...

3 Commits

Author SHA1 Message Date
sepro
d548bffaea Fix typo 2023-11-09 18:49:59 +01:00
sepro
20e5923c5a Inline subtitles 2023-11-09 18:48:32 +01:00
sepro
c0ab22fcc9
Apply suggestions from code review
Co-authored-by: bashonly <88596187+bashonly@users.noreply.github.com>
2023-11-09 18:47:18 +01:00

View File

@ -73,7 +73,7 @@ class SBSCoKrIE(InfoExtractor):
}, },
}] }]
def request_details(self, video_id, rscuse=''): def _call_api(self, video_id, rscuse=''):
return self._download_json( return self._download_json(
f'https://api.play.sbs.co.kr/1.0/sbs_vodall/{video_id}', video_id, f'https://api.play.sbs.co.kr/1.0/sbs_vodall/{video_id}', video_id,
note=f'Downloading m3u8 information {rscuse}', note=f'Downloading m3u8 information {rscuse}',
@ -89,19 +89,22 @@ class SBSCoKrIE(InfoExtractor):
def _real_extract(self, url): def _real_extract(self, url):
video_id = self._match_id(url) video_id = self._match_id(url)
details = self.request_details(video_id) details = self._call_api(video_id)
source = traverse_obj(details, ('vod', 'source', 'mediasource')) source = traverse_obj(details, ('vod', 'source', 'mediasource', {dict})) or {}
formats = [] formats = []
for stream in traverse_obj(details, ('vod', 'source', 'mediasourcelist'), default=[source]): for stream in traverse_obj(details, (
'vod', 'source', 'mediasourcelist', lambda _, v: v['mediaurl'] or v['mediarscuse']
), default=[source]):
if not stream.get('mediaurl'): if not stream.get('mediaurl'):
alt_details = self.request_details(video_id, rscuse=stream.get('mediarscuse')) new_source = traverse_obj(
new_source = traverse_obj(alt_details, ('vod', 'source', 'mediasource')) self._call_api(video_id, rscuse=stream['mediarscuse']),
('vod', 'source', 'mediasource', {dict})) or {}
if new_source.get('mediarscuse') == source.get('mediarscuse') or not new_source.get('mediaurl'): if new_source.get('mediarscuse') == source.get('mediarscuse') or not new_source.get('mediaurl'):
continue continue
stream = new_source stream = new_source
formats.append({ formats.append({
'url': stream.get('mediaurl'), 'url': stream['mediaurl'],
'format_id': stream.get('mediarscuse'), 'format_id': stream.get('mediarscuse'),
'format_note': stream.get('medianame'), 'format_note': stream.get('medianame'),
**parse_resolution(stream.get('quality')), **parse_resolution(stream.get('quality')),
@ -109,7 +112,6 @@ class SBSCoKrIE(InfoExtractor):
}) })
caption_url = traverse_obj(details, ('vod', 'source', 'subtitle', {url_or_none})) caption_url = traverse_obj(details, ('vod', 'source', 'subtitle', {url_or_none}))
subtitles = {'ko': [{'url': caption_url}]} if caption_url else None
return { return {
'id': video_id, 'id': video_id,
@ -127,13 +129,13 @@ class SBSCoKrIE(InfoExtractor):
'thumbnail': ('source', 'thumbnail', 'origin', {url_or_none}), 'thumbnail': ('source', 'thumbnail', 'origin', {url_or_none}),
}), get_all=False), }), get_all=False),
'formats': formats, 'formats': formats,
'subtitles': subtitles, 'subtitles': {'ko': [{'url': caption_url}]} if caption_url else None,
} }
class SBSCoKrAllvodProgramIE(InfoExtractor): class SBSCoKrAllvodProgramIE(InfoExtractor):
IE_NAME = 'sbs.co.kr:allvod_program' IE_NAME = 'sbs.co.kr:allvod_program'
_VALID_URL = r'https?://allvod\.sbs\.co\.kr/allvod/vod(?:Free)?ProgramDetail\.do\?(?:[^#]+&)?pgmId=(?P<id>P?[0-9]+)' _VALID_URL = r'https?://allvod\.sbs\.co\.kr/allvod/vod(?:Free)?ProgramDetail\.do\?(?:[^#]+&)?pgmId=(?P<id>P?\d+)'
_TESTS = [{ _TESTS = [{
'url': 'https://allvod.sbs.co.kr/allvod/vodFreeProgramDetail.do?type=legend&pgmId=22000010159&listOrder=vodCntAsc', 'url': 'https://allvod.sbs.co.kr/allvod/vodFreeProgramDetail.do?type=legend&pgmId=22000010159&listOrder=vodCntAsc',
@ -163,9 +165,8 @@ class SBSCoKrAllvodProgramIE(InfoExtractor):
}) })
return self.playlist_result( return self.playlist_result(
[self.url_result( [self.url_result(f'https://allvod.sbs.co.kr/allvod/vodEndPage.do?mdaId={video_id}', SBSCoKrIE)
'https://allvod.sbs.co.kr/allvod/vodEndPage.do?mdaId=' + video_id, SBSCoKrIE for video_id in traverse_obj(details, ('list', ..., 'mdaId'))], program_id)
) for video_id in traverse_obj(details, ('list', ..., 'mdaId'), default=[])], program_id)
class SBSCoKrProgramsVodIE(InfoExtractor): class SBSCoKrProgramsVodIE(InfoExtractor):
@ -191,10 +192,9 @@ class SBSCoKrProgramsVodIE(InfoExtractor):
def _real_extract(self, url): def _real_extract(self, url):
program_slug = self._match_id(url) program_slug = self._match_id(url)
menu_data = self._download_json( program_id = self._download_json(
f'https://static.apis.sbs.co.kr/program-api/1.0/menu/{program_slug}', program_slug, f'https://static.apis.sbs.co.kr/program-api/1.0/menu/{program_slug}', program_slug,
note='Downloading program menu data') note='Downloading program menu data')['program']['programid']
return self.url_result( return self.url_result(
'https://allvod.sbs.co.kr/allvod/vodProgramDetail.do?pgmId=' + traverse_obj( f'https://allvod.sbs.co.kr/allvod/vodProgramDetail.do?pgmId={program_id}', SBSCoKrAllvodProgramIE)
menu_data, ('program', 'programid')), SBSCoKrAllvodProgramIE)