From eed167824eae6a45a2cd6f7f3efc9de4e39bccf9 Mon Sep 17 00:00:00 2001 From: Jos Vooges | STH Date: Mon, 28 Sep 2026 00:15:39 +0200 Subject: [PATCH] iOS 0.5.43: honor master audio lane for HLS media playlists (F1TV audio). --- apps/ios/VMC.xcodeproj/project.pbxproj | 8 ++++---- apps/ios/VMC/Playback/ClearKeyDashProxy.swift | 9 ++++++--- apps/ios/VMC/UI/SettingsScreen.swift | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/apps/ios/VMC.xcodeproj/project.pbxproj b/apps/ios/VMC.xcodeproj/project.pbxproj index 299501d..b489b27 100644 --- a/apps/ios/VMC.xcodeproj/project.pbxproj +++ b/apps/ios/VMC.xcodeproj/project.pbxproj @@ -345,7 +345,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 55; + CURRENT_PROJECT_VERSION = 56; DEVELOPMENT_TEAM = X25NYX3K49; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; @@ -360,7 +360,7 @@ "$(inherited)", "@executable_path/Frameworks" ); - MARKETING_VERSION = 0.5.42; + MARKETING_VERSION = 0.5.43; OTHER_LDFLAGS = ("$(inherited)", "-ObjC"); PRODUCT_BUNDLE_IDENTIFIER = nl.vonas.mediacluster.ios; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -378,7 +378,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 55; + CURRENT_PROJECT_VERSION = 56; DEVELOPMENT_TEAM = X25NYX3K49; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; @@ -393,7 +393,7 @@ "$(inherited)", "@executable_path/Frameworks" ); - MARKETING_VERSION = 0.5.42; + MARKETING_VERSION = 0.5.43; OTHER_LDFLAGS = ("$(inherited)", "-ObjC"); PRODUCT_BUNDLE_IDENTIFIER = nl.vonas.mediacluster.ios; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/apps/ios/VMC/Playback/ClearKeyDashProxy.swift b/apps/ios/VMC/Playback/ClearKeyDashProxy.swift index 2b71417..fa3e9b3 100644 --- a/apps/ios/VMC/Playback/ClearKeyDashProxy.swift +++ b/apps/ios/VMC/Playback/ClearKeyDashProxy.swift @@ -613,7 +613,7 @@ final class ClearKeyDashProxy { let lower = url.absoluteString.lowercased() if Self.isHlsURL(url) || Self.looksLikeHls(data) { let text = String(data: data, encoding: .utf8) ?? String(decoding: data, as: UTF8.self) - let rewritten = rewriteHls(text, playlistURL: url) + let rewritten = rewriteHls(text, playlistURL: url, laneHint: lane) return (Data(rewritten.utf8), "application/vnd.apple.mpegurl") } let isManifest = lower.contains(".mpd") @@ -644,7 +644,7 @@ final class ClearKeyDashProxy { /// Strip Widevine/PlayReady KEY-tags; herschrijf media-URI's naar de proxy. /// ESPN EVENT-playlists met duizenden segmenten → trim naar live-edge (anders audio-only / geen beeld). - private func rewriteHls(_ text: String, playlistURL: URL) -> String { + private func rewriteHls(_ text: String, playlistURL: URL, laneHint: CryptoLane = .shared) -> String { let lines = text.components(separatedBy: .newlines) let isMaster = lines.contains { $0.hasPrefix("#EXT-X-STREAM-INF") } var out: [String] = [] @@ -656,7 +656,10 @@ final class ClearKeyDashProxy { // Gescheiden crypto-lanes: CMAF audio+video delen vaak track_ID=1. // Shared state → audio-init overschrijft video → geluid zonder beeld (ESPN). - let lane = Self.hlsMediaLane(for: playlistURL) + // De master kent TYPE=AUDIO al toe (ck=a); de URL-heuristiek mist o.a. F1TV-audio. + let guessed = Self.hlsMediaLane(for: playlistURL) + let lane = laneHint == .shared ? guessed : laneHint + proxyLog.info("media playlist lane=\(lane.rawValue, privacy: .public) hint=\(laneHint.rawValue, privacy: .public) guess=\(guessed.rawValue, privacy: .public) file=\(playlistURL.lastPathComponent, privacy: .public)") // Media playlist: verzamel tags + segmenten, trim live-edge. var header: [String] = [] diff --git a/apps/ios/VMC/UI/SettingsScreen.swift b/apps/ios/VMC/UI/SettingsScreen.swift index 791ab68..28ff228 100644 --- a/apps/ios/VMC/UI/SettingsScreen.swift +++ b/apps/ios/VMC/UI/SettingsScreen.swift @@ -96,7 +96,7 @@ struct SettingsScreen: View { Section("Info") { LabeledContent("App", value: "VMC iOS") - LabeledContent("Versie", value: "0.5.42") + LabeledContent("Versie", value: "0.5.43") LabeledContent("Live TV", value: app.iptvEnabled ? "Aan" : "Uit") LabeledContent("Events", value: app.eventsEnabled ? "Aan" : "Uit") }