mirror of
https://github.com/streamyfin/streamyfin.git
synced 2025-08-20 18:37:18 +02:00
Fixed HLS starting from the earliest segment
This commit is contained in:
@@ -11,6 +11,9 @@ class VlcPlayerView: ExpoView {
|
|||||||
private var lastReportedState: VLCMediaPlayerState?
|
private var lastReportedState: VLCMediaPlayerState?
|
||||||
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 isTranscodedStream: Bool = false
|
||||||
|
private var isMediaReady: Bool = false
|
||||||
|
|
||||||
// MARK: - Initialization
|
// MARK: - Initialization
|
||||||
|
|
||||||
@@ -103,10 +106,14 @@ class VlcPlayerView: ExpoView {
|
|||||||
|
|
||||||
let mediaOptions = source["mediaOptions"] as? [String: Any] ?? [:]
|
let mediaOptions = source["mediaOptions"] as? [String: Any] ?? [:]
|
||||||
var initOptions = source["initOptions"] as? [Any] ?? []
|
var initOptions = source["initOptions"] as? [Any] ?? []
|
||||||
let startPosition = source["startPosition"] as? Int32 ?? 0
|
startPosition = source["startPosition"] as? Int32 ?? 0
|
||||||
initOptions.append("--start-time=\(startPosition)")
|
initOptions.append("--start-time=\(startPosition)")
|
||||||
|
|
||||||
let uri = source["uri"] as? String
|
let uri = source["uri"] as? String
|
||||||
|
if let uri = uri, uri.contains("m3u8") {
|
||||||
|
self.isTranscodedStream = true
|
||||||
|
}
|
||||||
|
|
||||||
let autoplay = source["autoplay"] as? Bool ?? false
|
let autoplay = source["autoplay"] as? Bool ?? false
|
||||||
let isNetwork = source["isNetwork"] as? Bool ?? false
|
let isNetwork = source["isNetwork"] as? Bool ?? false
|
||||||
|
|
||||||
@@ -557,7 +564,8 @@ extension VlcPlayerView: VLCMediaPlayerDelegate {
|
|||||||
"error": false,
|
"error": false,
|
||||||
]
|
]
|
||||||
|
|
||||||
if player.isPlaying {
|
// Fix HLS issue.
|
||||||
|
if player.isPlaying && (!self.isTranscodedStream || self.isMediaReady) {
|
||||||
stateInfo["isPlaying"] = true
|
stateInfo["isPlaying"] = true
|
||||||
stateInfo["isBuffering"] = false
|
stateInfo["isBuffering"] = false
|
||||||
stateInfo["state"] = "Playing"
|
stateInfo["state"] = "Playing"
|
||||||
@@ -578,12 +586,6 @@ extension VlcPlayerView: VLCMediaPlayerDelegate {
|
|||||||
stateInfo["state"] = "Opening"
|
stateInfo["state"] = "Opening"
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dermine if the media has finished loading
|
|
||||||
// if player.isPlaying && !self.isMediaReady {
|
|
||||||
// self.isMediaReady = true
|
|
||||||
// self.onVideoLoadEnd?(stateInfo)
|
|
||||||
// }
|
|
||||||
|
|
||||||
if self.lastReportedState != currentState
|
if self.lastReportedState != currentState
|
||||||
|| self.lastReportedIsPlaying != player.isPlaying
|
|| self.lastReportedIsPlaying != player.isPlaying
|
||||||
{
|
{
|
||||||
@@ -621,10 +623,16 @@ extension VlcPlayerView: VLCMediaPlayerDelegate {
|
|||||||
guard let player = self.mediaPlayer else { return }
|
guard let player = self.mediaPlayer else { return }
|
||||||
|
|
||||||
let currentTimeMs = player.time.intValue
|
let currentTimeMs = player.time.intValue
|
||||||
let remainingTimeMs = player.remainingTime
|
|
||||||
let durationMs = player.media?.length.intValue ?? 0
|
let durationMs = player.media?.length.intValue ?? 0
|
||||||
|
|
||||||
if currentTimeMs >= 0 && currentTimeMs < durationMs {
|
if currentTimeMs >= 0 && currentTimeMs < durationMs {
|
||||||
|
// Handle when VLC starts at cloest earliest segment skip to the start time.
|
||||||
|
if player.isPlaying && !self.isMediaReady {
|
||||||
|
self.isMediaReady = true
|
||||||
|
if self.isTranscodedStream {
|
||||||
|
self.seekTo(self.startPosition * 1000)
|
||||||
|
}
|
||||||
|
}
|
||||||
self.onVideoProgress?([
|
self.onVideoProgress?([
|
||||||
"currentTime": currentTimeMs,
|
"currentTime": currentTimeMs,
|
||||||
"duration": durationMs,
|
"duration": durationMs,
|
||||||
|
|||||||
Reference in New Issue
Block a user