fix(iOS): add copyLocalFile for local file recording on iOS

HLSRecorder.recordStream() now checks url.isFileURL first and copies
locally instead of using URLSession.download() which only works for
http/https URLs. Fixes recording local mp4 files on iOS.
This commit is contained in:
yumoqing 2026-07-17 21:14:36 +08:00
parent 96d617617f
commit 4aec892151

View File

@ -73,6 +73,12 @@ final class HLSRecorder: ObservableObject {
// MARK: -
private func recordStream(url: URL) async throws -> URL {
//
if url.isFileURL {
NSLog("[MiniPlayer] recordStream: local file, copying directly")
return try await copyLocalFile(url: url)
}
// HLSm3u8 URL m3u8
let ext = url.pathExtension.lowercased()
let isHLS = ext == "m3u8"
@ -230,8 +236,23 @@ final class HLSRecorder: ObservableObject {
return outputURL
}
// MARK: -
// MARK: - /
private func copyLocalFile(url: URL) async throws -> URL {
let ext = url.pathExtension.isEmpty ? "mp4" : url.pathExtension
let outputURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
.appendingPathComponent("MiniPlayer_Recording_\(Int(Date().timeIntervalSince1970)).\(ext)")
if FileManager.default.fileExists(atPath: outputURL.path) {
try FileManager.default.removeItem(at: outputURL)
}
try FileManager.default.copyItem(at: url, to: outputURL)
NSLog("[MiniPlayer] copyLocalFile: %@ → %@ (%lld bytes)",
url.lastPathComponent, outputURL.lastPathComponent,
(try? FileManager.default.attributesOfItem(atPath: outputURL.path)[.size] as? Int64) ?? 0)
return outputURL
}
private func downloadFile(url: URL) async throws -> URL {
let ext = url.pathExtension.isEmpty ? "mp4" : url.pathExtension
let outputURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]