From d0cecebe6927df075f0a56ae014e400f4392fc15 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Fri, 17 Jul 2026 21:36:53 +0800 Subject: [PATCH] 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. --- Sources/HLSRecorder.swift | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/Sources/HLSRecorder.swift b/Sources/HLSRecorder.swift index b93381e..9749a06 100644 --- a/Sources/HLSRecorder.swift +++ b/Sources/HLSRecorder.swift @@ -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 } }