stormcloud-video-player 0.8.19 → 0.8.20
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/stormcloud-vp.min.js +1 -1
- package/lib/index.cjs +53 -9
- package/lib/index.cjs.map +1 -1
- package/lib/index.js +53 -9
- package/lib/index.js.map +1 -1
- package/lib/player/AdBreakOrchestrator.d.cts +1 -1
- package/lib/player/AdConfigManager.cjs +60 -5
- package/lib/player/AdConfigManager.cjs.map +1 -1
- package/lib/player/AdConfigManager.d.cts +1 -1
- package/lib/player/AdPreloadPool.d.cts +1 -1
- package/lib/player/AdTimingService.d.cts +1 -1
- package/lib/player/HlsEngine.d.cts +1 -1
- package/lib/player/PlayerControls.d.cts +1 -1
- package/lib/player/Scte35CueManager.d.cts +1 -1
- package/lib/player/Scte35Parser.d.cts +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +53 -9
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/player/playerTypes.d.cts +1 -1
- package/lib/players/HlsPlayer.cjs +53 -9
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +53 -9
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.cjs +5 -4
- package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.d.cts +1 -1
- package/lib/types-BAP8n5mE.d.cts +126 -0
- package/lib/ui/StormcloudVideoPlayer.cjs +53 -9
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/utils/ctvVastSignals.cjs +12 -1
- package/lib/utils/ctvVastSignals.cjs.map +1 -1
- package/lib/utils/tracking.d.cts +1 -1
- package/lib/utils/vastEnvironmentSignals.cjs +12 -1
- package/lib/utils/vastEnvironmentSignals.cjs.map +1 -1
- package/lib/utils/vastMacros.cjs +48 -0
- package/lib/utils/vastMacros.cjs.map +1 -1
- package/package.json +1 -1
|
@@ -827,6 +827,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
827
827
|
handleAdComplete();
|
|
828
828
|
});
|
|
829
829
|
adVideoElement.addEventListener("error", function(e) {
|
|
830
|
+
if (!adPlaying) return;
|
|
830
831
|
console.error("[HlsAdPlayer] Ad video error:", e);
|
|
831
832
|
if (currentAd) {
|
|
832
833
|
fireTrackingPixels(currentAd.trackingUrls.error);
|
|
@@ -1028,15 +1029,15 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1028
1029
|
adVideoElement.muted = originalMutedState;
|
|
1029
1030
|
console.log("[HlsAdPlayer] Set ad video volume to ".concat(adVideoElement.volume, ", muted: ").concat(adVideoElement.muted, ", originalMutedState: ").concat(originalMutedState, ", contentVolume: ").concat(contentVolume));
|
|
1030
1031
|
}
|
|
1032
|
+
mediaFile = selectBestMediaFile(currentAd.mediaFiles);
|
|
1033
|
+
if (!mediaFile) {
|
|
1034
|
+
throw new Error("No media file available for ad");
|
|
1035
|
+
}
|
|
1031
1036
|
if (adContainerEl) {
|
|
1032
1037
|
adContainerEl.style.display = "flex";
|
|
1033
1038
|
adContainerEl.style.pointerEvents = "auto";
|
|
1034
1039
|
}
|
|
1035
1040
|
emit("content_pause");
|
|
1036
|
-
mediaFile = selectBestMediaFile(currentAd.mediaFiles);
|
|
1037
|
-
if (!mediaFile) {
|
|
1038
|
-
throw new Error("No media file available for ad");
|
|
1039
|
-
}
|
|
1040
1041
|
isHlsAd = isHlsMediaFile(mediaFile);
|
|
1041
1042
|
console.log("[HlsAdPlayer] Loading ".concat(isHlsAd ? "HLS" : "progressive", " ad from: ").concat(mediaFile.url));
|
|
1042
1043
|
if (isHlsAd && import_hls.default.isSupported()) {
|
|
@@ -2324,9 +2325,20 @@ function initializePolyfills() {
|
|
|
2324
2325
|
}
|
|
2325
2326
|
// src/utils/vastEnvironmentSignals.ts
|
|
2326
2327
|
var AIRY_ANDROID_APP_ID = "com.freeairytv.android";
|
|
2328
|
+
var AIRY_WEBOS_APP_ID = "com.freeairytv.webos";
|
|
2329
|
+
var AIRY_TIZEN_APP_ID = "com.freeairytv.samsung";
|
|
2330
|
+
var AIRY_ROKU_APP_ID = "com.freeairytv.roku";
|
|
2327
2331
|
var AIRY_APP_NAME = "AiryTV Movies & TV";
|
|
2328
2332
|
var AIRY_DEFAULT_CONTENT_URL = "https://live.airy.tv";
|
|
2329
2333
|
var CTV_SESSION_STORAGE_KEY = "stormcloud.ctv.sid";
|
|
2334
|
+
function getDefaultAppId() {
|
|
2335
|
+
if (typeof navigator === "undefined") return AIRY_ANDROID_APP_ID;
|
|
2336
|
+
var ua = navigator.userAgent;
|
|
2337
|
+
if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;
|
|
2338
|
+
if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;
|
|
2339
|
+
if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;
|
|
2340
|
+
return AIRY_ANDROID_APP_ID;
|
|
2341
|
+
}
|
|
2330
2342
|
var DEVICE_ID_STORAGE_KEYS = [
|
|
2331
2343
|
"rdid",
|
|
2332
2344
|
"ifa",
|
|
@@ -2353,7 +2365,7 @@ function resolveVastEnvironmentSignals(isCtv) {
|
|
|
2353
2365
|
return _object_spread_props(_object_spread({
|
|
2354
2366
|
isCtv: true,
|
|
2355
2367
|
contentUrl: bridgeSignals.contentUrl || readStoredString("contentUrl") || AIRY_DEFAULT_CONTENT_URL,
|
|
2356
|
-
appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") ||
|
|
2368
|
+
appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || getDefaultAppId(),
|
|
2357
2369
|
appName: bridgeSignals.appName || readStoredString("appName") || readStoredString("an") || AIRY_APP_NAME,
|
|
2358
2370
|
sessionId: getOrCreateCtvSessionId()
|
|
2359
2371
|
}, deviceId ? {
|
|
@@ -2899,6 +2911,29 @@ function normalizeVastTagUrl(raw) {
|
|
|
2899
2911
|
if (!raw) return raw;
|
|
2900
2912
|
try {
|
|
2901
2913
|
var url = new URL(raw);
|
|
2914
|
+
var anValue = url.searchParams.get("an");
|
|
2915
|
+
if (anValue !== null) {
|
|
2916
|
+
var orphanFragments = [];
|
|
2917
|
+
url.searchParams.forEach(function(_value, key) {
|
|
2918
|
+
if (key && INVALID_VAST_PARAM_KEY.test(key)) {
|
|
2919
|
+
orphanFragments.push(key.trim());
|
|
2920
|
+
}
|
|
2921
|
+
});
|
|
2922
|
+
if (orphanFragments.length > 0) {
|
|
2923
|
+
var reconstructed = [
|
|
2924
|
+
anValue.trimEnd()
|
|
2925
|
+
].concat(_to_consumable_array(orphanFragments)).filter(Boolean).join(" & ");
|
|
2926
|
+
url.searchParams.forEach(function(_value, key) {
|
|
2927
|
+
if (key && INVALID_VAST_PARAM_KEY.test(key)) {
|
|
2928
|
+
url.searchParams.delete(key);
|
|
2929
|
+
}
|
|
2930
|
+
});
|
|
2931
|
+
url.searchParams.set("an", reconstructed);
|
|
2932
|
+
return url.toString().replace(/([?&]an=)([^&]*)/, function(_match, prefix, val) {
|
|
2933
|
+
return prefix + val.replace(/\+/g, "%20");
|
|
2934
|
+
});
|
|
2935
|
+
}
|
|
2936
|
+
}
|
|
2902
2937
|
removeBrokenAppNameOrphans(url.searchParams);
|
|
2903
2938
|
return url.toString();
|
|
2904
2939
|
} catch (unused) {
|
|
@@ -4306,7 +4341,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
|
|
|
4306
4341
|
key: "fetchAdConfiguration",
|
|
4307
4342
|
value: function fetchAdConfiguration() {
|
|
4308
4343
|
return _async_to_generator(function() {
|
|
4309
|
-
var _data_response_ima_publisherdeskima, _data_response_ima, _data_response, _data_response_options_vast_cue_tones, _data_response_options_vast, _data_response_options, _data_response1, vastMode, vastEndpoint, apiUrl, headers, response, data, imaPayload, numberAds;
|
|
4344
|
+
var _data_response_ima_publisherdeskima, _data_response_ima, _data_response, _data_response_options_vast_cue_tones, _data_response_options_vast, _data_response_options, _data_response1, vastMode, vastEndpoint, apiUrl, headers, response, data, imaPayload, decodedPayload, numberAds;
|
|
4310
4345
|
return _ts_generator(this, function(_state) {
|
|
4311
4346
|
switch(_state.label){
|
|
4312
4347
|
case 0:
|
|
@@ -4390,9 +4425,16 @@ var AdConfigManager = /*#__PURE__*/ function() {
|
|
|
4390
4425
|
data = _state.sent();
|
|
4391
4426
|
imaPayload = (_data_response = data.response) === null || _data_response === void 0 ? void 0 : (_data_response_ima = _data_response.ima) === null || _data_response_ima === void 0 ? void 0 : (_data_response_ima_publisherdeskima = _data_response_ima["publisherdesk.ima"]) === null || _data_response_ima_publisherdeskima === void 0 ? void 0 : _data_response_ima_publisherdeskima.payload;
|
|
4392
4427
|
if (imaPayload) {
|
|
4393
|
-
|
|
4428
|
+
decodedPayload = imaPayload;
|
|
4429
|
+
try {
|
|
4430
|
+
decodedPayload = decodeURIComponent(imaPayload);
|
|
4431
|
+
} catch (unused) {
|
|
4432
|
+
console.warn("[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:", imaPayload);
|
|
4433
|
+
}
|
|
4434
|
+
console.log("[StormcloudVideoPlayer] Raw VAST tag URL (from API):", decodedPayload);
|
|
4435
|
+
this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);
|
|
4394
4436
|
if (this.debug) {
|
|
4395
|
-
console.log("[StormcloudVideoPlayer]
|
|
4437
|
+
console.log("[StormcloudVideoPlayer] Normalized VAST tag URL:", this.apiVastTagUrl);
|
|
4396
4438
|
}
|
|
4397
4439
|
} else {
|
|
4398
4440
|
if (this.debug) {
|
|
@@ -4726,7 +4768,9 @@ var AdConfigManager = /*#__PURE__*/ function() {
|
|
|
4726
4768
|
adTest: this.config.adTest,
|
|
4727
4769
|
consent: this.consentSignals
|
|
4728
4770
|
});
|
|
4729
|
-
|
|
4771
|
+
var finalUrl = palNonce.injectNonce(urlWithMacros);
|
|
4772
|
+
console.log("[StormcloudVideoPlayer] Resolved ad request URL (pod=".concat(this.podCounter, ", pos=").concat(this.adRequestPositionInBreak, "):"), finalUrl);
|
|
4773
|
+
urls.push(finalUrl);
|
|
4730
4774
|
}
|
|
4731
4775
|
return urls;
|
|
4732
4776
|
}
|