From c2d70835bd965ac1843a6890a8919ec3ec9feaf5 Mon Sep 17 00:00:00 2001 From: bashonly Date: Thu, 20 Feb 2025 23:27:37 -0600 Subject: [PATCH 1/2] [ie] Fix parsing of MPDs with multiple adaptation sets Fixes 4ce57d3b873c2887814cbec03d029533e82f7db5 Authored by: bashonly --- yt_dlp/extractor/common.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/yt_dlp/extractor/common.py b/yt_dlp/extractor/common.py index 8d199b353c..896827cf46 100644 --- a/yt_dlp/extractor/common.py +++ b/yt_dlp/extractor/common.py @@ -2792,8 +2792,9 @@ class InfoExtractor: 'start_number': 1, 'timescale': 1, }) - for adaptation_set in period.findall(_add_ns('AdaptationSet')): + for adaptation_idx, adaptation_set in enumerate(period.findall(_add_ns('AdaptationSet'))): adaption_set_ms_info = extract_multisegment_info(adaptation_set, period_ms_info) + adaptation_set_label = try_call(lambda: adaptation_set.find(_add_ns('Label')).text) for representation in adaptation_set.findall(_add_ns('Representation')): representation_attrib = adaptation_set.attrib.copy() representation_attrib.update(representation.attrib) @@ -2857,7 +2858,10 @@ class InfoExtractor: 'asr': int_or_none(representation_attrib.get('audioSamplingRate')), 'fps': int_or_none(representation_attrib.get('frameRate')), 'language': lang if lang not in ('mul', 'und', 'zxx', 'mis') else None, - 'format_note': f'DASH {content_type}', + # AdaptationSet ID/index must be included to prevent improper merging as periods + 'format_note': join_nonempty( + f'DASH {content_type}', adaptation_set_label, + f'set {adaptation_set.get("id", adaptation_idx)}', delim=', '), 'filesize': filesize, 'container': mimetype2ext(mime_type) + '_dash', **codecs, From 95c46e32f01d53bfaa4ea5c41d2a7a11bd866074 Mon Sep 17 00:00:00 2001 From: bashonly Date: Fri, 21 Feb 2025 00:03:55 -0600 Subject: [PATCH 2/2] update the tests? Authored by: bashonly --- test/test_InfoExtractor.py | 46 +++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/test/test_InfoExtractor.py b/test/test_InfoExtractor.py index 54f35ef552..475157bb19 100644 --- a/test/test_InfoExtractor.py +++ b/test/test_InfoExtractor.py @@ -1060,7 +1060,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'manifest_url': 'http://unknown/manifest.mpd', 'ext': 'm4a', 'format_id': '318597', - 'format_note': 'DASH audio', + 'format_note': 'DASH audio, set 0', 'protocol': 'http_dash_segments', 'acodec': 'mp4a.40.2', 'vcodec': 'none', @@ -1069,7 +1069,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'manifest_url': 'http://unknown/manifest.mpd', 'ext': 'mp4', 'format_id': '318597', - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 1', 'protocol': 'http_dash_segments', 'acodec': 'none', 'vcodec': 'avc1.42001f', @@ -1080,7 +1080,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'manifest_url': 'http://unknown/manifest.mpd', 'ext': 'mp4', 'format_id': '638590', - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 1', 'protocol': 'http_dash_segments', 'acodec': 'none', 'vcodec': 'avc1.42001f', @@ -1091,7 +1091,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'manifest_url': 'http://unknown/manifest.mpd', 'ext': 'mp4', 'format_id': '1022565', - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 1', 'protocol': 'http_dash_segments', 'acodec': 'none', 'vcodec': 'avc1.4d001f', @@ -1102,7 +1102,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'manifest_url': 'http://unknown/manifest.mpd', 'ext': 'mp4', 'format_id': '2046506', - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 1', 'protocol': 'http_dash_segments', 'acodec': 'none', 'vcodec': 'avc1.4d001f', @@ -1113,7 +1113,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'manifest_url': 'http://unknown/manifest.mpd', 'ext': 'mp4', 'format_id': '3998017', - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 1', 'protocol': 'http_dash_segments', 'acodec': 'none', 'vcodec': 'avc1.640029', @@ -1124,7 +1124,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'manifest_url': 'http://unknown/manifest.mpd', 'ext': 'mp4', 'format_id': '5997485', - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 1', 'protocol': 'http_dash_segments', 'acodec': 'none', 'vcodec': 'avc1.640032', @@ -1142,7 +1142,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'manifest_url': 'http://unknown/manifest.mpd', 'ext': 'mp4', 'format_id': 'h264_aac_144p_m4s', - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 0', 'protocol': 'http_dash_segments', 'acodec': 'mp4a.40.2', 'vcodec': 'avc3.42c01e', @@ -1153,7 +1153,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'manifest_url': 'http://unknown/manifest.mpd', 'ext': 'mp4', 'format_id': 'h264_aac_240p_m4s', - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 0', 'protocol': 'http_dash_segments', 'acodec': 'mp4a.40.2', 'vcodec': 'avc3.42c01e', @@ -1164,7 +1164,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'manifest_url': 'http://unknown/manifest.mpd', 'ext': 'mp4', 'format_id': 'h264_aac_360p_m4s', - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 0', 'protocol': 'http_dash_segments', 'acodec': 'mp4a.40.2', 'vcodec': 'avc3.42c01e', @@ -1175,7 +1175,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'manifest_url': 'http://unknown/manifest.mpd', 'ext': 'mp4', 'format_id': 'h264_aac_480p_m4s', - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 0', 'protocol': 'http_dash_segments', 'acodec': 'mp4a.40.2', 'vcodec': 'avc3.42c01e', @@ -1186,7 +1186,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'manifest_url': 'http://unknown/manifest.mpd', 'ext': 'mp4', 'format_id': 'h264_aac_576p_m4s', - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 0', 'protocol': 'http_dash_segments', 'acodec': 'mp4a.40.2', 'vcodec': 'avc3.42c01e', @@ -1197,7 +1197,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'manifest_url': 'http://unknown/manifest.mpd', 'ext': 'mp4', 'format_id': 'h264_aac_720p_m4s', - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 0', 'protocol': 'http_dash_segments', 'acodec': 'mp4a.40.2', 'vcodec': 'avc3.42c01e', @@ -1208,7 +1208,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'manifest_url': 'http://unknown/manifest.mpd', 'ext': 'mp4', 'format_id': 'h264_aac_1080p_m4s', - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 0', 'protocol': 'http_dash_segments', 'acodec': 'mp4a.40.2', 'vcodec': 'avc3.42c01e', @@ -1229,7 +1229,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'manifest_url': 'https://v.redd.it/hw1x7rcg7zl21/DASHPlaylist.mpd', 'ext': 'm4a', 'format_id': 'AUDIO-1', - 'format_note': 'DASH audio', + 'format_note': 'DASH audio, set 1', 'container': 'm4a_dash', 'acodec': 'mp4a.40.2', 'vcodec': 'none', @@ -1241,7 +1241,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'manifest_url': 'https://v.redd.it/hw1x7rcg7zl21/DASHPlaylist.mpd', 'ext': 'mp4', 'format_id': 'VIDEO-2', - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 0', 'container': 'mp4_dash', 'acodec': 'none', 'vcodec': 'avc1.4d401e', @@ -1254,7 +1254,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'manifest_url': 'https://v.redd.it/hw1x7rcg7zl21/DASHPlaylist.mpd', 'ext': 'mp4', 'format_id': 'VIDEO-1', - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 0', 'container': 'mp4_dash', 'acodec': 'none', 'vcodec': 'avc1.4d401e', @@ -1274,7 +1274,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'ext': 'm4a', 'tbr': 128.001, 'asr': 48000, - 'format_note': 'DASH audio', + 'format_note': 'DASH audio, set 1', 'container': 'm4a_dash', 'vcodec': 'none', 'acodec': 'mp4a.40.2', @@ -1291,7 +1291,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'width': 336, 'height': 144, 'tbr': 100, - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 3', 'container': 'mp4_dash', 'vcodec': 'avc1.4D401F', 'acodec': 'none', @@ -1308,7 +1308,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'width': 562, 'height': 240, 'tbr': 326, - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 3', 'container': 'mp4_dash', 'vcodec': 'avc1.4D401F', 'acodec': 'none', @@ -1325,7 +1325,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'width': 844, 'height': 360, 'tbr': 698, - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 3', 'container': 'mp4_dash', 'vcodec': 'avc1.4D401F', 'acodec': 'none', @@ -1342,7 +1342,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'width': 1126, 'height': 480, 'tbr': 1493, - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 3', 'container': 'mp4_dash', 'vcodec': 'avc1.4D401F', 'acodec': 'none', @@ -1359,7 +1359,7 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ 'width': 1688, 'height': 720, 'tbr': 4482, - 'format_note': 'DASH video', + 'format_note': 'DASH video, set 3', 'container': 'mp4_dash', 'vcodec': 'avc1.4D401F', 'acodec': 'none',