Skip to content

Commit

Permalink
feat(FEC-11632): expose stream timed metadata (#618)
Browse files Browse the repository at this point in the history
add a new api `getTextTracks` to get the native video text tracks
add a new type `TextTrackCue`
add a new class `CuePoint`  
and `CuePoint.TYPE` - `EMSG` for emsg and `CUSTOM` for custom cue points
add a new function `createTextTrackCue` to create `TextTrackCue` for a `CuePoint` 

Related to kaltura/kaltura-player-js#509, kaltura/playkit-js-dash#172
Solves FEC-11632
  • Loading branch information
yairans authored Dec 16, 2021
1 parent 3ee1dc1 commit f841b7e
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 2 deletions.
1 change: 1 addition & 0 deletions flow-typed/interfaces/engine.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ declare interface IEngine extends FakeEventTarget {
getThumbnail(time: number): ?ThumbnailInfo;
isOnLiveEdge(): boolean;
addTextTrack(kind: string, label?: string, language): ?TextTrack;
getTextTracks(): Array<TextTrack>;
+id: string;
currentTime: number;
+duration: number;
Expand Down
6 changes: 6 additions & 0 deletions flow-typed/types/text-track-cue.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
declare type TextTrackCue = window.TextTrackCue & {
value: {
key: string,
data: string | Object
}
};
11 changes: 11 additions & 0 deletions src/engines/html5/html5.js
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,7 @@ export default class Html5 extends FakeEventTarget implements IEngine {
this._eventManager.listen(mediaSourceAdapter, Html5EventType.PLAYING, (event: FakeEvent) => this.dispatchEvent(event));
this._eventManager.listen(mediaSourceAdapter, Html5EventType.WAITING, (event: FakeEvent) => this.dispatchEvent(event));
this._eventManager.listen(mediaSourceAdapter, CustomEventType.MEDIA_RECOVERED, (event: FakeEvent) => this.dispatchEvent(event));
this._eventManager.listen(mediaSourceAdapter, CustomEventType.TIMED_METADATA_ADDED, (event: FakeEvent) => this.dispatchEvent(event));
this._eventManager.listen(mediaSourceAdapter, 'hlsFragParsingMetadata', (event: FakeEvent) => this.dispatchEvent(event));
if (this._droppedFramesWatcher) {
this._eventManager.listen(this._droppedFramesWatcher, CustomEventType.FPS_DROP, (event: FakeEvent) => this.dispatchEvent(event));
Expand Down Expand Up @@ -1211,4 +1212,14 @@ export default class Html5 extends FakeEventTarget implements IEngine {
addTextTrack(kind: string, label?: string, language?: string): ?TextTrack {
return this._el.addTextTrack(kind, label, language);
}

/**
* get text tracks
* @function getTextTracks
* @returns {Array<TextTrack>} - The TextTracks array.
* @public
*/
getTextTracks(): Array<TextTrack> {
return Array.from(this._el.textTracks);
}
}
16 changes: 15 additions & 1 deletion src/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -1364,6 +1364,19 @@ export default class Player extends FakeEventTarget {
}
}

/**
* get text tracks
* @function getTextTracks
* @returns {Array<TextTrack>} - The TextTracks array.
* @public
*/
getTextTracks(): Array<TextTrack> {
if (this._engine && typeof this._engine.getTextTracks === 'function') {
return this._engine.getTextTracks();
}
return [];
}

/**
* Enables adaptive bitrate switching.
* @function enableAdaptiveBitrate
Expand Down Expand Up @@ -1908,6 +1921,7 @@ export default class Player extends FakeEventTarget {
this._eventManager.listen(this._engine, CustomEventType.TEXT_CUE_CHANGED, (event: FakeEvent) => this._onCueChange(event));
this._eventManager.listen(this._engine, CustomEventType.ABR_MODE_CHANGED, (event: FakeEvent) => this.dispatchEvent(event));
this._eventManager.listen(this._engine, CustomEventType.TIMED_METADATA, (event: FakeEvent) => this.dispatchEvent(event));
this._eventManager.listen(this._engine, CustomEventType.TIMED_METADATA_ADDED, (event: FakeEvent) => this.dispatchEvent(event));
this._eventManager.listen(this._engine, CustomEventType.PLAY_FAILED, (event: FakeEvent) => {
this._onPlayFailed(event);
this.dispatchEvent(event);
Expand All @@ -1916,6 +1930,7 @@ export default class Player extends FakeEventTarget {
this._eventManager.listen(this._engine, CustomEventType.FRAG_LOADED, (event: FakeEvent) => this.dispatchEvent(event));
this._eventManager.listen(this._engine, CustomEventType.DRM_LICENSE_LOADED, (event: FakeEvent) => this.dispatchEvent(event));
this._eventManager.listen(this._engine, CustomEventType.MANIFEST_LOADED, (event: FakeEvent) => this.dispatchEvent(event));
this._eventManager.listen(this._engine, CustomEventType.MEDIA_RECOVERED, () => this._handleRecovered());
this._eventManager.listen(this, Html5EventType.PLAY, this._onPlay.bind(this));
this._eventManager.listen(this, Html5EventType.PAUSE, this._onPause.bind(this));
this._eventManager.listen(this, Html5EventType.PLAYING, this._onPlaying.bind(this));
Expand All @@ -1935,7 +1950,6 @@ export default class Player extends FakeEventTarget {
this._resetTextCuesAndReposition();
this.dispatchEvent(event);
});
this._eventManager.listen(this._engine, CustomEventType.MEDIA_RECOVERED, () => this._handleRecovered());
this._eventManager.listen(this._externalCaptionsHandler, CustomEventType.TEXT_CUE_CHANGED, (event: FakeEvent) => this._onCueChange(event));
this._eventManager.listen(this._externalCaptionsHandler, CustomEventType.TEXT_TRACK_CHANGED, (event: FakeEvent) =>
this._onTextTrackChanged(event)
Expand Down
4 changes: 4 additions & 0 deletions src/playkit.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import ImageTrack from './track/image-track';
import VideoTrack from './track/video-track';
import AudioTrack from './track/audio-track';
import TextTrack from './track/text-track';
import {CuePoint, createTextTrackCue} from './track/cue-point';
import TextStyle from './track/text-style';
import {Cue} from './track/vtt-cue';
import Env from './utils/env';
Expand Down Expand Up @@ -62,6 +63,9 @@ export {BaseMiddleware};
// Export the tracks classes
export {Track, VideoTrack, AudioTrack, TextTrack, ImageTrack, TextStyle, Cue};

// Export the cue point class and function
export {CuePoint, createTextTrackCue};

// Export utils library
export {Utils};

Expand Down
53 changes: 53 additions & 0 deletions src/track/cue-point.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
//@flow
class CuePoint {
static TYPE: {[type: string]: string};

startTime: number;
endTime: number;
id: string;
type: string;
metadata: string | Object;
/**
* @constructor
* @param {number} startTime - start time.
* @param {number} endTime - end time.
* @param {string} id - id.
* @param {string} type - type.
* @param {string|Object} metadata - metadata.
*/
constructor(startTime: number, endTime: number, id: string, type: string, metadata: string | Object) {
this.startTime = startTime;
this.endTime = endTime;
this.id = id;
this.type = type;
this.metadata = metadata;
}
}

CuePoint.TYPE = {
EMSG: 'emsg',
CUSTOM: 'custom'
};

/**
* Create a standard TextTrackCue.
* @param {CuePoint} cuePoint - cue point.
* @returns {TextTrackCue} - the created text track cue
* @private
*/
function createTextTrackCue(cuePoint: CuePoint): TextTrackCue {
const {startTime, endTime, id, type, metadata} = cuePoint;
let cue = {};
if (window.VTTCue) {
cue = new window.VTTCue(startTime, endTime, '');
} else if (window.TextTrackCue) {
// IE11 support
cue = new window.TextTrackCue(startTime, endTime, '');
}
const cueValue = {key: type, data: metadata};
cue.id = id;
cue.value = cueValue;
return cue;
}

export {CuePoint, createTextTrackCue};
2 changes: 1 addition & 1 deletion src/track/external-captions-handler.js
Original file line number Diff line number Diff line change
Expand Up @@ -548,7 +548,7 @@ class ExternalCaptionsHandler extends FakeEventTarget {
* @returns {Array<TextTrackCue>} the converted cues
*/
_convertCues(cues: Array<Cue>): Array<TextTrackCue> {
return cues.map(cue => new TextTrackCue(cue.startTime, cue.endTime, cue.text));
return cues.map(cue => new window.TextTrackCue(cue.startTime, cue.endTime, cue.text));
}

/**
Expand Down

0 comments on commit f841b7e

Please sign in to comment.