Skip to content

Commit

Permalink
feat(FEC-11894): persist user selection during playlist playback (#634)
Browse files Browse the repository at this point in the history
store the video track selection and select it on load 

Solves: FEC-11894
  • Loading branch information
yairans authored Feb 21, 2022
1 parent bf28e11 commit f15d365
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 1 deletion.
24 changes: 24 additions & 0 deletions src/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,7 @@ export default class Player extends FakeEventTarget {
muted: undefined,
volume: undefined,
rate: undefined,
videoTrack: undefined,
audioLanguage: '',
textLanguage: ''
};
Expand Down Expand Up @@ -1304,6 +1305,7 @@ export default class Player extends FakeEventTarget {
selectTrack(track: ?Track): void {
if (this._engine) {
if (track instanceof VideoTrack) {
this._playbackAttributesState.videoTrack = track;
if (this._stateManager.currentState.type === StateType.IDLE) {
this._pendingSelectedVideoTrack = track;
} else {
Expand Down Expand Up @@ -1388,6 +1390,7 @@ export default class Player extends FakeEventTarget {
if (this._engine) {
this._engine.enableAdaptiveBitrate();
}
this._playbackAttributesState.videoTrack = undefined;
}

/**
Expand Down Expand Up @@ -2549,6 +2552,7 @@ export default class Player extends FakeEventTarget {
let currentOrConfiguredAudioLang = this._playbackAttributesState.audioLanguage || playbackConfig.audioLanguage;
this._setDefaultTrack<TextTrack>(this._getTextTracks(), currentOrConfiguredTextLang, offTextTrack);
this._setDefaultTrack<AudioTrack>(this._getAudioTracks(), currentOrConfiguredAudioLang, activeTracks.audio);
this._setDefaultVideoTrack();
}

/**
Expand Down Expand Up @@ -2601,6 +2605,26 @@ export default class Player extends FakeEventTarget {
}
}

/**
* Sets the video track selected by the user.
* @returns {void}
* @private
*/
_setDefaultVideoTrack(): void {
const sortedVideoTracks = this._getVideoTracks().sort((track1: VideoTrack, track2: VideoTrack) => track2.bandwidth - track1.bandwidth);
let selectedVideoTrack = sortedVideoTracks.find(
(track: VideoTrack) => track.label && track.label === this._playbackAttributesState.videoTrack?.label
);
if (!selectedVideoTrack) {
selectedVideoTrack = sortedVideoTracks.find(
(track: VideoTrack) => track.height && track.height === this._playbackAttributesState.videoTrack?.height
);
}
if (selectedVideoTrack) {
this.selectTrack(selectedVideoTrack);
}
}

/**
* Checks for callbacks that should change the tracks, and call them on the
* respective track group (audio/text/video)
Expand Down
49 changes: 48 additions & 1 deletion test/src/player.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -935,7 +935,7 @@ describe('Player', function () {
removeElement(targetId);
});

it.skip('should select a new video track', done => {
it('should select a new video track', done => {
let tracks;
player.addEventListener(CustomEventType.VIDEO_TRACK_CHANGED, event => {
(event.payload.selectedVideoTrack instanceof VideoTrack).should.be.true;
Expand All @@ -961,6 +961,53 @@ describe('Player', function () {
video = player._engine.getVideoElement();
});

it('should select the previous selected track', done => {
let tracks;
player.ready().then(() => {
tracks = player._tracks.filter(track => {
return track instanceof VideoTrack;
});
player.selectTrack(tracks[1]);
player.setSources(sourcesConfig.MultipleSources);
player.load();
player.ready().then(() => {
try {
(video.src.indexOf(sourcesConfig.MultipleSources.progressive[0].url) > -1).should.be.false;
(video.src.indexOf(sourcesConfig.MultipleSources.progressive[1].url) > -1).should.be.true;
done();
} catch (e) {
done(e);
}
});
});
player.load();
video = player._engine.getVideoElement();
});

it('should remove user selection once adaptive bitrate enabled', done => {
let tracks;
player.ready().then(() => {
tracks = player._tracks.filter(track => {
return track instanceof VideoTrack;
});
player.selectTrack(tracks[1]);
player.enableAdaptiveBitrate();
player.setSources(sourcesConfig.MultipleSources);
player.load();
player.ready().then(() => {
try {
(video.src.indexOf(sourcesConfig.MultipleSources.progressive[0].url) > -1).should.be.true;
(video.src.indexOf(sourcesConfig.MultipleSources.progressive[1].url) > -1).should.be.false;
done();
} catch (e) {
done(e);
}
});
});
player.load();
video = player._engine.getVideoElement();
});

it('should not change the selected for non exist video track', done => {
player.ready().then(() => {
let tracks = player._tracks.filter(track => {
Expand Down

0 comments on commit f15d365

Please sign in to comment.