From 97d0458a04ccbf3d714ff3955c26f65c8787ae7d Mon Sep 17 00:00:00 2001 From: Gianni Carlo Date: Tue, 28 Jan 2020 10:53:30 -0500 Subject: [PATCH 1/6] Fix unable to pick completed track in a playlist --- BookPlayer/Player/PlayerManager.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/BookPlayer/Player/PlayerManager.swift b/BookPlayer/Player/PlayerManager.swift index 93bef5f3f..384072334 100644 --- a/BookPlayer/Player/PlayerManager.swift +++ b/BookPlayer/Player/PlayerManager.swift @@ -106,7 +106,9 @@ class PlayerManager: NSObject { MPNowPlayingInfoCenter.default().nowPlayingInfo = self.nowPlayingInfo if book.currentTime > 0.0 { - self.jumpTo(book.currentTime) + // if book is truly finished, start book again to avoid autoplaying next one + let time = book.currentTime == book.duration ? 0 : book.currentTime + self.jumpTo(time) } NotificationCenter.default.post(name: .bookReady, object: nil, userInfo: ["book": book]) From 18401bd11f08c8a99b7bd088d4de6a42d5edf645 Mon Sep 17 00:00:00 2001 From: Gianni Carlo Date: Mon, 3 Feb 2020 17:39:54 -0500 Subject: [PATCH 2/6] Fix sleep timer end of chapter option --- BookPlayer/Player/PlayerManager.swift | 23 ++++++++++++++++++---- BookPlayer/Services/CarPlayManager.swift | 1 - Shared/Models/Playlist+CoreDataClass.swift | 2 +- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/BookPlayer/Player/PlayerManager.swift b/BookPlayer/Player/PlayerManager.swift index 384072334..3de79e8ea 100644 --- a/BookPlayer/Player/PlayerManager.swift +++ b/BookPlayer/Player/PlayerManager.swift @@ -22,6 +22,18 @@ class PlayerManager: NSObject { private var playerItem: AVPlayerItem? + private var observeStatus: Bool = false { + didSet { + guard oldValue != observeStatus else { return } + + if self.observeStatus { + self.playerItem?.addObserver(self, forKeyPath: "status", options: .new, context: nil) + } else { + self.playerItem?.removeObserver(self, forKeyPath: "status") + } + } + } + var currentBook: Book? { didSet { guard let book = currentBook, @@ -340,7 +352,7 @@ extension PlayerManager { guard let item = self.playerItem, item.status == .readyToPlay else { //queue playback - self.playerItem?.addObserver(self, forKeyPath: "status", options: .new, context: nil) + self.observeStatus = true return } @@ -418,7 +430,8 @@ extension PlayerManager { return } - self.playerItem?.removeObserver(self, forKeyPath: "status") + self.observeStatus = false + self.play() } @@ -427,6 +440,8 @@ extension PlayerManager { return } + self.observeStatus = false + UserActivityManager.shared.stopPlaybackActivity() if let library = currentBook.library ?? currentBook.playlist?.library { @@ -459,6 +474,8 @@ extension PlayerManager { } func stop() { + self.observeStatus = false + self.audioPlayer.pause() UserActivityManager.shared.stopPlaybackActivity() @@ -518,8 +535,6 @@ extension PlayerManager { NotificationCenter.default.post(name: .bookChange, object: nil, userInfo: userInfo) - - self.play() }) } } diff --git a/BookPlayer/Services/CarPlayManager.swift b/BookPlayer/Services/CarPlayManager.swift index 06da5bcc7..3b001a138 100644 --- a/BookPlayer/Services/CarPlayManager.swift +++ b/BookPlayer/Services/CarPlayManager.swift @@ -90,7 +90,6 @@ class CarPlayManager: NSObject, MPPlayableContentDataSource, MPPlayableContentDe guard let playlist = items[indexPath[IndexGuide.library.content]] as? Playlist, let count = playlist.books?.count else { - print(items[indexPath[IndexGuide.library.content]]) return 0 } diff --git a/Shared/Models/Playlist+CoreDataClass.swift b/Shared/Models/Playlist+CoreDataClass.swift index 9d9f5b0b9..df9695eb6 100644 --- a/Shared/Models/Playlist+CoreDataClass.swift +++ b/Shared/Models/Playlist+CoreDataClass.swift @@ -100,7 +100,7 @@ public class Playlist: LibraryItem { public func updateCompletionState() { guard let books = self.books?.array as? [Book] else { return } - print(!books.contains(where: { !$0.isFinished })) + self.isFinished = !books.contains(where: { !$0.isFinished }) } From f5414643bbdc447945d75046297a553a23ed6d06 Mon Sep 17 00:00:00 2001 From: Gianni Carlo Date: Mon, 3 Feb 2020 17:46:04 -0500 Subject: [PATCH 3/6] Add 3 new speed options --- BookPlayer/Player/PlayerManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BookPlayer/Player/PlayerManager.swift b/BookPlayer/Player/PlayerManager.swift index 3de79e8ea..1f54a038f 100644 --- a/BookPlayer/Player/PlayerManager.swift +++ b/BookPlayer/Player/PlayerManager.swift @@ -16,7 +16,7 @@ import MediaPlayer class PlayerManager: NSObject { static let shared = PlayerManager() - static let speedOptions: [Float] = [2.5, 2, 1.75, 1.5, 1.25, 1, 0.75] + static let speedOptions: [Float] = [3, 2.5, 2, 1.75, 1.5, 1.25, 1, 0.9, 0.75, 0.5] private var audioPlayer = AVPlayer() From cc0cc64bb30b7435b86ac7db3c9156b524c5aaa4 Mon Sep 17 00:00:00 2001 From: Gianni Carlo Date: Mon, 3 Feb 2020 18:09:00 -0500 Subject: [PATCH 4/6] Fix playing from artwork for already loaded book --- BookPlayer/Library/ItemListViewController.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/BookPlayer/Library/ItemListViewController.swift b/BookPlayer/Library/ItemListViewController.swift index 5af151131..ab82332a4 100644 --- a/BookPlayer/Library/ItemListViewController.swift +++ b/BookPlayer/Library/ItemListViewController.swift @@ -195,11 +195,12 @@ class ItemListViewController: UIViewController, ItemList, ItemListAlerts, ItemLi } } - func setupPlayer(book: Book) { + func setupPlayer(book: Book, _ override: Bool = false) { // Make sure player is for a different book guard let currentBook = PlayerManager.shared.currentBook, - currentBook == book + currentBook == book, + !override else { // Handle loading new player self.loadPlayer(book: book) @@ -492,7 +493,7 @@ extension ItemListViewController: UITableViewDataSource { guard let book = self?.getNextBook(item) else { return } - self?.setupPlayer(book: book) + self?.setupPlayer(book: book, true) } if let book = item as? Book { From 74bd010002a8fe72bc48262fd164fb808ce053ff Mon Sep 17 00:00:00 2001 From: Gianni Carlo Date: Mon, 3 Feb 2020 18:54:42 -0500 Subject: [PATCH 5/6] Fix miniplayer being dismissed --- BookPlayer/Library/RootViewController.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/BookPlayer/Library/RootViewController.swift b/BookPlayer/Library/RootViewController.swift index d04d25af8..3bcb72f65 100644 --- a/BookPlayer/Library/RootViewController.swift +++ b/BookPlayer/Library/RootViewController.swift @@ -65,7 +65,6 @@ class RootViewController: UIViewController, UIGestureRecognizerDelegate { NotificationCenter.default.addObserver(self, selector: #selector(self.onBookPlay), name: .bookPlayed, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(self.onBookPause), name: .bookPaused, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(self.onBookPause), name: .bookEnd, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(self.dismissMiniPlayer), name: .bookStopped, object: nil) // Gestures self.pan = UIPanGestureRecognizer(target: self, action: #selector(self.panAction)) From 6257fe93ede475dc33b8190d7fd1ff6db8126ad5 Mon Sep 17 00:00:00 2001 From: Gianni Carlo Date: Fri, 7 Feb 2020 08:17:43 -0500 Subject: [PATCH 6/6] Set 3.6.2 labels --- BookPlayer.xcodeproj/project.pbxproj | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/BookPlayer.xcodeproj/project.pbxproj b/BookPlayer.xcodeproj/project.pbxproj index 6e4076ed2..441f84c81 100644 --- a/BookPlayer.xcodeproj/project.pbxproj +++ b/BookPlayer.xcodeproj/project.pbxproj @@ -1778,7 +1778,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BookPlayerWatch_Extension; INFOPLIST_FILE = BookPlayerWatch/Info.plist; - MARKETING_VERSION = 3.6.1; + MARKETING_VERSION = 3.6.2; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tortugapower.audiobookplayer.watchkitapp; @@ -1810,7 +1810,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BookPlayerWatch_Extension; INFOPLIST_FILE = BookPlayerWatch/Info.plist; - MARKETING_VERSION = 3.6.1; + MARKETING_VERSION = 3.6.2; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tortugapower.audiobookplayer.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1840,7 +1840,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BookPlayerWatch_Extension; INFOPLIST_FILE = BookPlayerWatch/Info.plist; - MARKETING_VERSION = 3.6.1; + MARKETING_VERSION = 3.6.2; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tortugapower.audiobookplayer.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1868,7 +1868,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "BookPlayerWatch Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 3.6.1; + MARKETING_VERSION = 3.6.2; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tortugapower.audiobookplayer.watchkitapp.watchkitextension; @@ -1898,7 +1898,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "BookPlayerWatch Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 3.6.1; + MARKETING_VERSION = 3.6.2; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tortugapower.audiobookplayer.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; @@ -1926,7 +1926,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "BookPlayerWatch Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 3.6.1; + MARKETING_VERSION = 3.6.2; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tortugapower.audiobookplayer.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; @@ -2171,7 +2171,7 @@ INFOPLIST_FILE = BookPlayer/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 3.6.1; + MARKETING_VERSION = 3.6.2; PRODUCT_BUNDLE_IDENTIFIER = com.tortugapower.audiobookplayer; PRODUCT_NAME = BookPlayer; PROVISIONING_PROFILE_SPECIFIER = "BookPlayer 3 with CarPlay"; @@ -2201,7 +2201,7 @@ INFOPLIST_FILE = BookPlayer/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 3.6.1; + MARKETING_VERSION = 3.6.2; PRODUCT_BUNDLE_IDENTIFIER = com.tortugapower.audiobookplayer; PRODUCT_NAME = BookPlayer; PROVISIONING_PROFILE_SPECIFIER = "BookPlayer 3 with CarPlay"; @@ -2370,7 +2370,7 @@ INFOPLIST_FILE = BookPlayerWidget/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 3.6.1; + MARKETING_VERSION = 3.6.2; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tortugapower.audiobookplayer.BookPlayerWidget; @@ -2399,7 +2399,7 @@ INFOPLIST_FILE = BookPlayerWidget/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 3.6.1; + MARKETING_VERSION = 3.6.2; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tortugapower.audiobookplayer.BookPlayerWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2426,7 +2426,7 @@ INFOPLIST_FILE = BookPlayerWidget/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 3.6.1; + MARKETING_VERSION = 3.6.2; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tortugapower.audiobookplayer.BookPlayerWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2507,7 +2507,7 @@ INFOPLIST_FILE = BookPlayer/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 3.6.1; + MARKETING_VERSION = 3.6.2; PRODUCT_BUNDLE_IDENTIFIER = com.tortugapower.audiobookplayer; PRODUCT_NAME = BookPlayer; PROVISIONING_PROFILE_SPECIFIER = "BookPlayer 3 with CarPlay";