From 52b5b2875c2ed73ca7562a8b86cf6a578553a9b4 Mon Sep 17 00:00:00 2001 From: Alex Kim Date: Thu, 21 Nov 2024 16:09:56 +1100 Subject: [PATCH] WIP --- app/(auth)/player/player.tsx | 11 +++-- modules/vlc-player/ios/VlcPlayerView.swift | 48 ++++++++++------------ utils/profiles/native.js | 8 +++- 3 files changed, 36 insertions(+), 31 deletions(-) diff --git a/app/(auth)/player/player.tsx b/app/(auth)/player/player.tsx index 406cca06..57b28db2 100644 --- a/app/(auth)/player/player.tsx +++ b/app/(auth)/player/player.tsx @@ -17,7 +17,7 @@ import { getStreamUrl } from "@/utils/jellyfin/media/getStreamUrl"; import { writeToLog } from "@/utils/log"; import native from "@/utils/profiles/native"; import android from "@/utils/profiles/android"; -import { msToTicks, ticksToMs } from "@/utils/time"; +import { msToTicks, ticksToSeconds } from "@/utils/time"; import { Api } from "@jellyfin/sdk"; import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client"; import { @@ -301,8 +301,9 @@ export default function page() { if (!stream || !item) return null; + console.log("AudioIndex", audioIndex); const startPosition = item?.UserData?.PlaybackPositionTicks - ? ticksToMs(item.UserData.PlaybackPositionTicks) + ? ticksToSeconds(item.UserData.PlaybackPositionTicks) : 0; return ( @@ -327,7 +328,11 @@ export default function page() { autoplay: true, isNetwork: true, startPosition, - initOptions: ["--sub-text-scale=60"], + initOptions: [ + "--sub-text-scale=60", + `--sub-track=${subtitleIndex - 2}`, // This refers to the subtitle position index in the subtitles list. + // `--audio-track=${audioIndex - 1}`, // This refers to the audio position index in the audio list. + ], }} style={{ width: "100%", height: "100%" }} onVideoProgress={onProgress} diff --git a/modules/vlc-player/ios/VlcPlayerView.swift b/modules/vlc-player/ios/VlcPlayerView.swift index f6bc6fbd..98637c0f 100644 --- a/modules/vlc-player/ios/VlcPlayerView.swift +++ b/modules/vlc-player/ios/VlcPlayerView.swift @@ -10,9 +10,7 @@ class VlcPlayerView: ExpoView { private var currentGeometryCString: [CChar]? private var lastReportedState: VLCMediaPlayerState? private var lastReportedIsPlaying: Bool? - private var isMediaReady: Bool = false private var customSubtitles: [(internalName: String, originalName: String)] = [] - private var startPosition: Int32? // MARK: - Initialization @@ -104,12 +102,13 @@ class VlcPlayerView: ExpoView { guard let self = self else { return } let mediaOptions = source["mediaOptions"] as? [String: Any] ?? [:] - let initOptions = source["initOptions"] as? [Any] ?? [] + var initOptions = source["initOptions"] as? [Any] ?? [] + let startPosition = source["startPosition"] as? Int32 ?? 0 + initOptions.append("--start-time=\(startPosition)") + let uri = source["uri"] as? String let autoplay = source["autoplay"] as? Bool ?? false let isNetwork = source["isNetwork"] as? Bool ?? false - let startPosition = source["startPosition"] as? Int32 ?? 0 - self.startPosition = startPosition guard let uri = uri, !uri.isEmpty else { print("Error: Invalid or empty URI") @@ -162,10 +161,6 @@ class VlcPlayerView: ExpoView { if autoplay { print("Playing...") self.play() - // if startPosition > 0 { - // print("Debug: Starting at position: \(startPosition)") - // self.seekTo(startPosition) - // } } } } @@ -584,11 +579,10 @@ extension VlcPlayerView: VLCMediaPlayerDelegate { } // Dermine if the media has finished loading - if player.isPlaying && !self.isMediaReady { - self.isMediaReady = true - self.onVideoLoadEnd?(stateInfo) - self.seekToStartTime() - } + // if player.isPlaying && !self.isMediaReady { + // self.isMediaReady = true + // self.onVideoLoadEnd?(stateInfo) + // } if self.lastReportedState != currentState || self.lastReportedIsPlaying != player.isPlaying @@ -600,21 +594,21 @@ extension VlcPlayerView: VLCMediaPlayerDelegate { } } - func seekToStartTime() { - DispatchQueue.main.async { [weak self] in - guard let self = self, let player = self.mediaPlayer else { return } + // func seekToStartTime() { + // DispatchQueue.main.async { [weak self] in + // guard let self = self, let player = self.mediaPlayer else { return } - if let startPosition = self.startPosition, startPosition > 0 { - print("Debug: Seeking to start position: \(startPosition)") - player.time = VLCTime(int: Int32(startPosition)) + // if let startPosition = self.startPosition, startPosition > 0 { + // print("Debug: Seeking to start position: \(startPosition)") + // player.time = VLCTime(int: Int32(startPosition)) - // Ensure the player continues playing after seeking - if !player.isPlaying { - player.play() - } - } - } - } + // // Ensure the player continues playing after seeking + // if !player.isPlaying { + // player.play() + // } + // } + // } + // } func mediaPlayerTimeChanged(_ aNotification: Notification) { DispatchQueue.main.async { [weak self] in diff --git a/utils/profiles/native.js b/utils/profiles/native.js index cf9a9402..b131b8b8 100644 --- a/utils/profiles/native.js +++ b/utils/profiles/native.js @@ -9,7 +9,7 @@ import MediaTypes from "../../constants/MediaTypes"; * Device profile for Native video player */ export default { - Name: "1. Native iOS Video Profile", + Name: "1. Vlc Player", MaxStaticBitrate: 100000000, MaxStreamingBitrate: 120000000, MusicStreamingTranscodingBitrate: 384000, @@ -47,6 +47,7 @@ export default { MaxAudioChannels: "8", MinSegments: "2", BreakOnNonKeyFrames: true, + EnableSubtitlesInManifest: true, }, { Type: MediaTypes.Audio, @@ -142,5 +143,10 @@ export default { { Format: "vplayer", Method: "Embed" }, { Format: "vplayer", Method: "External" }, { Format: "vplayer", Method: "Encode" }, + { Format: "vtt", Method: "Embed" }, + { Format: "vtt", Method: "External" }, + { Format: "vtt", Method: "Encode" }, + { Format: "webvtt", Method: "Embed" }, + { Format: "webvtt", Method: "External" }, ], };