Skip to content

Commit

Permalink
feat(FEC-8766): add closed captions from multi request to external #74
Browse files Browse the repository at this point in the history
feat(FEC-8766): add closed captions from multi request to external
  • Loading branch information
odedhutzler authored Dec 24, 2018
1 parent 37aa74a commit c10a5c9
Show file tree
Hide file tree
Showing 13 changed files with 129 additions and 5 deletions.
2 changes: 2 additions & 0 deletions flow-typed/types/caption-type.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// @flow
declare type CaptionType = { [type: string]: string };
3 changes: 2 additions & 1 deletion flow-typed/types/env-config.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// @flow
declare type ProviderEnvConfigObject = {
serviceUrl: string,
cdnUrl?: string
cdnUrl?: string,
experimentalLoadApiCaptions?: boolean
};
8 changes: 8 additions & 0 deletions flow-typed/types/external-caption-object.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// @flow
declare type PKExternalCaptionObject = {
url: string,
label: string,
language: string,
default: ?boolean,
type: ?string
};
3 changes: 2 additions & 1 deletion flow-typed/types/media-config-sources.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ declare type ProviderMediaConfigSourcesObject = {
poster: string | Array<Object>,
dvr: boolean,
vr: ?Object,
metadata: ProviderMediaConfigMetadataObject
metadata: ProviderMediaConfigMetadataObject,
captions?: Array<PKExternalCaptionObject>
};
3 changes: 2 additions & 1 deletion flow-typed/types/media-sources.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@
declare type ProviderMediaSourcesObject = {
progressive: Array<ProviderMediaSourceObject>,
dash: Array<ProviderMediaSourceObject>,
hls: Array<ProviderMediaSourceObject>
hls: Array<ProviderMediaSourceObject>,
captions?: Array<PKExternalCaptionObject>
};
1 change: 1 addition & 0 deletions src/entities/media-sources.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export default class MediaSources {
* @public
*/
hls: Array<MediaSource>;
captions: Array<PKExternalCaptionObject>;

/**
* @constructor
Expand Down
3 changes: 2 additions & 1 deletion src/k-provider/ovp/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ const defaultConfig: Object = {
serviceParams: {
apiVersion: '3.3.0',
format: 1
}
},
experimentalLoadApiCaptions: false
};

export default class OVPConfiguration {
Expand Down
43 changes: 43 additions & 0 deletions src/k-provider/ovp/external-captions-builder.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// @flow
import OVPConfiguration from './config';

const KalturaCaptionType: CaptionType = {
SRT: '1',
DFXP: '2',
WEBVTT: '3',
CAP: '4'
};

const CaptionsFormats: {[format: string]: string} = {
WEBVTT: 'vtt'
};

const BASE_URL: string = 'index.php/service/caption_captionasset/action/serveWebVTT/captionAssetId/ASSET_ID/segmentIndex/-1/version/2/captions.vtt';

const ASSET_ID_INDEX: number = 6;
const VERSION_INDEX: number = 10;

class ExternalCaptionsBuilder {
static createConfig(metadata: Object, ks: string): Array<PKExternalCaptionObject> {
return metadata.filter(meta => [KalturaCaptionType.WEBVTT, KalturaCaptionType.SRT].includes(meta.format)).map(meta => {
return {
type: CaptionsFormats.WEBVTT,
language: meta.language,
label: meta.label,
url: ExternalCaptionsBuilder.createUrl(meta, ks)
};
});
}

static createUrl(metadata: Object, ks: string): string {
const config = OVPConfiguration.get();
let path = BASE_URL.split('/');
path[ASSET_ID_INDEX] = metadata.id;
path[VERSION_INDEX] = metadata.version;
path = path.join('/');
ks = ks ? `/ks/${ks}` : ``;
return `${config.serviceUrl}/${path}${ks}`;
}
}

export {ExternalCaptionsBuilder};
13 changes: 12 additions & 1 deletion src/k-provider/ovp/loaders/media-entry-loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,14 @@ import KalturaPlaybackContext from '../response-types/kaltura-playback-context';
import KalturaMetadataListResponse from '../response-types/kaltura-metadata-list-response';
import KalturaBaseEntryListResponse from '../response-types/kaltura-base-entry-list-response';
import KalturaMediaEntry from '../response-types/kaltura-media-entry';
import OVPCaptionService from '../services/captions-service';
import KalturaCaptionAssetListResponse from '../response-types/kaltura-caption-list';

type OVPMediaEntryLoaderResponse = {
entry: KalturaMediaEntry,
playBackContextResult: KalturaPlaybackContext,
metadataListResult: KalturaMetadataListResponse
metadataListResult: KalturaMetadataListResponse,
captionResult?: KalturaCaptionAssetListResponse
};
export type {OVPMediaEntryLoaderResponse};

Expand All @@ -27,6 +30,7 @@ export default class OVPMediaEntryLoader implements ILoader {
/**
* @constructor
* @param {Object} params loader params
* @boolean {boolean} useExternalCaptions - if we should add captions request to the multirequests.
*/
constructor(params: Object) {
this.requests = this.buildRequests(params);
Expand All @@ -42,10 +46,14 @@ export default class OVPMediaEntryLoader implements ILoader {
}

set response(response: any) {
const config = OVPConfiguration.get();
let mediaEntryResponse: KalturaBaseEntryListResponse = new KalturaBaseEntryListResponse(response[0].data);
this._response.entry = mediaEntryResponse.entries[0];
this._response.playBackContextResult = new KalturaPlaybackContext(response[1].data);
this._response.metadataListResult = new KalturaMetadataListResponse(response[2].data);
if (config.experimentalLoadApiCaptions) {
this._response.captionResult = new KalturaCaptionAssetListResponse(response[3].data);
}
}

get response(): OVPMediaEntryLoaderResponse {
Expand All @@ -65,6 +73,9 @@ export default class OVPMediaEntryLoader implements ILoader {
requests.push(OVPBaseEntryService.list(config.serviceUrl, params.ks, params.entryId, params.redirectFromEntryId));
requests.push(OVPBaseEntryService.getPlaybackContext(config.serviceUrl, params.ks, params.entryId));
requests.push(OVPMetadataService.list(config.serviceUrl, params.ks, params.entryId));
if (config.experimentalLoadApiCaptions) {
requests.push(OVPCaptionService.list(config.serviceUrl, params.ks, params.entryId));
}
return requests;
}

Expand Down
4 changes: 4 additions & 0 deletions src/k-provider/ovp/provider-parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import EntryList from '../../entities/entry-list';
import KalturaRuleAction from './response-types/kaltura-rule-action';
import KalturaAccessControlMessage from '../common/response-types/kaltura-access-control-message';
import type {OVPMediaEntryLoaderResponse} from './loaders/media-entry-loader';
import {ExternalCaptionsBuilder} from './external-captions-builder';

export default class OVPProviderParser {
static _logger = getLogger('OVPProviderParser');
Expand All @@ -41,6 +42,9 @@ export default class OVPProviderParser {
const kalturaSources = playbackContext.sources;

mediaEntry.sources = OVPProviderParser._getParsedSources(kalturaSources, ks, partnerId, uiConfId, entry, playbackContext);
if (mediaEntryResponse.captionResult) {
mediaEntry.sources.captions = ExternalCaptionsBuilder.createConfig(mediaEntryResponse.captionResult.data, ks);
}
OVPProviderParser._fillBaseData(mediaEntry, entry, metadataList);
return mediaEntry;
}
Expand Down
3 changes: 3 additions & 0 deletions src/k-provider/ovp/provider.js
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,9 @@ export default class OVPProvider extends BaseProvider<OVPProviderMediaInfoObject
sourcesObject.type = mediaEntry.type;
sourcesObject.dvr = !!mediaEntry.dvrStatus;
sourcesObject.poster = mediaEntry.poster;
if (mediaEntry.sources.captions) {
sourcesObject.captions = mediaEntry.sources.captions;
}
if (mediaEntry.metadata && typeof mediaEntry.metadata.tags === 'string' && mediaEntry.metadata.tags.indexOf('360') > -1) {
sourcesObject.vr = {};
}
Expand Down
20 changes: 20 additions & 0 deletions src/k-provider/ovp/response-types/kaltura-caption-list.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//@flow
import ServiceResult from '../../common/base-service-result';

export default class KalturaCaptionAssetListResponse extends ServiceResult {
totalCount: number;
captions: Array<PKExternalCaptionObject>;

/**
* @constructor
* @param {Object} metaDataResponse The response
* @param {Object} urlObject response of the url
*/
constructor(metaDataResponse: Object) {
super(metaDataResponse);
if (!this.hasError) {
this.totalCount = metaDataResponse.totalCount;
this.data = metaDataResponse.objects;
}
}
}
28 changes: 28 additions & 0 deletions src/k-provider/ovp/services/captions-service.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//@flow
import OVPService from './ovp-service';
import RequestBuilder from '../../../util/request-builder';

const SERVICE_NAME: string = 'caption_captionasset';

export default class OVPCaptionService extends OVPService {
/**
* Creates an instance of RequestBuilder for caption_captionasset.list
* @function post
* @param {string} serviceUrl The service base URL
* @param {string} ks The ks
* @param {string} entryId The uiConf ID
* @returns {RequestBuilder} The request builder
* @static
*/
static list(serviceUrl: string, ks: string, entryId: string): RequestBuilder {
const headers: Map<string, string> = new Map();
headers.set('Content-Type', 'application/json');
const request = new RequestBuilder(headers);
request.service = SERVICE_NAME;
request.action = 'list';
request.method = 'POST';
request.url = request.getUrl(serviceUrl);
request.params = {ks: ks, 'filter:entryIdEqual': entryId};
return request;
}
}

0 comments on commit c10a5c9

Please sign in to comment.