mirror of
https://github.com/zoriya/react-native-omni.git
synced 2026-08-16 02:44:51 +00:00
Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
577c8b3e2d | ||
|
|
453f86a448 |
@@ -39,7 +39,7 @@ jobs:
|
||||
name: Build Android Example App
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
- uses: actions/checkout@v4
|
||||
- uses: oven-sh/setup-bun@v2
|
||||
|
||||
- name: Install dependencies (bun)
|
||||
|
||||
@@ -50,7 +50,7 @@ jobs:
|
||||
name: Build iOS Example App
|
||||
runs-on: macOS-15
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
- uses: actions/checkout@v4
|
||||
- uses: oven-sh/setup-bun@v2
|
||||
- name: Setup Xcode
|
||||
uses: maxim-lobanov/setup-xcode@v1
|
||||
|
||||
@@ -21,7 +21,7 @@ jobs:
|
||||
id-token: write
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v7
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Setup Bun.js
|
||||
|
||||
+1
-1
@@ -381,7 +381,7 @@ function PlayerExample({
|
||||
isAutoQuality && styles.selectedTrackButtonText,
|
||||
]}
|
||||
>
|
||||
Auto
|
||||
Auto{isAutoQuality && tracks.renditions.find(r => r.selected) ? ` (${tracks.renditions.find(r => r.selected)!.height}p)` : ""}
|
||||
</Text>
|
||||
</Pressable>
|
||||
{tracks.renditions.length === 0 ? (
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
"pod": "bundle install && bundle exec pod install --project-directory=ios"
|
||||
},
|
||||
"dependencies": {
|
||||
"@react-native/new-app-screen": "0.84.1",
|
||||
"@react-native/new-app-screen": "0.86.0",
|
||||
"react": "19.2.3",
|
||||
"react-dom": "19.2.3",
|
||||
"react-native": "0.84.1",
|
||||
@@ -27,10 +27,10 @@
|
||||
"@react-native-community/cli": "20.1.0",
|
||||
"@react-native-community/cli-platform-android": "20.1.0",
|
||||
"@react-native-community/cli-platform-ios": "20.1.0",
|
||||
"@react-native/babel-preset": "0.84.1",
|
||||
"@react-native/eslint-config": "0.84.1",
|
||||
"@react-native/metro-config": "0.84.1",
|
||||
"@react-native/typescript-config": "0.84.1",
|
||||
"@react-native/babel-preset": "0.86.0",
|
||||
"@react-native/eslint-config": "0.86.0",
|
||||
"@react-native/metro-config": "0.86.0",
|
||||
"@react-native/typescript-config": "0.86.0",
|
||||
"@types/jest": "^29.5.13",
|
||||
"babel-loader": "^10.1.1",
|
||||
"babel-plugin-module-resolver": "^5.0.2",
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"scripts": {
|
||||
"dev": "cd example && bun start",
|
||||
"android": " cd example && bunx react-native run-android --no-packager --port 8082",
|
||||
"web": "cd example && bun web",
|
||||
"typecheck": "tsc --noEmit && tsc -p plugin/tsconfig.json --noEmit",
|
||||
"build:plugin": "tsc -p plugin/tsconfig.json",
|
||||
"build": "bun run typecheck && bob build && bun run build:plugin",
|
||||
|
||||
+41
-7
@@ -1,4 +1,5 @@
|
||||
import type { VideoPlayerStore } from "@videojs/core/dom";
|
||||
import type Hls from "hls.js";
|
||||
import { stateMapper } from "./events.web";
|
||||
import type {
|
||||
OmniPlayer,
|
||||
@@ -17,6 +18,11 @@ export class WebOmniPlayer implements OmniPlayer {
|
||||
this._store = store;
|
||||
}
|
||||
|
||||
private getHls(): Hls | null {
|
||||
const media = this._store.target?.media;
|
||||
return (media?.engine as Hls | undefined) ?? null;
|
||||
}
|
||||
|
||||
source: Source | null = null;
|
||||
|
||||
get showNotification(): boolean {
|
||||
@@ -78,7 +84,9 @@ export class WebOmniPlayer implements OmniPlayer {
|
||||
}
|
||||
|
||||
get isAutoQuality(): boolean {
|
||||
return true;
|
||||
const hls = this.getHls();
|
||||
if (!hls) return false;
|
||||
return hls.autoLevelEnabled;
|
||||
}
|
||||
|
||||
play(): void {
|
||||
@@ -112,16 +120,31 @@ export class WebOmniPlayer implements OmniPlayer {
|
||||
}
|
||||
|
||||
get videos(): Track[] {
|
||||
// hls.js does not support alternative video tracks (e.g. camera angles)
|
||||
return [];
|
||||
}
|
||||
|
||||
selectVideo(video: Track): void {}
|
||||
selectVideo(_video: Track): void {
|
||||
// hls.js does not support alternative video tracks
|
||||
}
|
||||
|
||||
get audios(): Track[] {
|
||||
return [];
|
||||
const hls = this.getHls();
|
||||
if (!hls) return [];
|
||||
const currentTrackId = hls.audioTrack;
|
||||
return hls.audioTracks.map((track, index) => ({
|
||||
id: index.toString(),
|
||||
label: track.name,
|
||||
language: track.lang,
|
||||
selected: index === currentTrackId,
|
||||
}));
|
||||
}
|
||||
|
||||
selectAudio(audio: Track): void {}
|
||||
selectAudio(audio: Track): void {
|
||||
const hls = this.getHls();
|
||||
if (!hls) return;
|
||||
hls.audioTrack = parseInt(audio.id, 10);
|
||||
}
|
||||
|
||||
get subtitles(): Track[] {
|
||||
return this._store.textTrackList
|
||||
@@ -145,10 +168,21 @@ export class WebOmniPlayer implements OmniPlayer {
|
||||
}
|
||||
|
||||
get rendition(): Rendition[] {
|
||||
return [];
|
||||
const hls = this.getHls();
|
||||
if (!hls) return [];
|
||||
const currentLevel = hls.currentLevel;
|
||||
return hls.levels.map((level, index) => ({
|
||||
id: index.toString(),
|
||||
width: level.width,
|
||||
height: level.height,
|
||||
bitrate: level.bitrate,
|
||||
selected: index === currentLevel,
|
||||
}));
|
||||
}
|
||||
|
||||
selectRendition(_rendition?: Rendition): void {
|
||||
// Auto quality is handled by videojs/HLS
|
||||
selectRendition(rendition?: Rendition): void {
|
||||
const hls = this.getHls();
|
||||
if (!hls) return;
|
||||
hls.nextLevel = rendition ? parseInt(rendition.id, 10) : -1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ export const OmniView = ({
|
||||
autoPlay={autoplay}
|
||||
playsInline
|
||||
crossOrigin="anonymous"
|
||||
style={{ width: "100%", height: "100%", objectFit: "cover" }}
|
||||
/>
|
||||
)}
|
||||
</VideoPlayer.Container>
|
||||
|
||||
Reference in New Issue
Block a user