@playkit-js/playkit-js-providers 2.39.1 → 2.39.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/dist/playkit-analytics-service.js +2 -0
- package/dist/playkit-analytics-service.js.map +1 -0
- package/dist/playkit-bookmark-service.js +2 -0
- package/dist/playkit-bookmark-service.js.map +1 -0
- package/dist/playkit-ott-provider.js +2 -0
- package/dist/playkit-ott-provider.js.map +1 -0
- package/dist/playkit-ovp-provider.js +2 -0
- package/dist/playkit-ovp-provider.js.map +1 -0
- package/dist/playkit-stats-service.js +2 -0
- package/dist/playkit-stats-service.js.map +1 -0
- package/package.json +1 -1
- package/.babelrc +0 -22
- package/.editorconfig +0 -10
- package/.eslintignore +0 -3
- package/.eslintrc.json +0 -26
- package/.flowconfig +0 -5
- package/.github/ISSUE_TEMPLATE.md +0 -28
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -12
- package/.github/workflows/run_canary_full_flow.yaml +0 -28
- package/.github/workflows/run_prod.yaml +0 -24
- package/.github/workflows/run_tests.yaml +0 -24
- package/.prettierignore +0 -7
- package/.prettierrc +0 -12
- package/docs/configuration.md +0 -225
- package/karma.conf.js +0 -42
- package/src/entities/bumper.js +0 -23
- package/src/entities/drm.js +0 -46
- package/src/entities/entry-list.js +0 -15
- package/src/entities/image-source.js +0 -37
- package/src/entities/media-entry.js +0 -96
- package/src/entities/media-format.js +0 -46
- package/src/entities/media-source.js +0 -70
- package/src/entities/media-sources.js +0 -79
- package/src/entities/playlist.js +0 -37
- package/src/index.html +0 -11
- package/src/k-provider/common/base-provider-parser.js +0 -0
- package/src/k-provider/common/base-provider.js +0 -110
- package/src/k-provider/common/base-service-result.js +0 -57
- package/src/k-provider/common/data-loader-manager.js +0 -115
- package/src/k-provider/common/multi-request-builder.js +0 -112
- package/src/k-provider/common/response-types/kaltura-access-control-message.js +0 -22
- package/src/k-provider/common/response-types/kaltura-drm-playback-plugin-data.js +0 -39
- package/src/k-provider/ott/config.js +0 -22
- package/src/k-provider/ott/index.js +0 -15
- package/src/k-provider/ott/loaders/asset-list-loader.js +0 -68
- package/src/k-provider/ott/loaders/asset-loader.js +0 -69
- package/src/k-provider/ott/loaders/data-loader-manager.js +0 -15
- package/src/k-provider/ott/loaders/session-loader.js +0 -62
- package/src/k-provider/ott/provider-parser.js +0 -282
- package/src/k-provider/ott/provider.js +0 -242
- package/src/k-provider/ott/response-types/kaltura-asset.js +0 -79
- package/src/k-provider/ott/response-types/kaltura-bumper-playback-plugin-data.js +0 -28
- package/src/k-provider/ott/response-types/kaltura-playback-context.js +0 -74
- package/src/k-provider/ott/response-types/kaltura-playback-source.js +0 -63
- package/src/k-provider/ott/response-types/kaltura-rule-action.js +0 -26
- package/src/k-provider/ott/services/asset-service.js +0 -50
- package/src/k-provider/ott/services/bookmark/bookmark-service.js +0 -49
- package/src/k-provider/ott/services/bookmark/index.js +0 -12
- package/src/k-provider/ott/services/ott-service.js +0 -34
- package/src/k-provider/ott/services/user-service.js +0 -32
- package/src/k-provider/ovp/config.js +0 -28
- package/src/k-provider/ovp/external-captions-builder.js +0 -38
- package/src/k-provider/ovp/index.js +0 -13
- package/src/k-provider/ovp/loaders/data-loader-manager.js +0 -17
- package/src/k-provider/ovp/loaders/entry-list-loader.js +0 -69
- package/src/k-provider/ovp/loaders/media-entry-loader.js +0 -84
- package/src/k-provider/ovp/loaders/playlist-loader.js +0 -66
- package/src/k-provider/ovp/loaders/session-loader.js +0 -62
- package/src/k-provider/ovp/loaders/ui-config-loader.js +0 -71
- package/src/k-provider/ovp/play-source-url-builder.js +0 -60
- package/src/k-provider/ovp/provider-parser.js +0 -451
- package/src/k-provider/ovp/provider.js +0 -344
- package/src/k-provider/ovp/regex-action-handler.js +0 -147
- package/src/k-provider/ovp/request-params/base-entry-response-profile.js +0 -29
- package/src/k-provider/ovp/response-types/index.js +0 -18
- package/src/k-provider/ovp/response-types/kaltura-access-control-modify-request-host-regex-action.js +0 -36
- package/src/k-provider/ovp/response-types/kaltura-base-entry-list-response.js +0 -31
- package/src/k-provider/ovp/response-types/kaltura-bumper.js +0 -26
- package/src/k-provider/ovp/response-types/kaltura-flavor-asset.js +0 -109
- package/src/k-provider/ovp/response-types/kaltura-media-entries.js +0 -23
- package/src/k-provider/ovp/response-types/kaltura-media-entry.js +0 -141
- package/src/k-provider/ovp/response-types/kaltura-metadata-list-response.js +0 -23
- package/src/k-provider/ovp/response-types/kaltura-metadata.js +0 -51
- package/src/k-provider/ovp/response-types/kaltura-playback-context.js +0 -96
- package/src/k-provider/ovp/response-types/kaltura-playback-source.js +0 -90
- package/src/k-provider/ovp/response-types/kaltura-playlist.js +0 -35
- package/src/k-provider/ovp/response-types/kaltura-rule-action.js +0 -28
- package/src/k-provider/ovp/response-types/kaltura-ui-conf-response.js +0 -90
- package/src/k-provider/ovp/services/analytics/analytics-service.js +0 -57
- package/src/k-provider/ovp/services/analytics/index.js +0 -12
- package/src/k-provider/ovp/services/base-entry-service.js +0 -76
- package/src/k-provider/ovp/services/meta-data-service.js +0 -30
- package/src/k-provider/ovp/services/ovp-service.js +0 -33
- package/src/k-provider/ovp/services/playlist-service.js +0 -63
- package/src/k-provider/ovp/services/session-service.js +0 -28
- package/src/k-provider/ovp/services/stats/index.js +0 -12
- package/src/k-provider/ovp/services/stats/stats-service.js +0 -33
- package/src/k-provider/ovp/services/ui-conf-service.js +0 -33
- package/src/util/clone.js +0 -23
- package/src/util/error/category.js +0 -12
- package/src/util/error/code.js +0 -79
- package/src/util/error/error.js +0 -48
- package/src/util/error/severity.js +0 -23
- package/src/util/logger.js +0 -108
- package/src/util/param.js +0 -45
- package/src/util/request-builder.js +0 -187
- package/src/util/xml-parser.js +0 -40
- package/test/.eslintrc.json +0 -9
- package/test/setup/karma.js +0 -5
- package/test/setup/load-specs.js +0 -13
- package/test/setup/prepare-test-environment.js +0 -17
- package/test/src/k-provider/ott/be-data.js +0 -3306
- package/test/src/k-provider/ott/media-config-data.js +0 -793
- package/test/src/k-provider/ott/provider-parser.spec.js +0 -30
- package/test/src/k-provider/ott/provider.spec.js +0 -384
- package/test/src/k-provider/ott/services/bookmark-service.spec.js +0 -38
- package/test/src/k-provider/ovp/be-data.js +0 -3932
- package/test/src/k-provider/ovp/external-captions-builder.spec.js +0 -59
- package/test/src/k-provider/ovp/media-config-data.js +0 -1509
- package/test/src/k-provider/ovp/playback-sources-data.js +0 -229
- package/test/src/k-provider/ovp/provider-parser-data.js +0 -142
- package/test/src/k-provider/ovp/provider-parser.spec.js +0 -96
- package/test/src/k-provider/ovp/provider.spec.js +0 -1075
- package/test/src/k-provider/ovp/regex-action-handler-data.js +0 -794
- package/test/src/k-provider/ovp/regex-action-handler.spec.js +0 -93
- package/test/src/k-provider/ovp/services/analytics-service.spec.js +0 -62
- package/test/src/k-provider/ovp/services/stats-service.spec.js +0 -37
- package/test/src/util/param.spec.js +0 -23
- package/webpack.config.js +0 -85
|
@@ -1,344 +0,0 @@
|
|
|
1
|
-
//@flow
|
|
2
|
-
import getLogger from '../../util/logger';
|
|
3
|
-
import OVPConfiguration from './config';
|
|
4
|
-
import OVPProviderParser from './provider-parser';
|
|
5
|
-
import {KalturaMediaEntry} from './response-types/kaltura-media-entry';
|
|
6
|
-
import OVPMediaEntryLoader from './loaders/media-entry-loader';
|
|
7
|
-
import OVPSessionLoader from './loaders/session-loader';
|
|
8
|
-
import OVPDataLoaderManager from './loaders/data-loader-manager';
|
|
9
|
-
import OVPPlaylistLoader from './loaders/playlist-loader';
|
|
10
|
-
import BaseProvider from '../common/base-provider';
|
|
11
|
-
import MediaEntry from '../../entities/media-entry';
|
|
12
|
-
import OVPEntryListLoader from './loaders/entry-list-loader';
|
|
13
|
-
import Error from '../../util/error/error';
|
|
14
|
-
import RegexActionHandler from './regex-action-handler';
|
|
15
|
-
|
|
16
|
-
export default class OVPProvider extends BaseProvider<OVPProviderMediaInfoObject> {
|
|
17
|
-
_filterOptionsConfig: ProviderFilterOptionsObject = {redirectFromEntryId: true};
|
|
18
|
-
/**
|
|
19
|
-
* @constructor
|
|
20
|
-
* @param {ProviderOptionsObject} options - provider options
|
|
21
|
-
* @param {string} playerVersion - player version
|
|
22
|
-
*/
|
|
23
|
-
constructor(options: ProviderOptionsObject, playerVersion: string) {
|
|
24
|
-
super(options, playerVersion);
|
|
25
|
-
this._logger = getLogger('OVPProvider');
|
|
26
|
-
OVPConfiguration.set(options.env);
|
|
27
|
-
this._setFilterOptionsConfig(options.filterOptions);
|
|
28
|
-
this._networkRetryConfig = Object.assign(this._networkRetryConfig, options.networkRetryParameters);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
get env() {
|
|
32
|
-
return OVPConfiguration.get();
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Gets the backend media config.
|
|
37
|
-
* @param {OVPProviderMediaInfoObject} mediaInfo - ovp media info
|
|
38
|
-
* @returns {Promise<ProviderMediaConfigObject>} - The provider media config
|
|
39
|
-
*/
|
|
40
|
-
getMediaConfig(mediaInfo: OVPProviderMediaInfoObject): Promise<ProviderMediaConfigObject> {
|
|
41
|
-
if (mediaInfo.ks) {
|
|
42
|
-
this.ks = mediaInfo.ks;
|
|
43
|
-
this._isAnonymous = false;
|
|
44
|
-
}
|
|
45
|
-
if (this.widgetId !== this.defaultWidgetId) {
|
|
46
|
-
this._isAnonymous = false;
|
|
47
|
-
}
|
|
48
|
-
this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);
|
|
49
|
-
return new Promise((resolve, reject) => {
|
|
50
|
-
const entryId = mediaInfo.entryId;
|
|
51
|
-
const referenceId = mediaInfo.referenceId;
|
|
52
|
-
if (entryId || referenceId) {
|
|
53
|
-
let ks: string = this.ks;
|
|
54
|
-
if (!ks) {
|
|
55
|
-
ks = '{1:result:ks}';
|
|
56
|
-
this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});
|
|
57
|
-
}
|
|
58
|
-
const redirectFromEntryId = this._getEntryRedirectFilter(mediaInfo);
|
|
59
|
-
this._dataLoader.add(OVPMediaEntryLoader, {entryId, ks, redirectFromEntryId, referenceId});
|
|
60
|
-
return this._dataLoader.fetchData().then(
|
|
61
|
-
response => {
|
|
62
|
-
try {
|
|
63
|
-
const mediaConfig = this._parseDataFromResponse(response);
|
|
64
|
-
RegexActionHandler.handleRegexAction(mediaConfig, response).then(resolve);
|
|
65
|
-
} catch (err) {
|
|
66
|
-
reject(err);
|
|
67
|
-
}
|
|
68
|
-
},
|
|
69
|
-
err => {
|
|
70
|
-
reject(err);
|
|
71
|
-
}
|
|
72
|
-
);
|
|
73
|
-
} else {
|
|
74
|
-
reject(new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.MISSING_MANDATORY_PARAMS, {message: 'missing entry id'}));
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
doRequest(loaders: Array<RequestLoader>, ks?: string): Promise<any> {
|
|
80
|
-
let theKs: string = ks || this.ks;
|
|
81
|
-
const dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, theKs, this._networkRetryConfig);
|
|
82
|
-
|
|
83
|
-
return new Promise((resolve, reject) => {
|
|
84
|
-
if (!theKs) {
|
|
85
|
-
dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});
|
|
86
|
-
}
|
|
87
|
-
loaders.forEach((loaderRequest: RequestLoader) => {
|
|
88
|
-
dataLoader.add(loaderRequest.loader, loaderRequest.params, theKs || '{1:result:ks}');
|
|
89
|
-
});
|
|
90
|
-
return dataLoader.fetchData().then(
|
|
91
|
-
response => {
|
|
92
|
-
try {
|
|
93
|
-
resolve(response);
|
|
94
|
-
} catch (err) {
|
|
95
|
-
reject(err);
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
err => {
|
|
99
|
-
reject(err);
|
|
100
|
-
}
|
|
101
|
-
);
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
_getEntryRedirectFilter(mediaInfo: Object): boolean {
|
|
106
|
-
return typeof mediaInfo.redirectFromEntryId === 'boolean'
|
|
107
|
-
? mediaInfo.redirectFromEntryId
|
|
108
|
-
: typeof this._filterOptionsConfig.redirectFromEntryId === 'boolean'
|
|
109
|
-
? this._filterOptionsConfig.redirectFromEntryId
|
|
110
|
-
: true;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
_setFilterOptionsConfig(options?: ProviderFilterOptionsObject): void {
|
|
114
|
-
if (options && typeof options.redirectFromEntryId == 'boolean') {
|
|
115
|
-
this._filterOptionsConfig.redirectFromEntryId = options.redirectFromEntryId;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
_parseDataFromResponse(data: Map<string, Function>): ProviderMediaConfigObject {
|
|
120
|
-
this._logger.debug('Data parsing started');
|
|
121
|
-
const mediaConfig: ProviderMediaConfigObject = {
|
|
122
|
-
session: {
|
|
123
|
-
isAnonymous: this._isAnonymous,
|
|
124
|
-
partnerId: this.partnerId
|
|
125
|
-
},
|
|
126
|
-
sources: this._getDefaultSourcesObject(),
|
|
127
|
-
plugins: {}
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
if (this.uiConfId) {
|
|
131
|
-
mediaConfig.session.uiConfId = this.uiConfId;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if (data) {
|
|
135
|
-
if (data.has(OVPSessionLoader.id)) {
|
|
136
|
-
const sessionLoader = data.get(OVPSessionLoader.id);
|
|
137
|
-
if (sessionLoader && sessionLoader.response) {
|
|
138
|
-
mediaConfig.session.ks = sessionLoader.response;
|
|
139
|
-
if (this.widgetId !== this.defaultWidgetId) {
|
|
140
|
-
this.ks = mediaConfig.session.ks;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
} else {
|
|
144
|
-
mediaConfig.session.ks = this.ks;
|
|
145
|
-
}
|
|
146
|
-
if (data.has(OVPMediaEntryLoader.id)) {
|
|
147
|
-
const mediaLoader = data.get(OVPMediaEntryLoader.id);
|
|
148
|
-
if (mediaLoader && mediaLoader.response) {
|
|
149
|
-
const response = (mediaLoader: OVPMediaEntryLoader).response;
|
|
150
|
-
if (OVPProviderParser.hasBlockAction(response)) {
|
|
151
|
-
throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.BLOCK_ACTION, {
|
|
152
|
-
action: OVPProviderParser.getBlockAction(response),
|
|
153
|
-
messages: OVPProviderParser.getErrorMessages(response)
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
const mediaEntry = OVPProviderParser.getMediaEntry(this.isAnonymous ? '' : this.ks, this.partnerId, this.uiConfId, response);
|
|
157
|
-
Object.assign(mediaConfig.sources, this._getSourcesObject(mediaEntry));
|
|
158
|
-
this._verifyMediaStatus(mediaEntry);
|
|
159
|
-
this._verifyHasSources(mediaConfig.sources);
|
|
160
|
-
const bumper = OVPProviderParser.getBumper(response, this.isAnonymous ? '' : this.ks, this.partnerId);
|
|
161
|
-
if (bumper) {
|
|
162
|
-
Object.assign(mediaConfig.plugins, {bumper});
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
this._logger.debug('Data parsing finished', mediaConfig);
|
|
168
|
-
return mediaConfig;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Checks if media is ready for playback (not being imported or converted)
|
|
173
|
-
* @param {MediaEntry} mediaEntry - the media entry info
|
|
174
|
-
* @returns {void}
|
|
175
|
-
*/
|
|
176
|
-
_verifyMediaStatus(mediaEntry: MediaEntry) {
|
|
177
|
-
if ([KalturaMediaEntry.EntryStatus.IMPORT, KalturaMediaEntry.EntryStatus.PRECONVERT].includes(mediaEntry.status)) {
|
|
178
|
-
throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.MEDIA_STATUS_NOT_READY, {
|
|
179
|
-
messages: `Status of entry id ${mediaEntry.id} is ${mediaEntry.status} and is still being imported or converted`,
|
|
180
|
-
data: {status}
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Gets the backend playlist config.
|
|
186
|
-
* @param {ProviderPlaylistInfoObject} playlistInfo - ovp playlist info
|
|
187
|
-
* @returns {Promise<ProviderPlaylistObject>} - The provider playlist config
|
|
188
|
-
*/
|
|
189
|
-
getPlaylistConfig(playlistInfo: ProviderPlaylistInfoObject): Promise<ProviderPlaylistObject> {
|
|
190
|
-
if (playlistInfo.ks) {
|
|
191
|
-
this.ks = playlistInfo.ks;
|
|
192
|
-
this._isAnonymous = false;
|
|
193
|
-
}
|
|
194
|
-
if (this.widgetId !== this.defaultWidgetId) {
|
|
195
|
-
this._isAnonymous = false;
|
|
196
|
-
}
|
|
197
|
-
this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);
|
|
198
|
-
return new Promise((resolve, reject) => {
|
|
199
|
-
const playlistId = playlistInfo.playlistId;
|
|
200
|
-
if (playlistId) {
|
|
201
|
-
let ks: string = this.ks;
|
|
202
|
-
if (!ks) {
|
|
203
|
-
ks = '{1:result:ks}';
|
|
204
|
-
this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});
|
|
205
|
-
}
|
|
206
|
-
this._dataLoader.add(OVPPlaylistLoader, {playlistId, ks});
|
|
207
|
-
this._dataLoader.fetchData().then(
|
|
208
|
-
response => {
|
|
209
|
-
resolve(this._parsePlaylistDataFromResponse(response));
|
|
210
|
-
},
|
|
211
|
-
err => {
|
|
212
|
-
reject(err);
|
|
213
|
-
}
|
|
214
|
-
);
|
|
215
|
-
} else {
|
|
216
|
-
reject({success: false, data: 'Missing mandatory parameter'});
|
|
217
|
-
}
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
_parsePlaylistDataFromResponse(data: Map<string, Function>): ProviderPlaylistObject {
|
|
222
|
-
this._logger.debug('Data parsing started');
|
|
223
|
-
const playlistConfig: ProviderPlaylistObject = this._getPlaylistObject();
|
|
224
|
-
if (data && data.has(OVPPlaylistLoader.id)) {
|
|
225
|
-
const playlistLoader = data.get(OVPPlaylistLoader.id);
|
|
226
|
-
if (playlistLoader && playlistLoader.response) {
|
|
227
|
-
const playlist = OVPProviderParser.getPlaylist(playlistLoader.response);
|
|
228
|
-
playlistConfig.id = playlist.id;
|
|
229
|
-
playlistConfig.poster = playlist.poster;
|
|
230
|
-
playlistConfig.metadata.name = playlist.name;
|
|
231
|
-
playlistConfig.metadata.description = playlist.description;
|
|
232
|
-
playlist.items.forEach(i => playlistConfig.items.push({sources: this._getSourcesObject(i)}));
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
this._logger.debug('Data parsing finished', playlistConfig);
|
|
236
|
-
return playlistConfig;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
* Gets playlist config from entry list.
|
|
241
|
-
* @param {ProviderEntryListObject} entryListInfo - ovp entry list info
|
|
242
|
-
* @returns {Promise<ProviderPlaylistObject>} - The provider playlist config
|
|
243
|
-
*/
|
|
244
|
-
getEntryListConfig(entryListInfo: ProviderEntryListObject): Promise<ProviderPlaylistObject> {
|
|
245
|
-
if (entryListInfo.ks) {
|
|
246
|
-
this.ks = entryListInfo.ks;
|
|
247
|
-
this._isAnonymous = false;
|
|
248
|
-
}
|
|
249
|
-
if (this.widgetId !== this.defaultWidgetId) {
|
|
250
|
-
this._isAnonymous = false;
|
|
251
|
-
}
|
|
252
|
-
this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);
|
|
253
|
-
return new Promise((resolve, reject) => {
|
|
254
|
-
const entries = entryListInfo.entries;
|
|
255
|
-
if (entries && entries.length) {
|
|
256
|
-
let ks: string = this.ks;
|
|
257
|
-
if (!ks) {
|
|
258
|
-
ks = '{1:result:ks}';
|
|
259
|
-
this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});
|
|
260
|
-
}
|
|
261
|
-
const redirectFromEntryId = this._getEntryRedirectFilter(entryListInfo);
|
|
262
|
-
this._dataLoader.add(OVPEntryListLoader, {entries, ks, redirectFromEntryId});
|
|
263
|
-
this._dataLoader.fetchData(false).then(
|
|
264
|
-
response => {
|
|
265
|
-
resolve(this._parseEntryListDataFromResponse(response));
|
|
266
|
-
},
|
|
267
|
-
err => {
|
|
268
|
-
reject(err);
|
|
269
|
-
}
|
|
270
|
-
);
|
|
271
|
-
} else {
|
|
272
|
-
reject({success: false, data: 'Missing mandatory parameter'});
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
_parseEntryListDataFromResponse(data: Map<string, Function>): ProviderPlaylistObject {
|
|
278
|
-
this._logger.debug('Data parsing started');
|
|
279
|
-
const playlistConfig: ProviderPlaylistObject = this._getPlaylistObject();
|
|
280
|
-
if (data && data.has(OVPEntryListLoader.id)) {
|
|
281
|
-
const playlistLoader = data.get(OVPEntryListLoader.id);
|
|
282
|
-
if (playlistLoader && playlistLoader.response) {
|
|
283
|
-
const entryList = OVPProviderParser.getEntryList(playlistLoader.response);
|
|
284
|
-
entryList.items.forEach(i => playlistConfig.items.push({sources: this._getSourcesObject(i)}));
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
this._logger.debug('Data parsing finished', playlistConfig);
|
|
288
|
-
return playlistConfig;
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
_getPlaylistObject(): ProviderPlaylistObject {
|
|
292
|
-
return {
|
|
293
|
-
id: '',
|
|
294
|
-
metadata: {
|
|
295
|
-
name: '',
|
|
296
|
-
description: ''
|
|
297
|
-
},
|
|
298
|
-
poster: '',
|
|
299
|
-
items: []
|
|
300
|
-
};
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
_getDefaultSourcesObject(): ProviderMediaConfigSourcesObject {
|
|
304
|
-
return {
|
|
305
|
-
hls: [],
|
|
306
|
-
dash: [],
|
|
307
|
-
progressive: [],
|
|
308
|
-
image: [],
|
|
309
|
-
id: '',
|
|
310
|
-
duration: 0,
|
|
311
|
-
type: MediaEntry.Type.UNKNOWN,
|
|
312
|
-
poster: '',
|
|
313
|
-
dvr: false,
|
|
314
|
-
vr: null,
|
|
315
|
-
metadata: {
|
|
316
|
-
name: '',
|
|
317
|
-
description: '',
|
|
318
|
-
tags: ''
|
|
319
|
-
}
|
|
320
|
-
};
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
_getSourcesObject(mediaEntry: MediaEntry) {
|
|
324
|
-
const sourcesObject: ProviderMediaConfigSourcesObject = this._getDefaultSourcesObject();
|
|
325
|
-
const mediaSources = mediaEntry.sources.toJSON();
|
|
326
|
-
sourcesObject.hls = mediaSources.hls;
|
|
327
|
-
sourcesObject.dash = mediaSources.dash;
|
|
328
|
-
sourcesObject.progressive = mediaSources.progressive;
|
|
329
|
-
sourcesObject.image = mediaSources.image;
|
|
330
|
-
sourcesObject.id = mediaEntry.id;
|
|
331
|
-
sourcesObject.duration = mediaEntry.duration;
|
|
332
|
-
sourcesObject.type = mediaEntry.type;
|
|
333
|
-
sourcesObject.dvr = !!mediaEntry.dvrStatus;
|
|
334
|
-
sourcesObject.poster = mediaEntry.poster;
|
|
335
|
-
if (mediaEntry.sources.captions) {
|
|
336
|
-
sourcesObject.captions = mediaEntry.sources.captions;
|
|
337
|
-
}
|
|
338
|
-
if (mediaEntry.metadata && typeof mediaEntry.metadata.tags === 'string' && mediaEntry.metadata.tags.search(/\b360\b/) > -1) {
|
|
339
|
-
sourcesObject.vr = {};
|
|
340
|
-
}
|
|
341
|
-
Object.assign(sourcesObject.metadata, mediaEntry.metadata);
|
|
342
|
-
return sourcesObject;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
//@flow
|
|
2
|
-
import getLogger from '../../util/logger';
|
|
3
|
-
import OVPConfiguration from './config';
|
|
4
|
-
import {KalturaAccessControlModifyRequestHostRegexAction} from './response-types';
|
|
5
|
-
import OVPMediaEntryLoader from './loaders/media-entry-loader';
|
|
6
|
-
|
|
7
|
-
class RegexActionHandler {
|
|
8
|
-
static _logger = getLogger('RegexActionHandler');
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Applies the request host regex on the url
|
|
12
|
-
* @function _applyRegexAction
|
|
13
|
-
* @param {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action
|
|
14
|
-
* @param {string} url - The url to modify
|
|
15
|
-
* @returns {string} - The request host regex applied url
|
|
16
|
-
* @static
|
|
17
|
-
* @private
|
|
18
|
-
*/
|
|
19
|
-
static _applyRegexAction(regexAction: KalturaAccessControlModifyRequestHostRegexAction, url: string): string {
|
|
20
|
-
if (regexAction) {
|
|
21
|
-
const regex = new RegExp(regexAction.pattern, 'i');
|
|
22
|
-
if (url.match(regex)) {
|
|
23
|
-
return url.replace(regex, regexAction.replacement + '/');
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return url;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Ping the ECDN url to check if alive
|
|
31
|
-
* @function _pingECDNUrl
|
|
32
|
-
* @param {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action
|
|
33
|
-
* @param {string} cdnUrl - The CDN url
|
|
34
|
-
* @returns {Promise<boolean>} - Whether the media config sources urls should be modified or not
|
|
35
|
-
* @static
|
|
36
|
-
* @private
|
|
37
|
-
*/
|
|
38
|
-
static async _isECDNUrlAlive(regexAction: KalturaAccessControlModifyRequestHostRegexAction, cdnUrl: string) {
|
|
39
|
-
const urlPing = cdnUrl + '/api_v3/service/system/action/ping/format/1';
|
|
40
|
-
const req = new XMLHttpRequest();
|
|
41
|
-
req.open('GET', urlPing);
|
|
42
|
-
req.timeout = regexAction.checkAliveTimeoutMs;
|
|
43
|
-
req.onreadystatechange = () => {
|
|
44
|
-
if (req.readyState === 4) {
|
|
45
|
-
if (req.status === 200) {
|
|
46
|
-
return true;
|
|
47
|
-
}
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
req.ontimeout = () => {
|
|
52
|
-
RegexActionHandler._logger.warn(`Got timeout while pinging the ECDN url. the ping url: ${urlPing}`);
|
|
53
|
-
return false;
|
|
54
|
-
};
|
|
55
|
-
req.send();
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Handles regex action
|
|
60
|
-
* @function handleRegexAction
|
|
61
|
-
* @param {ProviderMediaConfigObject} mediaConfig - The media config
|
|
62
|
-
* @param {Map<string, Function>} rawResponse - The raw response data from backend
|
|
63
|
-
* @returns {Promise<ProviderMediaConfigObject>} - The media config with old or modified urls
|
|
64
|
-
* @static
|
|
65
|
-
*/
|
|
66
|
-
static async handleRegexAction(mediaConfig: ProviderMediaConfigObject, rawResponse: Map<string, Function>): Promise<ProviderMediaConfigObject> {
|
|
67
|
-
let cdnUrl = OVPConfiguration.get().cdnUrl;
|
|
68
|
-
const regexAction = RegexActionHandler._extractRegexActionFromData(rawResponse);
|
|
69
|
-
const regExp = RegexActionHandler._getRegExp(regexAction);
|
|
70
|
-
|
|
71
|
-
if (
|
|
72
|
-
cdnUrl &&
|
|
73
|
-
regexAction &&
|
|
74
|
-
regExp &&
|
|
75
|
-
cdnUrl.match(regExp) &&
|
|
76
|
-
// we need to make the replacement in all cases except for when the checkAliveTimeoutMs > 0 && the ping has failed
|
|
77
|
-
!(
|
|
78
|
-
regexAction.checkAliveTimeoutMs > 0 &&
|
|
79
|
-
!(await RegexActionHandler._isECDNUrlAlive(regexAction, cdnUrl.replace(regExp, regexAction.replacement)))
|
|
80
|
-
)
|
|
81
|
-
) {
|
|
82
|
-
RegexActionHandler._replaceHostUrls(mediaConfig, regexAction);
|
|
83
|
-
return mediaConfig;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
RegexActionHandler._logger.debug('exiting handleRegexAction - not applying regex action.');
|
|
87
|
-
return mediaConfig;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Modify the host urls - injects the configured cdn before the original host, to route requests
|
|
92
|
-
* @function _replaceHostUrls
|
|
93
|
-
* @param {ProviderMediaConfigObject} mediaConfig - The media config
|
|
94
|
-
* @param {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action
|
|
95
|
-
* @returns {void}
|
|
96
|
-
* @static
|
|
97
|
-
* @private
|
|
98
|
-
*/
|
|
99
|
-
static _replaceHostUrls(mediaConfig: ProviderMediaConfigObject, regexAction: KalturaAccessControlModifyRequestHostRegexAction) {
|
|
100
|
-
RegexActionHandler._logger.debug(`Starting to modify urls...`);
|
|
101
|
-
const sources = mediaConfig.sources;
|
|
102
|
-
const {hls, dash, progressive, image} = sources;
|
|
103
|
-
|
|
104
|
-
[...hls, ...dash, ...progressive, ...image].forEach(src => (src.url = RegexActionHandler._applyRegexAction(regexAction, src.url)));
|
|
105
|
-
|
|
106
|
-
if (!OVPConfiguration.get().replaceHostOnlyManifestUrls) {
|
|
107
|
-
RegexActionHandler._logger.debug(`replaceHostOnlyManifestUrls flag is off - modifying captions and poster URLs`);
|
|
108
|
-
if (sources.captions) {
|
|
109
|
-
sources.captions.forEach(src => (src.url = RegexActionHandler._applyRegexAction(regexAction, src.url)));
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// fix flow - poster can also be an array, but only for ott.
|
|
113
|
-
if (typeof sources.poster === 'string') {
|
|
114
|
-
sources.poster = RegexActionHandler._applyRegexAction(regexAction, sources.poster);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
RegexActionHandler._logger.debug(`Finished modifying urls`);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Extracts the regex action from the data response
|
|
122
|
-
* @function _extractRegexActionFromData
|
|
123
|
-
* @param {Map<string, Function>} data - The response data
|
|
124
|
-
* @returns {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action
|
|
125
|
-
* @static
|
|
126
|
-
* @private
|
|
127
|
-
*/
|
|
128
|
-
static _extractRegexActionFromData(data: Map<string, Function>): ?KalturaAccessControlModifyRequestHostRegexAction {
|
|
129
|
-
return data.get(OVPMediaEntryLoader.id)?.response?.playBackContextResult.getRequestHostRegexAction();
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Extracts the regex action from the data response
|
|
134
|
-
* @function _extractRegexActionFromData
|
|
135
|
-
* @param {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action
|
|
136
|
-
* @returns {RegExp} The regex expression
|
|
137
|
-
* @static
|
|
138
|
-
* @private
|
|
139
|
-
*/
|
|
140
|
-
static _getRegExp(regexAction: KalturaAccessControlModifyRequestHostRegexAction): ?RegExp {
|
|
141
|
-
if (regexAction && regexAction.pattern && regexAction.replacement) {
|
|
142
|
-
return new RegExp(regexAction.pattern, 'i');
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export default RegexActionHandler;
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
//@flow
|
|
2
|
-
const FIELDS =
|
|
3
|
-
'id,referenceId,name,description,thumbnailUrl,dataUrl,duration,msDuration,flavorParamsIds,mediaType,type,tags,dvrStatus,externalSourceType,status';
|
|
4
|
-
const RESPONSE_PROFILE_TYPE = {
|
|
5
|
-
INCLUDE_FIELDS: 1,
|
|
6
|
-
EXCLUDE_FIELDS: 2
|
|
7
|
-
};
|
|
8
|
-
export class BaseEntryResponseProfile {
|
|
9
|
-
static Type: {[type: string]: number} = RESPONSE_PROFILE_TYPE;
|
|
10
|
-
/**
|
|
11
|
-
* @member - the response profile type
|
|
12
|
-
* @type {number}
|
|
13
|
-
*/
|
|
14
|
-
type: number;
|
|
15
|
-
/**
|
|
16
|
-
* @member - Comma separated fields list to be included or excluded
|
|
17
|
-
* @type {string}
|
|
18
|
-
*/
|
|
19
|
-
fields: string;
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* @constructor
|
|
23
|
-
* @param {Object} responseProfile -
|
|
24
|
-
*/
|
|
25
|
-
constructor(responseProfile: Object = {}) {
|
|
26
|
-
this.type = responseProfile.type || BaseEntryResponseProfile.Type.INCLUDE_FIELDS;
|
|
27
|
-
this.fields = responseProfile.fields || FIELDS;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import BaseServiceResult from '../../common/base-service-result';
|
|
2
|
-
|
|
3
|
-
export {KalturaBaseEntryListResponse} from './kaltura-base-entry-list-response';
|
|
4
|
-
export {KalturaMediaEntry} from './kaltura-media-entry';
|
|
5
|
-
export {KalturaAccessControlModifyRequestHostRegexAction} from './kaltura-access-control-modify-request-host-regex-action';
|
|
6
|
-
export {KalturaBumper} from './kaltura-bumper';
|
|
7
|
-
export {KalturaFlavorAsset} from './kaltura-flavor-asset';
|
|
8
|
-
export {KalturaMediaEntries} from './kaltura-media-entries';
|
|
9
|
-
export {KalturaMetadata} from './kaltura-metadata';
|
|
10
|
-
export {KalturaMetadataListResponse} from './kaltura-metadata-list-response';
|
|
11
|
-
export {KalturaPlaybackContext} from './kaltura-playback-context';
|
|
12
|
-
export {KalturaPlaybackSource} from './kaltura-playback-source';
|
|
13
|
-
export {KalturaPlaylist} from './kaltura-playlist';
|
|
14
|
-
export {KalturaRuleAction} from './kaltura-rule-action';
|
|
15
|
-
export {KalturaUIConfResponse} from './kaltura-ui-conf-response';
|
|
16
|
-
export {KalturaDrmPlaybackPluginData} from '../../common/response-types/kaltura-drm-playback-plugin-data';
|
|
17
|
-
export {KalturaAccessControlMessage} from '../../common/response-types/kaltura-access-control-message';
|
|
18
|
-
export {BaseServiceResult};
|
package/src/k-provider/ovp/response-types/kaltura-access-control-modify-request-host-regex-action.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
//@flow
|
|
2
|
-
import {KalturaRuleAction} from './kaltura-rule-action';
|
|
3
|
-
|
|
4
|
-
export class KalturaAccessControlModifyRequestHostRegexAction extends KalturaRuleAction {
|
|
5
|
-
/**
|
|
6
|
-
* @member - Request host regex pattern
|
|
7
|
-
* @type {string}
|
|
8
|
-
*/
|
|
9
|
-
pattern: string;
|
|
10
|
-
/**
|
|
11
|
-
* @member - Request host regex replacement
|
|
12
|
-
* @type {string}
|
|
13
|
-
*/
|
|
14
|
-
replacement: string;
|
|
15
|
-
/**
|
|
16
|
-
* @member - serverNodeId to generate replacment host from
|
|
17
|
-
* @type {number}
|
|
18
|
-
*/
|
|
19
|
-
replacmenServerNodeId: number;
|
|
20
|
-
/**
|
|
21
|
-
* @member - checkAliveTimeout in milliseconds
|
|
22
|
-
* @type {number}
|
|
23
|
-
*/
|
|
24
|
-
checkAliveTimeoutMs: number;
|
|
25
|
-
/**
|
|
26
|
-
* @constructor
|
|
27
|
-
* @param {Object} data - The response
|
|
28
|
-
*/
|
|
29
|
-
constructor(data: Object) {
|
|
30
|
-
super(data);
|
|
31
|
-
this.pattern = data.pattern;
|
|
32
|
-
this.replacement = data.replacement;
|
|
33
|
-
this.replacmenServerNodeId = data.replacmenServerNodeId;
|
|
34
|
-
this.checkAliveTimeoutMs = data.checkAliveTimeoutMs;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
//@flow
|
|
2
|
-
import ServiceResult from '../../common/base-service-result';
|
|
3
|
-
import {KalturaMediaEntry} from './kaltura-media-entry';
|
|
4
|
-
|
|
5
|
-
export class KalturaBaseEntryListResponse extends ServiceResult {
|
|
6
|
-
/**
|
|
7
|
-
* @member - The total count
|
|
8
|
-
* @type {number}
|
|
9
|
-
*/
|
|
10
|
-
totalCount: number;
|
|
11
|
-
/**
|
|
12
|
-
* @member - The entries
|
|
13
|
-
* @type {Array<KalturaMediaEntry>}
|
|
14
|
-
*/
|
|
15
|
-
entries: Array<KalturaMediaEntry>;
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* @constructor
|
|
19
|
-
* @param {Object} responseObj The json response
|
|
20
|
-
*/
|
|
21
|
-
constructor(responseObj: Object) {
|
|
22
|
-
super(responseObj);
|
|
23
|
-
if (!this.hasError) {
|
|
24
|
-
this.totalCount = responseObj.totalCount;
|
|
25
|
-
if (this.totalCount > 0) {
|
|
26
|
-
this.entries = [];
|
|
27
|
-
responseObj.objects.map(entry => this.entries.push(new KalturaMediaEntry(entry)));
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
//@flow
|
|
2
|
-
import {KalturaPlaybackSource} from './kaltura-playback-source';
|
|
3
|
-
|
|
4
|
-
export class KalturaBumper {
|
|
5
|
-
/**
|
|
6
|
-
* @member - The bumper entry ID
|
|
7
|
-
* @type {string}
|
|
8
|
-
*/
|
|
9
|
-
entryId: string;
|
|
10
|
-
/**
|
|
11
|
-
* @member - The bumper click through url
|
|
12
|
-
* @type {string}
|
|
13
|
-
*/
|
|
14
|
-
clickThroughUrl: string;
|
|
15
|
-
/**
|
|
16
|
-
* @member - The bumper sources
|
|
17
|
-
* @type {Array<KalturaPlaybackSource>}
|
|
18
|
-
*/
|
|
19
|
-
sources: Array<KalturaPlaybackSource>;
|
|
20
|
-
|
|
21
|
-
constructor(data: any) {
|
|
22
|
-
this.entryId = data.entryId;
|
|
23
|
-
this.clickThroughUrl = data.url;
|
|
24
|
-
this.sources = data.sources ? data.sources.map(source => new KalturaPlaybackSource(source)) : [];
|
|
25
|
-
}
|
|
26
|
-
}
|