Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions src/streaming/MediaManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ function MediaManager() {
function prebufferAlternativeContent(playerId, alternativeMpdUrl) {
try {
if (prebufferedPlayers.has(playerId)) {
return; // Already prebuffered
return;
}

logger.info(`Starting prebuffering for player ${playerId}`);
Expand Down Expand Up @@ -150,10 +150,6 @@ function MediaManager() {
prebufferedPlayer.player.off(Events.ERROR);
prebufferedPlayer.player.reset();

if (prebufferedPlayer.videoElement && prebufferedPlayer.videoElement?.parentNode) {
prebufferedPlayer.videoElement.parentNode?.removeChild(prebufferedPlayer.videoElement);
}

prebufferedPlayers.delete(playerId);
}
logger.debug(`Cleaned up prebuffered content for ${playerId}`);
Expand Down Expand Up @@ -231,6 +227,11 @@ function MediaManager() {
logger.debug('Switch already in progress - ignoring request');
return
};

if (!altPlayer) {
logger.warn('No alternative player to switch back from');
return;
}

logger.info('Switching back to main content');
isSwitching = true;
Expand Down
5 changes: 5 additions & 0 deletions test/unit/mocks/VideoModelMock.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,14 @@ class VideoModelMock {
}

pause() {
this.isplaying = false;
this.ispaused = true;
}

isPlaying() {
return this.isplaying;
}

isPaused() {
return this.ispaused;
}
Expand Down
64 changes: 51 additions & 13 deletions test/unit/test/streaming/streaming.MediaManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,18 @@ import DebugMock from '../../mocks/DebugMock.js';
import { expect } from 'chai';

describe('MediaManager', function () {
const mediaManager = MediaManager().getInstance();
let mediaManager;
let videoModelMock;
let mockVideoElement;
let playbackControllerMock;
let debugMock;

beforeEach(function () {
mediaManager = MediaManager().getInstance();
videoModelMock = new VideoModelMock();
videoModelMock.play();
playbackControllerMock = new PlaybackControllerMock();
debugMock = new DebugMock();

mediaManager.setConfig({
videoModel: videoModelMock,
playbackController: playbackControllerMock,
Expand All @@ -32,30 +34,32 @@ describe('MediaManager', function () {
}
});

describe('setAlternativeVideoElement', function () {
describe('set the alternative video element', function () {
it('should not throw error when setting alternative video element', function () {
const mockVideoElement = videoModelMock.getElement();
mockVideoElement = document.createElement('video');

expect(() => {
mediaManager.setAlternativeVideoElement(mockVideoElement);
}).to.not.throw();
});
});

describe('prebufferAlternativeContent', function () {
describe('prebuffer the alternative content', function () {
it('should start prebuffering alternative content and log the action', function () {
const testUrl = 'http://test.mpd';
const testPlayerId = 'testPlayer';

mediaManager.prebufferAlternativeContent(testPlayerId, testUrl);
expect(() => {
mediaManager.prebufferAlternativeContent(testPlayerId, testUrl);
}).to.not.throw();

expect(debugMock.log.info).to.equal(`Starting prebuffering for player ${testPlayerId}`);
});
});

describe('switchToAlternativeContent', function () {
describe('switch to the alternative content', function () {
beforeEach(function () {
const mockVideoElement = videoModelMock.getElement();
mockVideoElement = document.createElement('video');
mediaManager.setAlternativeVideoElement(mockVideoElement);
});

Expand All @@ -66,17 +70,22 @@ describe('MediaManager', function () {
mediaManager.switchToAlternativeContent(testPlayerId, testUrl);

expect(debugMock.log.info).to.equal(`Alternative content playback started for player ${testPlayerId}`);
expect(videoModelMock.isPaused()).to.be.true;
expect(mockVideoElement.style.display).to.be.equal('block');
expect(videoModelMock.getElement().style.display).to.be.equal('none');
});

it('should switch to alternative content with prebuffered content', function () {
const testUrl = 'http://test.mpd';
const testPlayerId = 'testPlayer';

mediaManager.prebufferAlternativeContent(testPlayerId, testUrl);
expect(debugMock.log.info).to.equal(`Starting prebuffering for player ${testPlayerId}`);

mediaManager.switchToAlternativeContent(testPlayerId, testUrl);

expect(debugMock.log.info).to.equal(`Alternative content playback started for player ${testPlayerId}`);
expect(videoModelMock.isPaused()).to.be.true;
expect(mockVideoElement.style.display).to.be.equal('block');
expect(videoModelMock.getElement().style.display).to.be.equal('none');
});

it('should switch to alternative content and seek to a given time', function () {
Expand All @@ -88,18 +97,21 @@ describe('MediaManager', function () {

expect(debugMock.log.debug).to.equal(`Seeking alternative content to time: ${testTime}`);
expect(debugMock.log.info).to.equal(`Alternative content playback started for player ${testPlayerId}`);
expect(videoModelMock.isPaused()).to.be.true;
expect(mockVideoElement.style.display).to.be.equal('block');
expect(videoModelMock.getElement().style.display).to.be.equal('none');
});
});

describe('getAlternativePlayer', function () {
describe('get alternative player', function () {
beforeEach(function () {
const mockVideoElement = videoModelMock.getElement();
mockVideoElement = document.createElement('video');
mediaManager.setAlternativeVideoElement(mockVideoElement);
});

it('should return null when no alternative player is set', function () {
const result = mediaManager.getAlternativePlayer();
expect(result).to.be.null;
expect(result).to.be.undefined;
});

it('should return the alternative player when it is set', function () {
Expand All @@ -113,4 +125,30 @@ describe('MediaManager', function () {
expect(result).to.be.an('object');
});
});

describe('switch back to the main content', function () {
beforeEach(function () {
mockVideoElement = document.createElement('video');
mediaManager.setAlternativeVideoElement(mockVideoElement);
});

it('should warn when no alternative player is set', function () {
mediaManager.switchBackToMainContent(10);

expect(debugMock.log.warn).to.equal('No alternative player to switch back from');
});

it('should switch back to main content', function () {
const testUrl = 'http://test.mpd';
const testPlayerId = 'testPlayer';
const seekTime = 20;

mediaManager.switchToAlternativeContent(testPlayerId, testUrl, 0);
mediaManager.switchBackToMainContent(seekTime);

expect(debugMock.log.info).to.equal('Main content playback resumed');
expect(mediaManager.getAlternativePlayer()).to.be.null;
expect(videoModelMock.isPlaying()).to.be.true;
});
});
});