Skip to content

Commit

Permalink
cherry pick fallback logic
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewjl-mux committed Apr 26, 2024
1 parent 7a244c4 commit 3940672
Show file tree
Hide file tree
Showing 3 changed files with 134 additions and 14 deletions.
112 changes: 112 additions & 0 deletions Sources/MuxPlayerSwift/GlobalLifecycle/PlayerSDK.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
// PlayerSDK.swift
//

import AVFoundation
import AVKit
import Foundation
import os

Expand All @@ -18,6 +20,8 @@ class PlayerSDK {

let reverseProxyServer: ReverseProxyServer

let keyValueObservation = KeyValueObservation()

init() {
self.monitor = Monitor()
self.diagnosticsLogger = Logger(
Expand Down Expand Up @@ -45,4 +49,112 @@ class PlayerSDK {
self.reverseProxyServer.start()
}

func registerPlayerLayer(
playerLayer: AVPlayerLayer,
monitoringOptions: MonitoringOptions,
requiresReverseProxying: Bool = false
) {
monitor.setupMonitoring(
playerLayer: playerLayer,
options: monitoringOptions
)

if let player = playerLayer.player,
requiresReverseProxying == true {
keyValueObservation.register(
player,
for: \.error,
options: [.new]
) { player, observedChange in
self.handlePlayerError(player)
}
}
}

func registerPlayerViewController(
playerViewController: AVPlayerViewController,
monitoringOptions: MonitoringOptions,
requiresReverseProxying: Bool = false
) {
monitor.setupMonitoring(
playerViewController: playerViewController,
options: monitoringOptions
)

if let player = playerViewController.player,
requiresReverseProxying == true {
keyValueObservation.register(
player,
for: \.error,
options: [.new]
) { player, observedChange in
self.handlePlayerError(player)
}
}
}

func handlePlayerError(
_ player: AVPlayer
) {
guard let urlAsset = player.currentItem?.asset as? AVURLAsset else {
return
}

guard let components = URLComponents(
url: urlAsset.url,
resolvingAgainstBaseURL: false
) else {
return
}

if let port = components.port,
components.scheme == "http",
port == reverseProxyServer.port {
guard let originURLQueryComponentValue = components.queryItems?.first(
where: { $0.name == self.reverseProxyServer.originURLKey }
)?.value else {
// TODO: Handle more gracefully
fatalError("Invalid origin URL")
}

guard let originURL = URL(string: originURLQueryComponentValue) else {
// TODO: Handle more gracefully
fatalError("Invalid origin URL")
}

let playerItem = AVPlayerItem(
url: originURL
)

player.replaceCurrentItem(
with: playerItem
)
}
}

class KeyValueObservation {
var observations: [ObjectIdentifier: NSKeyValueObservation] = [:]

func register<Value>(
_ player: AVPlayer,
for keyPath: KeyPath<AVPlayer, Value>,
options: NSKeyValueObservingOptions,
changeHandler: @escaping (AVPlayer, NSKeyValueObservedChange<Value>) -> Void
) {
let observation = player.observe(keyPath,
options: options,
changeHandler: changeHandler
)
observations[ObjectIdentifier(player)] = observation
}

func unregister(
_ player: AVPlayer
) {
if let observation = observations[ObjectIdentifier(player)] {
observation.invalidate()
observations.removeValue(forKey: ObjectIdentifier(player))
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,10 @@ extension AVPlayerLayer {
playbackID: playbackID
)

PlayerSDK.shared.monitor.setupMonitoring(
PlayerSDK.shared.registerPlayerLayer(
playerLayer: self,
options: monitoringOptions
monitoringOptions: monitoringOptions,
requiresReverseProxying: playbackOptions.enableSmartCache
)
}

Expand Down Expand Up @@ -90,9 +91,10 @@ extension AVPlayerLayer {

self.player = player

PlayerSDK.shared.monitor.setupMonitoring(
PlayerSDK.shared.registerPlayerLayer(
playerLayer: self,
options: monitoringOptions
monitoringOptions: monitoringOptions,
requiresReverseProxying: playbackOptions.enableSmartCache
)
}

Expand Down Expand Up @@ -146,6 +148,7 @@ extension AVPlayerLayer {
playbackID: playbackID,
playbackOptions: playbackOptions
),
enableSmartCache: playbackOptions.enableSmartCache,
monitoringOptions: MonitoringOptions(
playbackID: playbackID
)
Expand Down Expand Up @@ -200,12 +203,14 @@ extension AVPlayerLayer {
playbackID: playbackID,
playbackOptions: playbackOptions
),
enableSmartCache: playbackOptions.enableSmartCache,
monitoringOptions: monitoringOptions
)
}

internal func prepare(
playerItem: AVPlayerItem,
enableSmartCache: Bool = false,
monitoringOptions: MonitoringOptions
) {
if let player {
Expand All @@ -218,9 +223,10 @@ extension AVPlayerLayer {
)
}

PlayerSDK.shared.monitor.setupMonitoring(
PlayerSDK.shared.registerPlayerLayer(
playerLayer: self,
options: monitoringOptions
monitoringOptions: monitoringOptions,
requiresReverseProxying: enableSmartCache
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ extension AVPlayerViewController {
playbackID: playbackID
)

PlayerSDK.shared.monitor.setupMonitoring(
PlayerSDK.shared.registerPlayerViewController(
playerViewController: self,
options: monitoringOptions
monitoringOptions: monitoringOptions
)
}

Expand All @@ -51,9 +51,9 @@ extension AVPlayerViewController {

self.player = player

PlayerSDK.shared.monitor.setupMonitoring(
PlayerSDK.shared.registerPlayerViewController(
playerViewController: self,
options: monitoringOptions
monitoringOptions: monitoringOptions
)
}

Expand Down Expand Up @@ -84,9 +84,10 @@ extension AVPlayerViewController {
playbackID: playbackID
)

PlayerSDK.shared.monitor.setupMonitoring(
PlayerSDK.shared.registerPlayerViewController(
playerViewController: self,
options: monitoringOptions
monitoringOptions: monitoringOptions,
requiresReverseProxying: playbackOptions.enableSmartCache
)
}

Expand Down Expand Up @@ -116,9 +117,10 @@ extension AVPlayerViewController {

self.player = player

PlayerSDK.shared.monitor.setupMonitoring(
PlayerSDK.shared.registerPlayerViewController(
playerViewController: self,
options: monitoringOptions
monitoringOptions: monitoringOptions,
requiresReverseProxying: playbackOptions.enableSmartCache
)
}

Expand Down

0 comments on commit 3940672

Please sign in to comment.