diff options
Diffstat (limited to 'yt_dlp/extractor')
-rw-r--r-- | yt_dlp/extractor/canvas.py | 6 | ||||
-rw-r--r-- | yt_dlp/extractor/common.py | 29 | ||||
-rw-r--r-- | yt_dlp/extractor/viki.py | 5 |
3 files changed, 28 insertions, 12 deletions
diff --git a/yt_dlp/extractor/canvas.py b/yt_dlp/extractor/canvas.py index 1b7c1d2ff..575f3d25c 100644 --- a/yt_dlp/extractor/canvas.py +++ b/yt_dlp/extractor/canvas.py @@ -24,7 +24,7 @@ class CanvasIE(InfoExtractor): _VALID_URL = r'https?://mediazone\.vrt\.be/api/v1/(?P<site_id>canvas|een|ketnet|vrt(?:video|nieuws)|sporza|dako)/assets/(?P<id>[^/?#&]+)' _TESTS = [{ 'url': 'https://mediazone.vrt.be/api/v1/ketnet/assets/md-ast-4ac54990-ce66-4d00-a8ca-9eac86f4c475', - 'md5': '68993eda72ef62386a15ea2cf3c93107', + 'md5': '37b2b7bb9b3dcaa05b67058dc3a714a9', 'info_dict': { 'id': 'md-ast-4ac54990-ce66-4d00-a8ca-9eac86f4c475', 'display_id': 'md-ast-4ac54990-ce66-4d00-a8ca-9eac86f4c475', @@ -32,9 +32,9 @@ class CanvasIE(InfoExtractor): 'title': 'Nachtwacht: De Greystook', 'description': 'Nachtwacht: De Greystook', 'thumbnail': r're:^https?://.*\.jpg$', - 'duration': 1468.04, + 'duration': 1468.02, }, - 'expected_warnings': ['is not a supported codec', 'Unknown MIME type'], + 'expected_warnings': ['is not a supported codec'], }, { 'url': 'https://mediazone.vrt.be/api/v1/canvas/assets/mz-ast-5e5f90b6-2d72-4c40-82c2-e134f884e93e', 'only_matching': True, diff --git a/yt_dlp/extractor/common.py b/yt_dlp/extractor/common.py index 3603924e4..1524fcb15 100644 --- a/yt_dlp/extractor/common.py +++ b/yt_dlp/extractor/common.py @@ -2126,6 +2126,7 @@ class InfoExtractor(object): format_id.append(str(format_index)) f = { 'format_id': '-'.join(format_id), + 'format_note': name, 'format_index': format_index, 'url': manifest_url, 'manifest_url': m3u8_url, @@ -2637,7 +2638,7 @@ class InfoExtractor(object): mime_type = representation_attrib['mimeType'] content_type = representation_attrib.get('contentType', mime_type.split('/')[0]) - if content_type in ('video', 'audio', 'text'): + if content_type in ('video', 'audio', 'text') or mime_type == 'image/jpeg': base_url = '' for element in (representation, adaptation_set, period, mpd_doc): base_url_e = element.find(_add_ns('BaseURL')) @@ -2654,9 +2655,15 @@ class InfoExtractor(object): url_el = representation.find(_add_ns('BaseURL')) filesize = int_or_none(url_el.attrib.get('{http://youtube.com/yt/2012/10/10}contentLength') if url_el is not None else None) bandwidth = int_or_none(representation_attrib.get('bandwidth')) + if representation_id is not None: + format_id = representation_id + else: + format_id = content_type + if mpd_id: + format_id = mpd_id + '-' + format_id if content_type in ('video', 'audio'): f = { - 'format_id': '%s-%s' % (mpd_id, representation_id) if mpd_id else representation_id, + 'format_id': format_id, 'manifest_url': mpd_url, 'ext': mimetype2ext(mime_type), 'width': int_or_none(representation_attrib.get('width')), @@ -2676,6 +2683,17 @@ class InfoExtractor(object): 'manifest_url': mpd_url, 'filesize': filesize, } + elif mime_type == 'image/jpeg': + # See test case in VikiIE + # https://www.viki.com/videos/1175236v-choosing-spouse-by-lottery-episode-1 + f = { + 'format_id': format_id, + 'ext': 'mhtml', + 'manifest_url': mpd_url, + 'format_note': 'DASH storyboards (jpeg)', + 'acodec': 'none', + 'vcodec': 'none', + } representation_ms_info = extract_multisegment_info(representation, adaption_set_ms_info) def prepare_template(template_name, identifiers): @@ -2694,7 +2712,8 @@ class InfoExtractor(object): t += c # Next, $...$ templates are translated to their # %(...) counterparts to be used with % operator - t = t.replace('$RepresentationID$', representation_id) + if representation_id is not None: + t = t.replace('$RepresentationID$', representation_id) t = re.sub(r'\$(%s)\$' % '|'.join(identifiers), r'%(\1)d', t) t = re.sub(r'\$(%s)%%([^$]+)\$' % '|'.join(identifiers), r'%(\1)\2', t) t.replace('$$', '$') @@ -2811,7 +2830,7 @@ class InfoExtractor(object): 'url': mpd_url or base_url, 'fragment_base_url': base_url, 'fragments': [], - 'protocol': 'http_dash_segments', + 'protocol': 'http_dash_segments' if mime_type != 'image/jpeg' else 'mhtml', }) if 'initialization_url' in representation_ms_info: initialization_url = representation_ms_info['initialization_url'] @@ -2822,7 +2841,7 @@ class InfoExtractor(object): else: # Assuming direct URL to unfragmented media. f['url'] = base_url - if content_type in ('video', 'audio'): + if content_type in ('video', 'audio') or mime_type == 'image/jpeg': formats.append(f) elif content_type == 'text': subtitles.setdefault(lang or 'und', []).append(f) diff --git a/yt_dlp/extractor/viki.py b/yt_dlp/extractor/viki.py index 98d16f4d1..19bcf1d7b 100644 --- a/yt_dlp/extractor/viki.py +++ b/yt_dlp/extractor/viki.py @@ -142,6 +142,7 @@ class VikiIE(VikiBaseIE): IE_NAME = 'viki' _VALID_URL = r'%s(?:videos|player)/(?P<id>[0-9]+v)' % VikiBaseIE._VALID_URL_BASE _TESTS = [{ + 'note': 'Free non-DRM video with storyboards in MPD', 'url': 'https://www.viki.com/videos/1175236v-choosing-spouse-by-lottery-episode-1', 'info_dict': { 'id': '1175236v', @@ -155,7 +156,6 @@ class VikiIE(VikiBaseIE): 'params': { 'format': 'bestvideo', }, - 'expected_warnings': ['Unknown MIME type image/jpeg in DASH manifest'], }, { 'url': 'http://www.viki.com/videos/1023585v-heirs-episode-14', 'info_dict': { @@ -173,7 +173,6 @@ class VikiIE(VikiBaseIE): 'format': 'bestvideo', }, 'skip': 'Blocked in the US', - 'expected_warnings': ['Unknown MIME type image/jpeg in DASH manifest'], }, { # clip 'url': 'http://www.viki.com/videos/1067139v-the-avengers-age-of-ultron-press-conference', @@ -225,7 +224,6 @@ class VikiIE(VikiBaseIE): 'params': { 'format': 'bestvideo', }, - 'expected_warnings': ['Unknown MIME type image/jpeg in DASH manifest'], }, { # youtube external 'url': 'http://www.viki.com/videos/50562v-poor-nastya-complete-episode-1', @@ -264,7 +262,6 @@ class VikiIE(VikiBaseIE): 'params': { 'format': 'bestvideo', }, - 'expected_warnings': ['Unknown MIME type image/jpeg in DASH manifest'], }] def _real_extract(self, url): |