react-native-tpstreams 1.1.0-debug.3 → 1.1.0-debug.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -21,7 +21,7 @@ Pod::Spec.new do |s|
|
|
|
21
21
|
'DEFINES_MODULE' => 'YES',
|
|
22
22
|
'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES'
|
|
23
23
|
}
|
|
24
|
-
s.dependency "TPStreamsSDK" , "1.2.
|
|
24
|
+
s.dependency "TPStreamsSDK" , "1.2.14"
|
|
25
25
|
s.source = {
|
|
26
26
|
:git => "https://github.com/testpress/iOSPlayerSDK.git",
|
|
27
27
|
:branch => "fix_download_cleanup"
|
|
@@ -28,14 +28,6 @@ class TPStreamsRNPlayerView: UIView {
|
|
|
28
28
|
private var pendingOfflineCredentialsCompletion: ((String?, Double) -> Void)?
|
|
29
29
|
private var _offlineLicenseExpireTime: Double = TPStreamsRNPlayerView.maxOfflineLicenseDuration
|
|
30
30
|
|
|
31
|
-
// Add a property to track when play() was called
|
|
32
|
-
private var playCallTime: CFAbsoluteTime?
|
|
33
|
-
private var playerReadyTime: CFAbsoluteTime?
|
|
34
|
-
private var playbackStartTime: CFAbsoluteTime?
|
|
35
|
-
|
|
36
|
-
// Add a property to track when setup started (for relative timing)
|
|
37
|
-
private var setupStartTime: CFAbsoluteTime?
|
|
38
|
-
|
|
39
31
|
@objc var videoId: NSString = ""
|
|
40
32
|
@objc var accessToken: NSString = ""
|
|
41
33
|
@objc var shouldAutoPlay: Bool = true
|
|
@@ -65,17 +57,11 @@ class TPStreamsRNPlayerView: UIView {
|
|
|
65
57
|
override init(frame: CGRect) {
|
|
66
58
|
super.init(frame: frame)
|
|
67
59
|
backgroundColor = .black
|
|
68
|
-
let deviceModel = UIDevice.current.model
|
|
69
|
-
let systemVersion = UIDevice.current.systemVersion
|
|
70
|
-
print("⏱️ [TPStreams] TPStreamsRNPlayerView init() - Device: \(deviceModel), iOS: \(systemVersion)")
|
|
71
60
|
}
|
|
72
61
|
|
|
73
62
|
required init?(coder: NSCoder) {
|
|
74
63
|
super.init(coder: coder)
|
|
75
64
|
backgroundColor = .black
|
|
76
|
-
let deviceModel = UIDevice.current.model
|
|
77
|
-
let systemVersion = UIDevice.current.systemVersion
|
|
78
|
-
print("⏱️ [TPStreams] TPStreamsRNPlayerView init(coder:) - Device: \(deviceModel), iOS: \(systemVersion)")
|
|
79
65
|
}
|
|
80
66
|
|
|
81
67
|
override func layoutSubviews() {
|
|
@@ -85,93 +71,38 @@ class TPStreamsRNPlayerView: UIView {
|
|
|
85
71
|
|
|
86
72
|
override func didSetProps(_ changedProps: [String]!) {
|
|
87
73
|
super.didSetProps(changedProps)
|
|
88
|
-
let propsTime = CFAbsoluteTimeGetCurrent()
|
|
89
|
-
print("⏱️ [TPStreams] didSetProps() called with props: \(changedProps ?? [])")
|
|
90
74
|
schedulePlayerSetup()
|
|
91
|
-
let propsDuration = CFAbsoluteTimeGetCurrent() - propsTime
|
|
92
|
-
print("⏱️ [TPStreams] didSetProps() took: \(String(format: "%.3f", propsDuration * 1000))ms")
|
|
93
75
|
}
|
|
94
76
|
|
|
95
77
|
private func schedulePlayerSetup() {
|
|
96
|
-
guard !setupScheduled else {
|
|
97
|
-
print("⏱️ [TPStreams] setupPlayer() already scheduled, skipping")
|
|
98
|
-
return
|
|
99
|
-
}
|
|
78
|
+
guard !setupScheduled else { return }
|
|
100
79
|
|
|
101
|
-
let scheduleTime = CFAbsoluteTimeGetCurrent()
|
|
102
80
|
setupScheduled = true
|
|
103
|
-
print("⏱️ [TPStreams] schedulePlayerSetup() - scheduling async setup")
|
|
104
81
|
DispatchQueue.main.async { [weak self] in
|
|
105
|
-
let asyncDelay = CFAbsoluteTimeGetCurrent() - scheduleTime
|
|
106
|
-
print("⏱️ [TPStreams] schedulePlayerSetup() - async dispatch delay: \(String(format: "%.3f", asyncDelay * 1000))ms")
|
|
107
82
|
self?.setupPlayer()
|
|
108
83
|
}
|
|
109
84
|
}
|
|
110
85
|
|
|
111
86
|
private func setupPlayer() {
|
|
112
|
-
let setupStartTime = CFAbsoluteTimeGetCurrent()
|
|
113
|
-
self.setupStartTime = setupStartTime // Store for relative timing
|
|
114
|
-
print("⏱️ [TPStreams] ========== setupPlayer() STARTED ==========")
|
|
115
|
-
print("⏱️ [TPStreams] videoId: \(videoId), accessToken length: \(accessToken.length)")
|
|
116
|
-
|
|
117
|
-
// Cleanup
|
|
118
|
-
let cleanupStartTime = CFAbsoluteTimeGetCurrent()
|
|
119
87
|
cleanupPlayer()
|
|
120
|
-
let cleanupDuration = CFAbsoluteTimeGetCurrent() - cleanupStartTime
|
|
121
|
-
print("⏱️ [TPStreams] cleanupPlayer() took: \(String(format: "%.3f", cleanupDuration * 1000))ms")
|
|
122
|
-
|
|
123
|
-
// Download check
|
|
124
|
-
let downloadCheckStartTime = CFAbsoluteTimeGetCurrent()
|
|
125
|
-
let isDownloaded = TPStreamsDownloadManager.shared.isAssetDownloaded(assetID: videoId as String)
|
|
126
|
-
let downloadCheckDuration = CFAbsoluteTimeGetCurrent() - downloadCheckStartTime
|
|
127
|
-
print("⏱️ [TPStreams] Download check took: \(String(format: "%.3f", downloadCheckDuration * 1000))ms (isDownloaded: \(isDownloaded))")
|
|
128
88
|
|
|
129
|
-
|
|
130
|
-
let playerCreateStartTime = CFAbsoluteTimeGetCurrent()
|
|
131
|
-
player = isDownloaded
|
|
89
|
+
player = TPStreamsDownloadManager.shared.isAssetDownloaded(assetID: videoId as String)
|
|
132
90
|
? createOfflinePlayer()
|
|
133
91
|
: createOnlinePlayer()
|
|
134
|
-
let playerCreateDuration = CFAbsoluteTimeGetCurrent() - playerCreateStartTime
|
|
135
|
-
print("⏱️ [TPStreams] Player creation took: \(String(format: "%.3f", playerCreateDuration * 1000))ms")
|
|
136
92
|
|
|
137
93
|
guard player != nil else {
|
|
138
|
-
print("
|
|
94
|
+
print("Failed to create player - invalid videoId or accessToken")
|
|
139
95
|
setupScheduled = false
|
|
140
96
|
return
|
|
141
97
|
}
|
|
142
|
-
|
|
143
|
-
// Token delegate setup
|
|
144
|
-
let tokenDelegateStartTime = CFAbsoluteTimeGetCurrent()
|
|
145
98
|
setupTokenDelegate()
|
|
146
|
-
let tokenDelegateDuration = CFAbsoluteTimeGetCurrent() - tokenDelegateStartTime
|
|
147
|
-
print("⏱️ [TPStreams] setupTokenDelegate() took: \(String(format: "%.3f", tokenDelegateDuration * 1000))ms")
|
|
148
|
-
|
|
149
|
-
// View configuration
|
|
150
|
-
let configStartTime = CFAbsoluteTimeGetCurrent()
|
|
151
99
|
configurePlayerView()
|
|
152
|
-
let configDuration = CFAbsoluteTimeGetCurrent() - configStartTime
|
|
153
|
-
print("⏱️ [TPStreams] configurePlayerView() took: \(String(format: "%.3f", configDuration * 1000))ms")
|
|
154
|
-
|
|
155
|
-
// Observer setup
|
|
156
|
-
let observerStartTime = CFAbsoluteTimeGetCurrent()
|
|
157
100
|
observePlayerChanges()
|
|
158
|
-
let observerDuration = CFAbsoluteTimeGetCurrent() - observerStartTime
|
|
159
|
-
print("⏱️ [TPStreams] observePlayerChanges() took: \(String(format: "%.3f", observerDuration * 1000))ms")
|
|
160
|
-
|
|
161
101
|
setupScheduled = false
|
|
162
|
-
|
|
163
|
-
let totalDuration = CFAbsoluteTimeGetCurrent() - setupStartTime
|
|
164
|
-
print("⏱️ [TPStreams] ========== setupPlayer() COMPLETED in \(String(format: "%.3f", totalDuration * 1000))ms ==========")
|
|
165
102
|
}
|
|
166
103
|
|
|
167
104
|
private func cleanupPlayer() {
|
|
168
|
-
let cleanupStartTime = CFAbsoluteTimeGetCurrent()
|
|
169
|
-
|
|
170
|
-
let removeObserversStartTime = CFAbsoluteTimeGetCurrent()
|
|
171
105
|
removeObservers()
|
|
172
|
-
let removeObserversDuration = CFAbsoluteTimeGetCurrent() - removeObserversStartTime
|
|
173
|
-
print("⏱️ [TPStreams] removeObservers() took: \(String(format: "%.3f", removeObserversDuration * 1000))ms")
|
|
174
|
-
|
|
175
106
|
player?.pause()
|
|
176
107
|
|
|
177
108
|
playerViewController?.view.removeFromSuperview()
|
|
@@ -180,11 +111,6 @@ class TPStreamsRNPlayerView: UIView {
|
|
|
180
111
|
|
|
181
112
|
player?.replaceCurrentItem(with: nil)
|
|
182
113
|
player = nil
|
|
183
|
-
|
|
184
|
-
let totalCleanupDuration = CFAbsoluteTimeGetCurrent() - cleanupStartTime
|
|
185
|
-
if totalCleanupDuration > 0.001 { // Only log if cleanup took meaningful time
|
|
186
|
-
print("⏱️ [TPStreams] cleanupPlayer() total: \(String(format: "%.3f", totalCleanupDuration * 1000))ms")
|
|
187
|
-
}
|
|
188
114
|
}
|
|
189
115
|
|
|
190
116
|
private func removeObservers() {
|
|
@@ -199,37 +125,17 @@ class TPStreamsRNPlayerView: UIView {
|
|
|
199
125
|
}
|
|
200
126
|
|
|
201
127
|
private func createOfflinePlayer() -> TPAVPlayer? {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
print("❌ [TPStreams] createOfflinePlayer() - invalid videoId")
|
|
205
|
-
return nil
|
|
206
|
-
}
|
|
207
|
-
print("⏱️ [TPStreams] Creating offline player for videoId: \(videoId)")
|
|
208
|
-
let player = TPAVPlayer(offlineAssetId: videoId as String) { [weak self] error in
|
|
209
|
-
let errorTime = CFAbsoluteTimeGetCurrent()
|
|
210
|
-
print("⏱️ [TPStreams] Offline player error callback triggered at: \(String(format: "%.3f", errorTime * 1000))ms")
|
|
128
|
+
guard videoId.length > 0 else { return nil }
|
|
129
|
+
return TPAVPlayer(offlineAssetId: videoId as String) { [weak self] error in
|
|
211
130
|
self?.handlePlayerError(error, context: "Offline setup")
|
|
212
131
|
}
|
|
213
|
-
let duration = CFAbsoluteTimeGetCurrent() - startTime
|
|
214
|
-
print("⏱️ [TPStreams] TPAVPlayer(offline) init took: \(String(format: "%.3f", duration * 1000))ms")
|
|
215
|
-
return player
|
|
216
132
|
}
|
|
217
133
|
|
|
218
134
|
private func createOnlinePlayer() -> TPAVPlayer? {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
print("❌ [TPStreams] createOnlinePlayer() - invalid videoId or accessToken")
|
|
222
|
-
return nil
|
|
223
|
-
}
|
|
224
|
-
print("⏱️ [TPStreams] Creating online player for videoId: \(videoId)")
|
|
225
|
-
let player = TPAVPlayer(assetID: videoId as String, accessToken: accessToken as String) { [weak self] error in
|
|
226
|
-
let errorTime = CFAbsoluteTimeGetCurrent()
|
|
227
|
-
// print("⏱️ [TPStreams] Online player error callback triggered at: \(String(format: "%.3f", errorTime * 1000))ms")
|
|
135
|
+
guard videoId.length > 0, accessToken.length > 0 else { return nil }
|
|
136
|
+
return TPAVPlayer(assetID: videoId as String, accessToken: accessToken as String) { [weak self] error in
|
|
228
137
|
self?.handlePlayerError(error, context: "Online setup")
|
|
229
138
|
}
|
|
230
|
-
let duration = CFAbsoluteTimeGetCurrent() - startTime
|
|
231
|
-
print("⏱️ [TPStreams] TPAVPlayer(online) init took: \(String(format: "%.3f", duration * 1000))ms")
|
|
232
|
-
return player
|
|
233
139
|
}
|
|
234
140
|
|
|
235
141
|
private func handlePlayerError(_ error: Error?, context: String) {
|
|
@@ -244,14 +150,7 @@ class TPStreamsRNPlayerView: UIView {
|
|
|
244
150
|
}
|
|
245
151
|
|
|
246
152
|
private func configurePlayerView() {
|
|
247
|
-
let
|
|
248
|
-
guard let player = player else {
|
|
249
|
-
print("❌ [TPStreams] configurePlayerView() - player is nil")
|
|
250
|
-
return
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
// License renewal setup
|
|
254
|
-
let licenseSetupStartTime = CFAbsoluteTimeGetCurrent()
|
|
153
|
+
guard let player = player else { return }
|
|
255
154
|
player.onRequestOfflineLicenseRenewal = { [weak self] assetId, completion in
|
|
256
155
|
guard let self = self else {
|
|
257
156
|
completion(nil, 0)
|
|
@@ -261,132 +160,53 @@ class TPStreamsRNPlayerView: UIView {
|
|
|
261
160
|
self.pendingOfflineCredentialsCompletion = completion
|
|
262
161
|
self.onAccessTokenExpired?(["videoId": assetId])
|
|
263
162
|
}
|
|
264
|
-
let licenseSetupDuration = CFAbsoluteTimeGetCurrent() - licenseSetupStartTime
|
|
265
|
-
print("⏱️ [TPStreams] License renewal setup took: \(String(format: "%.3f", licenseSetupDuration * 1000))ms")
|
|
266
163
|
|
|
267
|
-
// Config builder
|
|
268
|
-
let configBuilderStartTime = CFAbsoluteTimeGetCurrent()
|
|
269
164
|
let configBuilder = createPlayerConfigBuilder()
|
|
270
|
-
let configBuilderDuration = CFAbsoluteTimeGetCurrent() - configBuilderStartTime
|
|
271
|
-
print("⏱️ [TPStreams] createPlayerConfigBuilder() took: \(String(format: "%.3f", configBuilderDuration * 1000))ms")
|
|
272
|
-
|
|
273
|
-
// View controller creation
|
|
274
|
-
let vcCreateStartTime = CFAbsoluteTimeGetCurrent()
|
|
275
165
|
let playerVC = TPStreamPlayerViewController()
|
|
276
166
|
playerVC.player = player
|
|
277
167
|
playerVC.config = configBuilder.build()
|
|
278
|
-
let vcCreateDuration = CFAbsoluteTimeGetCurrent() - vcCreateStartTime
|
|
279
|
-
print("⏱️ [TPStreams] TPStreamPlayerViewController creation took: \(String(format: "%.3f", vcCreateDuration * 1000))ms")
|
|
280
168
|
|
|
281
|
-
// Attach view controller
|
|
282
|
-
let attachStartTime = CFAbsoluteTimeGetCurrent()
|
|
283
169
|
attachPlayerViewController(playerVC)
|
|
284
|
-
let attachDuration = CFAbsoluteTimeGetCurrent() - attachStartTime
|
|
285
|
-
print("⏱️ [TPStreams] attachPlayerViewController() took: \(String(format: "%.3f", attachDuration * 1000))ms")
|
|
286
|
-
|
|
287
|
-
if shouldAutoPlay {
|
|
288
|
-
let playStartTime = CFAbsoluteTimeGetCurrent()
|
|
289
|
-
playCallTime = playStartTime
|
|
290
|
-
print("⏱️ [TPStreams] 🎬 player.play() CALLED at: \(String(format: "%.3f", playStartTime * 1000))ms")
|
|
291
|
-
player.play()
|
|
292
|
-
let playDuration = CFAbsoluteTimeGetCurrent() - playStartTime
|
|
293
|
-
print("⏱️ [TPStreams] player.play() took: \(String(format: "%.3f", playDuration * 1000))ms")
|
|
294
|
-
}
|
|
295
170
|
|
|
171
|
+
if shouldAutoPlay { player.play() }
|
|
296
172
|
playerViewController = playerVC
|
|
297
|
-
|
|
298
|
-
let totalConfigDuration = CFAbsoluteTimeGetCurrent() - configStartTime
|
|
299
|
-
print("⏱️ [TPStreams] configurePlayerView() total: \(String(format: "%.3f", totalConfigDuration * 1000))ms")
|
|
300
173
|
}
|
|
301
174
|
|
|
302
175
|
private func createPlayerConfigBuilder() -> TPStreamPlayerConfigurationBuilder {
|
|
303
|
-
let builderStartTime = CFAbsoluteTimeGetCurrent()
|
|
304
|
-
|
|
305
|
-
let parseStartTime = CFAbsoluteTimeGetCurrent()
|
|
306
176
|
let metadataDict = parseMetadataJSON(from: downloadMetadata)
|
|
307
|
-
let parseDuration = CFAbsoluteTimeGetCurrent() - parseStartTime
|
|
308
|
-
print("⏱️ [TPStreams] parseMetadataJSON() took: \(String(format: "%.3f", parseDuration * 1000))ms")
|
|
309
|
-
|
|
310
|
-
let builderCreateStartTime = CFAbsoluteTimeGetCurrent()
|
|
311
177
|
let configBuilder = TPStreamPlayerConfigurationBuilder()
|
|
312
178
|
.setPreferredForwardDuration(15)
|
|
313
179
|
.setPreferredRewindDuration(5)
|
|
314
180
|
.setprogressBarThumbColor(.systemBlue)
|
|
315
181
|
.setwatchedProgressTrackColor(.systemBlue)
|
|
316
182
|
.setDownloadMetadata(metadataDict)
|
|
317
|
-
let builderCreateDuration = CFAbsoluteTimeGetCurrent() - builderCreateStartTime
|
|
318
|
-
print("⏱️ [TPStreams] ConfigBuilder creation took: \(String(format: "%.3f", builderCreateDuration * 1000))ms")
|
|
319
183
|
|
|
320
|
-
let licenseStartTime = CFAbsoluteTimeGetCurrent()
|
|
321
184
|
configBuilder.setLicenseDurationSeconds(offlineLicenseExpireTime)
|
|
322
|
-
let licenseDuration = CFAbsoluteTimeGetCurrent() - licenseStartTime
|
|
323
|
-
print("⏱️ [TPStreams] setLicenseDurationSeconds() took: \(String(format: "%.3f", licenseDuration * 1000))ms")
|
|
324
185
|
|
|
325
186
|
if enableDownload {
|
|
326
|
-
let downloadOptionStartTime = CFAbsoluteTimeGetCurrent()
|
|
327
187
|
configBuilder.showDownloadOption()
|
|
328
|
-
let downloadOptionDuration = CFAbsoluteTimeGetCurrent() - downloadOptionStartTime
|
|
329
|
-
print("⏱️ [TPStreams] showDownloadOption() took: \(String(format: "%.3f", downloadOptionDuration * 1000))ms")
|
|
330
188
|
}
|
|
331
189
|
|
|
332
|
-
let totalBuilderDuration = CFAbsoluteTimeGetCurrent() - builderStartTime
|
|
333
|
-
print("⏱️ [TPStreams] createPlayerConfigBuilder() total: \(String(format: "%.3f", totalBuilderDuration * 1000))ms")
|
|
334
|
-
|
|
335
190
|
return configBuilder
|
|
336
191
|
}
|
|
337
192
|
|
|
338
193
|
private func attachPlayerViewController(_ playerVC: TPStreamPlayerViewController) {
|
|
339
|
-
let
|
|
340
|
-
guard let parentVC = reactViewController() else {
|
|
341
|
-
print("❌ [TPStreams] attachPlayerViewController() - reactViewController() is nil")
|
|
342
|
-
return
|
|
343
|
-
}
|
|
194
|
+
guard let parentVC = reactViewController() else { return }
|
|
344
195
|
|
|
345
|
-
let addChildStartTime = CFAbsoluteTimeGetCurrent()
|
|
346
196
|
parentVC.addChild(playerVC)
|
|
347
|
-
let addChildDuration = CFAbsoluteTimeGetCurrent() - addChildStartTime
|
|
348
|
-
print("⏱️ [TPStreams] addChild() took: \(String(format: "%.3f", addChildDuration * 1000))ms")
|
|
349
|
-
|
|
350
197
|
addSubview(playerVC.view)
|
|
351
198
|
playerVC.view.frame = bounds
|
|
352
199
|
playerVC.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
|
|
353
200
|
playerVC.view.isHidden = false
|
|
354
201
|
bringSubviewToFront(playerVC.view)
|
|
355
|
-
|
|
356
|
-
let didMoveStartTime = CFAbsoluteTimeGetCurrent()
|
|
357
202
|
playerVC.didMove(toParent: parentVC)
|
|
358
|
-
let didMoveDuration = CFAbsoluteTimeGetCurrent() - didMoveStartTime
|
|
359
|
-
print("⏱️ [TPStreams] didMove(toParent:) took: \(String(format: "%.3f", didMoveDuration * 1000))ms")
|
|
360
|
-
|
|
361
|
-
let totalAttachDuration = CFAbsoluteTimeGetCurrent() - attachStartTime
|
|
362
|
-
print("⏱️ [TPStreams] attachPlayerViewController() total: \(String(format: "%.3f", totalAttachDuration * 1000))ms")
|
|
363
203
|
}
|
|
364
204
|
|
|
365
205
|
private func observePlayerChanges() {
|
|
366
|
-
let observerStartTime = CFAbsoluteTimeGetCurrent()
|
|
367
|
-
|
|
368
|
-
let seekObserverStartTime = CFAbsoluteTimeGetCurrent()
|
|
369
206
|
setupSeekObserver()
|
|
370
|
-
let seekObserverDuration = CFAbsoluteTimeGetCurrent() - seekObserverStartTime
|
|
371
|
-
print("⏱️ [TPStreams] setupSeekObserver() took: \(String(format: "%.3f", seekObserverDuration * 1000))ms")
|
|
372
|
-
|
|
373
|
-
let playerStateObserverStartTime = CFAbsoluteTimeGetCurrent()
|
|
374
207
|
setupPlayerStateObserver()
|
|
375
|
-
let playerStateObserverDuration = CFAbsoluteTimeGetCurrent() - playerStateObserverStartTime
|
|
376
|
-
print("⏱️ [TPStreams] setupPlayerStateObserver() took: \(String(format: "%.3f", playerStateObserverDuration * 1000))ms")
|
|
377
|
-
|
|
378
|
-
let playbackSpeedObserverStartTime = CFAbsoluteTimeGetCurrent()
|
|
379
208
|
setupPlaybackSpeedObserver()
|
|
380
|
-
let playbackSpeedObserverDuration = CFAbsoluteTimeGetCurrent() - playbackSpeedObserverStartTime
|
|
381
|
-
print("⏱️ [TPStreams] setupPlaybackSpeedObserver() took: \(String(format: "%.3f", playbackSpeedObserverDuration * 1000))ms")
|
|
382
|
-
|
|
383
|
-
let playingStateObserverStartTime = CFAbsoluteTimeGetCurrent()
|
|
384
209
|
setupPlayingStateObserver()
|
|
385
|
-
let playingStateObserverDuration = CFAbsoluteTimeGetCurrent() - playingStateObserverStartTime
|
|
386
|
-
print("⏱️ [TPStreams] setupPlayingStateObserver() took: \(String(format: "%.3f", playingStateObserverDuration * 1000))ms")
|
|
387
|
-
|
|
388
|
-
let totalObserverDuration = CFAbsoluteTimeGetCurrent() - observerStartTime
|
|
389
|
-
print("⏱️ [TPStreams] observePlayerChanges() total: \(String(format: "%.3f", totalObserverDuration * 1000))ms")
|
|
390
210
|
}
|
|
391
211
|
|
|
392
212
|
private func setupSeekObserver() {
|
|
@@ -425,37 +245,6 @@ class TPStreamsRNPlayerView: UIView {
|
|
|
425
245
|
guard let player = player else { return }
|
|
426
246
|
|
|
427
247
|
playerStateObserver = player.observe(\.status, options: [.new, .initial]) { [weak self] player, _ in
|
|
428
|
-
let statusTime = CFAbsoluteTimeGetCurrent()
|
|
429
|
-
let statusString: String
|
|
430
|
-
switch player.status {
|
|
431
|
-
case .unknown:
|
|
432
|
-
statusString = "unknown"
|
|
433
|
-
case .readyToPlay:
|
|
434
|
-
statusString = "readyToPlay"
|
|
435
|
-
if self?.playerReadyTime == nil {
|
|
436
|
-
self?.playerReadyTime = statusTime
|
|
437
|
-
if let playCallTime = self?.playCallTime {
|
|
438
|
-
let timeToReady = statusTime - playCallTime
|
|
439
|
-
print("⏱️ [TPStreams] ✅ Player READY TO PLAY - Time from play() call: \(String(format: "%.3f", timeToReady * 1000))ms")
|
|
440
|
-
} else {
|
|
441
|
-
print("⏱️ [TPStreams] ✅ Player READY TO PLAY")
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
case .failed:
|
|
445
|
-
statusString = "failed"
|
|
446
|
-
print("❌ [TPStreams] Player status: FAILED")
|
|
447
|
-
@unknown default:
|
|
448
|
-
statusString = "unknown"
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
// Show relative time from setup start instead of absolute timestamp
|
|
452
|
-
if let setupStart = self?.setupStartTime {
|
|
453
|
-
let relativeTime = statusTime - setupStart
|
|
454
|
-
print("⏱️ [TPStreams] Player status changed to: \(statusString) at +\(String(format: "%.3f", relativeTime * 1000))ms from setup start")
|
|
455
|
-
} else {
|
|
456
|
-
print("⏱️ [TPStreams] Player status changed to: \(statusString)")
|
|
457
|
-
}
|
|
458
|
-
|
|
459
248
|
DispatchQueue.main.async {
|
|
460
249
|
let state = self?.mapPlayerStateToAndroid(player.status) ?? PlaybackState.idle.rawValue
|
|
461
250
|
self?.onPlayerStateChanged?(["playbackState": state])
|
|
@@ -463,46 +252,6 @@ class TPStreamsRNPlayerView: UIView {
|
|
|
463
252
|
}
|
|
464
253
|
|
|
465
254
|
timeControlStatusObserver = player.observe(\.timeControlStatus, options: [.new, .initial]) { [weak self] player, _ in
|
|
466
|
-
let controlStatusTime = CFAbsoluteTimeGetCurrent()
|
|
467
|
-
let statusString: String
|
|
468
|
-
switch player.timeControlStatus {
|
|
469
|
-
case .paused:
|
|
470
|
-
statusString = "paused"
|
|
471
|
-
case .waitingToPlayAtSpecifiedRate:
|
|
472
|
-
statusString = "waitingToPlayAtSpecifiedRate"
|
|
473
|
-
if let setupStart = self?.setupStartTime {
|
|
474
|
-
let relativeTime = controlStatusTime - setupStart
|
|
475
|
-
print("⏱️ [TPStreams] ⏳ Player WAITING TO PLAY (buffering) at +\(String(format: "%.3f", relativeTime * 1000))ms from setup start")
|
|
476
|
-
} else {
|
|
477
|
-
print("⏱️ [TPStreams] ⏳ Player WAITING TO PLAY (buffering)")
|
|
478
|
-
}
|
|
479
|
-
case .playing:
|
|
480
|
-
statusString = "playing"
|
|
481
|
-
if self?.playbackStartTime == nil {
|
|
482
|
-
self?.playbackStartTime = controlStatusTime
|
|
483
|
-
if let playCallTime = self?.playCallTime {
|
|
484
|
-
let timeToPlay = controlStatusTime - playCallTime
|
|
485
|
-
print("⏱️ [TPStreams] 🎥 PLAYBACK STARTED! Time from play() call: \(String(format: "%.3f", timeToPlay * 1000))ms")
|
|
486
|
-
if let readyTime = self?.playerReadyTime {
|
|
487
|
-
let bufferingTime = controlStatusTime - readyTime
|
|
488
|
-
print("⏱️ [TPStreams] 📊 Buffering time (readyToPlay → playing): \(String(format: "%.3f", bufferingTime * 1000))ms")
|
|
489
|
-
}
|
|
490
|
-
} else {
|
|
491
|
-
print("⏱️ [TPStreams] 🎥 PLAYBACK STARTED!")
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
@unknown default:
|
|
495
|
-
statusString = "unknown"
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
// Show relative time from setup start
|
|
499
|
-
if let setupStart = self?.setupStartTime {
|
|
500
|
-
let relativeTime = controlStatusTime - setupStart
|
|
501
|
-
print("⏱️ [TPStreams] TimeControlStatus changed to: \(statusString) at +\(String(format: "%.3f", relativeTime * 1000))ms from setup start")
|
|
502
|
-
} else {
|
|
503
|
-
print("⏱️ [TPStreams] TimeControlStatus changed to: \(statusString)")
|
|
504
|
-
}
|
|
505
|
-
|
|
506
255
|
DispatchQueue.main.async {
|
|
507
256
|
let state = self?.mapPlayerStateToAndroid(player.status, timeControlStatus: player.timeControlStatus) ?? PlaybackState.idle.rawValue
|
|
508
257
|
self?.onPlayerStateChanged?(["playbackState": state])
|
|
@@ -535,10 +284,7 @@ class TPStreamsRNPlayerView: UIView {
|
|
|
535
284
|
}
|
|
536
285
|
|
|
537
286
|
private func setupTokenDelegate() {
|
|
538
|
-
let delegateStartTime = CFAbsoluteTimeGetCurrent()
|
|
539
287
|
TPStreamsDownloadModule.shared?.setAccessTokenDelegate(self)
|
|
540
|
-
let delegateDuration = CFAbsoluteTimeGetCurrent() - delegateStartTime
|
|
541
|
-
print("⏱️ [TPStreams] setupTokenDelegate() took: \(String(format: "%.3f", delegateDuration * 1000))ms")
|
|
542
288
|
}
|
|
543
289
|
|
|
544
290
|
private static func sanitizeLicenseDuration(_ value: Double) -> Double {
|