Fix/external subtitle support vlc3 (#655)

This commit is contained in:
Alex
2025-04-20 00:25:35 +10:00
committed by GitHub
parent 2ce04b3fd3
commit d6ac8569a8
2 changed files with 25 additions and 19 deletions

View File

@@ -1,4 +1,5 @@
import type { TrackInfo } from "@/modules/VlcPlayer.types"; import type { TrackInfo } from "@/modules/VlcPlayer.types";
import { VideoPlayer, useSettings } from "@/utils/atoms/settings";
import { router, useLocalSearchParams } from "expo-router"; import { router, useLocalSearchParams } from "expo-router";
import type React from "react"; import type React from "react";
import { import {
@@ -47,6 +48,7 @@ export const VideoProvider: React.FC<VideoProviderProps> = ({
}) => { }) => {
const [audioTracks, setAudioTracks] = useState<Track[] | null>(null); const [audioTracks, setAudioTracks] = useState<Track[] | null>(null);
const [subtitleTracks, setSubtitleTracks] = useState<Track[] | null>(null); const [subtitleTracks, setSubtitleTracks] = useState<Track[] | null>(null);
const [settings] = useSettings();
const ControlContext = useControlContext(); const ControlContext = useControlContext();
const isVideoLoaded = ControlContext?.isVideoLoaded; const isVideoLoaded = ControlContext?.isVideoLoaded;
@@ -132,7 +134,7 @@ export const VideoProvider: React.FC<VideoProviderProps> = ({
); );
// Step 2: Apply VLC indexing logic // Step 2: Apply VLC indexing logic
let textSubIndex = 0; let textSubIndex = settings.defaultPlayer === VideoPlayer.VLC_4 ? 0 : 1;
const processedSubs: Track[] = sortedSubs?.map((sub) => { const processedSubs: Track[] = sortedSubs?.map((sub) => {
// Always increment for non-transcoding subtitles // Always increment for non-transcoding subtitles
// Only increment for text-based subtitles when transcoding // Only increment for text-based subtitles when transcoding

View File

@@ -1,10 +1,10 @@
import ExpoModulesCore import ExpoModulesCore
#if os(tvOS) #if os(tvOS)
import TVVLCKit import TVVLCKit
#else #else
import MobileVLCKit import MobileVLCKit
#endif #endif
import UIKit
class VlcPlayer3View: ExpoView { class VlcPlayer3View: ExpoView {
private var mediaPlayer: VLCMediaPlayer? private var mediaPlayer: VLCMediaPlayer?
@@ -16,7 +16,7 @@ class VlcPlayer3View: ExpoView {
private var lastReportedIsPlaying: Bool? private var lastReportedIsPlaying: Bool?
private var customSubtitles: [(internalName: String, originalName: String)] = [] private var customSubtitles: [(internalName: String, originalName: String)] = []
private var startPosition: Int32 = 0 private var startPosition: Int32 = 0
private var isMediaReady: Bool = false private var externalSubtitles: [[String: String]]?
private var externalTrack: [String: String]? private var externalTrack: [String: String]?
private var progressTimer: DispatchSourceTimer? private var progressTimer: DispatchSourceTimer?
private var isStopping: Bool = false // Define isStopping here private var isStopping: Bool = false // Define isStopping here
@@ -61,7 +61,7 @@ class VlcPlayer3View: ExpoView {
} }
// MARK: - Public Methods // MARK: - Public Methods
func startPictureInPicture() { } func startPictureInPicture() {}
@objc func play() { @objc func play() {
self.mediaPlayer?.play() self.mediaPlayer?.play()
@@ -109,6 +109,7 @@ class VlcPlayer3View: ExpoView {
self.externalTrack = source["externalTrack"] as? [String: String] self.externalTrack = source["externalTrack"] as? [String: String]
var initOptions = source["initOptions"] as? [Any] ?? [] var initOptions = source["initOptions"] as? [Any] ?? []
self.startPosition = source["startPosition"] as? Int32 ?? 0 self.startPosition = source["startPosition"] as? Int32 ?? 0
self.externalSubtitles = source["externalSubtitles"] as? [[String: String]]
initOptions.append("--start-time=\(self.startPosition)") initOptions.append("--start-time=\(self.startPosition)")
guard let uri = source["uri"] as? String, !uri.isEmpty else { guard let uri = source["uri"] as? String, !uri.isEmpty else {
@@ -143,8 +144,8 @@ class VlcPlayer3View: ExpoView {
media.addOptions(mediaOptions) media.addOptions(mediaOptions)
self.mediaPlayer?.media = media self.mediaPlayer?.media = media
self.setInitialExternalSubtitles()
self.hasSource = true self.hasSource = true
if autoplay { if autoplay {
print("Playing...") print("Playing...")
self.play() self.play()
@@ -182,9 +183,9 @@ class VlcPlayer3View: ExpoView {
return 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 { if let result = result {
let internalName = "Track \(self.customSubtitles.count + 1)" let internalName = "Track \(self.customSubtitles.count)"
print("Subtitle added with result: \(result) \(internalName)") print("Subtitle added with result: \(result) \(internalName)")
self.customSubtitles.append((internalName: internalName, originalName: name)) self.customSubtitles.append((internalName: internalName, originalName: name))
} else { } 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]]? { @objc func getSubtitleTracks() -> [[String: Any]]? {
guard let mediaPlayer = self.mediaPlayer else { guard let mediaPlayer = self.mediaPlayer else {
return nil return nil
@@ -276,16 +290,6 @@ class VlcPlayer3View: ExpoView {
print("Debug: Current time: \(currentTimeMs)") print("Debug: Current time: \(currentTimeMs)")
if currentTimeMs >= 0 && currentTimeMs < durationMs { 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?([ self.onVideoProgress?([
"currentTime": currentTimeMs, "currentTime": currentTimeMs,
"duration": durationMs, "duration": durationMs,