Skip to content
Open
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
19 changes: 18 additions & 1 deletion src/media-groups.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,23 @@ const audioTrackKind_ = (properties) => {
return kind;
};

/**
* Convert the properties of an HLS track into an textTrackKind.
*
* @private
*/
const textTrackKind_ = (properties) => {
if (
properties.characteristics &&
(properties.characteristics.indexOf('public.accessibility.transcribes-spoken-dialog') >= 0 ||
properties.characteristics.indexOf('public.accessibility.describes-music-and-sound') >= 0)
) {
return 'captions';
}

return 'subtitles';
};

/**
* Pause provided segment loader and playlist loader if active
*
Expand Down Expand Up @@ -593,7 +610,7 @@ export const initialize = {
if (typeof tracks[variantLabel] === 'undefined') {
const track = tech.addRemoteTextTrack({
id: variantLabel,
kind: 'subtitles',
kind: textTrackKind_(properties),
default: properties.default && properties.autoselect,
language: properties.language,
label: variantLabel
Expand Down
152 changes: 152 additions & 0 deletions test/media-groups.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1252,6 +1252,158 @@ QUnit.module('MediaGroups', function() {
}
);

QUnit.test(
'initialize subtitles sets text track kind to "subtitles" by default when no characteristics are present',
function(assert) {
const type = 'SUBTITLES';

this.main.mediaGroups[type].sub1 = {
en: { language: 'en', resolvedUri: 'sub1/en.m3u8' }
};

MediaGroups.initialize[type](type, this.settings);

assert.equal(
this.mediaTypes[type].tracks.en.kind,
'subtitles',
'track kind is subtitles by default'
);
}
);

QUnit.test(
'initialize subtitles sets text track kind to "captions" when characteristics contains transcribes-spoken-dialog',
function(assert) {
const type = 'SUBTITLES';

this.main.mediaGroups[type].sub1 = {
en: {
language: 'en',
resolvedUri: 'sub1/en.m3u8',
characteristics: 'public.accessibility.transcribes-spoken-dialog'
}
};

MediaGroups.initialize[type](type, this.settings);

assert.equal(
this.mediaTypes[type].tracks.en.kind,
'captions',
'track kind is captions when transcribing spoken dialog'
);
}
);

QUnit.test(
'initialize subtitles sets text track kind to "captions" when characteristics contains transcribes-spoken-dialog and easy-to-read',
function(assert) {
const type = 'SUBTITLES';

this.main.mediaGroups[type].sub1 = {
en: {
language: 'en',
resolvedUri: 'sub1/en.m3u8',
characteristics: 'public.accessibility.transcribes-spoken-dialog,public.easy-to-read'
}
};

MediaGroups.initialize[type](type, this.settings);

assert.equal(
this.mediaTypes[type].tracks.en.kind,
'captions',
'track kind is captions when transcribing spoken dialog alongside other characteristics'
);
}
);

QUnit.test(
'initialize subtitles sets text track kind to "captions" when characteristics contains describes-music-and-sound',
function(assert) {
const type = 'SUBTITLES';

this.main.mediaGroups[type].sub1 = {
en: {
language: 'en',
resolvedUri: 'sub1/en.m3u8',
characteristics: 'public.accessibility.describes-music-and-sound'
}
};

MediaGroups.initialize[type](type, this.settings);

assert.equal(
this.mediaTypes[type].tracks.en.kind,
'captions',
'track kind is captions when describing music and sound'
);
}
);

QUnit.test(
'initialize subtitles sets text track kind to "subtitles" when characteristics does not match caption criteria',
function(assert) {
const type = 'SUBTITLES';

this.main.mediaGroups[type].sub1 = {
en: {
language: 'en',
resolvedUri: 'sub1/en.m3u8',
characteristics: 'public.accessibility.describes-video'
}
};

MediaGroups.initialize[type](type, this.settings);

assert.equal(
this.mediaTypes[type].tracks.en.kind,
'subtitles',
'track kind is subtitles for non-caption characteristics'
);
}
);

QUnit.test(
'initialize subtitles correctly sets track kind for mixed subtitle and caption renditions',
function(assert) {
const type = 'SUBTITLES';

this.main.mediaGroups[type].sub1 = {
'en': {
language: 'en',
resolvedUri: 'sub1/en.m3u8'
},
'en-cc': {
language: 'en',
resolvedUri: 'sub1/en-cc.m3u8',
characteristics: 'public.accessibility.transcribes-spoken-dialog'
},
'fr': {
language: 'fr',
resolvedUri: 'sub1/fr.m3u8'
}
};

MediaGroups.initialize[type](type, this.settings);

assert.equal(
this.mediaTypes[type].tracks.en.kind,
'subtitles',
'en track kind is subtitles'
);
assert.equal(
this.mediaTypes[type].tracks['en-cc'].kind,
'captions',
'en-cc track kind is captions'
);
assert.equal(
this.mediaTypes[type].tracks.fr.kind,
'subtitles',
'fr track kind is subtitles'
);
}
);

QUnit.test(
'initialize closed-captions correctly generates tracks and NO loaders',
function(assert) {
Expand Down
Loading