diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index 80e017c969..ecf14a0c37 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -3005,10 +3005,17 @@ def list_subtitles(self, video_id, subtitles, name='subtitles'): return self.to_screen( 'Available %s for %s:' % (name, video_id)) + + def _row(lang, formats): + exts, names = zip(*((f['ext'], f['name']) for f in reversed(formats))) + if len(set(names)) == 1: + names = names[:1] + return [lang, ', '.join(names), ', '.join(exts)] + self.to_screen(render_table( - ['Language', 'formats'], - [[lang, ', '.join(f['ext'] for f in reversed(formats))] - for lang, formats in subtitles.items()])) + ['Language', 'Name', 'Formats'], + [_row(lang, formats) for lang, formats in subtitles.items()], + hideEmpty=True)) def urlopen(self, req): """ Start an HTTP download """ diff --git a/yt_dlp/extractor/common.py b/yt_dlp/extractor/common.py index 119af1198f..b95a7a3097 100644 --- a/yt_dlp/extractor/common.py +++ b/yt_dlp/extractor/common.py @@ -250,6 +250,8 @@ class InfoExtractor(object): entry and one of: * "data": The subtitles file contents * "url": A URL pointing to the subtitles file + It can optionally also have: + * "name": Name or description of the subtitles "ext" will be calculated from URL if missing automatic_captions: Like 'subtitles'; contains automatically generated captions instead of normal subtitles diff --git a/yt_dlp/postprocessor/ffmpeg.py b/yt_dlp/postprocessor/ffmpeg.py index 78a80f3f86..b156108293 100644 --- a/yt_dlp/postprocessor/ffmpeg.py +++ b/yt_dlp/postprocessor/ffmpeg.py @@ -474,8 +474,7 @@ def run(self, information): filename = information['filepath'] ext = information['ext'] - sub_langs = [] - sub_filenames = [] + sub_langs, sub_names, sub_filenames = [], [], [] webm_vtt_warn = False mp4_ass_warn = False @@ -485,6 +484,7 @@ def run(self, information): self.report_warning('JSON subtitles cannot be embedded') elif ext != 'webm' or ext == 'webm' and sub_ext == 'vtt': sub_langs.append(lang) + sub_names.append(sub_info.get('name')) sub_filenames.append(sub_info['filepath']) else: if not webm_vtt_warn and ext == 'webm' and sub_ext != 'vtt': @@ -510,10 +510,13 @@ def run(self, information): ] if information['ext'] == 'mp4': opts += ['-c:s', 'mov_text'] - for (i, lang) in enumerate(sub_langs): + for i, (lang, name) in enumerate(zip(sub_langs, sub_names)): opts.extend(['-map', '%d:0' % (i + 1)]) lang_code = ISO639Utils.short2long(lang) or lang opts.extend(['-metadata:s:s:%d' % i, 'language=%s' % lang_code]) + if name: + opts.extend(['-metadata:s:s:%d' % i, 'handler_name=%s' % name, + '-metadata:s:s:%d' % i, 'title=%s' % name]) temp_filename = prepend_extension(filename, 'temp') self.to_screen('Embedding subtitles in "%s"' % filename)