Cleanup setSource

This commit is contained in:
2026-05-25 18:33:44 +02:00
parent 89799cd5cc
commit 466b792878
12 changed files with 76 additions and 11479 deletions
@@ -24,7 +24,6 @@ import androidx.core.net.toUri
import androidx.media3.common.MediaItem.RequestMetadata
import androidx.media3.common.MediaItem.SubtitleConfiguration
import androidx.media3.common.TrackSelectionOverride
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.session.DefaultMediaNotificationProvider
import androidx.media3.session.MediaSession
import androidx.media3.session.MediaSessionService
@@ -64,43 +63,6 @@ class OmniPlayer : HybridOmniPlayerSpec() {
runOnMainThread { player.release() }
}
private var currentSource: Source? = null
override var source: Source
get() = currentSource
?: throw IllegalStateException("source should be initialized before get")
set(value) {
Log.i("omni", "update source")
currentSource = value
val src = value.src.firstOrNull()
if (src == null) {
runOnMainThreadSync {
player.setMediaItem(MediaItem.EMPTY)
player.prepare()
}
return
}
val currentItem = buildMediaItem(src, value.metadata, value.subtitles)
val mediaItems = mutableListOf<MediaItem>()
if (value.metadata?.hasPrev == true) {
mediaItems.add(currentItem)
}
mediaItems.add(currentItem)
if (value.metadata?.hasNext == true) {
mediaItems.add(currentItem)
}
runOnMainThreadSync {
val startIndex = if (value.metadata?.hasPrev == true) 1 else 0
val startPositionMs = (value.startTime?.coerceAtLeast(0.0) ?: 0.0) * 1000.0
player.setMediaItems(mediaItems, startIndex, startPositionMs.toLong())
player.prepare()
}
}
private fun buildMediaItem(
src: com.margelo.nitro.omni.VideoSrc,
metadata: com.margelo.nitro.omni.Metadata?,
@@ -153,8 +115,8 @@ class OmniPlayer : HybridOmniPlayerSpec() {
}
}
override val hasPrev: Boolean get() = currentSource?.metadata?.hasPrev == true
override val hasNext: Boolean get() = currentSource?.metadata?.hasNext == true
override val hasPrev: Boolean get() = player.hasPreviousMediaItem()
override val hasNext: Boolean get() = player.hasNextMediaItem()
override val status by mainThreadProperty {
when (player.playbackState) {
Player.STATE_IDLE,
@@ -207,6 +169,38 @@ class OmniPlayer : HybridOmniPlayerSpec() {
}
}
override fun setSource(src: Source) {
Log.i("omni", "update source")
val source = src.src.firstOrNull()
if (source == null) {
runOnMainThreadSync {
player.setMediaItem(MediaItem.EMPTY)
player.prepare()
}
return
}
val currentItem = buildMediaItem(source, src.metadata, src.subtitles)
val mediaItems = mutableListOf<MediaItem>()
if (src.metadata?.hasPrev == true) {
mediaItems.add(currentItem)
}
mediaItems.add(currentItem)
if (src.metadata?.hasNext == true) {
mediaItems.add(currentItem)
}
runOnMainThreadSync {
val startIndex = if (src.metadata?.hasPrev == true) 1 else 0
val startPositionMs = (src.startTime?.coerceAtLeast(0.0) ?: 0.0) * 1000.0
player.setMediaItems(mediaItems, startIndex, startPositionMs.toLong())
player.prepare()
}
}
override fun play() {
runOnMainThreadSync { player.play() }
}
+19 -24
View File
@@ -9,6 +9,12 @@
// Forward declaration of `HybridOmniEventMapSpec` to properly resolve imports.
namespace margelo::nitro::omni { class HybridOmniEventMapSpec; }
// Forward declaration of `Track` to properly resolve imports.
namespace margelo::nitro::omni { struct Track; }
// Forward declaration of `Rendition` to properly resolve imports.
namespace margelo::nitro::omni { struct Rendition; }
// Forward declaration of `PlayerStatus` to properly resolve imports.
namespace margelo::nitro::omni { enum class PlayerStatus; }
// Forward declaration of `Source` to properly resolve imports.
namespace margelo::nitro::omni { struct Source; }
// Forward declaration of `VideoSrc` to properly resolve imports.
@@ -19,23 +25,23 @@ namespace margelo::nitro::omni { struct Subtitle; }
namespace margelo::nitro::omni { struct Metadata; }
// Forward declaration of `MixAudioMode` to properly resolve imports.
namespace margelo::nitro::omni { enum class MixAudioMode; }
// Forward declaration of `Track` to properly resolve imports.
namespace margelo::nitro::omni { struct Track; }
// Forward declaration of `Rendition` to properly resolve imports.
namespace margelo::nitro::omni { struct Rendition; }
// Forward declaration of `PlayerStatus` to properly resolve imports.
namespace margelo::nitro::omni { enum class PlayerStatus; }
#include <memory>
#include "HybridOmniEventMapSpec.hpp"
#include "JHybridOmniEventMapSpec.hpp"
#include <optional>
#include "Track.hpp"
#include <vector>
#include "JTrack.hpp"
#include <string>
#include "Rendition.hpp"
#include "JRendition.hpp"
#include "PlayerStatus.hpp"
#include "JPlayerStatus.hpp"
#include "Source.hpp"
#include "JSource.hpp"
#include "VideoSrc.hpp"
#include <vector>
#include "JVideoSrc.hpp"
#include <string>
#include <optional>
#include <unordered_map>
#include "Subtitle.hpp"
#include "JSubtitle.hpp"
@@ -43,12 +49,6 @@ namespace margelo::nitro::omni { enum class PlayerStatus; }
#include "JMetadata.hpp"
#include "MixAudioMode.hpp"
#include "JMixAudioMode.hpp"
#include "Track.hpp"
#include "JTrack.hpp"
#include "Rendition.hpp"
#include "JRendition.hpp"
#include "PlayerStatus.hpp"
#include "JPlayerStatus.hpp"
namespace margelo::nitro::omni {
@@ -85,15 +85,6 @@ namespace margelo::nitro::omni {
auto __result = method(_javaPart);
return __result->getJHybridOmniEventMapSpec();
}
Source JHybridOmniPlayerSpec::getSource() {
static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JSource>()>("getSource");
auto __result = method(_javaPart);
return __result->toCpp();
}
void JHybridOmniPlayerSpec::setSource(const Source& source) {
static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JSource> /* source */)>("setSource");
method(_javaPart, JSource::fromCpp(source));
}
std::optional<bool> JHybridOmniPlayerSpec::getShowNotification() {
static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<jni::JBoolean>()>("getShowNotification");
auto __result = method(_javaPart);
@@ -232,6 +223,10 @@ namespace margelo::nitro::omni {
}
// Methods
void JHybridOmniPlayerSpec::setSource(const Source& src) {
static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JSource> /* src */)>("setSource");
method(_javaPart, JSource::fromCpp(src));
}
void JHybridOmniPlayerSpec::play() {
static const auto method = _javaPart->javaClassStatic()->getMethod<void()>("play");
method(_javaPart);
+1 -2
View File
@@ -51,8 +51,6 @@ namespace margelo::nitro::omni {
public:
// Properties
std::shared_ptr<HybridOmniEventMapSpec> getEventMap() override;
Source getSource() override;
void setSource(const Source& source) override;
std::optional<bool> getShowNotification() override;
void setShowNotification(std::optional<bool> showNotification) override;
bool getHasPrev() override;
@@ -77,6 +75,7 @@ namespace margelo::nitro::omni {
public:
// Methods
void setSource(const Source& src) override;
void play() override;
void pause() override;
void seekBy(double offset) override;
@@ -29,12 +29,6 @@ abstract class HybridOmniPlayerSpec: HybridObject() {
@get:Keep
abstract val eventMap: HybridOmniEventMapSpec
@get:DoNotStrip
@get:Keep
@set:DoNotStrip
@set:Keep
abstract var source: Source
@get:DoNotStrip
@get:Keep
@set:DoNotStrip
@@ -110,6 +104,10 @@ abstract class HybridOmniPlayerSpec: HybridObject() {
abstract val isAutoQuality: Boolean
// Methods
@DoNotStrip
@Keep
abstract fun setSource(src: Source): Unit
@DoNotStrip
@Keep
abstract fun play(): Unit
+1 -2
View File
@@ -15,8 +15,6 @@ namespace margelo::nitro::omni {
// load custom methods/properties
registerHybrids(this, [](Prototype& prototype) {
prototype.registerHybridGetter("eventMap", &HybridOmniPlayerSpec::getEventMap);
prototype.registerHybridGetter("source", &HybridOmniPlayerSpec::getSource);
prototype.registerHybridSetter("source", &HybridOmniPlayerSpec::setSource);
prototype.registerHybridGetter("showNotification", &HybridOmniPlayerSpec::getShowNotification);
prototype.registerHybridSetter("showNotification", &HybridOmniPlayerSpec::setShowNotification);
prototype.registerHybridGetter("hasPrev", &HybridOmniPlayerSpec::getHasPrev);
@@ -38,6 +36,7 @@ namespace margelo::nitro::omni {
prototype.registerHybridGetter("muted", &HybridOmniPlayerSpec::getMuted);
prototype.registerHybridSetter("muted", &HybridOmniPlayerSpec::setMuted);
prototype.registerHybridGetter("isAutoQuality", &HybridOmniPlayerSpec::getIsAutoQuality);
prototype.registerHybridMethod("setSource", &HybridOmniPlayerSpec::setSource);
prototype.registerHybridMethod("play", &HybridOmniPlayerSpec::play);
prototype.registerHybridMethod("pause", &HybridOmniPlayerSpec::pause);
prototype.registerHybridMethod("seekBy", &HybridOmniPlayerSpec::seekBy);
+4 -5
View File
@@ -15,23 +15,23 @@
// Forward declaration of `HybridOmniEventMapSpec` to properly resolve imports.
namespace margelo::nitro::omni { class HybridOmniEventMapSpec; }
// Forward declaration of `Source` to properly resolve imports.
namespace margelo::nitro::omni { struct Source; }
// Forward declaration of `Track` to properly resolve imports.
namespace margelo::nitro::omni { struct Track; }
// Forward declaration of `Rendition` to properly resolve imports.
namespace margelo::nitro::omni { struct Rendition; }
// Forward declaration of `PlayerStatus` to properly resolve imports.
namespace margelo::nitro::omni { enum class PlayerStatus; }
// Forward declaration of `Source` to properly resolve imports.
namespace margelo::nitro::omni { struct Source; }
#include <memory>
#include "HybridOmniEventMapSpec.hpp"
#include "Source.hpp"
#include <optional>
#include "Track.hpp"
#include <vector>
#include "Rendition.hpp"
#include "PlayerStatus.hpp"
#include "Source.hpp"
namespace margelo::nitro::omni {
@@ -61,8 +61,6 @@ namespace margelo::nitro::omni {
public:
// Properties
virtual std::shared_ptr<HybridOmniEventMapSpec> getEventMap() = 0;
virtual Source getSource() = 0;
virtual void setSource(const Source& source) = 0;
virtual std::optional<bool> getShowNotification() = 0;
virtual void setShowNotification(std::optional<bool> showNotification) = 0;
virtual bool getHasPrev() = 0;
@@ -87,6 +85,7 @@ namespace margelo::nitro::omni {
public:
// Methods
virtual void setSource(const Source& src) = 0;
virtual void play() = 0;
virtual void pause() = 0;
virtual void seekBy(double offset) = 0;
-11373
View File
File diff suppressed because it is too large Load Diff
+4 -10
View File
@@ -6,7 +6,6 @@ import type {
Rendition,
Track,
} from "./types/player";
import type { Source } from "./types/source";
export class WebOmniPlayer implements OmniPlayer {
_store: VideoPlayerStore;
@@ -17,19 +16,12 @@ export class WebOmniPlayer implements OmniPlayer {
this._store = store;
}
get source(): Source {
// TODO
}
set source(source: Source) {
// TODO
}
get showNotification(): boolean {
// TODO
return false;
}
set showNotification(value: boolean) {
set showNotification(_: boolean) {
// TODO
}
@@ -108,10 +100,12 @@ export class WebOmniPlayer implements OmniPlayer {
get hasPrev(): boolean {
// TODO
return false;
}
get hasNext(): boolean {
// TODO
return false;
}
get videos(): Track[] {
+1 -1
View File
@@ -22,7 +22,7 @@ export const OmniProvider = ({
const player = useLazyRef(() => ProviderFactory.createPlayer(source));
useEffect(() => {
player.source = source;
player.setSource(source);
}, [source]);
useEffect(() => {
+5 -12
View File
@@ -1,15 +1,8 @@
import { createPlayer } from "@videojs/react";
import { videoFeatures } from "@videojs/react/video";
import {
createContext,
type ReactNode,
useContext,
useEffect,
} from "react";
import { createContext, type ReactNode, useContext, useEffect } from "react";
import { WebOmniPlayer } from "./player.web";
import type {
OmniPlayer,
} from "./types/player";
import type { OmniPlayer } from "./types/player";
import type { Source } from "./types/source";
import { useLazyRef } from "./utils/lazy-ref";
@@ -45,11 +38,11 @@ const PlayerInitializer = ({
showNotification: boolean;
}) => {
const store = VideoPlayer.usePlayer();
const player = useLazyRef(() => new WebOmniPlayer(store, source));
const player = useLazyRef(() => new WebOmniPlayer(store));
useEffect(() => {
player.updateSource(source);
}, [source]);
store.source = source.src[0]?.uri || null;
}, [store, source]);
useEffect(() => {
player.showNotification = showNotification;
+2
View File
@@ -56,6 +56,8 @@ export interface OmniPlayer
extends HybridObject<{ android: "kotlin" }>,
OmniPlayerT {
readonly eventMap: OmniEventMap;
setSource(src: Source): void;
}
export interface OmniPlayerFactory extends HybridObject<{ android: "kotlin" }> {
+1 -4
View File
@@ -1,7 +1,4 @@
import type { Source } from "./source";
export interface OmniPlayer extends OmniPlayerState {
source: Source;
showNotification?: boolean;
play(): void;
@@ -34,7 +31,7 @@ export interface OmniPlayerState {
// between 0 and 1
volume: number;
muted: boolean;
readonly isAutoQuality: boolean
readonly isAutoQuality: boolean;
}
export type PlayerStatus = "idle" | "loading" | "readyToPlay" | "error";