react-native-theoplayer 8.9.0 → 8.10.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.
- package/CHANGELOG.md +12 -0
- package/android/build.gradle +1 -1
- package/ios/THEOplayerRCTSourceDescriptionBuilder.swift +7 -1
- package/ios/theolive/THEOplayerRCTSourceDescriptionBuilder+Theolive.swift +26 -0
- package/lib/commonjs/internal/THEOplayerView.web.js +11 -2
- package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
- package/lib/commonjs/internal/utils/ServiceWorkerUtils.js +44 -0
- package/lib/commonjs/internal/utils/ServiceWorkerUtils.js.map +1 -0
- package/lib/commonjs/manifest.json +1 -1
- package/lib/module/internal/THEOplayerView.web.js +11 -2
- package/lib/module/internal/THEOplayerView.web.js.map +1 -1
- package/lib/module/internal/utils/ServiceWorkerUtils.js +36 -0
- package/lib/module/internal/utils/ServiceWorkerUtils.js.map +1 -0
- package/lib/module/manifest.json +1 -1
- package/lib/typescript/api/config/PlayerConfiguration.d.ts +6 -0
- package/lib/typescript/api/config/PlayerConfiguration.d.ts.map +1 -1
- package/lib/typescript/internal/THEOplayerView.web.d.ts.map +1 -1
- package/lib/typescript/internal/utils/ServiceWorkerUtils.d.ts +4 -0
- package/lib/typescript/internal/utils/ServiceWorkerUtils.d.ts.map +1 -0
- package/package.json +1 -1
- package/react-native-theoplayer.podspec +13 -7
- package/src/api/config/PlayerConfiguration.ts +7 -0
- package/src/internal/THEOplayerView.web.tsx +12 -2
- package/src/internal/utils/ServiceWorkerUtils.ts +39 -0
- package/src/manifest.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.1.0/)
|
|
6
6
|
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [8.10.0] - 24-12-06
|
|
9
|
+
|
|
10
|
+
## Added
|
|
11
|
+
|
|
12
|
+
- Added support for THEOlive on iOS.
|
|
13
|
+
|
|
14
|
+
## [8.9.1] - 24-12-04
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- Added a `enableTHEOlive` flag to `PlayerConfiguration` to enable play-out of THEOlive sources.
|
|
19
|
+
|
|
8
20
|
## [8.9.0] - 24-11-29
|
|
9
21
|
|
|
10
22
|
### Added
|
package/android/build.gradle
CHANGED
|
@@ -32,7 +32,7 @@ def enabledTHEOads = safeExtGet("THEOplayer_extensionTHEOads", 'false').toBoolea
|
|
|
32
32
|
def enabledAds = enabledGoogleIMA || enabledGoogleDAI || enabledTHEOads
|
|
33
33
|
def enabledCast = safeExtGet("THEOplayer_extensionCast", 'false').toBoolean()
|
|
34
34
|
def enabledMediaSession = safeExtGet("THEOplayer_extensionMediaSession", 'true').toBoolean()
|
|
35
|
-
def enabledMedia3 = safeExtGet("THEOplayer_extensionMedia3", '
|
|
35
|
+
def enabledMedia3 = safeExtGet("THEOplayer_extensionMedia3", 'false').toBoolean()
|
|
36
36
|
|
|
37
37
|
android {
|
|
38
38
|
compileSdk safeExtGet('THEOplayer_compileSdkVersion', 34)
|
|
@@ -167,10 +167,16 @@ class THEOplayerRCTSourceDescriptionBuilder {
|
|
|
167
167
|
*/
|
|
168
168
|
private static func buildTypedSource(_ typedSourceData: [String:Any]) -> TypedSource? {
|
|
169
169
|
let contentProtection = extractDrmConfiguration(from: typedSourceData)
|
|
170
|
+
|
|
171
|
+
if let integration = typedSourceData[SD_PROP_INTEGRATION] as? String, integration == "theolive" {
|
|
172
|
+
return THEOplayerRCTSourceDescriptionBuilder.buildTHEOliveDescription(typedSourceData)
|
|
173
|
+
}
|
|
174
|
+
|
|
170
175
|
if let src = typedSourceData[SD_PROP_SRC] as? String {
|
|
171
|
-
|
|
176
|
+
// extract the type
|
|
172
177
|
let type = typedSourceData[SD_PROP_TYPE] as? String ?? THEOplayerRCTSourceDescriptionBuilder.extractMimeType(src)
|
|
173
178
|
let headers = typedSourceData[SD_PROP_HEADERS] as? [String:String]
|
|
179
|
+
|
|
174
180
|
return TypedSource(src: src,
|
|
175
181
|
type: type,
|
|
176
182
|
drm: contentProtection,
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// THEOplayerRCTSourceDescriptionBuilder.swift
|
|
2
|
+
|
|
3
|
+
import Foundation
|
|
4
|
+
import THEOplayerSDK
|
|
5
|
+
import UIKit
|
|
6
|
+
|
|
7
|
+
#if canImport(THEOplayerTHEOliveIntegration)
|
|
8
|
+
import THEOplayerTHEOliveIntegration
|
|
9
|
+
#endif
|
|
10
|
+
|
|
11
|
+
extension THEOplayerRCTSourceDescriptionBuilder {
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
Builds a THEOplayer SourceDescription that can be passed as a source for the THEOplayer.
|
|
15
|
+
- returns: a THEOlive TypedSource.
|
|
16
|
+
*/
|
|
17
|
+
static func buildTHEOliveDescription(_ theoliveData: [String:Any]) -> TypedSource? {
|
|
18
|
+
#if canImport(THEOplayerTHEOliveIntegration)
|
|
19
|
+
if let src = theoliveData[SD_PROP_SRC] as? String {
|
|
20
|
+
//let headers = typedSourceData[SD_PROP_HEADERS] as? [String:String]
|
|
21
|
+
return TheoLiveSource(channelId: src)
|
|
22
|
+
}
|
|
23
|
+
#endif
|
|
24
|
+
return nil
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -7,6 +7,7 @@ exports.THEOplayerView = THEOplayerView;
|
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _theoplayer = require("theoplayer");
|
|
9
9
|
var _THEOplayerWebAdapter = require("./adapter/THEOplayerWebAdapter");
|
|
10
|
+
var _ServiceWorkerUtils = require("./utils/ServiceWorkerUtils");
|
|
10
11
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
11
12
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
12
13
|
function THEOplayerView(props) {
|
|
@@ -17,6 +18,14 @@ function THEOplayerView(props) {
|
|
|
17
18
|
const player = (0, _react.useRef)(null);
|
|
18
19
|
const adapter = (0, _react.useRef)(null);
|
|
19
20
|
const container = (0, _react.useRef)(null);
|
|
21
|
+
const preparePlayer = async adapter => {
|
|
22
|
+
if (config?.enableTHEOlive == true && (0, _ServiceWorkerUtils.browserCanPlayHLSAndHasNoMSE)()) {
|
|
23
|
+
await (0, _ServiceWorkerUtils.registerServiceWorker)(props.config?.libraryLocation);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Notify the player is ready
|
|
27
|
+
props.onPlayerReady?.(adapter);
|
|
28
|
+
};
|
|
20
29
|
(0, _react.useEffect)(() => {
|
|
21
30
|
// Create player inside container.
|
|
22
31
|
if (container.current) {
|
|
@@ -57,8 +66,8 @@ function THEOplayerView(props) {
|
|
|
57
66
|
// @ts-ignore
|
|
58
67
|
window.nativePlayer = player;
|
|
59
68
|
|
|
60
|
-
//
|
|
61
|
-
|
|
69
|
+
// Prepare & notify
|
|
70
|
+
void preparePlayer(adapter.current);
|
|
62
71
|
}
|
|
63
72
|
|
|
64
73
|
// Clean-up
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_theoplayer","_THEOplayerWebAdapter","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","THEOplayerView","props","config","children","player","useRef","adapter","container","useEffect","current","chromeless","undefined","ads","googleIma","ima","useNativeIma","language","ui","updatedConfig","allowNativeFullscreen","ChromelessPlayer","Player","fluid","THEOplayerWebAdapter","window","nativePlayer","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_theoplayer","_THEOplayerWebAdapter","_ServiceWorkerUtils","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","THEOplayerView","props","config","children","player","useRef","adapter","container","preparePlayer","enableTHEOlive","browserCanPlayHLSAndHasNoMSE","registerServiceWorker","libraryLocation","onPlayerReady","useEffect","current","chromeless","undefined","ads","googleIma","ima","useNativeIma","language","ui","updatedConfig","allowNativeFullscreen","ChromelessPlayer","Player","fluid","THEOplayerWebAdapter","window","nativePlayer","onPlayerDestroy","destroy","createElement","Fragment","ref","style","styles","className","display","position","width","height","maxHeight","maxWidth","aspectRatio"],"sourceRoot":"../../../src","sources":["internal/THEOplayerView.web.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.browserCanPlayHLSAndHasNoMSE = browserCanPlayHLSAndHasNoMSE;
|
|
7
|
+
exports.maybeUnregisterServiceWorker = maybeUnregisterServiceWorker;
|
|
8
|
+
exports.registerServiceWorker = registerServiceWorker;
|
|
9
|
+
function browserCanPlayHLSAndHasNoMSE() {
|
|
10
|
+
const videoElement = document.createElement('video');
|
|
11
|
+
const canPlayHls = videoElement && videoElement.canPlayType && videoElement.canPlayType('application/vnd.apple.mpegURL') !== '';
|
|
12
|
+
// @ts-ignore
|
|
13
|
+
const canPlayMse = Boolean(window.MediaSource || window.WebKitMediaSource || window.ManagedMediaSource);
|
|
14
|
+
return canPlayHls && !canPlayMse;
|
|
15
|
+
}
|
|
16
|
+
async function registerServiceWorker(libraryLocation) {
|
|
17
|
+
if ('serviceWorker' in navigator) {
|
|
18
|
+
try {
|
|
19
|
+
const serviceWorkerName = 'theoplayer.sw.js';
|
|
20
|
+
const serviceWorkerPath = libraryLocation ? (libraryLocation.endsWith('/') ? libraryLocation : `${libraryLocation}/`) + serviceWorkerName : serviceWorkerName;
|
|
21
|
+
const serviceWorkerScope = libraryLocation ? libraryLocation.endsWith('/') ? libraryLocation : `${libraryLocation}/` : '/';
|
|
22
|
+
|
|
23
|
+
// unregister beforehand to solve an issue when doing a hard reload of the page causing the service worker to not intercept the manifests.
|
|
24
|
+
await maybeUnregisterServiceWorker(serviceWorkerPath);
|
|
25
|
+
await navigator.serviceWorker.register(serviceWorkerPath, {
|
|
26
|
+
scope: serviceWorkerScope
|
|
27
|
+
});
|
|
28
|
+
//console.log('Successfully registered server worker');
|
|
29
|
+
} catch (error) {
|
|
30
|
+
console.error(`Service worker registration failed: ${error}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function maybeUnregisterServiceWorker(serviceWorkerPath) {
|
|
35
|
+
if ('serviceWorker' in navigator) {
|
|
36
|
+
try {
|
|
37
|
+
const registration = await navigator.serviceWorker.getRegistration(serviceWorkerPath);
|
|
38
|
+
await registration?.unregister();
|
|
39
|
+
} catch (error) {
|
|
40
|
+
console.error(`Service worker unregistration failed: ${error}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=ServiceWorkerUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["browserCanPlayHLSAndHasNoMSE","videoElement","document","createElement","canPlayHls","canPlayType","canPlayMse","Boolean","window","MediaSource","WebKitMediaSource","ManagedMediaSource","registerServiceWorker","libraryLocation","navigator","serviceWorkerName","serviceWorkerPath","endsWith","serviceWorkerScope","maybeUnregisterServiceWorker","serviceWorker","register","scope","error","console","registration","getRegistration","unregister"],"sourceRoot":"../../../../src","sources":["internal/utils/ServiceWorkerUtils.ts"],"mappings":";;;;;;;;AAAO,SAASA,4BAA4BA,CAAA,EAAG;EAC7C,MAAMC,YAAY,GAAGC,QAAQ,CAACC,aAAa,CAAC,OAAO,CAAC;EACpD,MAAMC,UAAU,GAAGH,YAAY,IAAIA,YAAY,CAACI,WAAW,IAAIJ,YAAY,CAACI,WAAW,CAAC,+BAA+B,CAAC,KAAK,EAAE;EAC/H;EACA,MAAMC,UAAU,GAAGC,OAAO,CAACC,MAAM,CAACC,WAAW,IAAID,MAAM,CAACE,iBAAiB,IAAIF,MAAM,CAACG,kBAAkB,CAAC;EACvG,OAAOP,UAAU,IAAI,CAACE,UAAU;AAClC;AAEO,eAAeM,qBAAqBA,CAACC,eAAwB,EAAiB;EACnF,IAAI,eAAe,IAAIC,SAAS,EAAE;IAChC,IAAI;MACF,MAAMC,iBAAiB,GAAG,kBAAkB;MAC5C,MAAMC,iBAAiB,GAAGH,eAAe,GACrC,CAACA,eAAe,CAACI,QAAQ,CAAC,GAAG,CAAC,GAAGJ,eAAe,GAAG,GAAGA,eAAe,GAAG,IAAIE,iBAAiB,GAC7FA,iBAAiB;MACrB,MAAMG,kBAAkB,GAAGL,eAAe,GAAIA,eAAe,CAACI,QAAQ,CAAC,GAAG,CAAC,GAAGJ,eAAe,GAAG,GAAGA,eAAe,GAAG,GAAI,GAAG;;MAE5H;MACA,MAAMM,4BAA4B,CAACH,iBAAiB,CAAC;MACrD,MAAMF,SAAS,CAACM,aAAa,CAACC,QAAQ,CAACL,iBAAiB,EAAE;QACxDM,KAAK,EAAEJ;MACT,CAAC,CAAC;MACF;IACF,CAAC,CAAC,OAAOK,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,uCAAuCA,KAAK,EAAE,CAAC;IAC/D;EACF;AACF;AAEO,eAAeJ,4BAA4BA,CAACH,iBAA0B,EAAiB;EAC5F,IAAI,eAAe,IAAIF,SAAS,EAAE;IAChC,IAAI;MACF,MAAMW,YAAY,GAAG,MAAMX,SAAS,CAACM,aAAa,CAACM,eAAe,CAACV,iBAAiB,CAAC;MACrF,MAAMS,YAAY,EAAEE,UAAU,CAAC,CAAC;IAClC,CAAC,CAAC,OAAOJ,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,yCAAyCA,KAAK,EAAE,CAAC;IACjE;EACF;AACF","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"8.
|
|
1
|
+
{"version":"8.10.0","buildDate":"2024-12-06T14:03:50.599Z"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, { useEffect, useRef } from 'react';
|
|
2
2
|
import { Player, ChromelessPlayer } from 'theoplayer';
|
|
3
3
|
import { THEOplayerWebAdapter } from './adapter/THEOplayerWebAdapter';
|
|
4
|
+
import { registerServiceWorker, browserCanPlayHLSAndHasNoMSE } from './utils/ServiceWorkerUtils';
|
|
4
5
|
export function THEOplayerView(props) {
|
|
5
6
|
const {
|
|
6
7
|
config,
|
|
@@ -9,6 +10,14 @@ export function THEOplayerView(props) {
|
|
|
9
10
|
const player = useRef(null);
|
|
10
11
|
const adapter = useRef(null);
|
|
11
12
|
const container = useRef(null);
|
|
13
|
+
const preparePlayer = async adapter => {
|
|
14
|
+
if (config?.enableTHEOlive == true && browserCanPlayHLSAndHasNoMSE()) {
|
|
15
|
+
await registerServiceWorker(props.config?.libraryLocation);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Notify the player is ready
|
|
19
|
+
props.onPlayerReady?.(adapter);
|
|
20
|
+
};
|
|
12
21
|
useEffect(() => {
|
|
13
22
|
// Create player inside container.
|
|
14
23
|
if (container.current) {
|
|
@@ -49,8 +58,8 @@ export function THEOplayerView(props) {
|
|
|
49
58
|
// @ts-ignore
|
|
50
59
|
window.nativePlayer = player;
|
|
51
60
|
|
|
52
|
-
//
|
|
53
|
-
|
|
61
|
+
// Prepare & notify
|
|
62
|
+
void preparePlayer(adapter.current);
|
|
54
63
|
}
|
|
55
64
|
|
|
56
65
|
// Clean-up
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useEffect","useRef","Player","ChromelessPlayer","THEOplayerWebAdapter","THEOplayerView","props","config","children","player","adapter","container","current","chromeless","undefined","ads","googleIma","ima","useNativeIma","language","ui","updatedConfig","allowNativeFullscreen","fluid","window","nativePlayer","
|
|
1
|
+
{"version":3,"names":["React","useEffect","useRef","Player","ChromelessPlayer","THEOplayerWebAdapter","registerServiceWorker","browserCanPlayHLSAndHasNoMSE","THEOplayerView","props","config","children","player","adapter","container","preparePlayer","enableTHEOlive","libraryLocation","onPlayerReady","current","chromeless","undefined","ads","googleIma","ima","useNativeIma","language","ui","updatedConfig","allowNativeFullscreen","fluid","window","nativePlayer","onPlayerDestroy","destroy","createElement","Fragment","ref","style","styles","className","display","position","width","height","maxHeight","maxWidth","aspectRatio"],"sourceRoot":"../../../src","sources":["internal/THEOplayerView.web.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function browserCanPlayHLSAndHasNoMSE() {
|
|
2
|
+
const videoElement = document.createElement('video');
|
|
3
|
+
const canPlayHls = videoElement && videoElement.canPlayType && videoElement.canPlayType('application/vnd.apple.mpegURL') !== '';
|
|
4
|
+
// @ts-ignore
|
|
5
|
+
const canPlayMse = Boolean(window.MediaSource || window.WebKitMediaSource || window.ManagedMediaSource);
|
|
6
|
+
return canPlayHls && !canPlayMse;
|
|
7
|
+
}
|
|
8
|
+
export async function registerServiceWorker(libraryLocation) {
|
|
9
|
+
if ('serviceWorker' in navigator) {
|
|
10
|
+
try {
|
|
11
|
+
const serviceWorkerName = 'theoplayer.sw.js';
|
|
12
|
+
const serviceWorkerPath = libraryLocation ? (libraryLocation.endsWith('/') ? libraryLocation : `${libraryLocation}/`) + serviceWorkerName : serviceWorkerName;
|
|
13
|
+
const serviceWorkerScope = libraryLocation ? libraryLocation.endsWith('/') ? libraryLocation : `${libraryLocation}/` : '/';
|
|
14
|
+
|
|
15
|
+
// unregister beforehand to solve an issue when doing a hard reload of the page causing the service worker to not intercept the manifests.
|
|
16
|
+
await maybeUnregisterServiceWorker(serviceWorkerPath);
|
|
17
|
+
await navigator.serviceWorker.register(serviceWorkerPath, {
|
|
18
|
+
scope: serviceWorkerScope
|
|
19
|
+
});
|
|
20
|
+
//console.log('Successfully registered server worker');
|
|
21
|
+
} catch (error) {
|
|
22
|
+
console.error(`Service worker registration failed: ${error}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export async function maybeUnregisterServiceWorker(serviceWorkerPath) {
|
|
27
|
+
if ('serviceWorker' in navigator) {
|
|
28
|
+
try {
|
|
29
|
+
const registration = await navigator.serviceWorker.getRegistration(serviceWorkerPath);
|
|
30
|
+
await registration?.unregister();
|
|
31
|
+
} catch (error) {
|
|
32
|
+
console.error(`Service worker unregistration failed: ${error}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=ServiceWorkerUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["browserCanPlayHLSAndHasNoMSE","videoElement","document","createElement","canPlayHls","canPlayType","canPlayMse","Boolean","window","MediaSource","WebKitMediaSource","ManagedMediaSource","registerServiceWorker","libraryLocation","navigator","serviceWorkerName","serviceWorkerPath","endsWith","serviceWorkerScope","maybeUnregisterServiceWorker","serviceWorker","register","scope","error","console","registration","getRegistration","unregister"],"sourceRoot":"../../../../src","sources":["internal/utils/ServiceWorkerUtils.ts"],"mappings":"AAAA,OAAO,SAASA,4BAA4BA,CAAA,EAAG;EAC7C,MAAMC,YAAY,GAAGC,QAAQ,CAACC,aAAa,CAAC,OAAO,CAAC;EACpD,MAAMC,UAAU,GAAGH,YAAY,IAAIA,YAAY,CAACI,WAAW,IAAIJ,YAAY,CAACI,WAAW,CAAC,+BAA+B,CAAC,KAAK,EAAE;EAC/H;EACA,MAAMC,UAAU,GAAGC,OAAO,CAACC,MAAM,CAACC,WAAW,IAAID,MAAM,CAACE,iBAAiB,IAAIF,MAAM,CAACG,kBAAkB,CAAC;EACvG,OAAOP,UAAU,IAAI,CAACE,UAAU;AAClC;AAEA,OAAO,eAAeM,qBAAqBA,CAACC,eAAwB,EAAiB;EACnF,IAAI,eAAe,IAAIC,SAAS,EAAE;IAChC,IAAI;MACF,MAAMC,iBAAiB,GAAG,kBAAkB;MAC5C,MAAMC,iBAAiB,GAAGH,eAAe,GACrC,CAACA,eAAe,CAACI,QAAQ,CAAC,GAAG,CAAC,GAAGJ,eAAe,GAAG,GAAGA,eAAe,GAAG,IAAIE,iBAAiB,GAC7FA,iBAAiB;MACrB,MAAMG,kBAAkB,GAAGL,eAAe,GAAIA,eAAe,CAACI,QAAQ,CAAC,GAAG,CAAC,GAAGJ,eAAe,GAAG,GAAGA,eAAe,GAAG,GAAI,GAAG;;MAE5H;MACA,MAAMM,4BAA4B,CAACH,iBAAiB,CAAC;MACrD,MAAMF,SAAS,CAACM,aAAa,CAACC,QAAQ,CAACL,iBAAiB,EAAE;QACxDM,KAAK,EAAEJ;MACT,CAAC,CAAC;MACF;IACF,CAAC,CAAC,OAAOK,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,uCAAuCA,KAAK,EAAE,CAAC;IAC/D;EACF;AACF;AAEA,OAAO,eAAeJ,4BAA4BA,CAACH,iBAA0B,EAAiB;EAC5F,IAAI,eAAe,IAAIF,SAAS,EAAE;IAChC,IAAI;MACF,MAAMW,YAAY,GAAG,MAAMX,SAAS,CAACM,aAAa,CAACM,eAAe,CAACV,iBAAiB,CAAC;MACrF,MAAMS,YAAY,EAAEE,UAAU,CAAC,CAAC;IAClC,CAAC,CAAC,OAAOJ,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,yCAAyCA,KAAK,EAAE,CAAC;IACjE;EACF;AACF","ignoreList":[]}
|
package/lib/module/manifest.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"8.
|
|
1
|
+
{"version":"8.10.0","buildDate":"2024-12-06T14:03:50.599Z"}
|
|
@@ -86,6 +86,12 @@ export interface PlayerConfiguration {
|
|
|
86
86
|
* @defaultValue `false`.
|
|
87
87
|
*/
|
|
88
88
|
useMedia3?: boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Sets whether support for THEOlive sources should be enabled.
|
|
91
|
+
*
|
|
92
|
+
* @defaultValue `false`.
|
|
93
|
+
*/
|
|
94
|
+
enableTHEOlive?: boolean;
|
|
89
95
|
}
|
|
90
96
|
/**
|
|
91
97
|
* The muted autoplay policy of a player for web.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlayerConfiguration.d.ts","sourceRoot":"","sources":["../../../../src/api/config/PlayerConfiguration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC;;;;;;;;;OASG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,0BAA0B,CAAC;IAE3C;;OAEG;IACH,GAAG,CAAC,EAAE,gBAAgB,CAAC;IAEvB;;OAEG;IACH,IAAI,CAAC,EAAE,iBAAiB,CAAC;IAEzB;;OAEG;IACH,EAAE,CAAC,EAAE,eAAe,CAAC;IAErB;;OAEG;IACH,YAAY,CAAC,EAAE,yBAAyB,CAAC;IAEzC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAE7B;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAEhC;;;;;OAKG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IAEjD;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"PlayerConfiguration.d.ts","sourceRoot":"","sources":["../../../../src/api/config/PlayerConfiguration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC;;;;;;;;;OASG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,0BAA0B,CAAC;IAE3C;;OAEG;IACH,GAAG,CAAC,EAAE,gBAAgB,CAAC;IAEvB;;OAEG;IACH,IAAI,CAAC,EAAE,iBAAiB,CAAC;IAEzB;;OAEG;IACH,EAAE,CAAC,EAAE,eAAe,CAAC;IAErB;;OAEG;IACH,YAAY,CAAC,EAAE,yBAAyB,CAAC;IAEzC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAE7B;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAEhC;;;;;OAKG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IAEjD;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,0BAA0B,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"THEOplayerView.web.d.ts","sourceRoot":"","sources":["../../../src/internal/THEOplayerView.web.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"THEOplayerView.web.d.ts","sourceRoot":"","sources":["../../../src/internal/THEOplayerView.web.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAKnE,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,qBAiFjF"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function browserCanPlayHLSAndHasNoMSE(): boolean;
|
|
2
|
+
export declare function registerServiceWorker(libraryLocation?: string): Promise<void>;
|
|
3
|
+
export declare function maybeUnregisterServiceWorker(serviceWorkerPath?: string): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=ServiceWorkerUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServiceWorkerUtils.d.ts","sourceRoot":"","sources":["../../../../src/internal/utils/ServiceWorkerUtils.ts"],"names":[],"mappings":"AAAA,wBAAgB,4BAA4B,YAM3C;AAED,wBAAsB,qBAAqB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBnF;AAED,wBAAsB,4BAA4B,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS5F"}
|
package/package.json
CHANGED
|
@@ -25,29 +25,35 @@ Pod::Spec.new do |s|
|
|
|
25
25
|
s.platforms = { :ios => "13.4", :tvos => "13.4" }
|
|
26
26
|
s.source = { :git => "https://www.theoplayer.com/.git", :tag => "#{s.version}" }
|
|
27
27
|
|
|
28
|
-
s.source_files = 'ios/*.{h,m,swift}', 'ios/ads/*.swift', 'ios/casting/*.swift', 'ios/contentprotection/*.swift', 'ios/pip/*.swift', 'ios/backgroundAudio/*.swift', 'ios/cache/*.swift', 'ios/sideloadedMetadata/*.swift', 'ios/eventBroadcasting/*.swift' , 'ios/ui/*.swift', 'ios/presentationMode/*.swift', 'ios/viewController/*.swift'
|
|
28
|
+
s.source_files = 'ios/*.{h,m,swift}', 'ios/ads/*.swift', 'ios/casting/*.swift', 'ios/contentprotection/*.swift', 'ios/pip/*.swift', 'ios/backgroundAudio/*.swift', 'ios/cache/*.swift', 'ios/sideloadedMetadata/*.swift', 'ios/eventBroadcasting/*.swift' , 'ios/ui/*.swift', 'ios/presentationMode/*.swift', 'ios/viewController/*.swift', 'ios/theolive/*.swift'
|
|
29
29
|
s.resources = ['ios/*.css']
|
|
30
30
|
|
|
31
31
|
# ReactNative Dependency
|
|
32
32
|
s.dependency "React-Core"
|
|
33
33
|
|
|
34
|
-
# THEOplayer
|
|
34
|
+
# THEOplayer Dependency
|
|
35
35
|
puts "Adding THEOplayerSDK-core"
|
|
36
|
-
s.dependency "THEOplayerSDK-core", "~> 8.
|
|
37
|
-
|
|
36
|
+
s.dependency "THEOplayerSDK-core", "~> 8.6"
|
|
37
|
+
|
|
38
|
+
# THEOlive Dependency
|
|
39
|
+
puts "Adding THEOplayer-Integration-THEOlive"
|
|
40
|
+
s.ios.dependency "THEOplayer-Integration-THEOlive/Base", "~> 8.6"
|
|
41
|
+
s.ios.dependency "THEOliveSDK", "~> 3.18.4"
|
|
42
|
+
|
|
43
|
+
# Feature based dependencies
|
|
38
44
|
if theofeatures.include?("GOOGLE_IMA")
|
|
39
45
|
puts "Adding THEOplayer-Integration-GoogleIMA"
|
|
40
|
-
s.dependency "THEOplayer-Integration-GoogleIMA", "~> 8.
|
|
46
|
+
s.dependency "THEOplayer-Integration-GoogleIMA", "~> 8.6"
|
|
41
47
|
end
|
|
42
48
|
|
|
43
49
|
if theofeatures.include?("CHROMECAST")
|
|
44
50
|
puts "Adding THEOplayer-Integration-GoogleCast"
|
|
45
|
-
s.ios.dependency "THEOplayer-Integration-GoogleCast", "~> 8.
|
|
51
|
+
s.ios.dependency "THEOplayer-Integration-GoogleCast", "~> 8.6"
|
|
46
52
|
end
|
|
47
53
|
|
|
48
54
|
if theofeatures.include?("SIDELOADED_TEXTTRACKS")
|
|
49
55
|
puts "Adding THEOplayer-Connector-SideloadedSubtitle"
|
|
50
|
-
s.dependency "THEOplayer-Connector-SideloadedSubtitle", "~> 8.
|
|
56
|
+
s.dependency "THEOplayer-Connector-SideloadedSubtitle", "~> 8.6"
|
|
51
57
|
end
|
|
52
58
|
|
|
53
59
|
end
|
|
@@ -99,6 +99,13 @@ export interface PlayerConfiguration {
|
|
|
99
99
|
* @defaultValue `false`.
|
|
100
100
|
*/
|
|
101
101
|
useMedia3?: boolean;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Sets whether support for THEOlive sources should be enabled.
|
|
105
|
+
*
|
|
106
|
+
* @defaultValue `false`.
|
|
107
|
+
*/
|
|
108
|
+
enableTHEOlive?: boolean;
|
|
102
109
|
}
|
|
103
110
|
|
|
104
111
|
/**
|
|
@@ -2,6 +2,7 @@ import React, { useEffect, useRef } from 'react';
|
|
|
2
2
|
import type { THEOplayerViewProps } from 'react-native-theoplayer';
|
|
3
3
|
import { Player, ChromelessPlayer, PlayerConfiguration } from 'theoplayer';
|
|
4
4
|
import { THEOplayerWebAdapter } from './adapter/THEOplayerWebAdapter';
|
|
5
|
+
import { registerServiceWorker, browserCanPlayHLSAndHasNoMSE } from './utils/ServiceWorkerUtils';
|
|
5
6
|
|
|
6
7
|
export function THEOplayerView(props: React.PropsWithChildren<THEOplayerViewProps>) {
|
|
7
8
|
const { config, children } = props;
|
|
@@ -9,6 +10,15 @@ export function THEOplayerView(props: React.PropsWithChildren<THEOplayerViewProp
|
|
|
9
10
|
const adapter = useRef<THEOplayerWebAdapter | null>(null);
|
|
10
11
|
const container = useRef<null | HTMLDivElement>(null);
|
|
11
12
|
|
|
13
|
+
const preparePlayer = async (adapter: THEOplayerWebAdapter) => {
|
|
14
|
+
if (config?.enableTHEOlive == true && browserCanPlayHLSAndHasNoMSE()) {
|
|
15
|
+
await registerServiceWorker(props.config?.libraryLocation);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Notify the player is ready
|
|
19
|
+
props.onPlayerReady?.(adapter);
|
|
20
|
+
};
|
|
21
|
+
|
|
12
22
|
useEffect(() => {
|
|
13
23
|
// Create player inside container.
|
|
14
24
|
if (container.current) {
|
|
@@ -49,8 +59,8 @@ export function THEOplayerView(props: React.PropsWithChildren<THEOplayerViewProp
|
|
|
49
59
|
// @ts-ignore
|
|
50
60
|
window.nativePlayer = player;
|
|
51
61
|
|
|
52
|
-
//
|
|
53
|
-
|
|
62
|
+
// Prepare & notify
|
|
63
|
+
void preparePlayer(adapter.current);
|
|
54
64
|
}
|
|
55
65
|
|
|
56
66
|
// Clean-up
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export function browserCanPlayHLSAndHasNoMSE() {
|
|
2
|
+
const videoElement = document.createElement('video');
|
|
3
|
+
const canPlayHls = videoElement && videoElement.canPlayType && videoElement.canPlayType('application/vnd.apple.mpegURL') !== '';
|
|
4
|
+
// @ts-ignore
|
|
5
|
+
const canPlayMse = Boolean(window.MediaSource || window.WebKitMediaSource || window.ManagedMediaSource);
|
|
6
|
+
return canPlayHls && !canPlayMse;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export async function registerServiceWorker(libraryLocation?: string): Promise<void> {
|
|
10
|
+
if ('serviceWorker' in navigator) {
|
|
11
|
+
try {
|
|
12
|
+
const serviceWorkerName = 'theoplayer.sw.js';
|
|
13
|
+
const serviceWorkerPath = libraryLocation
|
|
14
|
+
? (libraryLocation.endsWith('/') ? libraryLocation : `${libraryLocation}/`) + serviceWorkerName
|
|
15
|
+
: serviceWorkerName;
|
|
16
|
+
const serviceWorkerScope = libraryLocation ? (libraryLocation.endsWith('/') ? libraryLocation : `${libraryLocation}/`) : '/';
|
|
17
|
+
|
|
18
|
+
// unregister beforehand to solve an issue when doing a hard reload of the page causing the service worker to not intercept the manifests.
|
|
19
|
+
await maybeUnregisterServiceWorker(serviceWorkerPath);
|
|
20
|
+
await navigator.serviceWorker.register(serviceWorkerPath, {
|
|
21
|
+
scope: serviceWorkerScope,
|
|
22
|
+
});
|
|
23
|
+
//console.log('Successfully registered server worker');
|
|
24
|
+
} catch (error) {
|
|
25
|
+
console.error(`Service worker registration failed: ${error}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export async function maybeUnregisterServiceWorker(serviceWorkerPath?: string): Promise<void> {
|
|
31
|
+
if ('serviceWorker' in navigator) {
|
|
32
|
+
try {
|
|
33
|
+
const registration = await navigator.serviceWorker.getRegistration(serviceWorkerPath);
|
|
34
|
+
await registration?.unregister();
|
|
35
|
+
} catch (error) {
|
|
36
|
+
console.error(`Service worker unregistration failed: ${error}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
package/src/manifest.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"8.
|
|
1
|
+
{"version":"8.10.0","buildDate":"2024-12-06T14:03:50.599Z"}
|