Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

separate settings matcher to work on each property individually #4018

82 changes: 76 additions & 6 deletions src/streaming/controllers/MediaController.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ function MediaController() {
function setInitialMediaSettingsForType(type, streamInfo) {
let settings = lastSelectedTracks[type] || getInitialSettings(type);
const tracksForType = getTracksFor(type, streamInfo.id);
const tracks = [];
let tracks = [];

if (!settings) {
settings = domStorage.getSavedMediaSettings(type);
Expand All @@ -73,11 +73,16 @@ function MediaController() {
if (!tracksForType || (tracksForType.length === 0)) return;

if (settings) {
tracksForType.forEach(function (track) {
if (matchSettings(settings, track, !!lastSelectedTracks[type])) {
tracks.push(track);
}
});
tracks = Array.from(tracksForType);

tracks = filterTracksBySettings(tracks, matchSettingsLang, settings);
tracks = filterTracksBySettings(tracks, matchSettingsIndex, settings);
tracks = filterTracksBySettings(tracks, matchSettingsViewPoint, settings);
if ( !(type === Constants.AUDIO && !!lastSelectedTracks[type]) ) {
tracks = filterTracksBySettings(tracks, matchSettingsRole, settings);
}
tracks = filterTracksBySettings(tracks, matchSettingsAccessibility, settings);
tracks = filterTracksBySettings(tracks, matchSettingsAudioChannelConfig, settings);
}

if (tracks.length === 0) {
Expand Down Expand Up @@ -310,6 +315,65 @@ function MediaController() {
return notEmpty ? settings : null;
}

function filterTracksBySettings(tracks, filterFn, settings) {
let tracksAfterMatcher = [];
tracks.forEach(function (track) {
if (filterFn(settings, track)) {
tracksAfterMatcher.push(track);
}
});
if (tracksAfterMatcher.length !== 0) {
return tracksAfterMatcher;
}
return tracks;
dsilhavy marked this conversation as resolved.
Show resolved Hide resolved
}

function matchSettingsLang(settings, track) {
return !settings.lang ||
(settings.lang instanceof RegExp)?
(track.lang.match(settings.lang)):
(extendedFilter(track.lang, bcp47Normalize(settings.lang)).length>0);
}

function matchSettingsIndex(settings, track) {
return (settings.index === undefined) || (settings.index === null) || (track.index === settings.index);
}

function matchSettingsViewPoint(settings, track) {
return !settings.viewpoint || (settings.viewpoint === track.viewpoint);
}

function matchSettingsRole(settings, track, isTrackActive = false) {
const matchRole = !settings.role || !!track.roles.filter(function (item) {
return item === settings.role;
})[0];
return (matchRole || (track.type === Constants.AUDIO && isTrackActive));
}

function matchSettingsAccessibility(settings, track) {
let matchAccessibility;

if (!settings.accessibility) {
// if no accessibility is requested (or request is empty string),
// match only those tracks having no accessibility element present
matchAccessibility = !track.accessibility.length;
} else {
matchAccessibility = !!track.accessibility.filter(function (item) {
return item === settings.accessibility;
})[0];
}

return matchAccessibility;
}

function matchSettingsAudioChannelConfig(settings, track) {
let matchAudioChannelConfiguration = !settings.audioChannelConfiguration || !!track.audioChannelConfiguration.filter(function (item) {
return item === settings.audioChannelConfiguration;
})[0];

return matchAudioChannelConfiguration;
}

function matchSettings(settings, track, isTrackActive = false) {
try {
let matchLang = false;
Expand Down Expand Up @@ -572,6 +636,12 @@ function MediaController() {
getTracksWithWidestRange,
isTracksEqual,
matchSettings,
matchSettingsLang,
matchSettingsIndex,
matchSettingsViewPoint,
matchSettingsRole,
matchSettingsAccessibility,
matchSettingsAudioChannelConfig,
saveTextSettingsDisabled,
setConfig,
reset
Expand Down
143 changes: 140 additions & 3 deletions test/unit/streaming.controllers.MediaController.js
Original file line number Diff line number Diff line change
Expand Up @@ -334,10 +334,10 @@ describe('MediaController', function () {
});

describe('Initial Track Management', function () {
let streamInfo = {
const streamInfo = {
id: 'id'
};
let frTrack = {
const frTrack = {
type: trackType,
streamInfo: streamInfo,
lang: 'fr',
Expand All @@ -355,6 +355,36 @@ describe('MediaController', function () {
accessibility: 1,
audioChannelConfiguration: 1
};
const enTrack = {
type: trackType,
streamInfo: streamInfo,
lang: 'en',
viewpoint: null,
roles: ['Main'],
accessibility: [],
audioChannelConfiguration: 6,
selectionPriority: 5
};
const enADTrack = {
type: trackType,
streamInfo: streamInfo,
lang: 'en',
viewpoint: null,
roles: ['alternate'],
accessibility: ['1','description'],
audioChannelConfiguration: 6,
selectionPriority: 3
};
const esTrack = {
type: trackType,
streamInfo: streamInfo,
lang: 'es',
viewpoint: null,
roles: ['dub'],
accessibility: [],
audioChannelConfiguration: 2,
selectionPriority: 4
};

it('should check initial media settings to choose initial track', function () {
mediaController.addTrack(frTrack);
Expand Down Expand Up @@ -401,7 +431,6 @@ describe('MediaController', function () {

currentTrack = mediaController.getCurrentTrackFor(trackType, streamInfo.id);
expect(objectUtils.areEqual(currentTrack, frTrack)).to.be.true; // jshint ignore:line

});

it('should check initial media settings to choose initial track with a string/regex lang', function () {
Expand Down Expand Up @@ -450,6 +479,114 @@ describe('MediaController', function () {
currentTrack = mediaController.getCurrentTrackFor(trackType, streamInfo.id);
expect(objectUtils.areEqual(currentTrack, qtzTrack)).to.be.true; // jshint ignore:line
});

it('should check initial media settings to choose initial track with a lang and absent accessibility setting', function () {
mediaController.addTrack(enTrack);
mediaController.addTrack(enADTrack);
mediaController.addTrack(esTrack);

let trackList = mediaController.getTracksFor(trackType, streamInfo.id);
expect(trackList).to.have.lengthOf(3);
expect(objectUtils.areEqual(trackList[0], enTrack)).to.be.true; // jshint ignore:line
expect(objectUtils.areEqual(trackList[1], enADTrack)).to.be.true; // jshint ignore:line
expect(objectUtils.areEqual(trackList[2], esTrack)).to.be.true; // jshint ignore:line

let currentTrack = mediaController.getCurrentTrackFor(trackType, streamInfo.id);
expect(objectUtils.areEqual(currentTrack, enTrack)).to.be.false; // jshint ignore:line
expect(objectUtils.areEqual(currentTrack, enADTrack)).to.be.false; // jshint ignore:line
expect(objectUtils.areEqual(currentTrack, esTrack)).to.be.false; // jshint ignore:line

// call to setInitialMediaSettingsForType
mediaController.setInitialSettings(trackType, {
lang: 'en'
});
mediaController.setInitialMediaSettingsForType(trackType, streamInfo);

currentTrack = mediaController.getCurrentTrackFor(trackType, streamInfo.id);
expect(objectUtils.areEqual(currentTrack, enTrack)).to.be.true; // jshint ignore:line
});

it('should check initial media settings to choose initial track with a lang and empty accessibility setting', function () {
mediaController.addTrack(enTrack);
mediaController.addTrack(enADTrack);
mediaController.addTrack(esTrack);

let trackList = mediaController.getTracksFor(trackType, streamInfo.id);
expect(trackList).to.have.lengthOf(3);
expect(objectUtils.areEqual(trackList[0], enTrack)).to.be.true; // jshint ignore:line
expect(objectUtils.areEqual(trackList[1], enADTrack)).to.be.true; // jshint ignore:line
expect(objectUtils.areEqual(trackList[2], esTrack)).to.be.true; // jshint ignore:line

let currentTrack = mediaController.getCurrentTrackFor(trackType, streamInfo.id);
expect(objectUtils.areEqual(currentTrack, enTrack)).to.be.false; // jshint ignore:line
expect(objectUtils.areEqual(currentTrack, enADTrack)).to.be.false; // jshint ignore:line
expect(objectUtils.areEqual(currentTrack, esTrack)).to.be.false; // jshint ignore:line

// call to setInitialMediaSettingsForType
mediaController.setInitialSettings(trackType, {
lang: 'en',
accessibility: ''
});
mediaController.setInitialMediaSettingsForType(trackType, streamInfo);

currentTrack = mediaController.getCurrentTrackFor(trackType, streamInfo.id);
expect(objectUtils.areEqual(currentTrack, enTrack)).to.be.true; // jshint ignore:line
});

it('should check initial media settings to choose initial track with a lang and accessibility', function () {
mediaController.addTrack(enTrack);
mediaController.addTrack(enADTrack);
mediaController.addTrack(esTrack);

let trackList = mediaController.getTracksFor(trackType, streamInfo.id);
expect(trackList).to.have.lengthOf(3);
expect(objectUtils.areEqual(trackList[0], enTrack)).to.be.true; // jshint ignore:line
expect(objectUtils.areEqual(trackList[1], enADTrack)).to.be.true; // jshint ignore:line
expect(objectUtils.areEqual(trackList[2], esTrack)).to.be.true; // jshint ignore:line

let currentTrack = mediaController.getCurrentTrackFor(trackType, streamInfo.id);
expect(objectUtils.areEqual(currentTrack, enTrack)).to.be.false; // jshint ignore:line
expect(objectUtils.areEqual(currentTrack, enADTrack)).to.be.false; // jshint ignore:line
expect(objectUtils.areEqual(currentTrack, esTrack)).to.be.false; // jshint ignore:line

// call to setInitialMediaSettingsForType
mediaController.setInitialSettings(trackType, {
lang: 'en',
accessibility: 'description'
dsilhavy marked this conversation as resolved.
Show resolved Hide resolved
});
mediaController.setInitialMediaSettingsForType(trackType, streamInfo);

currentTrack = mediaController.getCurrentTrackFor(trackType, streamInfo.id);
expect(objectUtils.areEqual(currentTrack, enADTrack)).to.be.true; // jshint ignore:line
});

it('should check initial media settings to choose initial accessibility track where media has no accessibility for requested language', function () {
mediaController.addTrack(enTrack);
mediaController.addTrack(enADTrack);
mediaController.addTrack(esTrack);

let trackList = mediaController.getTracksFor(trackType, streamInfo.id);
expect(trackList).to.have.lengthOf(3);
expect(objectUtils.areEqual(trackList[0], enTrack)).to.be.true; // jshint ignore:line
expect(objectUtils.areEqual(trackList[1], enADTrack)).to.be.true; // jshint ignore:line
expect(objectUtils.areEqual(trackList[2], esTrack)).to.be.true; // jshint ignore:line

let currentTrack = mediaController.getCurrentTrackFor(trackType, streamInfo.id);
expect(objectUtils.areEqual(currentTrack, enTrack)).to.be.false; // jshint ignore:line
expect(objectUtils.areEqual(currentTrack, enADTrack)).to.be.false; // jshint ignore:line
expect(objectUtils.areEqual(currentTrack, esTrack)).to.be.false; // jshint ignore:line

// call to setInitialMediaSettingsForType
mediaController.setInitialSettings(trackType, {
lang: 'es',
accessibility: 'description'
});
mediaController.setInitialMediaSettingsForType(trackType, streamInfo);

currentTrack = mediaController.getCurrentTrackFor(trackType, streamInfo.id);
expect(objectUtils.areEqual(currentTrack, esTrack)).to.be.true; // jshint ignore:line
});

});

describe('Initial Track Selection', function () {
Expand Down