From 25199984756f86f3688eeb811553b1a85aaa942e Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sun, 10 May 2026 17:25:08 +0200 Subject: [PATCH] Cleanup prev/next --- .../src/main/java/dev/zoriya/omni/EventMap.kt | 18 +++ .../main/java/dev/zoriya/omni/MpvPlayer.kt | 12 +- .../main/java/dev/zoriya/omni/OmniPlayer.kt | 40 +++--- .../generated/android/c++/JBaseSource.hpp | 120 ------------------ .../c++/JHybridOmniPlayerFactorySpec.cpp | 6 +- .../android/c++/JHybridOmniPlayerSpec.cpp | 6 +- nitrogen/generated/android/c++/JMetadata.hpp | 14 +- nitrogen/generated/android/c++/JSource.hpp | 12 +- .../com/margelo/nitro/omni/BaseSource.kt | 50 -------- .../kotlin/com/margelo/nitro/omni/Metadata.kt | 12 +- .../kotlin/com/margelo/nitro/omni/Source.kt | 10 +- nitrogen/generated/shared/c++/BaseSource.hpp | 111 ---------------- nitrogen/generated/shared/c++/Metadata.hpp | 12 +- nitrogen/generated/shared/c++/Source.hpp | 15 +-- src/types/source.ts | 9 +- 15 files changed, 88 insertions(+), 359 deletions(-) delete mode 100644 nitrogen/generated/android/c++/JBaseSource.hpp delete mode 100644 nitrogen/generated/android/kotlin/com/margelo/nitro/omni/BaseSource.kt delete mode 100644 nitrogen/generated/shared/c++/BaseSource.hpp diff --git a/android/src/main/java/dev/zoriya/omni/EventMap.kt b/android/src/main/java/dev/zoriya/omni/EventMap.kt index b6921d4..1092470 100644 --- a/android/src/main/java/dev/zoriya/omni/EventMap.kt +++ b/android/src/main/java/dev/zoriya/omni/EventMap.kt @@ -5,9 +5,12 @@ import androidx.media3.common.C import androidx.media3.common.C.TRACK_TYPE_AUDIO import androidx.media3.common.C.TRACK_TYPE_TEXT import androidx.media3.common.C.TRACK_TYPE_VIDEO +import androidx.media3.common.MediaItem import androidx.media3.common.PlaybackException import androidx.media3.common.PlaybackParameters import androidx.media3.common.Player +import androidx.media3.common.Player.MEDIA_ITEM_TRANSITION_REASON_AUTO +import androidx.media3.common.Player.MEDIA_ITEM_TRANSITION_REASON_SEEK import androidx.media3.common.Player.STATE_BUFFERING import androidx.media3.common.Player.STATE_ENDED import androidx.media3.common.Player.STATE_IDLE @@ -34,6 +37,7 @@ class EventMap(private val player: Player) : HybridOmniEventMapSpec(), Player.Li private val stateBoolListeners = mutableMapOf Unit>>() private val playerStatusListeners = mutableSetOf<(PlayerStatus) -> Unit>() private var lastTimePosDispatchMs = 0L + private var lastMediaItemIndex = 0 init { player.addListener(this) @@ -112,6 +116,20 @@ class EventMap(private val player: Player) : HybridOmniEventMapSpec(), Player.Li } } + override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) { + if (reason != MEDIA_ITEM_TRANSITION_REASON_AUTO && reason != MEDIA_ITEM_TRANSITION_REASON_SEEK) { + lastMediaItemIndex = player.currentMediaItemIndex + return + } + val newIndex = player.currentMediaItemIndex + if (newIndex < lastMediaItemIndex) { + onPrevListeners.forEach { it() } + } else if (newIndex > lastMediaItemIndex) { + onNextListeners.forEach { it() } + } + lastMediaItemIndex = newIndex + } + override fun onPositionDiscontinuity( oldPosition: Player.PositionInfo, newPosition: Player.PositionInfo, diff --git a/android/src/main/java/dev/zoriya/omni/MpvPlayer.kt b/android/src/main/java/dev/zoriya/omni/MpvPlayer.kt index 237ffa2..0cf8997 100644 --- a/android/src/main/java/dev/zoriya/omni/MpvPlayer.kt +++ b/android/src/main/java/dev/zoriya/omni/MpvPlayer.kt @@ -102,6 +102,7 @@ class MpvPlayer(ctx: Context) : BasePlayer(), MPVLib.EventObserver { private var currentTrackSelectionParameters = TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT private var playerError: PlaybackException? = null private var playlistMetadata: MediaMetadata = MediaMetadata.EMPTY + private var userInitiatedTransition: Boolean = false private val availableCommands: Player.Commands = Player.Commands.Builder() .add(COMMAND_PLAY_PAUSE) @@ -185,6 +186,12 @@ class MpvPlayer(ctx: Context) : BasePlayer(), MPVLib.EventObserver { if (prev != currentMediaItemIndex) { events.add(EVENT_MEDIA_ITEM_TRANSITION) } + val transitionReason = if (userInitiatedTransition) { + MEDIA_ITEM_TRANSITION_REASON_SEEK + } else { + MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED + } + userInitiatedTransition = false notifyListeners(events.toTypedArray()) { it.onTimelineChanged(currentTimeline, TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED) it.onMediaMetadataChanged(mediaMetadata) @@ -192,7 +199,7 @@ class MpvPlayer(ctx: Context) : BasePlayer(), MPVLib.EventObserver { if (prev != currentMediaItemIndex) { it.onMediaItemTransition( currentMediaItem, - MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED + transitionReason ) } } @@ -276,6 +283,7 @@ class MpvPlayer(ctx: Context) : BasePlayer(), MPVLib.EventObserver { if (targetIndex == INDEX_UNSET || targetIndex !in mediaItems.indices) return if (targetIndex != currentMediaItemIndex) { + userInitiatedTransition = true setMediaItems(mediaItems, targetIndex, positionMs) return } @@ -428,7 +436,7 @@ class MpvPlayer(ctx: Context) : BasePlayer(), MPVLib.EventObserver { 0L, durationUs, 0, - 0, + mediaItems.size-1, 0L ) } diff --git a/android/src/main/java/dev/zoriya/omni/OmniPlayer.kt b/android/src/main/java/dev/zoriya/omni/OmniPlayer.kt index 8ebbca6..c2f94f3 100644 --- a/android/src/main/java/dev/zoriya/omni/OmniPlayer.kt +++ b/android/src/main/java/dev/zoriya/omni/OmniPlayer.kt @@ -68,32 +68,32 @@ class OmniPlayer : HybridOmniPlayerSpec() { set(value) { Log.e("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() - value.prev?.let { prevSource -> - prevSource.src.firstOrNull()?.let { src -> - mediaItems.add(buildMediaItem(src, prevSource.metadata, prevSource.subtitles)) - } + if (value.metadata?.hasPrev == true) { + mediaItems.add(currentItem) } - value.src.firstOrNull()?.let { src -> - mediaItems.add(buildMediaItem(src, value.metadata, value.subtitles)) - } + mediaItems.add(currentItem) - value.next?.let { nextSource -> - nextSource.src.firstOrNull()?.let { src -> - mediaItems.add(buildMediaItem(src, nextSource.metadata, nextSource.subtitles)) - } + if (value.metadata?.hasNext == true) { + mediaItems.add(currentItem) } runOnMainThreadSync { - if (mediaItems.isEmpty()) { - player.setMediaItem(MediaItem.EMPTY) - } else { - val startIndex = if (value.prev != null) 1 else 0 - val startPositionMs = (value.startTime?.coerceAtLeast(0.0) ?: 0.0) * 1000.0 - player.setMediaItems(mediaItems, startIndex, startPositionMs.toLong()) - } + 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() } } @@ -163,8 +163,8 @@ class OmniPlayer : HybridOmniPlayerSpec() { } } - override val hasPrev by mainThreadProperty { player.hasPreviousMediaItem() } - override val hasNext by mainThreadProperty { player.hasNextMediaItem() } + override val hasPrev: Boolean get() = currentSource?.metadata?.hasPrev == true + override val hasNext: Boolean get() = currentSource?.metadata?.hasNext == true override val status by mainThreadProperty { when (player.playbackState) { Player.STATE_IDLE, diff --git a/nitrogen/generated/android/c++/JBaseSource.hpp b/nitrogen/generated/android/c++/JBaseSource.hpp deleted file mode 100644 index 78aa649..0000000 --- a/nitrogen/generated/android/c++/JBaseSource.hpp +++ /dev/null @@ -1,120 +0,0 @@ -/// -/// JBaseSource.hpp -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © Marc Rousavy @ Margelo -/// - -#pragma once - -#include -#include "BaseSource.hpp" - -#include "JMetadata.hpp" -#include "JMixAudioMode.hpp" -#include "JSubtitle.hpp" -#include "JVideoSrc.hpp" -#include "Metadata.hpp" -#include "MixAudioMode.hpp" -#include "Subtitle.hpp" -#include "VideoSrc.hpp" -#include -#include -#include -#include - -namespace margelo::nitro::omni { - - using namespace facebook; - - /** - * The C++ JNI bridge between the C++ struct "BaseSource" and the the Kotlin data class "BaseSource". - */ - struct JBaseSource final: public jni::JavaClass { - public: - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/omni/BaseSource;"; - - public: - /** - * Convert this Java/Kotlin-based struct to the C++ struct BaseSource by copying all values to C++. - */ - [[maybe_unused]] - [[nodiscard]] - BaseSource toCpp() const { - static const auto clazz = javaClassStatic(); - static const auto fieldSrc = clazz->getField>("src"); - jni::local_ref> src = this->getFieldValue(fieldSrc); - static const auto fieldStartTime = clazz->getField("startTime"); - jni::local_ref startTime = this->getFieldValue(fieldStartTime); - static const auto fieldSubtitles = clazz->getField>("subtitles"); - jni::local_ref> subtitles = this->getFieldValue(fieldSubtitles); - static const auto fieldMetadata = clazz->getField("metadata"); - jni::local_ref metadata = this->getFieldValue(fieldMetadata); - static const auto fieldMixAudio = clazz->getField("mixAudio"); - jni::local_ref mixAudio = this->getFieldValue(fieldMixAudio); - return BaseSource( - [&]() { - size_t __size = src->size(); - std::vector __vector; - __vector.reserve(__size); - for (size_t __i = 0; __i < __size; __i++) { - auto __element = src->getElement(__i); - __vector.push_back(__element->toCpp()); - } - return __vector; - }(), - startTime != nullptr ? std::make_optional(startTime->value()) : std::nullopt, - [&]() { - size_t __size = subtitles->size(); - std::vector __vector; - __vector.reserve(__size); - for (size_t __i = 0; __i < __size; __i++) { - auto __element = subtitles->getElement(__i); - __vector.push_back(__element->toCpp()); - } - return __vector; - }(), - metadata != nullptr ? std::make_optional(metadata->toCpp()) : std::nullopt, - mixAudio != nullptr ? std::make_optional(mixAudio->toCpp()) : std::nullopt - ); - } - - public: - /** - * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java. - */ - [[maybe_unused]] - static jni::local_ref fromCpp(const BaseSource& value) { - using JSignature = JBaseSource(jni::alias_ref>, jni::alias_ref, jni::alias_ref>, jni::alias_ref, jni::alias_ref); - static const auto clazz = javaClassStatic(); - static const auto create = clazz->getStaticMethod("fromCpp"); - return create( - clazz, - [&]() { - size_t __size = value.src.size(); - jni::local_ref> __array = jni::JArrayClass::newArray(__size); - for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = value.src[__i]; - auto __elementJni = JVideoSrc::fromCpp(__element); - __array->setElement(__i, *__elementJni); - } - return __array; - }(), - value.startTime.has_value() ? jni::JDouble::valueOf(value.startTime.value()) : nullptr, - [&]() { - size_t __size = value.subtitles.size(); - jni::local_ref> __array = jni::JArrayClass::newArray(__size); - for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = value.subtitles[__i]; - auto __elementJni = JSubtitle::fromCpp(__element); - __array->setElement(__i, *__elementJni); - } - return __array; - }(), - value.metadata.has_value() ? JMetadata::fromCpp(value.metadata.value()) : nullptr, - value.mixAudio.has_value() ? JMixAudioMode::fromCpp(value.mixAudio.value()) : nullptr - ); - } - }; - -} // namespace margelo::nitro::omni diff --git a/nitrogen/generated/android/c++/JHybridOmniPlayerFactorySpec.cpp b/nitrogen/generated/android/c++/JHybridOmniPlayerFactorySpec.cpp index fcfaba5..8e95bf1 100644 --- a/nitrogen/generated/android/c++/JHybridOmniPlayerFactorySpec.cpp +++ b/nitrogen/generated/android/c++/JHybridOmniPlayerFactorySpec.cpp @@ -11,8 +11,6 @@ namespace margelo::nitro::omni { class HybridOmniPlayerSpec; } // Forward declaration of `Source` to properly resolve imports. namespace margelo::nitro::omni { struct Source; } -// Forward declaration of `BaseSource` to properly resolve imports. -namespace margelo::nitro::omni { struct BaseSource; } // Forward declaration of `VideoSrc` to properly resolve imports. namespace margelo::nitro::omni { struct VideoSrc; } // Forward declaration of `Subtitle` to properly resolve imports. @@ -27,13 +25,11 @@ namespace margelo::nitro::omni { enum class MixAudioMode; } #include "JHybridOmniPlayerSpec.hpp" #include "Source.hpp" #include "JSource.hpp" -#include "BaseSource.hpp" -#include -#include "JBaseSource.hpp" #include "VideoSrc.hpp" #include #include "JVideoSrc.hpp" #include +#include #include #include "Subtitle.hpp" #include "JSubtitle.hpp" diff --git a/nitrogen/generated/android/c++/JHybridOmniPlayerSpec.cpp b/nitrogen/generated/android/c++/JHybridOmniPlayerSpec.cpp index 20734d2..41cc4f2 100644 --- a/nitrogen/generated/android/c++/JHybridOmniPlayerSpec.cpp +++ b/nitrogen/generated/android/c++/JHybridOmniPlayerSpec.cpp @@ -11,8 +11,6 @@ namespace margelo::nitro::omni { class HybridOmniEventMapSpec; } // Forward declaration of `Source` to properly resolve imports. namespace margelo::nitro::omni { struct Source; } -// Forward declaration of `BaseSource` to properly resolve imports. -namespace margelo::nitro::omni { struct BaseSource; } // Forward declaration of `VideoSrc` to properly resolve imports. namespace margelo::nitro::omni { struct VideoSrc; } // Forward declaration of `Subtitle` to properly resolve imports. @@ -33,13 +31,11 @@ namespace margelo::nitro::omni { enum class PlayerStatus; } #include "JHybridOmniEventMapSpec.hpp" #include "Source.hpp" #include "JSource.hpp" -#include "BaseSource.hpp" -#include -#include "JBaseSource.hpp" #include "VideoSrc.hpp" #include #include "JVideoSrc.hpp" #include +#include #include #include "Subtitle.hpp" #include "JSubtitle.hpp" diff --git a/nitrogen/generated/android/c++/JMetadata.hpp b/nitrogen/generated/android/c++/JMetadata.hpp index a3a0f42..1d00f8f 100644 --- a/nitrogen/generated/android/c++/JMetadata.hpp +++ b/nitrogen/generated/android/c++/JMetadata.hpp @@ -40,11 +40,17 @@ namespace margelo::nitro::omni { jni::local_ref artist = this->getFieldValue(fieldArtist); static const auto fieldImageLink = clazz->getField("imageLink"); jni::local_ref imageLink = this->getFieldValue(fieldImageLink); + static const auto fieldHasPrev = clazz->getField("hasPrev"); + jni::local_ref hasPrev = this->getFieldValue(fieldHasPrev); + static const auto fieldHasNext = clazz->getField("hasNext"); + jni::local_ref hasNext = this->getFieldValue(fieldHasNext); return Metadata( title->toStdString(), album != nullptr ? std::make_optional(album->toStdString()) : std::nullopt, artist != nullptr ? std::make_optional(artist->toStdString()) : std::nullopt, - imageLink != nullptr ? std::make_optional(imageLink->toStdString()) : std::nullopt + imageLink != nullptr ? std::make_optional(imageLink->toStdString()) : std::nullopt, + hasPrev != nullptr ? std::make_optional(static_cast(hasPrev->value())) : std::nullopt, + hasNext != nullptr ? std::make_optional(static_cast(hasNext->value())) : std::nullopt ); } @@ -54,7 +60,7 @@ namespace margelo::nitro::omni { */ [[maybe_unused]] static jni::local_ref fromCpp(const Metadata& value) { - using JSignature = JMetadata(jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref); + using JSignature = JMetadata(jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref); static const auto clazz = javaClassStatic(); static const auto create = clazz->getStaticMethod("fromCpp"); return create( @@ -62,7 +68,9 @@ namespace margelo::nitro::omni { jni::make_jstring(value.title), value.album.has_value() ? jni::make_jstring(value.album.value()) : nullptr, value.artist.has_value() ? jni::make_jstring(value.artist.value()) : nullptr, - value.imageLink.has_value() ? jni::make_jstring(value.imageLink.value()) : nullptr + value.imageLink.has_value() ? jni::make_jstring(value.imageLink.value()) : nullptr, + value.hasPrev.has_value() ? jni::JBoolean::valueOf(value.hasPrev.value()) : nullptr, + value.hasNext.has_value() ? jni::JBoolean::valueOf(value.hasNext.value()) : nullptr ); } }; diff --git a/nitrogen/generated/android/c++/JSource.hpp b/nitrogen/generated/android/c++/JSource.hpp index d7b9cc8..4412f30 100644 --- a/nitrogen/generated/android/c++/JSource.hpp +++ b/nitrogen/generated/android/c++/JSource.hpp @@ -10,8 +10,6 @@ #include #include "Source.hpp" -#include "BaseSource.hpp" -#include "JBaseSource.hpp" #include "JMetadata.hpp" #include "JMixAudioMode.hpp" #include "JSubtitle.hpp" @@ -44,10 +42,6 @@ namespace margelo::nitro::omni { [[nodiscard]] Source toCpp() const { static const auto clazz = javaClassStatic(); - static const auto fieldPrev = clazz->getField("prev"); - jni::local_ref prev = this->getFieldValue(fieldPrev); - static const auto fieldNext = clazz->getField("next"); - jni::local_ref next = this->getFieldValue(fieldNext); static const auto fieldSrc = clazz->getField>("src"); jni::local_ref> src = this->getFieldValue(fieldSrc); static const auto fieldStartTime = clazz->getField("startTime"); @@ -59,8 +53,6 @@ namespace margelo::nitro::omni { static const auto fieldMixAudio = clazz->getField("mixAudio"); jni::local_ref mixAudio = this->getFieldValue(fieldMixAudio); return Source( - prev != nullptr ? std::make_optional(prev->toCpp()) : std::nullopt, - next != nullptr ? std::make_optional(next->toCpp()) : std::nullopt, [&]() { size_t __size = src->size(); std::vector __vector; @@ -93,13 +85,11 @@ namespace margelo::nitro::omni { */ [[maybe_unused]] static jni::local_ref fromCpp(const Source& value) { - using JSignature = JSource(jni::alias_ref, jni::alias_ref, jni::alias_ref>, jni::alias_ref, jni::alias_ref>, jni::alias_ref, jni::alias_ref); + using JSignature = JSource(jni::alias_ref>, jni::alias_ref, jni::alias_ref>, jni::alias_ref, jni::alias_ref); static const auto clazz = javaClassStatic(); static const auto create = clazz->getStaticMethod("fromCpp"); return create( clazz, - value.prev.has_value() ? JBaseSource::fromCpp(value.prev.value()) : nullptr, - value.next.has_value() ? JBaseSource::fromCpp(value.next.value()) : nullptr, [&]() { size_t __size = value.src.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/omni/BaseSource.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/omni/BaseSource.kt deleted file mode 100644 index a6b8fd1..0000000 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/omni/BaseSource.kt +++ /dev/null @@ -1,50 +0,0 @@ -/// -/// BaseSource.kt -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © Marc Rousavy @ Margelo -/// - -package com.margelo.nitro.omni - -import androidx.annotation.Keep -import com.facebook.proguard.annotations.DoNotStrip - - -/** - * Represents the JavaScript object/struct "BaseSource". - */ -@DoNotStrip -@Keep -data class BaseSource( - @DoNotStrip - @Keep - val src: Array, - @DoNotStrip - @Keep - val startTime: Double?, - @DoNotStrip - @Keep - val subtitles: Array, - @DoNotStrip - @Keep - val metadata: Metadata?, - @DoNotStrip - @Keep - val mixAudio: MixAudioMode? -) { - /* primary constructor */ - - companion object { - /** - * Constructor called from C++ - */ - @DoNotStrip - @Keep - @Suppress("unused") - @JvmStatic - private fun fromCpp(src: Array, startTime: Double?, subtitles: Array, metadata: Metadata?, mixAudio: MixAudioMode?): BaseSource { - return BaseSource(src, startTime, subtitles, metadata, mixAudio) - } - } -} diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/omni/Metadata.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/omni/Metadata.kt index 987775b..fa6fd15 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/omni/Metadata.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/omni/Metadata.kt @@ -28,7 +28,13 @@ data class Metadata( val artist: String?, @DoNotStrip @Keep - val imageLink: String? + val imageLink: String?, + @DoNotStrip + @Keep + val hasPrev: Boolean?, + @DoNotStrip + @Keep + val hasNext: Boolean? ) { /* primary constructor */ @@ -40,8 +46,8 @@ data class Metadata( @Keep @Suppress("unused") @JvmStatic - private fun fromCpp(title: String, album: String?, artist: String?, imageLink: String?): Metadata { - return Metadata(title, album, artist, imageLink) + private fun fromCpp(title: String, album: String?, artist: String?, imageLink: String?, hasPrev: Boolean?, hasNext: Boolean?): Metadata { + return Metadata(title, album, artist, imageLink, hasPrev, hasNext) } } } diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/omni/Source.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/omni/Source.kt index 605f7b1..c8525c7 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/omni/Source.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/omni/Source.kt @@ -17,12 +17,6 @@ import com.facebook.proguard.annotations.DoNotStrip @DoNotStrip @Keep data class Source( - @DoNotStrip - @Keep - val prev: BaseSource?, - @DoNotStrip - @Keep - val next: BaseSource?, @DoNotStrip @Keep val src: Array, @@ -49,8 +43,8 @@ data class Source( @Keep @Suppress("unused") @JvmStatic - private fun fromCpp(prev: BaseSource?, next: BaseSource?, src: Array, startTime: Double?, subtitles: Array, metadata: Metadata?, mixAudio: MixAudioMode?): Source { - return Source(prev, next, src, startTime, subtitles, metadata, mixAudio) + private fun fromCpp(src: Array, startTime: Double?, subtitles: Array, metadata: Metadata?, mixAudio: MixAudioMode?): Source { + return Source(src, startTime, subtitles, metadata, mixAudio) } } } diff --git a/nitrogen/generated/shared/c++/BaseSource.hpp b/nitrogen/generated/shared/c++/BaseSource.hpp deleted file mode 100644 index d48193a..0000000 --- a/nitrogen/generated/shared/c++/BaseSource.hpp +++ /dev/null @@ -1,111 +0,0 @@ -/// -/// BaseSource.hpp -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - -// Forward declaration of `VideoSrc` to properly resolve imports. -namespace margelo::nitro::omni { struct VideoSrc; } -// Forward declaration of `Subtitle` to properly resolve imports. -namespace margelo::nitro::omni { struct Subtitle; } -// Forward declaration of `Metadata` to properly resolve imports. -namespace margelo::nitro::omni { struct Metadata; } -// Forward declaration of `MixAudioMode` to properly resolve imports. -namespace margelo::nitro::omni { enum class MixAudioMode; } - -#include "VideoSrc.hpp" -#include -#include -#include "Subtitle.hpp" -#include "Metadata.hpp" -#include "MixAudioMode.hpp" - -namespace margelo::nitro::omni { - - /** - * A struct which can be represented as a JavaScript object (BaseSource). - */ - struct BaseSource final { - public: - std::vector src SWIFT_PRIVATE; - std::optional startTime SWIFT_PRIVATE; - std::vector subtitles SWIFT_PRIVATE; - std::optional metadata SWIFT_PRIVATE; - std::optional mixAudio SWIFT_PRIVATE; - - public: - BaseSource() = default; - explicit BaseSource(std::vector src, std::optional startTime, std::vector subtitles, std::optional metadata, std::optional mixAudio): src(src), startTime(startTime), subtitles(subtitles), metadata(metadata), mixAudio(mixAudio) {} - - public: - friend bool operator==(const BaseSource& lhs, const BaseSource& rhs) = default; - }; - -} // namespace margelo::nitro::omni - -namespace margelo::nitro { - - // C++ BaseSource <> JS BaseSource (object) - template <> - struct JSIConverter final { - static inline margelo::nitro::omni::BaseSource fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - jsi::Object obj = arg.asObject(runtime); - return margelo::nitro::omni::BaseSource( - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "src"))), - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "startTime"))), - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "subtitles"))), - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "metadata"))), - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "mixAudio"))) - ); - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::omni::BaseSource& arg) { - jsi::Object obj(runtime); - obj.setProperty(runtime, PropNameIDCache::get(runtime, "src"), JSIConverter>::toJSI(runtime, arg.src)); - obj.setProperty(runtime, PropNameIDCache::get(runtime, "startTime"), JSIConverter>::toJSI(runtime, arg.startTime)); - obj.setProperty(runtime, PropNameIDCache::get(runtime, "subtitles"), JSIConverter>::toJSI(runtime, arg.subtitles)); - obj.setProperty(runtime, PropNameIDCache::get(runtime, "metadata"), JSIConverter>::toJSI(runtime, arg.metadata)); - obj.setProperty(runtime, PropNameIDCache::get(runtime, "mixAudio"), JSIConverter>::toJSI(runtime, arg.mixAudio)); - return obj; - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isObject()) { - return false; - } - jsi::Object obj = value.getObject(runtime); - if (!nitro::isPlainObject(runtime, obj)) { - return false; - } - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "src")))) return false; - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "startTime")))) return false; - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "subtitles")))) return false; - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "metadata")))) return false; - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "mixAudio")))) return false; - return true; - } - }; - -} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/Metadata.hpp b/nitrogen/generated/shared/c++/Metadata.hpp index 60de8a7..1d3f163 100644 --- a/nitrogen/generated/shared/c++/Metadata.hpp +++ b/nitrogen/generated/shared/c++/Metadata.hpp @@ -44,10 +44,12 @@ namespace margelo::nitro::omni { std::optional album SWIFT_PRIVATE; std::optional artist SWIFT_PRIVATE; std::optional imageLink SWIFT_PRIVATE; + std::optional hasPrev SWIFT_PRIVATE; + std::optional hasNext SWIFT_PRIVATE; public: Metadata() = default; - explicit Metadata(std::string title, std::optional album, std::optional artist, std::optional imageLink): title(title), album(album), artist(artist), imageLink(imageLink) {} + explicit Metadata(std::string title, std::optional album, std::optional artist, std::optional imageLink, std::optional hasPrev, std::optional hasNext): title(title), album(album), artist(artist), imageLink(imageLink), hasPrev(hasPrev), hasNext(hasNext) {} public: friend bool operator==(const Metadata& lhs, const Metadata& rhs) = default; @@ -66,7 +68,9 @@ namespace margelo::nitro { JSIConverter::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "title"))), JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "album"))), JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "artist"))), - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "imageLink"))) + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "imageLink"))), + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "hasPrev"))), + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "hasNext"))) ); } static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::omni::Metadata& arg) { @@ -75,6 +79,8 @@ namespace margelo::nitro { obj.setProperty(runtime, PropNameIDCache::get(runtime, "album"), JSIConverter>::toJSI(runtime, arg.album)); obj.setProperty(runtime, PropNameIDCache::get(runtime, "artist"), JSIConverter>::toJSI(runtime, arg.artist)); obj.setProperty(runtime, PropNameIDCache::get(runtime, "imageLink"), JSIConverter>::toJSI(runtime, arg.imageLink)); + obj.setProperty(runtime, PropNameIDCache::get(runtime, "hasPrev"), JSIConverter>::toJSI(runtime, arg.hasPrev)); + obj.setProperty(runtime, PropNameIDCache::get(runtime, "hasNext"), JSIConverter>::toJSI(runtime, arg.hasNext)); return obj; } static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { @@ -89,6 +95,8 @@ namespace margelo::nitro { if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "album")))) return false; if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "artist")))) return false; if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "imageLink")))) return false; + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "hasPrev")))) return false; + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "hasNext")))) return false; return true; } }; diff --git a/nitrogen/generated/shared/c++/Source.hpp b/nitrogen/generated/shared/c++/Source.hpp index 021a412..d84af8b 100644 --- a/nitrogen/generated/shared/c++/Source.hpp +++ b/nitrogen/generated/shared/c++/Source.hpp @@ -28,8 +28,6 @@ #error NitroModules cannot be found! Are you sure you installed NitroModules properly? #endif -// Forward declaration of `BaseSource` to properly resolve imports. -namespace margelo::nitro::omni { struct BaseSource; } // Forward declaration of `VideoSrc` to properly resolve imports. namespace margelo::nitro::omni { struct VideoSrc; } // Forward declaration of `Subtitle` to properly resolve imports. @@ -39,10 +37,9 @@ namespace margelo::nitro::omni { struct Metadata; } // Forward declaration of `MixAudioMode` to properly resolve imports. namespace margelo::nitro::omni { enum class MixAudioMode; } -#include "BaseSource.hpp" -#include #include "VideoSrc.hpp" #include +#include #include "Subtitle.hpp" #include "Metadata.hpp" #include "MixAudioMode.hpp" @@ -54,8 +51,6 @@ namespace margelo::nitro::omni { */ struct Source final { public: - std::optional prev SWIFT_PRIVATE; - std::optional next SWIFT_PRIVATE; std::vector src SWIFT_PRIVATE; std::optional startTime SWIFT_PRIVATE; std::vector subtitles SWIFT_PRIVATE; @@ -64,7 +59,7 @@ namespace margelo::nitro::omni { public: Source() = default; - explicit Source(std::optional prev, std::optional next, std::vector src, std::optional startTime, std::vector subtitles, std::optional metadata, std::optional mixAudio): prev(prev), next(next), src(src), startTime(startTime), subtitles(subtitles), metadata(metadata), mixAudio(mixAudio) {} + explicit Source(std::vector src, std::optional startTime, std::vector subtitles, std::optional metadata, std::optional mixAudio): src(src), startTime(startTime), subtitles(subtitles), metadata(metadata), mixAudio(mixAudio) {} public: friend bool operator==(const Source& lhs, const Source& rhs) = default; @@ -80,8 +75,6 @@ namespace margelo::nitro { static inline margelo::nitro::omni::Source fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { jsi::Object obj = arg.asObject(runtime); return margelo::nitro::omni::Source( - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "prev"))), - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "next"))), JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "src"))), JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "startTime"))), JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "subtitles"))), @@ -91,8 +84,6 @@ namespace margelo::nitro { } static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::omni::Source& arg) { jsi::Object obj(runtime); - obj.setProperty(runtime, PropNameIDCache::get(runtime, "prev"), JSIConverter>::toJSI(runtime, arg.prev)); - obj.setProperty(runtime, PropNameIDCache::get(runtime, "next"), JSIConverter>::toJSI(runtime, arg.next)); obj.setProperty(runtime, PropNameIDCache::get(runtime, "src"), JSIConverter>::toJSI(runtime, arg.src)); obj.setProperty(runtime, PropNameIDCache::get(runtime, "startTime"), JSIConverter>::toJSI(runtime, arg.startTime)); obj.setProperty(runtime, PropNameIDCache::get(runtime, "subtitles"), JSIConverter>::toJSI(runtime, arg.subtitles)); @@ -108,8 +99,6 @@ namespace margelo::nitro { if (!nitro::isPlainObject(runtime, obj)) { return false; } - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "prev")))) return false; - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "next")))) return false; if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "src")))) return false; if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "startTime")))) return false; if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "subtitles")))) return false; diff --git a/src/types/source.ts b/src/types/source.ts index 35d7d98..ee043ac 100644 --- a/src/types/source.ts +++ b/src/types/source.ts @@ -1,4 +1,4 @@ -export interface BaseSource { +export interface Source { src: VideoSrc[]; startTime?: number; subtitles: Subtitle[]; @@ -6,11 +6,6 @@ export interface BaseSource { mixAudio?: MixAudioMode; } -export interface Source extends BaseSource { - prev?: BaseSource - next?: BaseSource -} - export interface VideoSrc { uri: string; mimeType?: string; @@ -32,6 +27,8 @@ export interface Metadata { album?: string; artist?: string; imageLink?: string; + hasPrev?: boolean; + hasNext?: boolean; } export type MixAudioMode = "mixWithOthers" | "doNotMix" | "duckOthers" | "auto";