From 77140991f10885b0169495c29300ea35b04ad511 Mon Sep 17 00:00:00 2001 From: "Suraj kumar (sk)" <71056993+surajkumar-sk@users.noreply.github.com> Date: Wed, 14 Apr 2021 02:26:02 +0530 Subject: [PATCH] fix(hls): Assume MP4 if MIME type can't be deduced (#3325) Fixes #3142 --- lib/hls/hls_parser.js | 9 +++--- lib/util/error.js | 6 +--- test/hls/hls_parser_unit.js | 64 ++++++++++++++++++++++--------------- 3 files changed, 43 insertions(+), 36 deletions(-) diff --git a/lib/hls/hls_parser.js b/lib/hls/hls_parser.js index 11f212ef40..8cdc1c955f 100644 --- a/lib/hls/hls_parser.js +++ b/lib/hls/hls_parser.js @@ -2414,11 +2414,10 @@ shaka.hls.HlsParser = class { const contentMimeType = response.headers['content-type']; if (!contentMimeType) { - throw new shaka.util.Error( - shaka.util.Error.Severity.CRITICAL, - shaka.util.Error.Category.MANIFEST, - shaka.util.Error.Code.HLS_COULD_NOT_GUESS_MIME_TYPE, - extension); + // if the HLS content is lacking in both MIME type metadata and + // segment file extensions we fall back to assuming its MP4. + const fallbackMimeType = map['mp4']; + return fallbackMimeType; } // Split the MIME type in case the server sent additional parameters. diff --git a/lib/util/error.js b/lib/util/error.js index 37d4b2b5e0..1624c16d02 100644 --- a/lib/util/error.js +++ b/lib/util/error.js @@ -582,11 +582,7 @@ shaka.util.Error.Code = { */ 'HLS_MULTIPLE_MEDIA_INIT_SECTIONS_FOUND': 4020, - /** - * HLS parser was unable to guess mime type of a stream. - *
error.data[0] is the stream file's extension. - */ - 'HLS_COULD_NOT_GUESS_MIME_TYPE': 4021, + // RETIRED: 'HLS_COULD_NOT_GUESS_MIME_TYPE': 4021, /** * No Master Playlist has been provided. Master playlist provides diff --git a/test/hls/hls_parser_unit.js b/test/hls/hls_parser_unit.js index dddec76d3c..43c6cd46fc 100644 --- a/test/hls/hls_parser_unit.js +++ b/test/hls/hls_parser_unit.js @@ -1935,6 +1935,44 @@ describe('HlsParser', () => { await testHlsParser(master, media, manifest); }); + it('falls back to mp4 if HEAD request fails', async () => { + const master = [ + '#EXTM3U\n', + '#EXT-X-STREAM-INF:BANDWIDTH=200,CODECS="avc1,mp4a",', + 'RESOLUTION=960x540,FRAME-RATE=60,VIDEO="vid"\n', + 'audio\n', + '#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="vid",URI="video"', + ].join(''); + + const media = [ + '#EXTM3U\n', + '#EXT-X-MAP:URI="init.mp4",BYTERANGE="616@0"\n', + '#EXT-X-PLAYLIST-TYPE:VOD\n', + '#EXTINF:5,\n', + '#EXT-X-BYTERANGE:121090@616\n', + 'main.test', + ].join(''); + + const manifest = shaka.test.ManifestGenerator.generate((manifest) => { + manifest.anyTimeline(); + manifest.addPartialVariant((variant) => { + variant.addPartialStream(ContentType.VIDEO, (stream) => { + stream.mime('video/mp4', 'avc1'); + }); + variant.addPartialStream(ContentType.AUDIO, (stream) => { + stream.mime('audio/mp4', 'mp4a'); + }); + }); + }); + + fakeNetEngine.setHeaders( + 'test:/main.test', { + 'content-type': '', + }); + + await testHlsParser(master, media, manifest); + }); + describe('Errors out', () => { const Code = shaka.util.Error.Code; @@ -1956,32 +1994,6 @@ describe('HlsParser', () => { .toBeRejectedWith(Util.jasmineError(error)); } - it('if unable to guess mime type', async () => { - const master = [ - '#EXTM3U\n', - '#EXT-X-STREAM-INF:BANDWIDTH=200,CODECS="avc1,mp4a",', - 'RESOLUTION=960x540,FRAME-RATE=60,VIDEO="vid"\n', - 'audio\n', - '#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="vid",URI="video"', - ].join(''); - - const media = [ - '#EXTM3U\n', - '#EXT-X-MAP:URI="init.mp4",BYTERANGE="616@0"\n', - '#EXT-X-PLAYLIST-TYPE:VOD\n', - '#EXTINF:5,\n', - '#EXT-X-BYTERANGE:121090@616\n', - 'main.exe', - ].join(''); - - const error = new shaka.util.Error( - shaka.util.Error.Severity.CRITICAL, - shaka.util.Error.Category.MANIFEST, - Code.HLS_COULD_NOT_GUESS_MIME_TYPE, 'exe'); - - await verifyError(master, media, error); - }); - it('if unable to guess codecs', async () => { const master = [ '#EXTM3U\n',