From d6ac8569a8bbc7fd45b2458a8c327ad47292a1d0 Mon Sep 17 00:00:00 2001 From: Alex <111128610+Alexk2309@users.noreply.github.com> Date: Sun, 20 Apr 2025 00:25:35 +1000 Subject: [PATCH] Fix/external subtitle support vlc3 (#655) --- .../controls/contexts/VideoContext.tsx | 4 +- modules/vlc-player-3/ios/VlcPlayer3View.swift | 40 ++++++++++--------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/components/video-player/controls/contexts/VideoContext.tsx b/components/video-player/controls/contexts/VideoContext.tsx index 18d7f463..a7417c79 100644 --- a/components/video-player/controls/contexts/VideoContext.tsx +++ b/components/video-player/controls/contexts/VideoContext.tsx @@ -1,4 +1,5 @@ import type { TrackInfo } from "@/modules/VlcPlayer.types"; +import { VideoPlayer, useSettings } from "@/utils/atoms/settings"; import { router, useLocalSearchParams } from "expo-router"; import type React from "react"; import { @@ -47,6 +48,7 @@ export const VideoProvider: React.FC = ({ }) => { const [audioTracks, setAudioTracks] = useState(null); const [subtitleTracks, setSubtitleTracks] = useState(null); + const [settings] = useSettings(); const ControlContext = useControlContext(); const isVideoLoaded = ControlContext?.isVideoLoaded; @@ -132,7 +134,7 @@ export const VideoProvider: React.FC = ({ ); // Step 2: Apply VLC indexing logic - let textSubIndex = 0; + let textSubIndex = settings.defaultPlayer === VideoPlayer.VLC_4 ? 0 : 1; const processedSubs: Track[] = sortedSubs?.map((sub) => { // Always increment for non-transcoding subtitles // Only increment for text-based subtitles when transcoding diff --git a/modules/vlc-player-3/ios/VlcPlayer3View.swift b/modules/vlc-player-3/ios/VlcPlayer3View.swift index b9189f9f..50882734 100644 --- a/modules/vlc-player-3/ios/VlcPlayer3View.swift +++ b/modules/vlc-player-3/ios/VlcPlayer3View.swift @@ -1,10 +1,10 @@ import ExpoModulesCore + #if os(tvOS) -import TVVLCKit + import TVVLCKit #else -import MobileVLCKit + import MobileVLCKit #endif -import UIKit class VlcPlayer3View: ExpoView { private var mediaPlayer: VLCMediaPlayer? @@ -16,7 +16,7 @@ class VlcPlayer3View: ExpoView { private var lastReportedIsPlaying: Bool? private var customSubtitles: [(internalName: String, originalName: String)] = [] private var startPosition: Int32 = 0 - private var isMediaReady: Bool = false + private var externalSubtitles: [[String: String]]? private var externalTrack: [String: String]? private var progressTimer: DispatchSourceTimer? private var isStopping: Bool = false // Define isStopping here @@ -61,7 +61,7 @@ class VlcPlayer3View: ExpoView { } // MARK: - Public Methods - func startPictureInPicture() { } + func startPictureInPicture() {} @objc func play() { self.mediaPlayer?.play() @@ -109,6 +109,7 @@ class VlcPlayer3View: ExpoView { self.externalTrack = source["externalTrack"] as? [String: String] var initOptions = source["initOptions"] as? [Any] ?? [] self.startPosition = source["startPosition"] as? Int32 ?? 0 + self.externalSubtitles = source["externalSubtitles"] as? [[String: String]] initOptions.append("--start-time=\(self.startPosition)") guard let uri = source["uri"] as? String, !uri.isEmpty else { @@ -143,8 +144,8 @@ class VlcPlayer3View: ExpoView { media.addOptions(mediaOptions) self.mediaPlayer?.media = media + self.setInitialExternalSubtitles() self.hasSource = true - if autoplay { print("Playing...") self.play() @@ -182,9 +183,9 @@ class VlcPlayer3View: ExpoView { return } - let result = self.mediaPlayer?.addPlaybackSlave(url, type: .subtitle, enforce: true) + let result = self.mediaPlayer?.addPlaybackSlave(url, type: .subtitle, enforce: false) if let result = result { - let internalName = "Track \(self.customSubtitles.count + 1)" + let internalName = "Track \(self.customSubtitles.count)" print("Subtitle added with result: \(result) \(internalName)") self.customSubtitles.append((internalName: internalName, originalName: name)) } else { @@ -192,6 +193,19 @@ class VlcPlayer3View: ExpoView { } } + private func setInitialExternalSubtitles() { + if let externalSubtitles = self.externalSubtitles { + for subtitle in externalSubtitles { + if let subtitleName = subtitle["name"], + let subtitleURL = subtitle["DeliveryUrl"] + { + print("Setting external subtitle: \(subtitleName) \(subtitleURL)") + self.setSubtitleURL(subtitleURL, name: subtitleName) + } + } + } + } + @objc func getSubtitleTracks() -> [[String: Any]]? { guard let mediaPlayer = self.mediaPlayer else { return nil @@ -276,16 +290,6 @@ class VlcPlayer3View: ExpoView { print("Debug: Current time: \(currentTimeMs)") if currentTimeMs >= 0 && currentTimeMs < durationMs { - if player.isPlaying && !self.isMediaReady { - self.isMediaReady = true - // Set external track subtitle when starting. - if let externalTrack = self.externalTrack { - if let name = externalTrack["name"], !name.isEmpty { - let deliveryUrl = externalTrack["DeliveryUrl"] ?? "" - self.setSubtitleURL(deliveryUrl, name: name) - } - } - } self.onVideoProgress?([ "currentTime": currentTimeMs, "duration": durationMs,