@gcorevideo/player 2.0.0 → 2.0.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/dist/index.js +1483 -175
- package/lib/Player.d.ts +2 -2
- package/lib/Player.d.ts.map +1 -1
- package/lib/Player.js +10 -6
- package/lib/trace/SentryTracer.d.ts +2 -2
- package/lib/trace/SentryTracer.d.ts.map +1 -1
- package/lib/trace/SentryTracer.js +6 -2
- package/lib/types.d.ts +1 -2
- package/lib/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/Player.ts +12 -7
- package/src/trace/SentryTracer.ts +6 -3
- package/src/types.ts +3 -3
- package/tsconfig.tsbuildinfo +1 -1
package/lib/Player.d.ts
CHANGED
|
@@ -7,13 +7,13 @@ export type PlaybackModule = 'dash' | 'hls' | 'native';
|
|
|
7
7
|
* @beta
|
|
8
8
|
*/
|
|
9
9
|
export declare class Player {
|
|
10
|
+
private bitrateInfo;
|
|
11
|
+
private config;
|
|
10
12
|
private emitter;
|
|
11
13
|
private player;
|
|
12
14
|
private ready;
|
|
13
15
|
private tuneInTimerId;
|
|
14
16
|
private tunedIn;
|
|
15
|
-
private config;
|
|
16
|
-
private bitrateInfo;
|
|
17
17
|
get activePlayback(): PlaybackModule | null;
|
|
18
18
|
get bitrate(): BitrateInfo | null;
|
|
19
19
|
get hd(): any;
|
package/lib/Player.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../src/Player.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../src/Player.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EAEb,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;AAIpB,OAAO,2BAA2B,CAAC;AAInC,KAAK,kBAAkB,CAAC,CAAC,SAAS,WAAW,IAAI,MAAM,IAAI,CAAC;AAU5D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;AAIvD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,WAAW,CAA4B;IAE/C,OAAO,CAAC,MAAM,CAAe;IAE7B,OAAO,CAAC,OAAO,CAAmB;IAElC,OAAO,CAAC,MAAM,CAA6B;IAE3C,OAAO,CAAC,KAAK,CAAS;IAEtB,OAAO,CAAC,aAAa,CAA8C;IAEnE,OAAO,CAAC,OAAO,CAAS;IAExB,IAAI,cAAc,IAAI,cAAc,GAAG,IAAI,CAY1C;IAED,IAAI,OAAO,IAAI,WAAW,GAAG,IAAI,CAEhC;IAED,IAAI,EAAE,QAEL;IAED,IAAI,YAAY,IAAI,YAAY,GAAG,SAAS,CAE3C;gBAGC,MAAM,EAAE,YAAY;IAKtB,EAAE,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAIlE,GAAG,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAInE,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC;IAIjC,IAAI,CAAC,aAAa,EAAE,WAAW;IA2BrC,OAAO;IAeP,KAAK;IAKL,IAAI;IAKJ,MAAM,CAAC,IAAI,EAAE,MAAM;IAKnB,IAAI;IAKJ,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY;IAI1C,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY;IAI5C,OAAO,CAAC,UAAU;YAgBJ,MAAM;IA8CpB,OAAO,CAAC,MAAM,CA2CZ;IAEF,OAAO,CAAC,gBAAgB;IAqCxB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,wBAAwB;IAMhC,OAAO,CAAC,qBAAqB;CAuC9B"}
|
package/lib/Player.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { Browser, Events as ClapprEvents,
|
|
2
|
-
// HTML5Video,
|
|
3
|
-
Log, Player as PlayerClappr, $, Loader, } from '@clappr/core';
|
|
1
|
+
import { Browser, Events as ClapprEvents, Log, Player as PlayerClappr, $, Loader, } from '@clappr/core';
|
|
4
2
|
import assert from 'assert';
|
|
5
3
|
import EventLite from "event-lite";
|
|
6
4
|
import { reportError } from "./trace/index.js";
|
|
@@ -18,13 +16,13 @@ const DEFAULT_OPTIONS = {
|
|
|
18
16
|
* @beta
|
|
19
17
|
*/
|
|
20
18
|
export class Player {
|
|
19
|
+
bitrateInfo = null;
|
|
20
|
+
config;
|
|
21
21
|
emitter = new EventLite();
|
|
22
22
|
player = null;
|
|
23
23
|
ready = false;
|
|
24
24
|
tuneInTimerId = null;
|
|
25
25
|
tunedIn = false;
|
|
26
|
-
config;
|
|
27
|
-
bitrateInfo = null;
|
|
28
26
|
get activePlayback() {
|
|
29
27
|
if (!this.player?.core.activePlayback) {
|
|
30
28
|
return null;
|
|
@@ -84,6 +82,13 @@ export class Player {
|
|
|
84
82
|
this.player.destroy();
|
|
85
83
|
this.player = null;
|
|
86
84
|
}
|
|
85
|
+
this.ready = false;
|
|
86
|
+
this.tunedIn = false;
|
|
87
|
+
if (this.tuneInTimerId) {
|
|
88
|
+
clearTimeout(this.tuneInTimerId);
|
|
89
|
+
this.tuneInTimerId = null;
|
|
90
|
+
}
|
|
91
|
+
this.bitrateInfo = null;
|
|
87
92
|
}
|
|
88
93
|
pause() {
|
|
89
94
|
assert.ok(this.player, 'Player not initialized');
|
|
@@ -246,7 +251,6 @@ export class Player {
|
|
|
246
251
|
configurePlaybacks() {
|
|
247
252
|
Loader.registerPlayback(DashPlayback);
|
|
248
253
|
Loader.registerPlayback(HlsPlayback);
|
|
249
|
-
// Loader.registerPlayback(HTML5Video); // registered by default
|
|
250
254
|
}
|
|
251
255
|
bindBitrateChangeHandler() {
|
|
252
256
|
this.player?.core.activeContainer.on(ClapprEvents.CONTAINER_BITRATE, (bitrate) => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Client } from "@sentry/
|
|
1
|
+
import { Client } from "@sentry/core";
|
|
2
2
|
/**
|
|
3
3
|
* @beta
|
|
4
4
|
*/
|
|
@@ -6,6 +6,6 @@ export declare class SentryTracer {
|
|
|
6
6
|
private client;
|
|
7
7
|
constructor(client: Client);
|
|
8
8
|
reportError(e: Error): void;
|
|
9
|
-
trace(
|
|
9
|
+
trace(message: string, data?: Record<string, unknown>): void;
|
|
10
10
|
}
|
|
11
11
|
//# sourceMappingURL=SentryTracer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SentryTracer.d.ts","sourceRoot":"","sources":["../../src/trace/SentryTracer.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"SentryTracer.d.ts","sourceRoot":"","sources":["../../src/trace/SentryTracer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,cAAc,CAAC;AAErD;;GAEG;AACH,qBAAa,YAAY;IACX,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAElC,WAAW,CAAC,CAAC,EAAE,KAAK;IAIpB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAQtD"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { addBreadcrumb } from "@sentry/core";
|
|
1
2
|
/**
|
|
2
3
|
* @beta
|
|
3
4
|
*/
|
|
@@ -9,8 +10,11 @@ export class SentryTracer {
|
|
|
9
10
|
reportError(e) {
|
|
10
11
|
this.client.captureException(e);
|
|
11
12
|
}
|
|
12
|
-
trace(
|
|
13
|
-
|
|
13
|
+
trace(message, data) {
|
|
14
|
+
addBreadcrumb({
|
|
15
|
+
type: "default",
|
|
16
|
+
level: "info",
|
|
17
|
+
message,
|
|
14
18
|
data,
|
|
15
19
|
});
|
|
16
20
|
}
|
package/lib/types.d.ts
CHANGED
|
@@ -14,11 +14,10 @@ export type PlayerConfig = {
|
|
|
14
14
|
loop?: boolean;
|
|
15
15
|
multisources: StreamMediaSource[];
|
|
16
16
|
mute?: boolean;
|
|
17
|
-
playbackType
|
|
17
|
+
playbackType?: PlaybackType;
|
|
18
18
|
pluginSettings?: Record<string, unknown>;
|
|
19
19
|
poster?: string;
|
|
20
20
|
priorityTransport?: TransportPreference;
|
|
21
|
-
realtimeApi?: string;
|
|
22
21
|
strings: TranslationSettings;
|
|
23
22
|
};
|
|
24
23
|
export type PlayerOptionsThumbnails = {
|
package/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AACxE,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,OAAO,CAAC;AAE3D,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,CAAC;AAC1C,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;AACvD,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,MAAM,CAAC;AAE1D,MAAM,MAAM,YAAY,GAAG;IACzB,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/Player.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Browser,
|
|
3
3
|
Events as ClapprEvents,
|
|
4
|
-
// HTML5Video,
|
|
5
4
|
Log,
|
|
6
5
|
Player as PlayerClappr,
|
|
7
6
|
$,
|
|
@@ -51,6 +50,10 @@ type PluginOptions = Record<string, unknown>;
|
|
|
51
50
|
* @beta
|
|
52
51
|
*/
|
|
53
52
|
export class Player {
|
|
53
|
+
private bitrateInfo: BitrateInfo | null = null;
|
|
54
|
+
|
|
55
|
+
private config: PlayerConfig;
|
|
56
|
+
|
|
54
57
|
private emitter = new EventLite();
|
|
55
58
|
|
|
56
59
|
private player: PlayerClappr | null = null;
|
|
@@ -61,10 +64,6 @@ export class Player {
|
|
|
61
64
|
|
|
62
65
|
private tunedIn = false;
|
|
63
66
|
|
|
64
|
-
private config: PlayerConfig;
|
|
65
|
-
|
|
66
|
-
private bitrateInfo: BitrateInfo | null = null;
|
|
67
|
-
|
|
68
67
|
get activePlayback(): PlaybackModule | null {
|
|
69
68
|
if (!this.player?.core.activePlayback) {
|
|
70
69
|
return null;
|
|
@@ -142,6 +141,13 @@ export class Player {
|
|
|
142
141
|
this.player.destroy();
|
|
143
142
|
this.player = null;
|
|
144
143
|
}
|
|
144
|
+
this.ready = false;
|
|
145
|
+
this.tunedIn = false;
|
|
146
|
+
if (this.tuneInTimerId) {
|
|
147
|
+
clearTimeout(this.tuneInTimerId);
|
|
148
|
+
this.tuneInTimerId = null;
|
|
149
|
+
}
|
|
150
|
+
this.bitrateInfo = null;
|
|
145
151
|
}
|
|
146
152
|
|
|
147
153
|
pause() {
|
|
@@ -229,7 +235,7 @@ export class Player {
|
|
|
229
235
|
setTimeout(() => {
|
|
230
236
|
Log.debug(T, 'autoPlay');
|
|
231
237
|
assert(this.player);
|
|
232
|
-
this.player.play({ autoPlay: true});
|
|
238
|
+
this.player.play({ autoPlay: true });
|
|
233
239
|
}, 0)
|
|
234
240
|
}
|
|
235
241
|
}
|
|
@@ -319,7 +325,6 @@ export class Player {
|
|
|
319
325
|
private configurePlaybacks() {
|
|
320
326
|
Loader.registerPlayback(DashPlayback);
|
|
321
327
|
Loader.registerPlayback(HlsPlayback);
|
|
322
|
-
// Loader.registerPlayback(HTML5Video); // registered by default
|
|
323
328
|
}
|
|
324
329
|
|
|
325
330
|
private bindBitrateChangeHandler() {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {Client} from "@sentry/
|
|
1
|
+
import { Client, addBreadcrumb } from "@sentry/core";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @beta
|
|
@@ -10,8 +10,11 @@ export class SentryTracer {
|
|
|
10
10
|
this.client.captureException(e);
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
trace(
|
|
14
|
-
|
|
13
|
+
trace(message: string, data?: Record<string, unknown>) {
|
|
14
|
+
addBreadcrumb({
|
|
15
|
+
type: "default",
|
|
16
|
+
level: "info",
|
|
17
|
+
message,
|
|
15
18
|
data,
|
|
16
19
|
});
|
|
17
20
|
}
|
package/src/types.ts
CHANGED
|
@@ -15,13 +15,12 @@ export type PlayerConfig = {
|
|
|
15
15
|
debug?: PlayerDebugSettings;
|
|
16
16
|
language?: string;
|
|
17
17
|
loop?: boolean;
|
|
18
|
-
multisources: StreamMediaSource[];
|
|
18
|
+
multisources: StreamMediaSource[]; // TODO rename sources
|
|
19
19
|
mute?: boolean;
|
|
20
|
-
playbackType
|
|
20
|
+
playbackType?: PlaybackType;
|
|
21
21
|
pluginSettings?: Record<string, unknown>;
|
|
22
22
|
poster?: string;
|
|
23
23
|
priorityTransport?: TransportPreference;
|
|
24
|
-
realtimeApi?: string;
|
|
25
24
|
strings: TranslationSettings;
|
|
26
25
|
}
|
|
27
26
|
|
|
@@ -73,6 +72,7 @@ export type StreamMediaSourceDto = {
|
|
|
73
72
|
vtt: string | null;
|
|
74
73
|
}
|
|
75
74
|
|
|
75
|
+
// TODO split into sources and source attributes
|
|
76
76
|
export type StreamMediaSource = {
|
|
77
77
|
description: string;
|
|
78
78
|
dvr: boolean;
|