From 0c1217a58b9922a4d02aa24e64232cd5cd2a7f7a Mon Sep 17 00:00:00 2001 From: zhuangs Date: Tue, 18 Apr 2017 18:50:54 -0400 Subject: [PATCH] Trigger an event when the final playlist would have been blacklisted (#1080) * trigger events for blacklistplaylist and retryplaylist --- src/master-playlist-controller.js | 2 ++ test/videojs-contrib-hls.test.js | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/src/master-playlist-controller.js b/src/master-playlist-controller.js index a49812e1d..250714248 100644 --- a/src/master-playlist-controller.js +++ b/src/master-playlist-controller.js @@ -1070,10 +1070,12 @@ export class MasterPlaylistController extends videojs.EventTarget { videojs.log.warn('Problem encountered with the current ' + 'HLS playlist. Trying again since it is the final playlist.'); + this.tech_.trigger('retryplaylist'); return this.masterPlaylistLoader_.load(isFinalRendition); } // Blacklist this playlist currentPlaylist.excludeUntil = Date.now() + this.blacklistDuration * 1000; + this.tech_.trigger('blacklistplaylist'); // Select a new playlist nextPlaylist = this.selectPlaylist(); diff --git a/test/videojs-contrib-hls.test.js b/test/videojs-contrib-hls.test.js index fd0e252ec..02642b4e2 100644 --- a/test/videojs-contrib-hls.test.js +++ b/test/videojs-contrib-hls.test.js @@ -1096,12 +1096,16 @@ QUnit.test('segment 404 should trigger blacklisting of media', function(assert) QUnit.test('playlist 404 should blacklist media', function(assert) { let media; let url; + let blacklistplaylist = 0; + let retryplaylist = 0; this.player.src({ src: 'manifest/master.m3u8', type: 'application/vnd.apple.mpegurl' }); openMediaSource(this.player, this.clock); + this.player.tech_.on('blacklistplaylist', () => blacklistplaylist++); + this.player.tech_.on('retryplaylist', () => retryplaylist++); this.player.tech_.hls.bandwidth = 1e10; // master @@ -1114,6 +1118,8 @@ QUnit.test('playlist 404 should blacklist media', function(assert) { assert.equal(typeof this.player.tech_.hls.playlists.media_, 'undefined', 'no media is initially set'); + + assert.equal(blacklistplaylist, 0, 'there is no blacklisted playlist'); // media this.requests[1].respond(404); url = this.requests[1].url.slice(this.requests[1].url.lastIndexOf('/') + 1); @@ -1123,6 +1129,8 @@ QUnit.test('playlist 404 should blacklist media', function(assert) { assert.equal(this.env.log.warn.args[0], 'Problem encountered with the current HLS playlist. HLS playlist request error at URL: media.m3u8 Switching to another playlist.', 'log generic error message'); + assert.equal(blacklistplaylist, 1, 'there is one blacklisted playlist'); + assert.equal(retryplaylist, 0, 'haven\'t retried any playlist'); // request for the final available media this.requests[2].respond(404); @@ -1135,6 +1143,8 @@ QUnit.test('playlist 404 should blacklist media', function(assert) { assert.equal(this.env.log.warn.args[1], 'Problem encountered with the current HLS playlist. Trying again since it is the final playlist.', 'log specific error message for final playlist'); + assert.equal(retryplaylist, 1, 'retried final playlist for once'); + assert.equal(blacklistplaylist, 1, 'there is one blacklisted playlist'); this.clock.tick(2 * 1000); // no new request was made since it hasn't been half the segment duration