@mottosports/motto-video-player 1.0.1-rc.36 → 1.0.1-rc.38
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.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +291 -35
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +315 -59
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1106,8 +1106,8 @@ styleInject(`/*! tailwindcss v4.1.8 | MIT License | https://tailwindcss.com */
|
|
|
1106
1106
|
import { forwardRef, useEffect as useEffect5, useRef as useRef8, useImperativeHandle } from "react";
|
|
1107
1107
|
import shaka3 from "shaka-player/dist/shaka-player.ui";
|
|
1108
1108
|
|
|
1109
|
-
// src/hooks/
|
|
1110
|
-
import { useRef, useCallback } from "react";
|
|
1109
|
+
// src/hooks/useShakaPlayer.ts
|
|
1110
|
+
import { useRef, useCallback, useState } from "react";
|
|
1111
1111
|
import shaka from "shaka-player/dist/shaka-player.ui";
|
|
1112
1112
|
|
|
1113
1113
|
// src/utils/devices.ts
|
|
@@ -1130,17 +1130,186 @@ var isPlayReadySupported = () => {
|
|
|
1130
1130
|
const isXbox = /Xbox/.test(userAgent);
|
|
1131
1131
|
const isEdge = /Edg/.test(userAgent);
|
|
1132
1132
|
const isIE = /Trident|MSIE/.test(userAgent);
|
|
1133
|
-
|
|
1133
|
+
const isWindows = /Windows/.test(userAgent);
|
|
1134
|
+
return isXbox || (isEdge || isIE) && isWindows;
|
|
1135
|
+
};
|
|
1136
|
+
var isChrome64PlusOnMacOrWindows = () => {
|
|
1137
|
+
if (typeof navigator === "undefined") {
|
|
1138
|
+
return false;
|
|
1139
|
+
}
|
|
1140
|
+
const userAgent = navigator.userAgent || "";
|
|
1141
|
+
const isChromeMatch = userAgent.match(/Chrome\/(\d+)/);
|
|
1142
|
+
if (!isChromeMatch) {
|
|
1143
|
+
return false;
|
|
1144
|
+
}
|
|
1145
|
+
if (/Edg|OPR|Opera/.test(userAgent)) {
|
|
1146
|
+
return false;
|
|
1147
|
+
}
|
|
1148
|
+
const chromeVersion = parseInt(isChromeMatch[1], 10);
|
|
1149
|
+
if (chromeVersion < 64) {
|
|
1150
|
+
return false;
|
|
1151
|
+
}
|
|
1152
|
+
const isMacOS = /Mac OS X|Macintosh/.test(userAgent);
|
|
1153
|
+
const isWindows = /Windows/.test(userAgent);
|
|
1154
|
+
return isMacOS || isWindows;
|
|
1134
1155
|
};
|
|
1135
1156
|
|
|
1136
|
-
// src/hooks/
|
|
1157
|
+
// src/hooks/useShakaPlayer.ts
|
|
1137
1158
|
import initShakaPlayerMux from "@mux/mux-data-shakaplayer";
|
|
1138
1159
|
|
|
1139
1160
|
// package.json
|
|
1140
|
-
var version = "1.0.1-rc.
|
|
1161
|
+
var version = "1.0.1-rc.38";
|
|
1162
|
+
|
|
1163
|
+
// src/utils/licenseCache.ts
|
|
1164
|
+
var PERSISTENT_LICENSE_PREFIX = "motto_lic_";
|
|
1165
|
+
var LICENSE_EXPIRY_MS = 7 * 24 * 60 * 60 * 1e3;
|
|
1166
|
+
var LICENSE_MAX_RETRY_ATTEMPTS = 10;
|
|
1167
|
+
var getAllLicenseCacheKeys = () => {
|
|
1168
|
+
const keys = [];
|
|
1169
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
1170
|
+
const key = localStorage.key(i);
|
|
1171
|
+
if (key?.startsWith(PERSISTENT_LICENSE_PREFIX)) {
|
|
1172
|
+
keys.push(key);
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
return keys;
|
|
1176
|
+
};
|
|
1177
|
+
var getAllLicenseCacheEntries = () => {
|
|
1178
|
+
const keys = getAllLicenseCacheKeys();
|
|
1179
|
+
const entries = [];
|
|
1180
|
+
for (const key of keys) {
|
|
1181
|
+
try {
|
|
1182
|
+
const stored = localStorage.getItem(key);
|
|
1183
|
+
if (stored) {
|
|
1184
|
+
const data = JSON.parse(stored);
|
|
1185
|
+
entries.push({ key, data });
|
|
1186
|
+
}
|
|
1187
|
+
} catch (error) {
|
|
1188
|
+
console.warn(`Failed to parse license cache entry for key ${key}:`, error);
|
|
1189
|
+
localStorage.removeItem(key);
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
return entries;
|
|
1193
|
+
};
|
|
1194
|
+
var evictLRUEntry = () => {
|
|
1195
|
+
const entries = getAllLicenseCacheEntries();
|
|
1196
|
+
if (entries.length === 0) {
|
|
1197
|
+
return false;
|
|
1198
|
+
}
|
|
1199
|
+
entries.sort((a, b) => {
|
|
1200
|
+
const oldestA = Math.min(...a.data.map((session) => session.timestamp));
|
|
1201
|
+
const oldestB = Math.min(...b.data.map((session) => session.timestamp));
|
|
1202
|
+
return oldestA - oldestB;
|
|
1203
|
+
});
|
|
1204
|
+
const lruEntry = entries[0];
|
|
1205
|
+
localStorage.removeItem(lruEntry.key);
|
|
1206
|
+
console.log(`Evicted LRU license cache entry: ${lruEntry.key}`);
|
|
1207
|
+
return true;
|
|
1208
|
+
};
|
|
1209
|
+
var storeWithQuotaHandling = (key, data) => {
|
|
1210
|
+
let attempts = 0;
|
|
1211
|
+
while (attempts < LICENSE_MAX_RETRY_ATTEMPTS) {
|
|
1212
|
+
try {
|
|
1213
|
+
localStorage.setItem(key, data);
|
|
1214
|
+
return true;
|
|
1215
|
+
} catch (error) {
|
|
1216
|
+
if (error instanceof DOMException && (error.code === 22 || // QUOTA_EXCEEDED_ERR
|
|
1217
|
+
error.name === "QuotaExceededError" || error.name === "NS_ERROR_DOM_QUOTA_REACHED")) {
|
|
1218
|
+
console.warn(`QuotaExceededError on attempt ${attempts + 1}, attempting LRU eviction...`);
|
|
1219
|
+
if (!evictLRUEntry()) {
|
|
1220
|
+
console.error("No more entries to evict, storage operation failed");
|
|
1221
|
+
return false;
|
|
1222
|
+
}
|
|
1223
|
+
attempts++;
|
|
1224
|
+
} else {
|
|
1225
|
+
console.error("Failed to store license cache data:", error);
|
|
1226
|
+
return false;
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
}
|
|
1230
|
+
console.error(`Failed to store license cache data after ${LICENSE_MAX_RETRY_ATTEMPTS} eviction attempts`);
|
|
1231
|
+
return false;
|
|
1232
|
+
};
|
|
1233
|
+
var managePersistentLicenseStorage = (playlistId, licenseCacheKey, newSessionMetadata) => {
|
|
1234
|
+
try {
|
|
1235
|
+
const storageKey = `${PERSISTENT_LICENSE_PREFIX}${playlistId}_${licenseCacheKey}`;
|
|
1236
|
+
const stored = localStorage.getItem(storageKey);
|
|
1237
|
+
let existingSessions = [];
|
|
1238
|
+
if (stored) {
|
|
1239
|
+
try {
|
|
1240
|
+
existingSessions = JSON.parse(stored);
|
|
1241
|
+
} catch (parseError) {
|
|
1242
|
+
console.warn("Failed to parse existing persistent license data:", parseError);
|
|
1243
|
+
existingSessions = [];
|
|
1244
|
+
}
|
|
1245
|
+
}
|
|
1246
|
+
const now = Date.now();
|
|
1247
|
+
let validSessions = existingSessions.filter(
|
|
1248
|
+
(session) => now - session.timestamp < LICENSE_EXPIRY_MS
|
|
1249
|
+
);
|
|
1250
|
+
if (newSessionMetadata && newSessionMetadata.length > 0) {
|
|
1251
|
+
const newSessions = newSessionMetadata.map((session) => {
|
|
1252
|
+
const uint8Array = new Uint8Array(session.initData);
|
|
1253
|
+
const binaryString = Array.from(uint8Array).map((byte) => String.fromCharCode(byte)).join("");
|
|
1254
|
+
return {
|
|
1255
|
+
sessionId: session.sessionId,
|
|
1256
|
+
initData: btoa(binaryString),
|
|
1257
|
+
initDataType: session.initDataType,
|
|
1258
|
+
keySystem: session.keySystem,
|
|
1259
|
+
timestamp: now
|
|
1260
|
+
};
|
|
1261
|
+
});
|
|
1262
|
+
const newSessionIds = new Set(newSessions.map((s) => s.sessionId));
|
|
1263
|
+
validSessions = validSessions.filter((session) => !newSessionIds.has(session.sessionId));
|
|
1264
|
+
validSessions = [...validSessions, ...newSessions];
|
|
1265
|
+
}
|
|
1266
|
+
if (validSessions.length === 0) {
|
|
1267
|
+
localStorage.removeItem(storageKey);
|
|
1268
|
+
} else {
|
|
1269
|
+
const dataToStore = JSON.stringify(validSessions);
|
|
1270
|
+
const success = storeWithQuotaHandling(storageKey, dataToStore);
|
|
1271
|
+
if (!success) {
|
|
1272
|
+
console.error(`Failed to store license cache for ${storageKey} after quota handling`);
|
|
1273
|
+
return validSessions;
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
return validSessions;
|
|
1277
|
+
} catch (error) {
|
|
1278
|
+
console.warn("Failed to manage persistent license storage:", error);
|
|
1279
|
+
return [];
|
|
1280
|
+
}
|
|
1281
|
+
};
|
|
1282
|
+
var storePersistentLicense = (playlistId, licenseCacheKey, sessionMetadata) => {
|
|
1283
|
+
managePersistentLicenseStorage(playlistId, licenseCacheKey, sessionMetadata);
|
|
1284
|
+
};
|
|
1285
|
+
var retrievePersistentLicense = (playlistId, licenseCacheKey) => {
|
|
1286
|
+
try {
|
|
1287
|
+
const validSessions = managePersistentLicenseStorage(playlistId, licenseCacheKey);
|
|
1288
|
+
return validSessions.map((session) => ({
|
|
1289
|
+
sessionId: session.sessionId,
|
|
1290
|
+
initData: Uint8Array.from(atob(session.initData), (c) => c.charCodeAt(0)).buffer,
|
|
1291
|
+
initDataType: session.initDataType,
|
|
1292
|
+
keySystem: session.keySystem
|
|
1293
|
+
}));
|
|
1294
|
+
} catch (error) {
|
|
1295
|
+
console.warn("Failed to retrieve persistent license:", error);
|
|
1296
|
+
return [];
|
|
1297
|
+
}
|
|
1298
|
+
};
|
|
1299
|
+
var clearAllPersistentLicenses = () => {
|
|
1300
|
+
try {
|
|
1301
|
+
const keys = getAllLicenseCacheKeys();
|
|
1302
|
+
for (const key of keys) {
|
|
1303
|
+
localStorage.removeItem(key);
|
|
1304
|
+
}
|
|
1305
|
+
console.log(`Cleared ${keys.length} persistent license cache entries`);
|
|
1306
|
+
} catch (error) {
|
|
1307
|
+
console.error("Failed to clear persistent licenses:", error);
|
|
1308
|
+
}
|
|
1309
|
+
};
|
|
1141
1310
|
|
|
1142
|
-
// src/hooks/
|
|
1143
|
-
var
|
|
1311
|
+
// src/hooks/useShakaPlayer.ts
|
|
1312
|
+
var useShakaPlayer = ({
|
|
1144
1313
|
src,
|
|
1145
1314
|
shakaConfig,
|
|
1146
1315
|
drmConfig,
|
|
@@ -1151,8 +1320,26 @@ var useShakePlayer = ({
|
|
|
1151
1320
|
onMuxDataUpdate
|
|
1152
1321
|
}) => {
|
|
1153
1322
|
const playerRef = useRef(null);
|
|
1154
|
-
const
|
|
1323
|
+
const [isRetrying, setIsRetrying] = useState(false);
|
|
1324
|
+
const videoElementRef = useRef(null);
|
|
1325
|
+
const getManifestUrl = useCallback(() => {
|
|
1326
|
+
let manifestUrl = src.url;
|
|
1327
|
+
const isDRM = Boolean(src.drm);
|
|
1328
|
+
if (isDRM) {
|
|
1329
|
+
const isPlayReady = isPlayReadySupported();
|
|
1330
|
+
if (isAppleDevice() && src.drm.fairplay?.certificateUrl) {
|
|
1331
|
+
manifestUrl = src.drm.fairplay.playlistUrl;
|
|
1332
|
+
} else if (isPlayReady && src.drm.playready?.licenseUrl) {
|
|
1333
|
+
manifestUrl = src.drm.playready.playlistUrl;
|
|
1334
|
+
} else {
|
|
1335
|
+
manifestUrl = src.drm?.widevine?.playlistUrl || "";
|
|
1336
|
+
}
|
|
1337
|
+
}
|
|
1338
|
+
return manifestUrl;
|
|
1339
|
+
}, [src]);
|
|
1340
|
+
const initializePlayerInternal = useCallback(async (video) => {
|
|
1155
1341
|
try {
|
|
1342
|
+
videoElementRef.current = video;
|
|
1156
1343
|
shaka.polyfill.installAll();
|
|
1157
1344
|
if (!shaka.Player.isBrowserSupported()) {
|
|
1158
1345
|
throw new Error("Browser not supported by Shaka Player");
|
|
@@ -1163,36 +1350,55 @@ var useShakePlayer = ({
|
|
|
1163
1350
|
if (shakaConfig) {
|
|
1164
1351
|
player.configure(shakaConfig);
|
|
1165
1352
|
}
|
|
1166
|
-
|
|
1353
|
+
const manifestUrl = getManifestUrl();
|
|
1354
|
+
let playlistId = src.id;
|
|
1167
1355
|
const isDRM = Boolean(src.drm);
|
|
1168
|
-
let
|
|
1356
|
+
let storedSessionsMetadata = [];
|
|
1357
|
+
if (isDRM && playlistId) {
|
|
1358
|
+
storedSessionsMetadata = retrievePersistentLicense(playlistId, src.drm.licenseCacheKey ?? "");
|
|
1359
|
+
}
|
|
1169
1360
|
if (isDRM) {
|
|
1170
|
-
const
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
player.configure({
|
|
1181
|
-
drm: {
|
|
1182
|
-
servers: {
|
|
1183
|
-
"com.widevine.alpha": src.drm.widevine?.licenseUrl,
|
|
1184
|
-
"com.microsoft.playready": src.drm.playready?.licenseUrl,
|
|
1185
|
-
"com.apple.fps": src.drm.fairplay?.licenseUrl
|
|
1186
|
-
},
|
|
1187
|
-
...cert && {
|
|
1188
|
-
advanced: {
|
|
1189
|
-
"com.apple.fps": {
|
|
1190
|
-
serverCertificate: new Uint8Array(cert)
|
|
1191
|
-
}
|
|
1361
|
+
const drmConfig2 = {
|
|
1362
|
+
servers: {
|
|
1363
|
+
"com.widevine.alpha": src.drm.widevine?.licenseUrl,
|
|
1364
|
+
"com.microsoft.playready": src.drm.playready?.licenseUrl,
|
|
1365
|
+
"com.apple.fps": src.drm.fairplay?.licenseUrl
|
|
1366
|
+
},
|
|
1367
|
+
...src.drm.fairplay && {
|
|
1368
|
+
advanced: {
|
|
1369
|
+
"com.apple.fps": {
|
|
1370
|
+
serverCertificateUri: src.drm.fairplay.certificateUrl
|
|
1192
1371
|
}
|
|
1193
1372
|
}
|
|
1194
1373
|
}
|
|
1195
|
-
}
|
|
1374
|
+
};
|
|
1375
|
+
drmConfig2.advanced = {
|
|
1376
|
+
...drmConfig2.advanced,
|
|
1377
|
+
"com.widevine.alpha": {
|
|
1378
|
+
...drmConfig2.advanced?.["com.widevine.alpha"],
|
|
1379
|
+
// set to `persistent-license` only on Chrome 64+ on MacOS/Windows: https://shaka-player-demo.appspot.com/docs/api/tutorial-faq.html
|
|
1380
|
+
sessionType: isChrome64PlusOnMacOrWindows() ? "persistent-license" : "temporary"
|
|
1381
|
+
},
|
|
1382
|
+
"com.microsoft.playready": {
|
|
1383
|
+
...drmConfig2.advanced?.["com.microsoft.playready"],
|
|
1384
|
+
sessionType: "temporary"
|
|
1385
|
+
// PlayReady always uses temporary sessions
|
|
1386
|
+
},
|
|
1387
|
+
"com.apple.fps": {
|
|
1388
|
+
...drmConfig2.advanced?.["com.apple.fps"],
|
|
1389
|
+
sessionType: "temporary"
|
|
1390
|
+
// FairPlay always uses temporary sessions - Safari won't play with persistent-license
|
|
1391
|
+
}
|
|
1392
|
+
};
|
|
1393
|
+
if (storedSessionsMetadata.length > 0) {
|
|
1394
|
+
drmConfig2.persistentSessionOnlinePlayback = true;
|
|
1395
|
+
drmConfig2.persistentSessionsMetadata = storedSessionsMetadata.map((session) => ({
|
|
1396
|
+
sessionId: session.sessionId,
|
|
1397
|
+
initData: new Uint8Array(session.initData),
|
|
1398
|
+
initDataType: session.initDataType
|
|
1399
|
+
}));
|
|
1400
|
+
}
|
|
1401
|
+
player.configure({ drm: drmConfig2 });
|
|
1196
1402
|
const netEngine = player.getNetworkingEngine();
|
|
1197
1403
|
if (netEngine) {
|
|
1198
1404
|
netEngine.registerRequestFilter((type, request) => {
|
|
@@ -1216,6 +1422,28 @@ var useShakePlayer = ({
|
|
|
1216
1422
|
if (error?.code === 7e3) {
|
|
1217
1423
|
return;
|
|
1218
1424
|
}
|
|
1425
|
+
if (error?.code >= 6e3 && error?.code < 7e3 && !isRetrying && videoElementRef.current) {
|
|
1426
|
+
console.warn(`DRM error detected (code: ${error.code}), clearing licenses and retrying...`);
|
|
1427
|
+
setIsRetrying(true);
|
|
1428
|
+
clearAllPersistentLicenses();
|
|
1429
|
+
setTimeout(async () => {
|
|
1430
|
+
try {
|
|
1431
|
+
const video2 = videoElementRef.current;
|
|
1432
|
+
const currentPlayer = playerRef.current;
|
|
1433
|
+
if (video2 && currentPlayer) {
|
|
1434
|
+
console.log("Reloading manifest after license cache clear...");
|
|
1435
|
+
await currentPlayer.load(getManifestUrl());
|
|
1436
|
+
console.log("Manifest reloaded successfully");
|
|
1437
|
+
}
|
|
1438
|
+
} catch (retryError) {
|
|
1439
|
+
console.error("Failed to retry after license clear:", retryError);
|
|
1440
|
+
onError?.(retryError);
|
|
1441
|
+
} finally {
|
|
1442
|
+
setIsRetrying(false);
|
|
1443
|
+
}
|
|
1444
|
+
}, 500);
|
|
1445
|
+
return;
|
|
1446
|
+
}
|
|
1219
1447
|
console.error("Shaka Player Error:", error);
|
|
1220
1448
|
onError?.(new Error(`Shaka Player Error: ${error.message || "Unknown error"}`));
|
|
1221
1449
|
});
|
|
@@ -1247,6 +1475,30 @@ var useShakePlayer = ({
|
|
|
1247
1475
|
}
|
|
1248
1476
|
}
|
|
1249
1477
|
await player.load(manifestUrl);
|
|
1478
|
+
if (isDRM && playlistId) {
|
|
1479
|
+
try {
|
|
1480
|
+
setTimeout(() => {
|
|
1481
|
+
const activeDrmSessions = player.getActiveSessionsMetadata?.();
|
|
1482
|
+
if (activeDrmSessions) {
|
|
1483
|
+
const persistentSessions = activeDrmSessions.filter(
|
|
1484
|
+
(session) => session.sessionType === "persistent-license"
|
|
1485
|
+
);
|
|
1486
|
+
if (persistentSessions.length > 0) {
|
|
1487
|
+
const sessionsToStore = persistentSessions.map((session) => ({
|
|
1488
|
+
sessionId: session.sessionId,
|
|
1489
|
+
initData: session.initData,
|
|
1490
|
+
initDataType: session.initDataType,
|
|
1491
|
+
keySystem: session.keySystem || "com.widevine.alpha"
|
|
1492
|
+
// fallback
|
|
1493
|
+
}));
|
|
1494
|
+
storePersistentLicense(playlistId, src.drm.licenseCacheKey ?? "", sessionsToStore);
|
|
1495
|
+
}
|
|
1496
|
+
}
|
|
1497
|
+
}, 2e3);
|
|
1498
|
+
} catch (error) {
|
|
1499
|
+
console.warn("Failed to store persistent license sessions:", error);
|
|
1500
|
+
}
|
|
1501
|
+
}
|
|
1250
1502
|
onPlayerReady?.(player);
|
|
1251
1503
|
return player;
|
|
1252
1504
|
} catch (error) {
|
|
@@ -1257,7 +1509,10 @@ var useShakePlayer = ({
|
|
|
1257
1509
|
onError?.(error);
|
|
1258
1510
|
throw error;
|
|
1259
1511
|
}
|
|
1260
|
-
}, [shakaConfig, drmConfig, src, onError, onPlayerReady, muxConfig, onMuxReady]);
|
|
1512
|
+
}, [shakaConfig, drmConfig, src, onError, onPlayerReady, muxConfig, onMuxReady, isRetrying, getManifestUrl]);
|
|
1513
|
+
const initializePlayer = useCallback(async (video) => {
|
|
1514
|
+
return initializePlayerInternal(video);
|
|
1515
|
+
}, [initializePlayerInternal]);
|
|
1261
1516
|
const destroyPlayer = useCallback(async () => {
|
|
1262
1517
|
if (playerRef.current) {
|
|
1263
1518
|
try {
|
|
@@ -1272,7 +1527,8 @@ var useShakePlayer = ({
|
|
|
1272
1527
|
return {
|
|
1273
1528
|
playerRef,
|
|
1274
1529
|
initializePlayer,
|
|
1275
|
-
destroyPlayer
|
|
1530
|
+
destroyPlayer,
|
|
1531
|
+
isRetrying
|
|
1276
1532
|
};
|
|
1277
1533
|
};
|
|
1278
1534
|
|
|
@@ -1809,11 +2065,11 @@ var useEventHandlers = (videoRef, handlers) => {
|
|
|
1809
2065
|
};
|
|
1810
2066
|
|
|
1811
2067
|
// src/hooks/useLiveBadge.ts
|
|
1812
|
-
import { useEffect, useState, useRef as useRef5 } from "react";
|
|
2068
|
+
import { useEffect, useState as useState2, useRef as useRef5 } from "react";
|
|
1813
2069
|
var useLiveBadge = (playerRef, options = {}) => {
|
|
1814
|
-
const [isLive, setIsLive] =
|
|
1815
|
-
const [isVisible, setIsVisible] =
|
|
1816
|
-
const [isNearLiveEdge, setIsNearLiveEdge] =
|
|
2070
|
+
const [isLive, setIsLive] = useState2(false);
|
|
2071
|
+
const [isVisible, setIsVisible] = useState2(false);
|
|
2072
|
+
const [isNearLiveEdge, setIsNearLiveEdge] = useState2(false);
|
|
1817
2073
|
const intervalRef = useRef5(null);
|
|
1818
2074
|
const { enabled = true, onLiveStateChange, liveThresholdSeconds = 15 } = options;
|
|
1819
2075
|
const checkLiveStatus = () => {
|
|
@@ -1900,7 +2156,7 @@ var useLiveBadge = (playerRef, options = {}) => {
|
|
|
1900
2156
|
};
|
|
1901
2157
|
|
|
1902
2158
|
// src/hooks/usePosterFallback.ts
|
|
1903
|
-
import { useEffect as useEffect2, useState as
|
|
2159
|
+
import { useEffect as useEffect2, useState as useState3 } from "react";
|
|
1904
2160
|
|
|
1905
2161
|
// src/hooks/useLiveIndicator.ts
|
|
1906
2162
|
import { useEffect as useEffect3, useRef as useRef7 } from "react";
|
|
@@ -3294,7 +3550,7 @@ var Player = forwardRef(
|
|
|
3294
3550
|
const containerRef = useRef8(null);
|
|
3295
3551
|
const adContainerRef = useRef8(null);
|
|
3296
3552
|
useImperativeHandle(ref, () => videoRef.current, []);
|
|
3297
|
-
const { playerRef, initializePlayer, destroyPlayer } =
|
|
3553
|
+
const { playerRef, initializePlayer, destroyPlayer, isRetrying } = useShakaPlayer({
|
|
3298
3554
|
src,
|
|
3299
3555
|
shakaConfig,
|
|
3300
3556
|
drmConfig,
|
|
@@ -3671,7 +3927,7 @@ var getErrorType = (error, video) => {
|
|
|
3671
3927
|
};
|
|
3672
3928
|
|
|
3673
3929
|
// src/messages/useMessages.tsx
|
|
3674
|
-
import { useState as
|
|
3930
|
+
import { useState as useState4, useEffect as useEffect6 } from "react";
|
|
3675
3931
|
|
|
3676
3932
|
// src/messages/en.json
|
|
3677
3933
|
var en_default = {
|
|
@@ -3973,8 +4229,8 @@ var getBrowserLanguage = () => {
|
|
|
3973
4229
|
return availableLanguages[language] ? language : "en";
|
|
3974
4230
|
};
|
|
3975
4231
|
var useMessages = (locale) => {
|
|
3976
|
-
const [language, setLanguage] =
|
|
3977
|
-
const [translations, setTranslations] =
|
|
4232
|
+
const [language, setLanguage] = useState4("en");
|
|
4233
|
+
const [translations, setTranslations] = useState4(availableLanguages.en);
|
|
3978
4234
|
useEffect6(() => {
|
|
3979
4235
|
const lang = !!availableLanguages?.[locale] ? locale : getBrowserLanguage();
|
|
3980
4236
|
;
|
|
@@ -4089,7 +4345,7 @@ var Video = ({
|
|
|
4089
4345
|
};
|
|
4090
4346
|
|
|
4091
4347
|
// src/Event.tsx
|
|
4092
|
-
import { useCallback as useCallback9, useEffect as useEffect8, useState as
|
|
4348
|
+
import { useCallback as useCallback9, useEffect as useEffect8, useState as useState5 } from "react";
|
|
4093
4349
|
import { twMerge as twMerge4 } from "tailwind-merge";
|
|
4094
4350
|
import { useQuery as useQuery2 } from "@tanstack/react-query";
|
|
4095
4351
|
import { Fragment, jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
@@ -4122,8 +4378,8 @@ var Event = ({
|
|
|
4122
4378
|
retry: queryOptions.retry ?? 3,
|
|
4123
4379
|
retryDelay: queryOptions.retryDelay ?? ((attemptIndex) => Math.min(1e3 * 2 ** attemptIndex, 3e4))
|
|
4124
4380
|
});
|
|
4125
|
-
const [activePlaylist, setActivePlaylist] =
|
|
4126
|
-
const [activeVideoId, setActiveVideoId] =
|
|
4381
|
+
const [activePlaylist, setActivePlaylist] = useState5();
|
|
4382
|
+
const [activeVideoId, setActiveVideoId] = useState5();
|
|
4127
4383
|
const videoIds = eventData?.videoIds ?? [];
|
|
4128
4384
|
const {
|
|
4129
4385
|
data: videosData,
|
|
@@ -4139,7 +4395,7 @@ var Event = ({
|
|
|
4139
4395
|
retry: queryOptions.retry ?? 3,
|
|
4140
4396
|
retryDelay: queryOptions.retryDelay ?? ((attemptIndex) => Math.min(1e3 * 2 ** attemptIndex, 3e4))
|
|
4141
4397
|
});
|
|
4142
|
-
const [loadingApisState, setLoadingApisState] =
|
|
4398
|
+
const [loadingApisState, setLoadingApisState] = useState5(true);
|
|
4143
4399
|
useEffect8(() => {
|
|
4144
4400
|
if (videosData !== void 0) {
|
|
4145
4401
|
setLoadingApisState(false);
|
|
@@ -4187,8 +4443,8 @@ var Event = ({
|
|
|
4187
4443
|
}
|
|
4188
4444
|
}
|
|
4189
4445
|
}, [activeVideoId, videosData, events]);
|
|
4190
|
-
const [error, setError] =
|
|
4191
|
-
const [loadingPlaylist, setLoadingPlaylist] =
|
|
4446
|
+
const [error, setError] = useState5(null);
|
|
4447
|
+
const [loadingPlaylist, setLoadingPlaylist] = useState5(true);
|
|
4192
4448
|
const videosDataError = videosData?.some((video) => !!video.error);
|
|
4193
4449
|
useEffect8(() => {
|
|
4194
4450
|
if (isEventLoading || videosIsLoading || loadingApisState) {
|
|
@@ -4287,7 +4543,7 @@ function PreEvent({
|
|
|
4287
4543
|
}) {
|
|
4288
4544
|
const date = new Date(event.startTime);
|
|
4289
4545
|
const now = /* @__PURE__ */ new Date();
|
|
4290
|
-
const [remainingTime, setRemainingTime] =
|
|
4546
|
+
const [remainingTime, setRemainingTime] = useState5(
|
|
4291
4547
|
date.getTime() - now.getTime()
|
|
4292
4548
|
);
|
|
4293
4549
|
const shouldBeStarted = remainingTime < 0;
|
|
@@ -4432,7 +4688,7 @@ var TitleAndDescription = ({
|
|
|
4432
4688
|
};
|
|
4433
4689
|
|
|
4434
4690
|
// src/CreativeWork.tsx
|
|
4435
|
-
import { useEffect as useEffect9, useState as
|
|
4691
|
+
import { useEffect as useEffect9, useState as useState6 } from "react";
|
|
4436
4692
|
import { twMerge as twMerge5 } from "tailwind-merge";
|
|
4437
4693
|
import { useQuery as useQuery3 } from "@tanstack/react-query";
|
|
4438
4694
|
import { Fragment as Fragment2, jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
@@ -4465,9 +4721,9 @@ var CreativeWork = ({
|
|
|
4465
4721
|
retry: queryOptions.retry ?? 3,
|
|
4466
4722
|
retryDelay: queryOptions.retryDelay ?? ((attemptIndex) => Math.min(1e3 * 2 ** attemptIndex, 3e4))
|
|
4467
4723
|
});
|
|
4468
|
-
const [activePlaylist, setActivePlaylist] =
|
|
4469
|
-
const [activeVideoId, setActiveVideoId] =
|
|
4470
|
-
const [showCountDown, setShowCountDown] =
|
|
4724
|
+
const [activePlaylist, setActivePlaylist] = useState6();
|
|
4725
|
+
const [activeVideoId, setActiveVideoId] = useState6();
|
|
4726
|
+
const [showCountDown, setShowCountDown] = useState6(false);
|
|
4471
4727
|
const videoIds = creativeWorkData?.videoIds ?? [];
|
|
4472
4728
|
const {
|
|
4473
4729
|
data: videosData,
|
|
@@ -4483,7 +4739,7 @@ var CreativeWork = ({
|
|
|
4483
4739
|
retry: queryOptions.retry ?? 3,
|
|
4484
4740
|
retryDelay: queryOptions.retryDelay ?? ((attemptIndex) => Math.min(1e3 * 2 ** attemptIndex, 3e4))
|
|
4485
4741
|
});
|
|
4486
|
-
const [loadingApisState, setLoadingApisState] =
|
|
4742
|
+
const [loadingApisState, setLoadingApisState] = useState6(true);
|
|
4487
4743
|
useEffect9(() => {
|
|
4488
4744
|
if (videosData !== void 0) {
|
|
4489
4745
|
setLoadingApisState(false);
|
|
@@ -4534,7 +4790,7 @@ var CreativeWork = ({
|
|
|
4534
4790
|
}
|
|
4535
4791
|
}
|
|
4536
4792
|
}, [activeVideoId, videosData, events]);
|
|
4537
|
-
const [error, setError] =
|
|
4793
|
+
const [error, setError] = useState6(null);
|
|
4538
4794
|
const videosDataError = videosData?.some((video) => !!video.error);
|
|
4539
4795
|
useEffect9(() => {
|
|
4540
4796
|
if (creativeWorkError || videosError || videosDataError) {
|
|
@@ -4558,7 +4814,7 @@ var CreativeWork = ({
|
|
|
4558
4814
|
}
|
|
4559
4815
|
) }) });
|
|
4560
4816
|
}
|
|
4561
|
-
const [loadingPlaylist, setLoadingPlaylist] =
|
|
4817
|
+
const [loadingPlaylist, setLoadingPlaylist] = useState6(true);
|
|
4562
4818
|
useEffect9(() => {
|
|
4563
4819
|
const creativeWorkLoadedWithNoVideos = !isCreativeWorkLoading && creativeWorkData && creativeWorkData.videoIds && creativeWorkData.videoIds.length === 0;
|
|
4564
4820
|
const creativeWorkLoadedWithNoData = !isCreativeWorkLoading && creativeWorkData && !creativeWorkData.videoIds;
|
|
@@ -4635,7 +4891,7 @@ function PreCreativeWork({
|
|
|
4635
4891
|
}) {
|
|
4636
4892
|
const date = new Date(creativeWork.releaseTime);
|
|
4637
4893
|
const now = /* @__PURE__ */ new Date();
|
|
4638
|
-
const [remainingTime, setRemainingTime] =
|
|
4894
|
+
const [remainingTime, setRemainingTime] = useState6(
|
|
4639
4895
|
date.getTime() - now.getTime()
|
|
4640
4896
|
);
|
|
4641
4897
|
const shouldBeStarted = remainingTime < 0;
|