iOS 0.5.43: honor master audio lane for HLS media playlists (F1TV audio).

This commit is contained in:
Jos Vooges | STH 2026-09-28 00:15:39 +02:00
parent 2da59616e8
commit eed167824e
3 changed files with 11 additions and 8 deletions

View file

@ -345,7 +345,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 55; CURRENT_PROJECT_VERSION = 56;
DEVELOPMENT_TEAM = X25NYX3K49; DEVELOPMENT_TEAM = X25NYX3K49;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@ -360,7 +360,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks" "@executable_path/Frameworks"
); );
MARKETING_VERSION = 0.5.42; MARKETING_VERSION = 0.5.43;
OTHER_LDFLAGS = ("$(inherited)", "-ObjC"); OTHER_LDFLAGS = ("$(inherited)", "-ObjC");
PRODUCT_BUNDLE_IDENTIFIER = nl.vonas.mediacluster.ios; PRODUCT_BUNDLE_IDENTIFIER = nl.vonas.mediacluster.ios;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@ -378,7 +378,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 55; CURRENT_PROJECT_VERSION = 56;
DEVELOPMENT_TEAM = X25NYX3K49; DEVELOPMENT_TEAM = X25NYX3K49;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@ -393,7 +393,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks" "@executable_path/Frameworks"
); );
MARKETING_VERSION = 0.5.42; MARKETING_VERSION = 0.5.43;
OTHER_LDFLAGS = ("$(inherited)", "-ObjC"); OTHER_LDFLAGS = ("$(inherited)", "-ObjC");
PRODUCT_BUNDLE_IDENTIFIER = nl.vonas.mediacluster.ios; PRODUCT_BUNDLE_IDENTIFIER = nl.vonas.mediacluster.ios;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";

View file

@ -613,7 +613,7 @@ final class ClearKeyDashProxy {
let lower = url.absoluteString.lowercased() let lower = url.absoluteString.lowercased()
if Self.isHlsURL(url) || Self.looksLikeHls(data) { if Self.isHlsURL(url) || Self.looksLikeHls(data) {
let text = String(data: data, encoding: .utf8) ?? String(decoding: data, as: UTF8.self) 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") return (Data(rewritten.utf8), "application/vnd.apple.mpegurl")
} }
let isManifest = lower.contains(".mpd") let isManifest = lower.contains(".mpd")
@ -644,7 +644,7 @@ final class ClearKeyDashProxy {
/// Strip Widevine/PlayReady KEY-tags; herschrijf media-URI's naar de proxy. /// 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). /// 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 lines = text.components(separatedBy: .newlines)
let isMaster = lines.contains { $0.hasPrefix("#EXT-X-STREAM-INF") } let isMaster = lines.contains { $0.hasPrefix("#EXT-X-STREAM-INF") }
var out: [String] = [] var out: [String] = []
@ -656,7 +656,10 @@ final class ClearKeyDashProxy {
// Gescheiden crypto-lanes: CMAF audio+video delen vaak track_ID=1. // Gescheiden crypto-lanes: CMAF audio+video delen vaak track_ID=1.
// Shared state → audio-init overschrijft video → geluid zonder beeld (ESPN). // 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. // Media playlist: verzamel tags + segmenten, trim live-edge.
var header: [String] = [] var header: [String] = []

View file

@ -96,7 +96,7 @@ struct SettingsScreen: View {
Section("Info") { Section("Info") {
LabeledContent("App", value: "VMC iOS") 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("Live TV", value: app.iptvEnabled ? "Aan" : "Uit")
LabeledContent("Events", value: app.eventsEnabled ? "Aan" : "Uit") LabeledContent("Events", value: app.eventsEnabled ? "Aan" : "Uit")
} }