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 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
@@ -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", 'true').toBoolean()
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
- // extract the type
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
- // Notify the player is ready
61
- props.onPlayerReady?.(adapter.current);
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","onPlayerReady","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":[]}
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.9.0","buildDate":"2024-11-29T16:08:29.064Z"}
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
- // Notify the player is ready
53
- props.onPlayerReady?.(adapter.current);
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","onPlayerReady","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":[]}
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":[]}
@@ -1 +1 @@
1
- {"version":"8.9.0","buildDate":"2024-11-29T16:08:29.064Z"}
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;CACrB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,0BAA0B,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,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;AAInE,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,qBAwEjF"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-theoplayer",
3
- "version": "8.9.0",
3
+ "version": "8.10.0",
4
4
  "description": "A THEOplayer video component for react-native.",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -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 core Dependency
34
+ # THEOplayer Dependency
35
35
  puts "Adding THEOplayerSDK-core"
36
- s.dependency "THEOplayerSDK-core", "~> 8.3"
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.3"
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.3"
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.3"
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
- // Notify the player is ready
53
- props.onPlayerReady?.(adapter.current);
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.9.0","buildDate":"2024-11-29T16:08:29.064Z"}
1
+ {"version":"8.10.0","buildDate":"2024-12-06T14:03:50.599Z"}