From 558480ea9da3270e43da34c4b78e23980605ff65 Mon Sep 17 00:00:00 2001 From: Alex Kim Date: Mon, 18 Nov 2024 03:06:29 +1100 Subject: [PATCH] Got working subtitles/audio --- .../.gradle/8.9/checksums/checksums.lock | Bin 0 -> 17 bytes .../8.9/dependencies-accessors/gc.properties | 0 .../.gradle/8.9/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/8.9/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../android/.gradle/8.9/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .../buildOutputCleanup/cache.properties | 2 + .../android/.gradle/vcs-1/gc.properties | 0 modules/vlc-player/android/build.gradle | 1 - .../expo/modules/vlcplayer/VlcPlayerModule.kt | 30 +++--- .../expo/modules/vlcplayer/VlcPlayerView.kt | 92 +++++++----------- 11 files changed, 52 insertions(+), 73 deletions(-) create mode 100644 modules/vlc-player/android/.gradle/8.9/checksums/checksums.lock create mode 100644 modules/vlc-player/android/.gradle/8.9/dependencies-accessors/gc.properties create mode 100644 modules/vlc-player/android/.gradle/8.9/fileChanges/last-build.bin create mode 100644 modules/vlc-player/android/.gradle/8.9/fileHashes/fileHashes.lock create mode 100644 modules/vlc-player/android/.gradle/8.9/gc.properties create mode 100644 modules/vlc-player/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 modules/vlc-player/android/.gradle/buildOutputCleanup/cache.properties create mode 100644 modules/vlc-player/android/.gradle/vcs-1/gc.properties diff --git a/modules/vlc-player/android/.gradle/8.9/checksums/checksums.lock b/modules/vlc-player/android/.gradle/8.9/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..52a7f0f4db1362d9d70601745a03ec2299581cfd GIT binary patch literal 17 TcmZQxc(L*Ap=GabGC% - // view.setAudioTrack(trackIndex) - // } + AsyncFunction("setAudioTrack") { view: VlcPlayerView, trackIndex: Int -> + view.setAudioTrack(trackIndex) + } - // AsyncFunction("getAudioTracks") { view: VlcPlayerView -> List>? -> - // view.getAudioTracks() - // } + AsyncFunction("getAudioTracks") { view: VlcPlayerView -> + view.getAudioTracks() + } - // AsyncFunction("setSubtitleTrack") { view: VlcPlayerView, trackIndex: Int -> - // view.setSubtitleTrack(trackIndex) - // } + AsyncFunction("setSubtitleTrack") { view: VlcPlayerView, trackIndex: Int -> + view.setSubtitleTrack(trackIndex) + } - // AsyncFunction("getSubtitleTracks") { view: VlcPlayerView -> List>? -> - // view.getSubtitleTracks() - // } + AsyncFunction("getSubtitleTracks") { view: VlcPlayerView -> + view.getSubtitleTracks() + } - // AsyncFunction("setSubtitleURL") { view: VlcPlayerView, url: String, name: String -> - // view.setSubtitleURL(url, name) - // } + AsyncFunction("setSubtitleURL") { view: VlcPlayerView, url: String, name: String -> + view.setSubtitleURL(url, name) + } } } } \ No newline at end of file diff --git a/modules/vlc-player/android/src/main/java/expo/modules/vlcplayer/VlcPlayerView.kt b/modules/vlc-player/android/src/main/java/expo/modules/vlcplayer/VlcPlayerView.kt index e6afc99f..92db5b17 100644 --- a/modules/vlc-player/android/src/main/java/expo/modules/vlcplayer/VlcPlayerView.kt +++ b/modules/vlc-player/android/src/main/java/expo/modules/vlcplayer/VlcPlayerView.kt @@ -6,14 +6,12 @@ import android.view.ViewGroup import android.widget.FrameLayout import androidx.lifecycle.LifecycleObserver import android.net.Uri -import com.facebook.react.bridge.Arguments -import com.facebook.react.bridge.ReactContext -import com.facebook.react.bridge.ReactApplicationContext -import com.facebook.react.modules.core.DeviceEventManagerModule import expo.modules.kotlin.AppContext import expo.modules.kotlin.views.ExpoView +import expo.modules.kotlin.viewevent.EventDispatcher import org.videolan.libvlc.LibVLC import org.videolan.libvlc.Media + import org.videolan.libvlc.MediaPlayer import org.videolan.libvlc.util.VLCVideoLayout @@ -28,6 +26,10 @@ class VlcPlayerView(context: Context, appContext: AppContext) : ExpoView(context private var lastReportedIsPlaying: Boolean? = null private var startPosition: Int? = null + private val onVideoProgress by EventDispatcher() + private val onVideoStateChange by EventDispatcher() + private val onVideoLoadEnd by EventDispatcher() + init { setupView() } @@ -81,10 +83,6 @@ class VlcPlayerView(context: Context, appContext: AppContext) : ExpoView(context if (autoplay) { Log.d("VlcPlayerView", "Playing...") play() - // if (startPosition > 0) { - // Log.d("VlcPlayerView", "Debug: Starting at position: $startPosition") - // seekTo(startPosition) - // } } } @@ -119,36 +117,36 @@ class VlcPlayerView(context: Context, appContext: AppContext) : ExpoView(context } } - // fun setAudioTrack(trackIndex: Int) { - // mediaPlayer?.setAudioTrack(trackIndex) - // } + fun setAudioTrack(trackIndex: Int) { + mediaPlayer?.setAudioTrack(trackIndex) + } - // fun getAudioTracks(): List>? { - // val trackNames = mediaPlayer?.audioTrackNames ?: return null - // val trackIndexes = mediaPlayer?.audioTracks ?: return null + fun getAudioTracks(): List>? { - // return trackNames.zip(trackIndexes).map { (name, index) -> - // mapOf("name" to name, "index" to index) - // } - // } + println("getAudioTracks") + println(mediaPlayer?.getAudioTracks()) + val trackDescriptions = mediaPlayer?.audioTracks ?: return null - // fun setSubtitleTrack(trackIndex: Int) { - // mediaPlayer?.setSpuTrack(trackIndex) - // } + return trackDescriptions.map { trackDescription -> + mapOf("name" to trackDescription.name, "index" to trackDescription.id) + } + } - // fun getSubtitleTracks(): List>? { - // val trackNames = mediaPlayer?.spuTrackNames ?: return null - // val trackIndexes = mediaPlayer?.spuTracks ?: return null + fun setSubtitleTrack(trackIndex: Int) { + mediaPlayer?.setSpuTrack(trackIndex) + } - // return trackNames.zip(trackIndexes).map { (name, index) -> - // mapOf("name" to name, "index" to index) - // } - // } + fun getSubtitleTracks(): List>? { + return mediaPlayer?.getSpuTracks()?.map { trackDescription -> + mapOf("name" to trackDescription.name, "index" to trackDescription.id) + } + } - // fun setSubtitleURL(subtitleURL: String, name: String) { - // val media = mediaPlayer?.media ?: return - // media.addSlave(Media.Slave(Media.Slave.Type.Subtitle, subtitleURL, true)) - // } + fun setSubtitleURL(subtitleURL: String, name: String) { + // val media = mediaPlayer?.media ?: return + // media.addSlave(Media.Slave(Media.Slave.Type.Subtitle, 0, Uri.parse(subtitleURL))) + mediaPlayer?.addSlave(1, Uri.parse(subtitleURL), false) + } override fun onDetachedFromWindow() { super.onDetachedFromWindow() @@ -196,7 +194,7 @@ class VlcPlayerView(context: Context, appContext: AppContext) : ExpoView(context MediaPlayer.Event.EncounteredError -> { Log.e("VlcPlayerView", "player.state ~ error") stateInfo["state"] = "Error" - sendEvent("onVideoLoadEnd", stateInfo) + onVideoLoadEnd(stateInfo); } MediaPlayer.Event.Opening -> { Log.d("VlcPlayerView", "player.state ~ opening") @@ -207,14 +205,14 @@ class VlcPlayerView(context: Context, appContext: AppContext) : ExpoView(context // Determine if the media has finished loading if (player.isPlaying && !isMediaReady) { isMediaReady = true - sendEvent("onVideoLoadEnd", stateInfo) + onVideoLoadEnd(stateInfo) seekToStartTime() } if (lastReportedState != currentState || lastReportedIsPlaying != player.isPlaying) { lastReportedState = currentState lastReportedIsPlaying = player.isPlaying - sendEvent("onVideoStateChange", stateInfo) + onVideoStateChange(stateInfo) } } @@ -239,31 +237,11 @@ class VlcPlayerView(context: Context, appContext: AppContext) : ExpoView(context val currentTimeMs = player.time.toInt() val durationMs = player.media?.duration?.toInt() ?: 0 - println("currentTimeMs: $currentTimeMs, durationMs: $durationMs") if (currentTimeMs >= 0 && currentTimeMs < durationMs) { - val progressInfo = mapOf( + onVideoProgress(mapOf( "currentTime" to currentTimeMs, "duration" to durationMs - ) - sendEvent("onVideoProgress", progressInfo) + )); } } - - private fun sendEvent(eventName: String, params: Map) { - val reactContext = appContext.reactContext as? ReactContext - Log.d("VlcPlayerView", "Sending event: $eventName with params: $params") - val eventMap = Arguments.createMap() - params.forEach { (key, value) -> - when (value) { - is Int -> eventMap.putInt(key, value) - is String -> eventMap.putString(key, value) - is Boolean -> eventMap.putBoolean(key, value) - } - } - reactContext?.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) - ?.emit(eventName, eventMap) - } - - var onVideoLoadEnd: ((Map) -> Unit)? = null - var onVideoStateChange: ((Map) -> Unit)? = null } \ No newline at end of file