mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2024-11-26 02:55:17 +00:00
[pbs] Fix subtitle extraction (#813)
Original PR: https://github.com/ytdl-org/youtube-dl/pull/24430, https://github.com/ytdl-org/youtube-dl/pull/17434 Closes: #836, https://github.com/ytdl-org/youtube-dl/issues/18796, https://github.com/ytdl-org/youtube-dl/issues/17273 Authored-by: coletdjnz, gesa, raphaeldore
This commit is contained in:
parent
71407b3eca
commit
a7e999beec
2 changed files with 48 additions and 21 deletions
|
@ -19,6 +19,7 @@
|
||||||
CeskaTelevizeIE,
|
CeskaTelevizeIE,
|
||||||
LyndaIE,
|
LyndaIE,
|
||||||
NPOIE,
|
NPOIE,
|
||||||
|
PBSIE,
|
||||||
ComedyCentralIE,
|
ComedyCentralIE,
|
||||||
NRKTVIE,
|
NRKTVIE,
|
||||||
RaiPlayIE,
|
RaiPlayIE,
|
||||||
|
@ -372,5 +373,42 @@ def test_subtitles_in_page(self):
|
||||||
self.assertEqual(md5(subtitles['en']), 'acaca989e24a9e45a6719c9b3d60815c')
|
self.assertEqual(md5(subtitles['en']), 'acaca989e24a9e45a6719c9b3d60815c')
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
|
class TestPBSSubtitles(BaseTestSubtitles):
|
||||||
|
url = 'https://www.pbs.org/video/how-fantasy-reflects-our-world-picecq/'
|
||||||
|
IE = PBSIE
|
||||||
|
|
||||||
|
def test_allsubtitles(self):
|
||||||
|
self.DL.params['writesubtitles'] = True
|
||||||
|
self.DL.params['allsubtitles'] = True
|
||||||
|
subtitles = self.getSubtitles()
|
||||||
|
self.assertEqual(set(subtitles.keys()), set(['en']))
|
||||||
|
|
||||||
|
def test_subtitles_dfxp_format(self):
|
||||||
|
self.DL.params['writesubtitles'] = True
|
||||||
|
self.DL.params['subtitlesformat'] = 'dfxp'
|
||||||
|
subtitles = self.getSubtitles()
|
||||||
|
self.assertIn(md5(subtitles['en']), ['643b034254cdc3768ff1e750b6b5873b'])
|
||||||
|
|
||||||
|
def test_subtitles_vtt_format(self):
|
||||||
|
self.DL.params['writesubtitles'] = True
|
||||||
|
self.DL.params['subtitlesformat'] = 'vtt'
|
||||||
|
subtitles = self.getSubtitles()
|
||||||
|
self.assertIn(
|
||||||
|
md5(subtitles['en']), ['937a05711555b165d4c55a9667017045', 'f49ea998d6824d94959c8152a368ff73'])
|
||||||
|
|
||||||
|
def test_subtitles_srt_format(self):
|
||||||
|
self.DL.params['writesubtitles'] = True
|
||||||
|
self.DL.params['subtitlesformat'] = 'srt'
|
||||||
|
subtitles = self.getSubtitles()
|
||||||
|
self.assertIn(md5(subtitles['en']), ['2082c21b43759d9bf172931b2f2ca371'])
|
||||||
|
|
||||||
|
def test_subtitles_sami_format(self):
|
||||||
|
self.DL.params['writesubtitles'] = True
|
||||||
|
self.DL.params['subtitlesformat'] = 'sami'
|
||||||
|
subtitles = self.getSubtitles()
|
||||||
|
self.assertIn(md5(subtitles['en']), ['4256b16ac7da6a6780fafd04294e85cd'])
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
@ -600,6 +600,7 @@ def extract_redirect_urls(info):
|
||||||
|
|
||||||
formats = []
|
formats = []
|
||||||
http_url = None
|
http_url = None
|
||||||
|
hls_subs = {}
|
||||||
for num, redirect in enumerate(redirects):
|
for num, redirect in enumerate(redirects):
|
||||||
redirect_id = redirect.get('eeid')
|
redirect_id = redirect.get('eeid')
|
||||||
|
|
||||||
|
@ -622,8 +623,9 @@ def extract_redirect_urls(info):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if determine_ext(format_url) == 'm3u8':
|
if determine_ext(format_url) == 'm3u8':
|
||||||
formats.extend(self._extract_m3u8_formats(
|
hls_formats, hls_subs = self._extract_m3u8_formats_and_subtitles(
|
||||||
format_url, display_id, 'mp4', m3u8_id='hls', fatal=False))
|
format_url, display_id, 'mp4', m3u8_id='hls', fatal=False)
|
||||||
|
formats.extend(hls_formats)
|
||||||
else:
|
else:
|
||||||
formats.append({
|
formats.append({
|
||||||
'url': format_url,
|
'url': format_url,
|
||||||
|
@ -666,25 +668,12 @@ def extract_redirect_urls(info):
|
||||||
age_limit = US_RATINGS.get(rating_str)
|
age_limit = US_RATINGS.get(rating_str)
|
||||||
|
|
||||||
subtitles = {}
|
subtitles = {}
|
||||||
closed_captions_url = info.get('closed_captions_url')
|
captions = info.get('cc') or {}
|
||||||
if closed_captions_url:
|
for caption_url in captions.values():
|
||||||
subtitles['en'] = [{
|
subtitles.setdefault('en', []).append({
|
||||||
'ext': 'ttml',
|
'url': caption_url
|
||||||
'url': closed_captions_url,
|
})
|
||||||
}]
|
subtitles = self._merge_subtitles(subtitles, hls_subs)
|
||||||
mobj = re.search(r'/(\d+)_Encoded\.dfxp', closed_captions_url)
|
|
||||||
if mobj:
|
|
||||||
ttml_caption_suffix, ttml_caption_id = mobj.group(0, 1)
|
|
||||||
ttml_caption_id = int(ttml_caption_id)
|
|
||||||
subtitles['en'].extend([{
|
|
||||||
'url': closed_captions_url.replace(
|
|
||||||
ttml_caption_suffix, '/%d_Encoded.srt' % (ttml_caption_id + 1)),
|
|
||||||
'ext': 'srt',
|
|
||||||
}, {
|
|
||||||
'url': closed_captions_url.replace(
|
|
||||||
ttml_caption_suffix, '/%d_Encoded.vtt' % (ttml_caption_id + 2)),
|
|
||||||
'ext': 'vtt',
|
|
||||||
}])
|
|
||||||
|
|
||||||
# info['title'] is often incomplete (e.g. 'Full Episode', 'Episode 5', etc)
|
# info['title'] is often incomplete (e.g. 'Full Episode', 'Episode 5', etc)
|
||||||
# Try turning it to 'program - title' naming scheme if possible
|
# Try turning it to 'program - title' naming scheme if possible
|
||||||
|
|
Loading…
Reference in a new issue