Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/Eyevinn/player-analytics-client-sdk-web
EPAS Client SDK for Web
https://github.com/Eyevinn/player-analytics-client-sdk-web
library
Last synced: 3 months ago
JSON representation
EPAS Client SDK for Web
- Host: GitHub
- URL: https://github.com/Eyevinn/player-analytics-client-sdk-web
- Owner: Eyevinn
- License: mit
- Created: 2021-12-20T11:06:03.000Z (almost 3 years ago)
- Default Branch: master
- Last Pushed: 2022-03-08T16:14:54.000Z (over 2 years ago)
- Last Synced: 2024-07-12T15:51:38.248Z (4 months ago)
- Topics: library
- Language: TypeScript
- Homepage:
- Size: 2.48 MB
- Stars: 1
- Watchers: 4
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: Readme.md
- License: LICENSE
Awesome Lists containing this project
README
# Player Analytics Client SDK Web
Part of [Eyevinn Player Analytics Specification](https://github.com/Eyevinn/player-analytics-specification). To be used together with [Eyevinn Player Analytics Eventsink](https://github.com/Eyevinn/player-analytics-eventsink)
```
npm install @eyevinn/player-analytics-client-sdk-web
```## Usage
### Automatic Event Listening
```js
import { PlayerAnalyticsConnector } from "@eyevinn/player-analytics-client-sdk-web";// Create your instance and set the analytics eventsink endpoint
const playerAnalytics = new PlayerAnalyticsConnector(
"https://your-eventsink-url.io"
);// Initiate the analytics with the base data needed
// This will create you session in the backend
try {
await playerAnalytics.init({
sessionId: "generated-unique-uuid-session-id",
});// Get your video element from the site, or your video player of choice
const videoElement = document.querySelector("video");
// Load the analytics library with the video element to fetch the events
playerAnalytics.load(videoElement);
} catch (err) {
console.error(err);
// Remove event listeners and heartbeat timers if init fails.
playerAnalytics.deinit();
}
```Due to bitrate changes not being reported, and errors not being reported in any descriptive way, there is a possibility to do separate calls for these events - which you may trigger based on you video player of choice following these examples.
```js
playerAnalytics.reportBitrateChange({
bitrate: 246.440, // bitrate in Kbps
width: 320, // optional, video width in pixels
height: 136, // optional, video height in pixels
videoBitrate: 0, // optional, if available provide the bitrate for the video track
audioBitrate: 0, // optional, if available provide the bitrate for the audio track
});
``````js
// error is fatal, i.e. sends an end event as well
playerAnalytics.reportError({
category: "", // optional, eg. NETWORK, DECODER, etc.
code: "",
message: "", // optional
data: {}, // optional
});// warning is not fatal
playerAnalytics.reportWarning({
category: "", // optional, eg. NETWORK, DECODER, etc.
code: "",
message: "", // optional
data: {}, // optional
});
``````js
// when leaving the player, to stop the analytics in a correct manor
playerAnalytics.reportStop();
playerAnalytics.destroy();
```### Manual Event Triggering
```js
import { PlayerAnalytics } from "@eyevinn/player-analytics-client-sdk-web";// Create your instance and set the analytics eventsink endpoint
const playerAnalytics = new PlayerAnalytics("https://your-eventsink-url.io");
await playerAnalytics.initiateAnalyticsReporter({
sessionId: "generated-unique-uuid-session-id",
contentId: "big-buck-bunny-720",
contentUrl:
"https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/720/Big_Buck_Bunny_720_10s_1MB.mp4",
});// then trigger the method calls accordingly, e.g.
const videoElement = document.querySelector("video");
videoElement.addEventListener("play", () => {
playerAnalytics.playing({
event: "playing",
timestamp: Date.now(),
playhead: 0,
duration: 3600,
sessionId: "generated-unique-uuid-session-id",
});
});
```### Report Metadata
You can report your metadata at a later stage in your code and tailor ther callbacks for your tech stach, for example when you have parsed your manifest.
In this example we're using hls.js```js
import Hls from "hls.js";
import { PlayerAnalyticsConnector } from "@eyevinn/player-analytics-client-sdk-web";// Create your instance and set the analytics eventsink endpoint
const playerAnalytics = new PlayerAnalytics("https://your-eventsink-url.io");
await playerAnalytics.initiateAnalyticsReporter({
sessionId: "generated-unique-uuid-session-id",
});const hls = new Hls();
const videoElement = document.querySelector("video");hls.attachMedia(videoElement);
hls.load(src);
hls.on(Hls.Events.LEVEL_LOADED, (event, data) => {
playerAnalytics.metadata({
live: data?.details?.level?.live,
});
});
```These are the available keys for metadata, which can be sent anytime between a `init` and a `stopped` call.
```ts
export interface TMetadataEventPayload {
live?: boolean;
contentTitle?: string;
contentId?: string;
contentUrl?: string;
drmType?: string;
userId?: string;
deviceId?: string;
deviceModel?: string;
deviceType?: string;
}
```### Constructor parameters
These applies to both the `PlayerAnalyticsConnector` and `PlayerAnalytics`.
- `eventsinkUrl`, the url to your event sink.
- `debug`, default false, triggers output to dev console rather than actual http posts.### Init parameters
```ts
export interface IPlayerAnalyticsInitOptions {
sessionId?: string; // should be generated by the backend if not sent in
hearbeatInterval?: number; //Defaults to 30_000 (ms)
}
```## Development
Run the demo page by `npm start`
## Release
- Pull latest master
- `npm version patch | minor | major`
- This triggers an update of the version in package.json + creates a tag with that version number
- This will automatically be pushed to Github upon success.
- At github.com go to releases (far right)
- click "Draft a new release"
- choose your tag
- give it a name (preferably your version number, e.g. `v0.0.1`)
- click "Auto-generate release notes"
- click "Publish release"
- A Github Action is triggered to do the releases towards the npmjs and github packages repositories.