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:
yumoqing 2026-07-17 21:36:53 +08:00
parent 1f8ecb9bcb
commit d0cecebe69

View File

@ -104,8 +104,12 @@ final class HLSRecorder: ObservableObject {
// MARK: - HLS m3u8 +
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
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 {
throw RecorderError.invalidPlaylist
}
@ -143,7 +147,9 @@ final class HLSRecorder: ObservableObject {
while !stopRequested {
// 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 {
consecutiveErrors += 1
if consecutiveErrors >= maxConsecutiveErrors {
@ -178,13 +184,17 @@ final class HLSRecorder: ObservableObject {
for segURL in newSegments {
guard !stopRequested else { break }
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")
try segData.write(to: localFile)
downloadedSegments.append(localFile)
segmentIndex += 1
} catch {
//
NSLog("[MiniPlayer] Segment download failed: %@", error.localizedDescription)
continue
}
}