@@ -16,8 +16,6 @@ import CoreImage
16
16
@MainActor
17
17
public protocol AbstractPlayer : AnyObject {
18
18
19
- typealias ItemStatusCallback = ( AVPlayerItem . Status ) -> Void
20
-
21
19
/// Observes the status property of the new player item.
22
20
var itemStatusObserver : NSKeyValueObservation ? { get set }
23
21
@@ -112,7 +110,7 @@ public protocol AbstractPlayer: AnyObject {
112
110
func applyVideoComposition( )
113
111
114
112
/// Updates the current playback asset, settings, and initializes playback or a specific action when the asset is ready.
115
- func update( settings: VideoSettings , doUpdate : Bool , callback : ( ( AVPlayerItem ) -> Void ) ? )
113
+ func update( settings: VideoSettings , doUpdate : Bool )
116
114
}
117
115
118
116
extension AbstractPlayer {
@@ -204,46 +202,6 @@ extension AbstractPlayer{
204
202
return AVPlayerItem ( asset: asset)
205
203
}
206
204
}
207
-
208
- /// Clear status observer
209
- func clearStatusObserver( ) {
210
- guard itemStatusObserver != nil else { return }
211
- itemStatusObserver? . invalidate ( )
212
- itemStatusObserver = nil
213
- }
214
-
215
- /// Sets up an observer for the status of the provided `AVPlayerItem`.
216
- ///
217
- /// This method observes changes in the status of `newItem` and triggers the provided callback
218
- /// whenever the status changes to `.readyToPlay` or `.failed`. Once the callback is invoked,
219
- /// the observer is invalidated, ensuring that the callback is called only once.
220
- ///
221
- /// - Parameters:
222
- /// - item: The `AVPlayerItem` whose status is to be observed.
223
- /// - callback: A closure that is called when the item's status changes to `.readyToPlay` or `.failed`.
224
- func setupStateStatusObserver( for item: AVPlayerItem , callback : @escaping ItemStatusCallback ) {
225
-
226
- clearStatusObserver ( )
227
-
228
- guard item. status == . unknown else {
229
- callback ( item. status)
230
- return
231
- }
232
-
233
- itemStatusObserver = item. observe ( \. status, options: [ . new, . initial] ) { [ weak self] observedItem, change in
234
- print ( observedItem. status. rawValue, " status " )
235
-
236
- guard [ . readyToPlay, . failed] . contains ( observedItem. status) else {
237
- return
238
- }
239
-
240
- callback ( observedItem. status)
241
-
242
- Task { @MainActor in
243
- self ? . clearStatusObserver ( )
244
- }
245
- }
246
- }
247
205
248
206
/// Seeks the video to a specific time in the timeline.
249
207
/// This method adjusts the playback position to the specified time with precise accuracy.
@@ -257,7 +215,7 @@ extension AbstractPlayer{
257
215
/// Defaults to `false`, meaning playback will remain paused after the seek operation.
258
216
func seek( to time: Double , play: Bool = false ) {
259
217
guard let player = player, let duration = player. currentItem? . duration else {
260
- onUnavailableDuration ( for : time , play : play )
218
+ delegate ? . didSeek ( value : false , currentTime : time )
261
219
return
262
220
}
263
221
@@ -266,43 +224,18 @@ extension AbstractPlayer{
266
224
return
267
225
}
268
226
269
- player. seek ( to: seekTime, toleranceBefore : . zero , toleranceAfter : . zero ) { [ weak self] success in
227
+ player. seek ( to: seekTime) { [ weak self] success in
270
228
self ? . seekCompletion ( success: success, autoPlay: play)
271
229
}
272
230
}
273
-
274
- private func onUnavailableDuration( for time: Double , play: Bool ) {
275
- guard let settings = currentSettings else {
276
- delegate? . didSeek ( value: false , currentTime: time)
277
- return
278
- }
279
-
280
- let callback : ItemStatusCallback = { [ weak self] status in
281
- if status == . readyToPlay {
282
- self ? . seek ( to: time, play: play)
283
- } else {
284
- self ? . delegate? . didSeek ( value: false , currentTime: time)
285
- }
286
- }
287
-
288
- update ( settings: settings, doUpdate: true ) { [ weak self] item in
289
- DispatchQueue . main. asyncAfter ( deadline: . now( ) + 0.5 ) {
290
- self ? . setupStateStatusObserver ( for: item, callback: callback)
291
- }
292
- }
293
- }
294
231
295
232
private func seekCompletion( success: Bool , autoPlay: Bool ) {
296
233
guard let player = player else { return }
297
234
let currentTime = CMTimeGetSeconds ( player. currentTime ( ) )
298
235
299
236
Task { @MainActor in
300
237
delegate? . didSeek ( value: success, currentTime: currentTime)
301
- if autoPlay {
302
- play ( )
303
- } else {
304
- pause ( )
305
- }
238
+ autoPlay ? play ( ) : pause ( )
306
239
}
307
240
}
308
241
0 commit comments