fix(iOS): add User-Agent header to all HLS segment + playlist requests
CBS streams require iPhone UA to serve actual TS data. Without it, segments download as empty/small placeholder responses. Also added per-segment size logging for diagnostics.
This commit is contained in:
parent
1f8ecb9bcb
commit
d0cecebe69
@ -104,8 +104,12 @@ final class HLSRecorder: ObservableObject {
|
|||||||
// MARK: - HLS 持续录制(轮询 m3u8 + 增量下载片段)
|
// MARK: - HLS 持续录制(轮询 m3u8 + 增量下载片段)
|
||||||
|
|
||||||
private func recordHLS(url: URL) async throws -> URL {
|
private func recordHLS(url: URL) async throws -> URL {
|
||||||
|
let ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15"
|
||||||
|
|
||||||
// 1. 解析 master playlist
|
// 1. 解析 master playlist
|
||||||
let (data, _) = try await URLSession.shared.data(from: url)
|
var req = URLRequest(url: url)
|
||||||
|
req.setValue(ua, forHTTPHeaderField: "User-Agent")
|
||||||
|
let (data, _) = try await URLSession.shared.data(for: req)
|
||||||
guard let playlist = String(data: data, encoding: .utf8) else {
|
guard let playlist = String(data: data, encoding: .utf8) else {
|
||||||
throw RecorderError.invalidPlaylist
|
throw RecorderError.invalidPlaylist
|
||||||
}
|
}
|
||||||
@ -143,7 +147,9 @@ final class HLSRecorder: ObservableObject {
|
|||||||
|
|
||||||
while !stopRequested {
|
while !stopRequested {
|
||||||
// 拉取最新的 m3u8
|
// 拉取最新的 m3u8
|
||||||
guard let (plData, _) = try? await URLSession.shared.data(from: mediaPlaylistURL),
|
var plReq = URLRequest(url: mediaPlaylistURL)
|
||||||
|
plReq.setValue(ua, forHTTPHeaderField: "User-Agent")
|
||||||
|
guard let (plData, _) = try? await URLSession.shared.data(for: plReq),
|
||||||
let plText = String(data: plData, encoding: .utf8) else {
|
let plText = String(data: plData, encoding: .utf8) else {
|
||||||
consecutiveErrors += 1
|
consecutiveErrors += 1
|
||||||
if consecutiveErrors >= maxConsecutiveErrors {
|
if consecutiveErrors >= maxConsecutiveErrors {
|
||||||
@ -178,13 +184,17 @@ final class HLSRecorder: ObservableObject {
|
|||||||
for segURL in newSegments {
|
for segURL in newSegments {
|
||||||
guard !stopRequested else { break }
|
guard !stopRequested else { break }
|
||||||
do {
|
do {
|
||||||
let (segData, _) = try await URLSession.shared.data(from: segURL)
|
var req = URLRequest(url: segURL)
|
||||||
|
req.setValue("Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15", forHTTPHeaderField: "User-Agent")
|
||||||
|
let (segData, resp) = try await URLSession.shared.data(for: req)
|
||||||
|
let httpResp = resp as? HTTPURLResponse
|
||||||
|
NSLog("[MiniPlayer] Segment %d: %d bytes, HTTP %d", segmentIndex, segData.count, httpResp?.statusCode ?? 0)
|
||||||
let localFile = tempDir.appendingPathComponent("seg_\(String(format: "%06d", segmentIndex)).ts")
|
let localFile = tempDir.appendingPathComponent("seg_\(String(format: "%06d", segmentIndex)).ts")
|
||||||
try segData.write(to: localFile)
|
try segData.write(to: localFile)
|
||||||
downloadedSegments.append(localFile)
|
downloadedSegments.append(localFile)
|
||||||
segmentIndex += 1
|
segmentIndex += 1
|
||||||
} catch {
|
} catch {
|
||||||
// 单个片段下载失败不中断
|
NSLog("[MiniPlayer] Segment download failed: %@", error.localizedDescription)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user