@ngxsplayer/ngx-smart-player-ima 0.0.1-next.0

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.
@@ -0,0 +1,107 @@
1
+ class ImaAdsPlugin {
2
+ cfg;
3
+ id = 'ima-ads';
4
+ constructor(cfg) {
5
+ this.cfg = cfg;
6
+ }
7
+ adsManager = null;
8
+ adsLoader = null;
9
+ adDisplayContainer = null;
10
+ inAd = false;
11
+ async onInit(ctx) {
12
+ ctx.facade.ads = {
13
+ request: (tagUrl) => this.request(ctx, tagUrl),
14
+ skip: () => this.skip(),
15
+ isInAd: () => this.inAd
16
+ };
17
+ }
18
+ async onLoaded(ctx) {
19
+ if (this.cfg.autoPlayPreroll !== false) {
20
+ await this.request(ctx, this.cfg.adTagUrl);
21
+ }
22
+ }
23
+ async onDestroy() {
24
+ try {
25
+ this.adsManager?.destroy?.();
26
+ }
27
+ catch { }
28
+ this.adsManager = null;
29
+ this.adsLoader = null;
30
+ this.adDisplayContainer = null;
31
+ this.inAd = false;
32
+ }
33
+ ensureIma() {
34
+ const ima = globalThis.google?.ima;
35
+ if (!ima)
36
+ throw new Error('IMA SDK not found. Include ima3.js in your app.');
37
+ return ima;
38
+ }
39
+ findVideoElement() {
40
+ const v = document.querySelector('ngx-smart-player video');
41
+ if (!v)
42
+ throw new Error('Could not find ngx-smart-player video element for IMA');
43
+ return v;
44
+ }
45
+ async request(_ctx, tagUrl) {
46
+ const ima = this.ensureIma();
47
+ const videoEl = this.findVideoElement();
48
+ const container = videoEl.parentElement ?? document.body;
49
+ if (!this.adDisplayContainer) {
50
+ this.adDisplayContainer = new ima.AdDisplayContainer(container, videoEl);
51
+ this.adsLoader = new ima.AdsLoader(this.adDisplayContainer);
52
+ this.adsLoader.addEventListener(ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, (e) => this.onAdsManagerLoaded(e, ima, videoEl), false);
53
+ this.adsLoader.addEventListener(ima.AdErrorEvent.Type.AD_ERROR, (e) => this.onAdError(e), false);
54
+ }
55
+ this.adDisplayContainer.initialize();
56
+ const req = new ima.AdsRequest();
57
+ req.adTagUrl = tagUrl;
58
+ req.linearAdSlotWidth = container.clientWidth || 640;
59
+ req.linearAdSlotHeight = container.clientHeight || 360;
60
+ req.nonLinearAdSlotWidth = req.linearAdSlotWidth;
61
+ req.nonLinearAdSlotHeight = 150;
62
+ this.adsLoader.requestAds(req);
63
+ }
64
+ onAdsManagerLoaded(e, ima, videoEl) {
65
+ const settings = new ima.AdsRenderingSettings();
66
+ this.adsManager = e.getAdsManager(videoEl, settings);
67
+ this.adsManager.addEventListener(ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, () => {
68
+ this.inAd = true;
69
+ videoEl.pause();
70
+ });
71
+ this.adsManager.addEventListener(ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, () => {
72
+ this.inAd = false;
73
+ void videoEl.play();
74
+ });
75
+ this.adsManager.addEventListener(ima.AdErrorEvent.Type.AD_ERROR, (err) => this.onAdError(err));
76
+ try {
77
+ this.adsManager.init(videoEl.clientWidth || 640, videoEl.clientHeight || 360, ima.ViewMode.NORMAL);
78
+ this.adsManager.start();
79
+ }
80
+ catch (err) {
81
+ this.onAdError(err);
82
+ }
83
+ }
84
+ onAdError(e) {
85
+ if (this.cfg.debug)
86
+ console.warn('[IMA] ad error', e);
87
+ try {
88
+ this.adsManager?.destroy?.();
89
+ }
90
+ catch { }
91
+ this.adsManager = null;
92
+ this.inAd = false;
93
+ }
94
+ async skip() {
95
+ try {
96
+ this.adsManager?.skip?.();
97
+ }
98
+ catch { }
99
+ }
100
+ }
101
+
102
+ /**
103
+ * Generated bundle index. Do not edit.
104
+ */
105
+
106
+ export { ImaAdsPlugin };
107
+ //# sourceMappingURL=ngxsplayer-ngx-smart-player-ima.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngxsplayer-ngx-smart-player-ima.mjs","sources":["../../../projects/ngx-smart-player-ima/src/lib/ima-ads.plugin.ts","../../../projects/ngx-smart-player-ima/src/ngxsplayer-ngx-smart-player-ima.ts"],"sourcesContent":["import { PlayerPlugin, PlayerContext } from '@ngxsp/core';\nimport { ImaConfig } from './ima.types';\n\nexport class ImaAdsPlugin implements PlayerPlugin {\n id = 'ima-ads';\n\n constructor(private cfg: ImaConfig) {}\n\n private adsManager: any | null = null;\n private adsLoader: any | null = null;\n private adDisplayContainer: any | null = null;\n private inAd = false;\n\n async onInit(ctx: PlayerContext): Promise<void> {\n (ctx.facade as any).ads = {\n request: (tagUrl: string) => this.request(ctx, tagUrl),\n skip: () => this.skip(),\n isInAd: () => this.inAd\n };\n }\n\n async onLoaded(ctx: PlayerContext): Promise<void> {\n if (this.cfg.autoPlayPreroll !== false) {\n await this.request(ctx, this.cfg.adTagUrl);\n }\n }\n\n async onDestroy(): Promise<void> {\n try { this.adsManager?.destroy?.(); } catch {}\n this.adsManager = null;\n this.adsLoader = null;\n this.adDisplayContainer = null;\n this.inAd = false;\n }\n\n private ensureIma(): any {\n const ima = (globalThis as any).google?.ima;\n if (!ima) throw new Error('IMA SDK not found. Include ima3.js in your app.');\n return ima;\n }\n\n private findVideoElement(): HTMLVideoElement {\n const v = document.querySelector('ngx-smart-player video') as HTMLVideoElement | null;\n if (!v) throw new Error('Could not find ngx-smart-player video element for IMA');\n return v;\n }\n\n private async request(_ctx: PlayerContext, tagUrl: string): Promise<void> {\n const ima = this.ensureIma();\n const videoEl = this.findVideoElement();\n const container = videoEl.parentElement ?? document.body;\n\n if (!this.adDisplayContainer) {\n this.adDisplayContainer = new ima.AdDisplayContainer(container, videoEl);\n this.adsLoader = new ima.AdsLoader(this.adDisplayContainer);\n\n this.adsLoader.addEventListener(\n ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n (e: any) => this.onAdsManagerLoaded(e, ima, videoEl),\n false\n );\n this.adsLoader.addEventListener(\n ima.AdErrorEvent.Type.AD_ERROR,\n (e: any) => this.onAdError(e),\n false\n );\n }\n\n this.adDisplayContainer.initialize();\n\n const req = new ima.AdsRequest();\n req.adTagUrl = tagUrl;\n req.linearAdSlotWidth = container.clientWidth || 640;\n req.linearAdSlotHeight = container.clientHeight || 360;\n req.nonLinearAdSlotWidth = req.linearAdSlotWidth;\n req.nonLinearAdSlotHeight = 150;\n\n this.adsLoader.requestAds(req);\n }\n\n private onAdsManagerLoaded(e: any, ima: any, videoEl: HTMLVideoElement): void {\n const settings = new ima.AdsRenderingSettings();\n this.adsManager = e.getAdsManager(videoEl, settings);\n\n this.adsManager.addEventListener(ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, () => {\n this.inAd = true;\n videoEl.pause();\n });\n this.adsManager.addEventListener(ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, () => {\n this.inAd = false;\n void videoEl.play();\n });\n this.adsManager.addEventListener(ima.AdErrorEvent.Type.AD_ERROR, (err: any) => this.onAdError(err));\n\n try {\n this.adsManager.init(videoEl.clientWidth || 640, videoEl.clientHeight || 360, ima.ViewMode.NORMAL);\n this.adsManager.start();\n } catch (err) {\n this.onAdError(err);\n }\n }\n\n private onAdError(e: any): void {\n if (this.cfg.debug) console.warn('[IMA] ad error', e);\n try { this.adsManager?.destroy?.(); } catch {}\n this.adsManager = null;\n this.inAd = false;\n }\n\n private async skip(): Promise<void> {\n try { this.adsManager?.skip?.(); } catch {}\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,29 @@
1
+ import { PlayerPlugin, PlayerContext } from '@ngxsp/core';
2
+
3
+ interface ImaConfig {
4
+ adTagUrl: string;
5
+ autoPlayPreroll?: boolean;
6
+ debug?: boolean;
7
+ }
8
+
9
+ declare class ImaAdsPlugin implements PlayerPlugin {
10
+ private cfg;
11
+ id: string;
12
+ constructor(cfg: ImaConfig);
13
+ private adsManager;
14
+ private adsLoader;
15
+ private adDisplayContainer;
16
+ private inAd;
17
+ onInit(ctx: PlayerContext): Promise<void>;
18
+ onLoaded(ctx: PlayerContext): Promise<void>;
19
+ onDestroy(): Promise<void>;
20
+ private ensureIma;
21
+ private findVideoElement;
22
+ private request;
23
+ private onAdsManagerLoaded;
24
+ private onAdError;
25
+ private skip;
26
+ }
27
+
28
+ export { ImaAdsPlugin };
29
+ export type { ImaConfig };
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@ngxsplayer/ngx-smart-player-ima",
3
+ "version": "0.0.1-next.0",
4
+ "description": "Google IMA CSAI integration for ngx-smart-player (separate package).",
5
+ "keywords": [
6
+ "angular",
7
+ "video",
8
+ "ads",
9
+ "ima",
10
+ "vast",
11
+ "vmap"
12
+ ],
13
+ "license": "MIT",
14
+ "peerDependencies": {
15
+ "@angular/common": ">=16.0.0",
16
+ "@angular/core": ">=16.0.0",
17
+ "rxjs": ">=7.0.0",
18
+ "@ngxsplayer/ngx-smart-player": "0.0.1-next.0",
19
+ "@ngxsp/core": "0.0.1-next.0"
20
+ },
21
+ "sideEffects": false,
22
+ "dependencies": {
23
+ "tslib": "^2.3.0"
24
+ },
25
+ "peerDependenciesMeta": {
26
+ "@ngxsp/core": {
27
+ "optional": false
28
+ }
29
+ },
30
+ "module": "fesm2022/ngxsplayer-ngx-smart-player-ima.mjs",
31
+ "typings": "index.d.ts",
32
+ "exports": {
33
+ "./package.json": {
34
+ "default": "./package.json"
35
+ },
36
+ ".": {
37
+ "types": "./index.d.ts",
38
+ "default": "./fesm2022/ngxsplayer-ngx-smart-player-ima.mjs"
39
+ }
40
+ }
41
+ }