@playkit-js/playkit-js-providers 2.40.1 → 2.41.0-canary.0-2452bbc
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/dist/index.d.ts +1624 -0
- package/dist/playkit-analytics-service.js +1 -1
- package/dist/playkit-analytics-service.js.map +1 -1
- package/dist/playkit-bookmark-service.js +1 -1
- package/dist/playkit-bookmark-service.js.map +1 -1
- package/dist/playkit-ott-provider.js +1 -1
- package/dist/playkit-ott-provider.js.map +1 -1
- package/dist/playkit-ovp-provider.js +1 -1
- package/dist/playkit-ovp-provider.js.map +1 -1
- package/dist/playkit-stats-service.js +1 -1
- package/dist/playkit-stats-service.js.map +1 -1
- package/dist/tsdoc-metadata.json +11 -0
- package/flow-typed/types/media-config-sources.js +1 -1
- package/flow-typed/types/media-sources.js +1 -1
- package/package.json +48 -45
- package/playkit-analytics-service/package.json +5 -0
- package/playkit-bookmark-service/package.json +5 -0
- package/playkit-ott-provider/package.json +5 -0
- package/playkit-ovp-provider/package.json +5 -0
- package/playkit-stats-service/package.json +5 -0
- package/src/entities/bumper.ts +21 -0
- package/src/entities/drm.ts +47 -0
- package/src/entities/entry-list.ts +13 -0
- package/src/entities/image-source.ts +36 -0
- package/src/entities/media-entry.ts +104 -0
- package/src/entities/media-format.ts +47 -0
- package/src/entities/media-source.ts +70 -0
- package/src/entities/media-sources.ts +79 -0
- package/src/entities/playlist.ts +41 -0
- package/src/k-provider/common/base-provider-parser.ts +0 -0
- package/src/k-provider/common/base-provider.ts +112 -0
- package/src/k-provider/common/base-service-result.ts +56 -0
- package/src/k-provider/common/data-loader-manager.ts +115 -0
- package/src/k-provider/common/multi-request-builder.ts +111 -0
- package/src/k-provider/common/response-types/kaltura-access-control-message.ts +21 -0
- package/src/k-provider/common/response-types/kaltura-drm-playback-plugin-data.ts +38 -0
- package/src/k-provider/ott/config.ts +22 -0
- package/src/k-provider/ott/index.ts +14 -0
- package/src/k-provider/ott/loaders/asset-list-loader.ts +68 -0
- package/src/k-provider/ott/loaders/asset-loader.ts +69 -0
- package/src/k-provider/ott/loaders/data-loader-manager.ts +15 -0
- package/src/k-provider/ott/loaders/session-loader.ts +62 -0
- package/src/k-provider/ott/provider-parser.ts +285 -0
- package/src/k-provider/ott/provider.ts +252 -0
- package/src/k-provider/ott/response-types/kaltura-asset.ts +105 -0
- package/src/k-provider/ott/response-types/kaltura-bumper-playback-plugin-data.ts +27 -0
- package/src/k-provider/ott/response-types/kaltura-playback-context.ts +73 -0
- package/src/k-provider/ott/response-types/kaltura-playback-source.ts +62 -0
- package/src/k-provider/ott/response-types/kaltura-rule-action.ts +25 -0
- package/src/k-provider/ott/services/asset-service.ts +50 -0
- package/src/k-provider/ott/services/bookmark/bookmark-service.ts +48 -0
- package/src/k-provider/ott/services/bookmark/index.ts +11 -0
- package/src/k-provider/ott/services/ott-service.ts +33 -0
- package/src/k-provider/ott/services/user-service.ts +31 -0
- package/src/k-provider/ovp/config.ts +28 -0
- package/src/k-provider/ovp/external-captions-builder.ts +37 -0
- package/src/k-provider/ovp/index.ts +13 -0
- package/src/k-provider/ovp/loaders/data-loader-manager.ts +17 -0
- package/src/k-provider/ovp/loaders/entry-list-loader.ts +69 -0
- package/src/k-provider/ovp/loaders/media-entry-loader.ts +84 -0
- package/src/k-provider/ovp/loaders/playlist-loader.ts +69 -0
- package/src/k-provider/ovp/loaders/session-loader.ts +62 -0
- package/src/k-provider/ovp/loaders/ui-config-loader.ts +71 -0
- package/src/k-provider/ovp/play-source-url-builder.ts +59 -0
- package/src/k-provider/ovp/provider-parser.ts +461 -0
- package/src/k-provider/ovp/provider.ts +358 -0
- package/src/k-provider/ovp/regex-action-handler.ts +149 -0
- package/src/k-provider/ovp/request-params/base-entry-response-profile.ts +28 -0
- package/src/k-provider/ovp/response-types/index.ts +21 -0
- package/src/k-provider/ovp/response-types/kaltura-access-control-modify-request-host-regex-action.ts +35 -0
- package/src/k-provider/ovp/response-types/kaltura-base-entry-list-response.ts +30 -0
- package/src/k-provider/ovp/response-types/kaltura-bumper.ts +25 -0
- package/src/k-provider/ovp/response-types/kaltura-flavor-asset.ts +108 -0
- package/src/k-provider/ovp/response-types/kaltura-media-entries.ts +28 -0
- package/src/k-provider/ovp/response-types/kaltura-media-entry.ts +189 -0
- package/src/k-provider/ovp/response-types/kaltura-metadata-list-response.ts +22 -0
- package/src/k-provider/ovp/response-types/kaltura-metadata.ts +50 -0
- package/src/k-provider/ovp/response-types/kaltura-playback-context.ts +95 -0
- package/src/k-provider/ovp/response-types/kaltura-playback-source.ts +89 -0
- package/src/k-provider/ovp/response-types/kaltura-playlist.ts +33 -0
- package/src/k-provider/ovp/response-types/kaltura-rule-action.ts +27 -0
- package/src/k-provider/ovp/response-types/kaltura-ui-conf-response.ts +89 -0
- package/src/k-provider/ovp/response-types/kaltura-user-entry-list-response.ts +30 -0
- package/src/k-provider/ovp/response-types/kaltura-user-entry.ts +57 -0
- package/src/k-provider/ovp/services/analytics/analytics-service.ts +58 -0
- package/src/k-provider/ovp/services/analytics/index.ts +11 -0
- package/src/k-provider/ovp/services/base-entry-service.ts +75 -0
- package/src/k-provider/ovp/services/meta-data-service.ts +29 -0
- package/src/k-provider/ovp/services/ovp-service.ts +32 -0
- package/src/k-provider/ovp/services/playlist-service.ts +95 -0
- package/src/k-provider/ovp/services/session-service.ts +27 -0
- package/src/k-provider/ovp/services/stats/index.ts +11 -0
- package/src/k-provider/ovp/services/stats/stats-service.ts +32 -0
- package/src/k-provider/ovp/services/ui-conf-service.ts +32 -0
- package/src/types/adapter-data-config.ts +1 -0
- package/src/types/caption-type.ts +1 -0
- package/src/types/drm-data.ts +5 -0
- package/src/types/entry-list.ts +6 -0
- package/src/types/env-config.ts +7 -0
- package/src/types/external-caption-object.ts +7 -0
- package/src/types/filter-options.ts +3 -0
- package/src/types/index.ts +34 -0
- package/src/types/loader.ts +7 -0
- package/src/types/media-config-metadata.ts +13 -0
- package/src/types/media-config-session.ts +6 -0
- package/src/types/media-config-sources.ts +20 -0
- package/src/types/media-config.ts +8 -0
- package/src/types/media-entry.ts +16 -0
- package/src/types/media-format.ts +5 -0
- package/src/types/media-info.ts +21 -0
- package/src/types/media-source.ts +12 -0
- package/src/types/media-sources.ts +11 -0
- package/src/types/network-retry-parameters.ts +5 -0
- package/src/types/playback-context.ts +10 -0
- package/src/types/playlist-info.ts +4 -0
- package/src/types/playlist-item.ts +5 -0
- package/src/types/playlist-metadata.ts +4 -0
- package/src/types/playlist.ts +10 -0
- package/src/types/poster.ts +5 -0
- package/src/types/provider-options.ts +17 -0
- package/src/types/request-loader.ts +6 -0
- package/src/util/clone.ts +23 -0
- package/src/util/error/category.ts +11 -0
- package/src/util/error/code.ts +77 -0
- package/src/util/error/error.ts +47 -0
- package/src/util/error/severity.ts +21 -0
- package/src/util/logger.ts +108 -0
- package/src/util/param.ts +45 -0
- package/src/util/request-builder.ts +187 -0
- package/src/util/xml-parser.ts +39 -0
- package/CHANGELOG.md +0 -959
- package/samples/ott/bookmark.html +0 -23
- package/samples/ott/provider.html +0 -28
- package/samples/ovp/provider.html +0 -30
- package/samples/ovp/stats.html +0 -17
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import MediaSources from './media-sources';
|
|
2
|
+
import {ProviderMediaEntryObject} from '../types';
|
|
3
|
+
import {Poster} from '../types/poster';
|
|
4
|
+
|
|
5
|
+
export default class MediaEntry {
|
|
6
|
+
public static Type: {[type: string]: string} = {
|
|
7
|
+
VOD: 'Vod',
|
|
8
|
+
LIVE: 'Live',
|
|
9
|
+
IMAGE: 'Image',
|
|
10
|
+
AUDIO: 'Audio',
|
|
11
|
+
UNKNOWN: 'Unknown'
|
|
12
|
+
};
|
|
13
|
+
public static DvrStatus: {[type: string]: number} = {
|
|
14
|
+
ON: 1,
|
|
15
|
+
OFF: 0
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @member - entry id
|
|
20
|
+
* @type {string}
|
|
21
|
+
*/
|
|
22
|
+
public id?: string;
|
|
23
|
+
/**
|
|
24
|
+
* @member - entry name
|
|
25
|
+
* @type {string}
|
|
26
|
+
*/
|
|
27
|
+
public name?: string;
|
|
28
|
+
/**
|
|
29
|
+
* @member - entry sources
|
|
30
|
+
* @type {MediaSources}
|
|
31
|
+
*/
|
|
32
|
+
public sources: MediaSources;
|
|
33
|
+
/**
|
|
34
|
+
* @member - entry duration
|
|
35
|
+
* @type {number}
|
|
36
|
+
*/
|
|
37
|
+
public duration?: number;
|
|
38
|
+
/**
|
|
39
|
+
* @member - entry type
|
|
40
|
+
* @type {string}
|
|
41
|
+
*/
|
|
42
|
+
public type: string;
|
|
43
|
+
/**
|
|
44
|
+
* @member - entry metadata
|
|
45
|
+
* @type {Object}
|
|
46
|
+
*/
|
|
47
|
+
public metadata: any;
|
|
48
|
+
/**
|
|
49
|
+
* @member - DVR status
|
|
50
|
+
* @type {number}
|
|
51
|
+
*/
|
|
52
|
+
public dvrStatus?: number;
|
|
53
|
+
/**
|
|
54
|
+
* @member - media status
|
|
55
|
+
* @type {number}
|
|
56
|
+
*/
|
|
57
|
+
public status?: number;
|
|
58
|
+
/**
|
|
59
|
+
* @member - media poster
|
|
60
|
+
* @type {string | Array<Object>}
|
|
61
|
+
*/
|
|
62
|
+
public poster?: string | Poster[];
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @member - assetReferenceType
|
|
66
|
+
* @type {string }
|
|
67
|
+
*/
|
|
68
|
+
public assetReferenceType?: string;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @member - The download URL of the entry.
|
|
72
|
+
* @type {string}
|
|
73
|
+
*/
|
|
74
|
+
public downloadUrl?: string;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* @constructor
|
|
78
|
+
*/
|
|
79
|
+
constructor() {
|
|
80
|
+
this.metadata = new Map();
|
|
81
|
+
this.sources = new MediaSources();
|
|
82
|
+
this.type = MediaEntry.Type.UNKNOWN;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Convert class to native js object.
|
|
87
|
+
* @returns {ProviderMediaEntryObject} - The json class object.
|
|
88
|
+
*/
|
|
89
|
+
public toJSON(): ProviderMediaEntryObject {
|
|
90
|
+
return {
|
|
91
|
+
id: this.id,
|
|
92
|
+
name: this.name,
|
|
93
|
+
sources: this.sources.toJSON(),
|
|
94
|
+
duration: this.duration,
|
|
95
|
+
dvrStatus: this.dvrStatus,
|
|
96
|
+
status: this.status,
|
|
97
|
+
metadata: this.metadata,
|
|
98
|
+
type: this.type,
|
|
99
|
+
poster: this.poster,
|
|
100
|
+
assetReferenceType: this.assetReferenceType,
|
|
101
|
+
downloadUrl: this.downloadUrl
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import {ProviderMediaFormatType} from '../types';
|
|
2
|
+
|
|
3
|
+
export const MediaFormat: {[name: string]: ProviderMediaFormatType} = {
|
|
4
|
+
DASH: {
|
|
5
|
+
name: 'dash',
|
|
6
|
+
mimeType: 'application/dash+xml',
|
|
7
|
+
pathExt: 'mpd'
|
|
8
|
+
},
|
|
9
|
+
HLS: {
|
|
10
|
+
name: 'hls',
|
|
11
|
+
mimeType: 'application/x-mpegURL',
|
|
12
|
+
pathExt: 'm3u8'
|
|
13
|
+
},
|
|
14
|
+
WVM: {
|
|
15
|
+
name: 'wvm',
|
|
16
|
+
mimeType: 'video/wvm',
|
|
17
|
+
pathExt: 'wvm'
|
|
18
|
+
},
|
|
19
|
+
MP4: {
|
|
20
|
+
name: 'mp4',
|
|
21
|
+
mimeType: 'video/mp4',
|
|
22
|
+
pathExt: 'mp4'
|
|
23
|
+
},
|
|
24
|
+
MP3: {
|
|
25
|
+
name: 'mp3',
|
|
26
|
+
mimeType: 'audio/mpeg',
|
|
27
|
+
pathExt: 'mp3'
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const SupportedStreamFormat: Map<string, ProviderMediaFormatType> = new Map([
|
|
32
|
+
['mpegdash', MediaFormat.DASH],
|
|
33
|
+
['applehttp', MediaFormat.HLS],
|
|
34
|
+
['url', MediaFormat.MP4]
|
|
35
|
+
]);
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* returns a boolean whether a source is progressive or not
|
|
39
|
+
* @param {string} formatName - the format name
|
|
40
|
+
* @returns {boolean} - if source is progressive or not
|
|
41
|
+
*/
|
|
42
|
+
function isProgressiveSource(formatName: string): boolean {
|
|
43
|
+
const sourceFormat = SupportedStreamFormat.get(formatName);
|
|
44
|
+
return !!sourceFormat && sourceFormat.name === MediaFormat.MP4.name;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export {isProgressiveSource};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import Drm from './drm';
|
|
2
|
+
import {ProviderMediaSourceObject} from '../types';
|
|
3
|
+
|
|
4
|
+
export default class MediaSource {
|
|
5
|
+
/**
|
|
6
|
+
* @member - media source id
|
|
7
|
+
* @type {string}
|
|
8
|
+
*/
|
|
9
|
+
public id!: string;
|
|
10
|
+
/**
|
|
11
|
+
* @member - media source url
|
|
12
|
+
* @type {string}
|
|
13
|
+
*/
|
|
14
|
+
public url!: string;
|
|
15
|
+
/**
|
|
16
|
+
* @member - media source mimetype
|
|
17
|
+
* @type {string}
|
|
18
|
+
*/
|
|
19
|
+
public mimetype!: string;
|
|
20
|
+
/**
|
|
21
|
+
* @member - media source drm data
|
|
22
|
+
* @type {Array<Drm>}
|
|
23
|
+
*/
|
|
24
|
+
public drmData?: Array<Drm>;
|
|
25
|
+
/**
|
|
26
|
+
* @member - media source bandwidth
|
|
27
|
+
* @type {number}
|
|
28
|
+
*/
|
|
29
|
+
public bandwidth?: number;
|
|
30
|
+
/**
|
|
31
|
+
* @member - media source width
|
|
32
|
+
* @type {number}
|
|
33
|
+
*/
|
|
34
|
+
public width?: number;
|
|
35
|
+
/**
|
|
36
|
+
* @member - media source height
|
|
37
|
+
* @type {number}
|
|
38
|
+
*/
|
|
39
|
+
public height?: number;
|
|
40
|
+
/**
|
|
41
|
+
* @member - media source label
|
|
42
|
+
* @type {string}
|
|
43
|
+
*/
|
|
44
|
+
public label?: string;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Convert class to native js object.
|
|
48
|
+
* @returns {ProviderMediaSourceObject} - The json class object.
|
|
49
|
+
*/
|
|
50
|
+
public toJSON(): ProviderMediaSourceObject {
|
|
51
|
+
const response: ProviderMediaSourceObject = {
|
|
52
|
+
id: this.id,
|
|
53
|
+
url: this.url,
|
|
54
|
+
mimetype: this.mimetype
|
|
55
|
+
};
|
|
56
|
+
if (this.bandwidth) response.bandwidth = this.bandwidth;
|
|
57
|
+
if (this.width) response.width = this.width;
|
|
58
|
+
if (this.height) response.height = this.height;
|
|
59
|
+
if (this.label) response.label = this.label;
|
|
60
|
+
if (this.drmData && this.drmData.length > 0) {
|
|
61
|
+
response.drmData = [];
|
|
62
|
+
this.drmData.forEach(d => {
|
|
63
|
+
if (Array.isArray(response.drmData)) {
|
|
64
|
+
response.drmData.push(d.toJSON());
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return response;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import MediaSource from './media-source';
|
|
2
|
+
import {MediaFormat} from './media-format';
|
|
3
|
+
import {ImageSource} from './image-source';
|
|
4
|
+
import {PKExternalCaptionObject, ProviderMediaFormatType, ProviderMediaSourcesObject} from '../types';
|
|
5
|
+
|
|
6
|
+
export default class MediaSources {
|
|
7
|
+
/**
|
|
8
|
+
* Progressive download media sources container.
|
|
9
|
+
* @type {Array<MediaSource>}
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
public progressive: Array<MediaSource>;
|
|
13
|
+
/**
|
|
14
|
+
* Dash media sources container.
|
|
15
|
+
* @type {Array<MediaSource>}
|
|
16
|
+
* @public
|
|
17
|
+
*/
|
|
18
|
+
public dash: Array<MediaSource>;
|
|
19
|
+
/**
|
|
20
|
+
* Hls media sources container.
|
|
21
|
+
* @type {Array<MediaSource>}
|
|
22
|
+
* @public
|
|
23
|
+
*/
|
|
24
|
+
public hls: Array<MediaSource>;
|
|
25
|
+
public image: Array<ImageSource>;
|
|
26
|
+
public captions?: Array<PKExternalCaptionObject>;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @constructor
|
|
30
|
+
*/
|
|
31
|
+
constructor() {
|
|
32
|
+
this.progressive = [];
|
|
33
|
+
this.dash = [];
|
|
34
|
+
this.hls = [];
|
|
35
|
+
this.image = [];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Maps the source to one of the containers according to his media format.
|
|
40
|
+
* @param {MediaSource} source - The source to add to one of the containers.
|
|
41
|
+
* @param {MediaFormat} mediaFormat - The media format of the source.
|
|
42
|
+
* @returns {void}
|
|
43
|
+
*/
|
|
44
|
+
public map(source: MediaSource, mediaFormat?: ProviderMediaFormatType): void {
|
|
45
|
+
if (mediaFormat) {
|
|
46
|
+
switch (mediaFormat.name) {
|
|
47
|
+
case MediaFormat.MP4.name:
|
|
48
|
+
this.progressive.push(source);
|
|
49
|
+
break;
|
|
50
|
+
case MediaFormat.DASH.name:
|
|
51
|
+
this.dash.push(source);
|
|
52
|
+
break;
|
|
53
|
+
case MediaFormat.HLS.name:
|
|
54
|
+
this.hls.push(source);
|
|
55
|
+
break;
|
|
56
|
+
default:
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Convert class to native js object.
|
|
64
|
+
* @returns {ProviderMediaSourcesObject} - The json class object.
|
|
65
|
+
*/
|
|
66
|
+
public toJSON(): ProviderMediaSourcesObject {
|
|
67
|
+
const response: ProviderMediaSourcesObject = {
|
|
68
|
+
progressive: [],
|
|
69
|
+
dash: [],
|
|
70
|
+
hls: [],
|
|
71
|
+
image: []
|
|
72
|
+
};
|
|
73
|
+
this.progressive.forEach(p => response.progressive.push(p.toJSON()));
|
|
74
|
+
this.hls.forEach(h => response.hls.push(h.toJSON()));
|
|
75
|
+
this.dash.forEach(d => response.dash.push(d.toJSON()));
|
|
76
|
+
response.image = this.image;
|
|
77
|
+
return response;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import MediaEntry from '../entities/media-entry';
|
|
2
|
+
|
|
3
|
+
export default class Playlist {
|
|
4
|
+
/**
|
|
5
|
+
* @member - playlist id
|
|
6
|
+
* @type {string}
|
|
7
|
+
*/
|
|
8
|
+
public id?: string;
|
|
9
|
+
/**
|
|
10
|
+
* @member - playlist name
|
|
11
|
+
* @type {string}
|
|
12
|
+
*/
|
|
13
|
+
public name?: string;
|
|
14
|
+
/**
|
|
15
|
+
* @member - playlist description
|
|
16
|
+
* @type {string}
|
|
17
|
+
*/
|
|
18
|
+
public description?: string;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @member - playlist poster
|
|
22
|
+
* @type {string}
|
|
23
|
+
*/
|
|
24
|
+
public poster?: string;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @member - playlist items
|
|
28
|
+
* @type {Array<MediaEntry>}
|
|
29
|
+
*/
|
|
30
|
+
public items: Array<MediaEntry>;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @member - playlist last played entry
|
|
34
|
+
* @type {string}
|
|
35
|
+
*/
|
|
36
|
+
public playlistLastEntryId?: string;
|
|
37
|
+
|
|
38
|
+
constructor() {
|
|
39
|
+
this.items = [];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import {getLogLevel, setLogLevel, setLogger, LogLevelType, LogLevel} from '../../util/logger';
|
|
2
|
+
import DataLoaderManager from './data-loader-manager';
|
|
3
|
+
import Error from '../../util/error/error';
|
|
4
|
+
import {ProviderEntryListObject, ProviderMediaConfigObject, ProviderPlaylistInfoObject, ProviderMediaConfigSourcesObject, ProviderNetworkRetryParameters, ProviderOptionsObject, ProviderPlaylistObject} from '../../types';
|
|
5
|
+
|
|
6
|
+
export default class BaseProvider<MI> {
|
|
7
|
+
private _partnerId: number;
|
|
8
|
+
private _widgetId?: string;
|
|
9
|
+
private _ks: string;
|
|
10
|
+
private _uiConfId?: number;
|
|
11
|
+
public _dataLoader!: DataLoaderManager;
|
|
12
|
+
private _playerVersion: string;
|
|
13
|
+
public _logger: any;
|
|
14
|
+
protected _isAnonymous: boolean;
|
|
15
|
+
public _networkRetryConfig: ProviderNetworkRetryParameters = {
|
|
16
|
+
async: true,
|
|
17
|
+
timeout: 0,
|
|
18
|
+
maxAttempts: 4
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
public get partnerId(): number {
|
|
22
|
+
return this._partnerId;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public get widgetId(): string {
|
|
26
|
+
return this._widgetId || this.defaultWidgetId;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public get defaultWidgetId(): string {
|
|
30
|
+
return '_' + this._partnerId;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public get uiConfId(): number | undefined {
|
|
34
|
+
return this._uiConfId;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public get ks(): string {
|
|
38
|
+
return this._ks;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public set ks(value: string) {
|
|
42
|
+
this._ks = value;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public get playerVersion(): string {
|
|
46
|
+
return this._playerVersion;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public get isAnonymous(): boolean {
|
|
50
|
+
return this._isAnonymous;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
constructor(options: ProviderOptionsObject, playerVersion: string) {
|
|
54
|
+
setLogger(options.logger);
|
|
55
|
+
this._partnerId = options.partnerId;
|
|
56
|
+
this._widgetId = options.widgetId;
|
|
57
|
+
this._uiConfId = options.uiConfId;
|
|
58
|
+
this._isAnonymous = !options.ks;
|
|
59
|
+
this._ks = options.ks || '';
|
|
60
|
+
this._playerVersion = playerVersion;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
64
|
+
public getMediaConfig(mediaInfo: MI): Promise<ProviderMediaConfigObject> {
|
|
65
|
+
return Promise.reject(
|
|
66
|
+
new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {
|
|
67
|
+
message: 'getMediaConfig method must be implement by the derived class'
|
|
68
|
+
})
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
73
|
+
public getPlaylistConfig(playlistInfo: ProviderPlaylistInfoObject): Promise<ProviderPlaylistObject> {
|
|
74
|
+
return Promise.reject(
|
|
75
|
+
new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {
|
|
76
|
+
message: 'The provider does not support loading playlist by id'
|
|
77
|
+
})
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
82
|
+
public getEntryListConfig(entryListInfo: ProviderEntryListObject): Promise<ProviderPlaylistObject> {
|
|
83
|
+
return Promise.reject(
|
|
84
|
+
new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {
|
|
85
|
+
message: 'The provider does not support loading entry list'
|
|
86
|
+
})
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
protected _verifyHasSources(sources: ProviderMediaConfigSourcesObject): void {
|
|
91
|
+
if (sources.hls.concat(sources.dash, sources.progressive, sources.image).length === 0) {
|
|
92
|
+
throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.MISSING_PLAY_SOURCE, {
|
|
93
|
+
action: '',
|
|
94
|
+
messages: `No play source for entry id: ${sources.id}`
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
public get LogLevel(): LogLevelType {
|
|
100
|
+
return LogLevel;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
public getLogLevel(name?: string): any {
|
|
104
|
+
return getLogLevel(name);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
public setLogLevel(level: any, name?: string): void {
|
|
108
|
+
setLogLevel(level, name);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export {BaseProvider}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export default class ServiceResult {
|
|
2
|
+
/**
|
|
3
|
+
* @member - Is service returned an error
|
|
4
|
+
* @type {boolean}
|
|
5
|
+
*/
|
|
6
|
+
public hasError: boolean = false;
|
|
7
|
+
/**
|
|
8
|
+
* @member - The service error
|
|
9
|
+
* @type {ServiceError}
|
|
10
|
+
*/
|
|
11
|
+
public error!: ServiceError;
|
|
12
|
+
/**
|
|
13
|
+
* @member - The service result data
|
|
14
|
+
* @type {Object}
|
|
15
|
+
*/
|
|
16
|
+
public data: any;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @constructor
|
|
20
|
+
* @param {Object} response - Service response
|
|
21
|
+
*/
|
|
22
|
+
constructor(response: any) {
|
|
23
|
+
if (response.objectType === 'KalturaAPIException') {
|
|
24
|
+
this.hasError = true;
|
|
25
|
+
this.error = new ServiceError(response.code, response.message);
|
|
26
|
+
} else if (response.error && response.error.objectType === 'KalturaAPIException') {
|
|
27
|
+
this.hasError = true;
|
|
28
|
+
this.error = new ServiceError(response.error.code, response.error.message);
|
|
29
|
+
} else {
|
|
30
|
+
this.data = response;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
class ServiceError {
|
|
36
|
+
/**
|
|
37
|
+
* @member - The error code
|
|
38
|
+
* @type {string}
|
|
39
|
+
*/
|
|
40
|
+
public code: string;
|
|
41
|
+
/**
|
|
42
|
+
* @member - The error message
|
|
43
|
+
* @type {string}
|
|
44
|
+
*/
|
|
45
|
+
public message: string;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @constructor
|
|
49
|
+
* @param {string} code - The result code
|
|
50
|
+
* @param {string} message - The result message
|
|
51
|
+
*/
|
|
52
|
+
constructor(code: string, message: string) {
|
|
53
|
+
this.code = code;
|
|
54
|
+
this.message = message;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import MultiRequestBuilder, {MultiRequestResult} from './multi-request-builder';
|
|
2
|
+
import Error from '../../util/error/error';
|
|
3
|
+
import {ILoader, ProviderNetworkRetryParameters} from '../../types';
|
|
4
|
+
|
|
5
|
+
export default class DataLoaderManager {
|
|
6
|
+
/**
|
|
7
|
+
* @member - Loaders response map index
|
|
8
|
+
* @type {Map<string,Array<number>>}
|
|
9
|
+
* @private
|
|
10
|
+
*/
|
|
11
|
+
private _loadersResponseMap: Map<string, Array<number>> = new Map();
|
|
12
|
+
/**
|
|
13
|
+
* @member - Loaders multi request
|
|
14
|
+
* @type {MultiRequestBuilder}
|
|
15
|
+
* @protected
|
|
16
|
+
*/
|
|
17
|
+
protected _multiRequest!: MultiRequestBuilder;
|
|
18
|
+
/**
|
|
19
|
+
* @member - Loaders multi response
|
|
20
|
+
* @type {MultiRequestResult}
|
|
21
|
+
* @private
|
|
22
|
+
*/
|
|
23
|
+
private _multiResponse!: MultiRequestResult;
|
|
24
|
+
/**
|
|
25
|
+
* @member - Loaders to execute
|
|
26
|
+
* @type {Map<string,Function>}
|
|
27
|
+
* @private
|
|
28
|
+
*/
|
|
29
|
+
private _loaders: Map<string, ILoader> = new Map();
|
|
30
|
+
|
|
31
|
+
private _networkRetryConfig: ProviderNetworkRetryParameters;
|
|
32
|
+
|
|
33
|
+
constructor(networkRetryConfig: ProviderNetworkRetryParameters) {
|
|
34
|
+
this._networkRetryConfig = networkRetryConfig;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Add loader to execution loaders map
|
|
39
|
+
* @function
|
|
40
|
+
* @param {Function} loader Loader to add
|
|
41
|
+
* @param {Object} params Loader params
|
|
42
|
+
* @param {string} ks ks
|
|
43
|
+
* @returns {void}
|
|
44
|
+
*/
|
|
45
|
+
public add(loader: {new(...params): ILoader, id: string}, params: any, ks?: string): void {
|
|
46
|
+
const execution_loader = new loader(params);
|
|
47
|
+
if (execution_loader.isValid()) {
|
|
48
|
+
this._loaders.set(loader.id, execution_loader);
|
|
49
|
+
// Get the start index from the multiReqeust before adding current execution_loader requests
|
|
50
|
+
const startIndex = this._multiRequest.requests.length;
|
|
51
|
+
// Get the requests
|
|
52
|
+
const requests = execution_loader.requests;
|
|
53
|
+
this._multiRequest.retryConfig = this._networkRetryConfig;
|
|
54
|
+
// Add requests to multiRequest queue
|
|
55
|
+
requests.forEach(request => {
|
|
56
|
+
request.params = request.params || {};
|
|
57
|
+
request.params.ks = request.params.ks || ks;
|
|
58
|
+
this._multiRequest.add(request);
|
|
59
|
+
});
|
|
60
|
+
// Create range array of current execution_loader requests
|
|
61
|
+
const executionLoaderResponseMap = Array.from(new Array(requests.length), (val, index) => index + startIndex);
|
|
62
|
+
// Add to map
|
|
63
|
+
this._loadersResponseMap.set(loader.id, executionLoaderResponseMap);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Get data from all loaders using multi request
|
|
69
|
+
* @param {boolean} requestsMustSucceed whether all of the requests must succeed or not
|
|
70
|
+
* @function
|
|
71
|
+
* @returns {Promise} Promise
|
|
72
|
+
*/
|
|
73
|
+
public fetchData(requestsMustSucceed?: boolean): Promise<any> {
|
|
74
|
+
return new Promise((resolve, reject) => {
|
|
75
|
+
this._multiRequest.execute(requestsMustSucceed).then(
|
|
76
|
+
data => {
|
|
77
|
+
this._multiResponse = data.response;
|
|
78
|
+
const preparedData: any = this.prepareData(data.response);
|
|
79
|
+
if (preparedData.success) {
|
|
80
|
+
resolve(this._loaders);
|
|
81
|
+
} else {
|
|
82
|
+
reject(
|
|
83
|
+
new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.API_RESPONSE_MISMATCH, {
|
|
84
|
+
headers: data.headers
|
|
85
|
+
})
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
err => {
|
|
90
|
+
reject(err);
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Prepare fetched data
|
|
98
|
+
* @function
|
|
99
|
+
* @param {MultiRequestResult} response - The multi request result
|
|
100
|
+
* @returns {Object} - The prepared data
|
|
101
|
+
*/
|
|
102
|
+
public prepareData(response: MultiRequestResult): any {
|
|
103
|
+
this._loaders.forEach((loader, name) => {
|
|
104
|
+
const loaderDataIndexes = this._loadersResponseMap.get(name);
|
|
105
|
+
try {
|
|
106
|
+
if (loaderDataIndexes && loaderDataIndexes.length > 0) {
|
|
107
|
+
loader.response = response.results.slice(loaderDataIndexes[0], loaderDataIndexes[loaderDataIndexes.length - 1] + 1);
|
|
108
|
+
}
|
|
109
|
+
} catch (err) {
|
|
110
|
+
return {success: false, error: err};
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
return {success: true, data: this._loaders};
|
|
114
|
+
}
|
|
115
|
+
}
|