Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 620df96

Browse files
update
1 parent 8d066aa commit 620df96

File tree

3 files changed

+50
-39
lines changed

3 files changed

+50
-39
lines changed

‎Sources/swiftui-loop-videoplayer/protocol/player/AbstractPlayer.swift‎

Lines changed: 49 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ import CoreImage
1616
@MainActor
1717
public protocol AbstractPlayer: AnyObject {
1818

19+
typealias ItemStatusCallback = (AVPlayerItem.Status) -> Void
20+
1921
/// Observes the status property of the new player item.
20-
var statusObserver: NSKeyValueObservation? { get set }
22+
var itemStatusObserver: NSKeyValueObservation? { get set }
2123

2224
/// An optional property that stores the current video settings.
2325
///
@@ -205,9 +207,9 @@ extension AbstractPlayer{
205207

206208
/// Clear status observer
207209
func clearStatusObserver(){
208-
guard statusObserver != nil else { return }
209-
statusObserver?.invalidate()
210-
statusObserver = nil
210+
guard itemStatusObserver != nil else { return }
211+
itemStatusObserver?.invalidate()
212+
itemStatusObserver = nil
211213
}
212214

213215
/// Sets up an observer for the status of the provided `AVPlayerItem`.
@@ -219,7 +221,7 @@ extension AbstractPlayer{
219221
/// - Parameters:
220222
/// - item: The `AVPlayerItem` whose status is to be observed.
221223
/// - callback: A closure that is called when the item's status changes to `.readyToPlay` or `.failed`.
222-
func setupStateStatusObserver(for item: AVPlayerItem, callback : @escaping (AVPlayerItem.Status)->Void) {
224+
func setupStateStatusObserver(for item: AVPlayerItem, callback : @escaping ItemStatusCallback) {
223225

224226
clearStatusObserver()
225227

@@ -228,9 +230,10 @@ extension AbstractPlayer{
228230
return
229231
}
230232

231-
statusObserver = item.observe(\.status, options: [.new, .initial, .old]) { [weak self] item, change in
233+
itemStatusObserver = item.observe(\.status, options: [.new, .initial, .old]) { [weak self] item, change in
232234
print(item.status.rawValue, "status")
233-
guard item.status == .readyToPlay || item.status == .failed else {
235+
236+
guard [.readyToPlay, .failed].contains(item.status) else {
234237
return
235238
}
236239

@@ -254,42 +257,51 @@ extension AbstractPlayer{
254257
/// Defaults to `false`, meaning playback will remain paused after the seek operation.
255258
func seek(to time: Double, play: Bool = false) {
256259
guard let player = player, let duration = player.currentItem?.duration else {
257-
guard let settings = currentSettings else{
258-
delegate?.didSeek(value: false, currentTime: time)
259-
return
260-
}
261-
let callback : (AVPlayerItem.Status) -> Void = { [weak self] status in
262-
guard status == .readyToPlay else {
263-
self?.delegate?.didSeek(value: false, currentTime: time)
264-
return
265-
}
266-
self?.seek(to: time, play: play)
267-
}
268-
269-
update(settings: settings, doUpdate: true){ [weak self] item in
270-
/// Need to refactor
271-
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5){
272-
self?.setupStateStatusObserver(for: item, callback: callback)
273-
}
274-
}
275-
260+
onUnavailableDuration(for: time, play: play)
276261
return
277262
}
278-
279-
guard let seekTime = getSeekTime(for: time, duration: duration) else{
263+
264+
guard let seekTime = getSeekTime(for: time, duration: duration) else{
280265
delegate?.didSeek(value: false, currentTime: time)
281266
return
282267
}
268+
269+
player.seek(to: seekTime, toleranceBefore: .zero, toleranceAfter: .zero) { [weak self] success in
270+
self?.seekCompletion(success: success, autoPlay: play)
271+
}
272+
}
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+
}
283294

284-
player.seek(to: seekTime){ [weak self] value in
285-
let currentTime = CMTimeGetSeconds(player.currentTime())
286-
Task { @MainActor in
287-
self?.delegate?.didSeek(value: value, currentTime: currentTime)
288-
if play{
289-
self?.play()
290-
}else{
291-
self?.pause()
292-
}
295+
private func seekCompletion(success: Bool, autoPlay: Bool) {
296+
guard let player = player else { return }
297+
let currentTime = CMTimeGetSeconds(player.currentTime())
298+
299+
Task { @MainActor in
300+
delegate?.didSeek(value: success, currentTime: currentTime)
301+
if autoPlay {
302+
play()
303+
} else {
304+
pause()
293305
}
294306
}
295307
}

‎Sources/swiftui-loop-videoplayer/protocol/player/ExtPlayerProtocol.swift‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,6 @@ internal extension ExtPlayerProtocol {
191191
}
192192

193193
callback?(newItem)
194-
195194
insert(newItem)
196195

197196
if settings.loop {

‎Sources/swiftui-loop-videoplayer/view/player/ios/ExtPlayerUIView.swift‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ internal class ExtPlayerUIView: UIView, ExtPlayerProtocol {
6060
internal var volumeObserver: NSKeyValueObservation?
6161

6262
/// Observes the status property of the new player item.
63-
internal var statusObserver: NSKeyValueObservation?
63+
internal var itemStatusObserver: NSKeyValueObservation?
6464

6565
/// The delegate to be notified about errors encountered by the player.
6666
weak var delegate: PlayerDelegateProtocol?

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /