add queued subtitles before vlc playback

This commit is contained in:
dirtydishes 2026-05-25 19:05:44 -04:00
parent 9693f65f45
commit 1c34000027
2 changed files with 123 additions and 9 deletions

View file

@ -355,6 +355,7 @@ final class VLCNativePlaybackBackend: NSObject, NativePlaybackBackend {
media.addOption(":http-reconnect") media.addOption(":http-reconnect")
addRemoteHeaders(to: media, request: request) addRemoteHeaders(to: media, request: request)
} }
let queuedSubtitleCount = addQueuedSubtitleSlaves(to: media)
mediaPlayer.media = media mediaPlayer.media = media
#if DEBUG #if DEBUG
@ -362,7 +363,9 @@ final class VLCNativePlaybackBackend: NSObject, NativePlaybackBackend {
#endif #endif
mediaPlayer.play() mediaPlayer.play()
hasStartedMedia = true hasStartedMedia = true
flushPendingSubtitleCandidates() if queuedSubtitleCount > 0 {
scheduleSubtitleTrackRefreshes(attachedCount: queuedSubtitleCount)
}
} }
private func addRemoteHeaders(to media: VLCMedia, request: NativePlaybackRequest) { private func addRemoteHeaders(to media: VLCMedia, request: NativePlaybackRequest) {
@ -416,6 +419,14 @@ final class VLCNativePlaybackBackend: NSObject, NativePlaybackBackend {
guard attachedCount > 0 else { guard attachedCount > 0 else {
return attachedCount return attachedCount
} }
scheduleSubtitleTrackRefreshes(attachedCount: attachedCount)
return attachedCount
}
private func scheduleSubtitleTrackRefreshes(attachedCount: Int) {
guard attachedCount > 0 else {
return
}
[0.2, 0.6, 1.0, 2.0, 4.0].forEach { delay in [0.2, 0.6, 1.0, 2.0, 4.0].forEach { delay in
DispatchQueue.main.asyncAfter(deadline: .now() + delay) { [weak self] in DispatchQueue.main.asyncAfter(deadline: .now() + delay) { [weak self] in
self?.selectPreferredSubtitleTrackIfNeeded(reason: "delayed-refresh-\(String(format: "%.1f", delay))") self?.selectPreferredSubtitleTrackIfNeeded(reason: "delayed-refresh-\(String(format: "%.1f", delay))")
@ -428,7 +439,6 @@ final class VLCNativePlaybackBackend: NSObject, NativePlaybackBackend {
self?.onSubtitleTracksChange?() self?.onSubtitleTracksChange?()
} }
} }
return attachedCount
} }
private func queuePendingSubtitleCandidates(_ candidates: [SubtitleCandidate]) -> Int { private func queuePendingSubtitleCandidates(_ candidates: [SubtitleCandidate]) -> Int {
@ -447,18 +457,34 @@ final class VLCNativePlaybackBackend: NSObject, NativePlaybackBackend {
return queuedCount return queuedCount
} }
private func flushPendingSubtitleCandidates() { private func addQueuedSubtitleSlaves(to media: VLCMedia) -> Int {
guard !pendingSubtitleCandidates.isEmpty else { guard !pendingSubtitleCandidates.isEmpty else {
return return 0
} }
let candidates = pendingSubtitleCandidates let candidates = pendingSubtitleCandidates
pendingSubtitleCandidates.removeAll() pendingSubtitleCandidates.removeAll()
pendingSubtitleURLs.removeAll() pendingSubtitleURLs.removeAll()
var addedCount = 0
let baselineTrackIDs = Set(rawSubtitleTracks().filter { $0.id >= 0 }.map(\.id))
#if DEBUG #if DEBUG
print("[DreamioVLC] flushing queued subtitles count=\(candidates.count)") print("[DreamioVLC] flushing queued subtitles count=\(candidates.count)")
#endif #endif
_ = attachSubtitles(candidates) candidates.forEach { candidate in
guard !attachedSubtitleURLs.contains(candidate.url) else {
return
}
attachedSubtitleURLs.insert(candidate.url)
externalSubtitleBaselineTrackIDs.formUnion(baselineTrackIDs)
hasPendingExternalSubtitleSelection = true
pendingExternalSubtitleDisplayNames.append(SubtitleDisplayName.displayName(for: candidate))
media.addOption(":input-slave=\(candidate.url.absoluteString)")
addedCount += 1
#if DEBUG
print("[DreamioVLC] queued subtitle slave subtitle=\(URLRedactor.redactedURLString(candidate.url.absoluteString)) label=\(candidate.label) language=\(candidate.language ?? "unknown") ext=\(candidate.url.pathExtension.lowercased())")
#endif
}
return addedCount
} }
private func rawSubtitleTracks() -> [SubtitleTrack] { private func rawSubtitleTracks() -> [SubtitleTrack] {

File diff suppressed because one or more lines are too long