Content-Length: 626613 | pFad | http://github.com/muxinc/mux-player-swift/commit/91a139c6d39d2b75798f05c09710b350d5b87553

18 fix: cache error fallback (#38) · muxinc/mux-player-swift@91a139c · GitHub
Skip to content

Commit

Permalink
fix: cache error fallback (#38)
Browse files Browse the repository at this point in the history
* build: update Data SDK

* [NFC] reverse proxy cleanup

* use Foundation APIs to extract origen URL query value
  • Loading branch information
andrewjl-mux committed May 8, 2024
1 parent 5f20f6b commit 91a139c
Show file tree
Hide file tree
Showing 10 changed files with 450 additions and 227 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"origenHash" : "dc98da4f24976725085eec4af9a1756cdf986007b8fbabe8e86ce304ee2c6169",
"pins" : [
{
"identity" : "gcdwebserver",
Expand All @@ -14,19 +15,19 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/muxinc/mux-stats-sdk-avplayer",
"state" : {
"revision" : "0502d923df4100ffd433320b932952883136665c",
"version" : "3.4.2"
"revision" : "18881b50fc2ed755859b523955fac0dbe292af6b",
"version" : "3.6.0"
}
},
{
"identity" : "stats-sdk-objc",
"kind" : "remoteSourceControl",
"location" : "https://github.com/muxinc/stats-sdk-objc.git",
"state" : {
"revision" : "982feb93c4601684b5e3eef9ad1a036e3ec117c7",
"version" : "4.6.0"
"revision" : "50d131b5b85f48ce496843eecdf812a5307d0721",
"version" : "4.7.0"
}
}
],
"version" : 2
"version" : 3
}
8 changes: 4 additions & 4 deletions Package.resolved
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,17 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/muxinc/mux-stats-sdk-avplayer",
"state" : {
"revision" : "0502d923df4100ffd433320b932952883136665c",
"version" : "3.4.2"
"revision" : "18881b50fc2ed755859b523955fac0dbe292af6b",
"version" : "3.6.0"
}
},
{
"identity" : "stats-sdk-objc",
"kind" : "remoteSourceControl",
"location" : "https://github.com/muxinc/stats-sdk-objc.git",
"state" : {
"revision" : "982feb93c4601684b5e3eef9ad1a036e3ec117c7",
"version" : "4.6.0"
"revision" : "50d131b5b85f48ce496843eecdf812a5307d0721",
"version" : "4.7.0"
}
},
{
Expand Down
2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ let package = Package(
dependencies: [
.package(
url: "https://github.com/muxinc/mux-stats-sdk-avplayer",
exact: "3.4.2"
exact: "3.6.0"
),
.package(
url: "https://github.com/apple/swift-docc-plugin",
Expand Down
2 changes: 1 addition & 1 deletion Package@swift-5.8.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ let package = Package(
dependencies: [
.package(
url: "https://github.com/muxinc/mux-stats-sdk-avplayer",
exact: "3.4.2"
exact: "3.6.0"
),
.package(
url: "https://github.com/apple/swift-docc-plugin",
Expand Down
108 changes: 108 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 @@ -22,6 +24,8 @@ class PlayerSDK {

let reverseProxyServer: ReverseProxyServer

let keyValueObservation = KeyValueObservation()

init() {
self.monitor = Monitor()
self.diagnosticsLogger = Logger(
Expand Down Expand Up @@ -49,4 +53,108 @@ 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
), urlAsset.url.isReverseProxyable else {
return
}

guard let origenURLQueryComponentValue = components.queryItems?.first(
where: { $0.name == self.reverseProxyServer.origenURLKey }
)?.value else {
// TODO: Handle more gracefully
fatalError("Invalid origen URL")
}

guard let origenURL = URL(string: origenURLQueryComponentValue) else {
// TODO: Handle more gracefully
fatalError("Invalid origen URL")
}

let playerItem = AVPlayerItem(
url: origenURL
)

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))
}
}
}
}
22 changes: 22 additions & 0 deletions Sources/MuxPlayerSwift/InternalExtensions/URL+Mux.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
//
// URL+Mux.swift
//

import Foundation

internal extension URL {

var isReverseProxyable: Bool {
guard let components = URLComponents(
url: self,
resolvingAgainstBaseURL: false
) else {
return false
}

return components.scheme == PlaybackURLConstants.reverseProxyScheme &&
components.port == PlaybackURLConstants.reverseProxyPort &&
components.host == PlaybackURLConstants.reverseProxyHost
}

}
14 changes: 11 additions & 3 deletions Sources/MuxPlayerSwift/PublicAPI/Extensions/AVPlayerItem+Mux.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@
import AVFoundation
import Foundation

internal enum PlaybackURLConstants {
static let reverseProxyScheme = "http"

static let reverseProxyHost = "127.0.0.1"

static let reverseProxyPort = Int(1234)
}

fileprivate func makePlaybackURL(
playbackID: String,
playbackOptions: PlaybackOptions
Expand Down Expand Up @@ -89,9 +97,9 @@ fileprivate func makePlaybackURL(
]

// TODO: currently enables reverse proxying unless caching is disabled
components.scheme = "http"
components.host = "127.0.0.1"
components.port = Int(1234)
components.scheme = PlaybackURLConstants.reverseProxyScheme
components.host = PlaybackURLConstants.reverseProxyHost
components.port = PlaybackURLConstants.reverseProxyPort
}

guard let playbackURL = components.url else {
Expand Down
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
Loading

0 comments on commit 91a139c

Please sign in to comment.








ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

Fetched URL: http://github.com/muxinc/mux-player-swift/commit/91a139c6d39d2b75798f05c09710b350d5b87553

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy