Skip to content

Commit

Permalink
Add last-ditch effort to recover an avplayer with an unknown status
Browse files Browse the repository at this point in the history
when trying to run play() by just adding a single avplayeritem, if the
item is known to be already downloaded.
  • Loading branch information
gioneill committed Feb 9, 2019
1 parent 13822b2 commit 00b02c7
Showing 1 changed file with 13 additions and 8 deletions.
21 changes: 13 additions & 8 deletions NYPLAudiobookToolkit/Player/OpenAccessPlayer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,11 @@ final class OpenAccessPlayer: NSObject, Player {
if self.avQueuePlayer.currentItem == nil {
if let cursorItemDownloadTask = self.cursor.currentElement.downloadTask as? OpenAccessDownloadTask {
switch cursorItemDownloadTask.assetFileStatus() {
case .saved(let savedURL):
let item = AVPlayerItem(url: savedURL)
if self.avQueuePlayer.canInsert(item, after: nil) {
self.avQueuePlayer.insert(item, after: nil)
}
case .missing(_):
self.rebuildOnFinishedDownload(task: cursorItemDownloadTask)
default:
Expand Down Expand Up @@ -185,8 +190,7 @@ final class OpenAccessPlayer: NSObject, Player {
private func seekWithinCurrentItem(newOffset: TimeInterval)
{
guard let currentItem = self.avQueuePlayer.currentItem else {
ATLog(.error, "No current AVPlayerItem in AVQueuePlayer")

ATLog(.error, "No current AVPlayerItem in AVQueuePlayer to seek with.")
return
}
if self.avQueuePlayer.currentItem?.status != .readyToPlay {
Expand Down Expand Up @@ -223,12 +227,12 @@ final class OpenAccessPlayer: NSObject, Player {
/// You cannot play audio without both being "ready."
fileprivate func overallPlayerReadiness(player: AVPlayer.Status, item: AVPlayerItem.Status?) -> AVPlayerItem.Status
{
let convertedPlayerStatus = AVPlayerItem.Status(rawValue: self.avQueuePlayer.status.rawValue) ?? .unknown
let currentItemStatus = self.avQueuePlayer.currentItem?.status ?? .unknown
if convertedPlayerStatus == currentItemStatus {
return convertedPlayerStatus
let avPlayerStatus = AVPlayerItem.Status(rawValue: self.avQueuePlayer.status.rawValue) ?? .unknown
let playerItemStatus = self.avQueuePlayer.currentItem?.status ?? .unknown
if avPlayerStatus == playerItemStatus {
return avPlayerStatus
} else {
return currentItemStatus
return playerItemStatus
}
}

Expand All @@ -250,7 +254,8 @@ final class OpenAccessPlayer: NSObject, Player {
self.notifyDelegatesOfPlaybackFailureFor(chapter: self.chapterAtCurrentCursor, error)
}
}
} else if let seekOffset = self.queuedSeekOffset {
}
if let seekOffset = self.queuedSeekOffset {
self.queuedSeekOffset = nil
self.seekWithinCurrentItem(newOffset: seekOffset)
}
Expand Down

0 comments on commit 00b02c7

Please sign in to comment.