From d73d008ad4de4d0a4bee1a22aa9e1cc363911493 Mon Sep 17 00:00:00 2001 From: c-basalt <117849907+c-basalt@users.noreply.github.com> Date: Sun, 23 Jun 2024 18:04:26 -0400 Subject: [PATCH] update --- yt_dlp/extractor/bilibili.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/yt_dlp/extractor/bilibili.py b/yt_dlp/extractor/bilibili.py index 66670f290..48cf7b3b9 100644 --- a/yt_dlp/extractor/bilibili.py +++ b/yt_dlp/extractor/bilibili.py @@ -30,6 +30,7 @@ merge_dicts, mimetype2ext, parse_count, + parse_resolution, parse_qs, qualities, smuggle_url, @@ -742,14 +743,16 @@ def _real_extract(self, url): else: formats = self.extract_formats(play_info) - if not traverse_obj(play_info, ('dash')): # for legacy-only formats + if not traverse_obj(play_info, ('dash')): + # we only have legacy formats and need additional work has_qn = lambda x: x in traverse_obj(formats, (..., 'quality')) for qn in traverse_obj(play_info, ('accept_quality', lambda _, v: not has_qn(v), {int})): formats.extend(traverse_obj( self.extract_formats(self._download_playinfo(video_id, cid, headers=headers, qn=qn)), (lambda _, v: not has_qn(v.get('quality'))))) self.check_missing_formats(play_info, formats) - if traverse_obj(formats, lambda _, v: v['fragments']): + if traverse_obj(formats, lambda _, v: v['fragments']) and traverse_obj(formats, lambda _, v: not v['fragments']): # We are having both flv and mp4 formats here + # Flv and mp4 are incompatible due to `multi_video` workaround, so we need to drop one of them if not self._configuration_arg('_prefer_multi_flv'): # `_prefer_multi_flv` is mainly for writing test case, user should hardly need this dropping = ', '.join(traverse_obj(formats, ( @@ -762,7 +765,9 @@ def _real_extract(self, url): formats, lambda _, v: v['quality'] == int(self._configuration_arg('_prefer_multi_flv')[0]), ) or [max(traverse_obj(formats, lambda _, v: v['fragments']), key=lambda x: x['quality'])] - if formats[0].get('fragments'): # transform multi_video format + if formats[0].get('fragments'): + # We have flv formats, which are individual short videos with their own timestamps and metainfo + # Binary concatenation corrupts their timestamps, so we need a `multi_video` workaround return { **metainfo, '_type': 'multi_video',