From ac385ec2fdc3d04d8f282fb03986cce541516dc5 Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Wed, 26 Jun 2024 16:16:19 -0400 Subject: [PATCH 01/23] Resolve TOC navigation errors --- Palace.xcodeproj/project.pbxproj | 12 ++++++------ ios-audiobooktoolkit | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Palace.xcodeproj/project.pbxproj b/Palace.xcodeproj/project.pbxproj index 532e7e895..6c3bca2b3 100644 --- a/Palace.xcodeproj/project.pbxproj +++ b/Palace.xcodeproj/project.pbxproj @@ -5655,7 +5655,7 @@ CODE_SIGN_IDENTITY = "Apple Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 266; + CURRENT_PROJECT_VERSION = 267; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5714,7 +5714,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 266; + CURRENT_PROJECT_VERSION = 267; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5899,7 +5899,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 266; + CURRENT_PROJECT_VERSION = 267; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5960,7 +5960,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 266; + CURRENT_PROJECT_VERSION = 267; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6022,7 +6022,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 266; + CURRENT_PROJECT_VERSION = 267; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6083,7 +6083,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 266; + CURRENT_PROJECT_VERSION = 267; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; diff --git a/ios-audiobooktoolkit b/ios-audiobooktoolkit index 469d0ce59..d6ca2114a 160000 --- a/ios-audiobooktoolkit +++ b/ios-audiobooktoolkit @@ -1 +1 @@ -Subproject commit 469d0ce598cf2b8a8ec4aabf77a9ec4ae71c7137 +Subproject commit d6ca2114ad93ac60767d7095369799dd4f7c04f2 From b0f59043f096bff398c2193f6dfdc1c739b6a17f Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Mon, 1 Jul 2024 16:17:46 -0400 Subject: [PATCH 02/23] integrate updated audiobook toolkit --- Palace/Book/UI/TPPBookCellDelegate+Extensions.swift | 4 ++-- Palace/MyBooks/MyBooksDownloadCenter.swift | 7 ++++++- ios-audiobooktoolkit | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Palace/Book/UI/TPPBookCellDelegate+Extensions.swift b/Palace/Book/UI/TPPBookCellDelegate+Extensions.swift index a5eafd3bd..d25fedfea 100644 --- a/Palace/Book/UI/TPPBookCellDelegate+Extensions.swift +++ b/Palace/Book/UI/TPPBookCellDelegate+Extensions.swift @@ -50,7 +50,7 @@ private struct AssociatedKeys { } let manifestDecoder = Manifest.customDecoder() - + guard let jsonData = try? JSONSerialization.data(withJSONObject: json, options: []), let manifest = try? manifestDecoder.decode(Manifest.self, from: jsonData), let audiobook = AudiobookFactory.audiobook(for: manifest, bookIdentifier: book.identifier, decryptor: drmDecryptor, token: book.bearerToken) @@ -59,7 +59,7 @@ private struct AssociatedKeys { completion?() return } - + let metadata = AudiobookMetadata(title: book.title, authors: [book.authors ?? ""]) let audiobookManager = DefaultAudiobookManager( metadata: metadata, diff --git a/Palace/MyBooks/MyBooksDownloadCenter.swift b/Palace/MyBooks/MyBooksDownloadCenter.swift index 30c566bf8..dfbafd723 100644 --- a/Palace/MyBooks/MyBooksDownloadCenter.swift +++ b/Palace/MyBooks/MyBooksDownloadCenter.swift @@ -497,7 +497,12 @@ extension MyBooksDownloadCenter { // Assuming we create and use an audiobook object to manage deletion guard let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: []), let manifest = try? Manifest.customDecoder().decode(Manifest.self, from: jsonData), - let audiobook = AudiobookFactory.audiobook(for: manifest, bookIdentifier: book.identifier, decryptor: nil, token: book.bearerToken) else { + let audiobook = AudiobookFactory.audiobook( + for: manifest, + bookIdentifier: book.identifier, + decryptor: nil, + token: book.bearerToken + ) else { return } audiobook.deleteLocalContent(completion: { _, _ in }) diff --git a/ios-audiobooktoolkit b/ios-audiobooktoolkit index d6ca2114a..c005b42b9 160000 --- a/ios-audiobooktoolkit +++ b/ios-audiobooktoolkit @@ -1 +1 @@ -Subproject commit d6ca2114ad93ac60767d7095369799dd4f7c04f2 +Subproject commit c005b42b99f69d314fa86ae74fbb627aa444dccc From 3cc2ee8443038624f5e646fe8b8d30705602129c Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Mon, 1 Jul 2024 16:18:17 -0400 Subject: [PATCH 03/23] Update project.pbxproj --- Palace.xcodeproj/project.pbxproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Palace.xcodeproj/project.pbxproj b/Palace.xcodeproj/project.pbxproj index 6c3bca2b3..265c45264 100644 --- a/Palace.xcodeproj/project.pbxproj +++ b/Palace.xcodeproj/project.pbxproj @@ -5655,7 +5655,7 @@ CODE_SIGN_IDENTITY = "Apple Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 267; + CURRENT_PROJECT_VERSION = 268; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5714,7 +5714,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 267; + CURRENT_PROJECT_VERSION = 268; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5899,7 +5899,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 267; + CURRENT_PROJECT_VERSION = 268; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5960,7 +5960,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 267; + CURRENT_PROJECT_VERSION = 268; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6022,7 +6022,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 267; + CURRENT_PROJECT_VERSION = 268; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6083,7 +6083,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 267; + CURRENT_PROJECT_VERSION = 268; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; From 6ebd4a99d911387cf1c0b37a09004e3d6328c7b4 Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Mon, 1 Jul 2024 16:20:14 -0400 Subject: [PATCH 04/23] Update project.pbxproj --- Palace.xcodeproj/project.pbxproj | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Palace.xcodeproj/project.pbxproj b/Palace.xcodeproj/project.pbxproj index b32f8c98a..6c3bca2b3 100644 --- a/Palace.xcodeproj/project.pbxproj +++ b/Palace.xcodeproj/project.pbxproj @@ -5655,7 +5655,6 @@ CODE_SIGN_IDENTITY = "Apple Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 268; CURRENT_PROJECT_VERSION = 267; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; @@ -5715,7 +5714,6 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 268; CURRENT_PROJECT_VERSION = 267; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; @@ -5901,7 +5899,6 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 268; CURRENT_PROJECT_VERSION = 267; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; @@ -5963,7 +5960,6 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 268; CURRENT_PROJECT_VERSION = 267; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; @@ -6026,7 +6022,6 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 268; CURRENT_PROJECT_VERSION = 267; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; @@ -6088,7 +6083,6 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 268; CURRENT_PROJECT_VERSION = 267; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; From d2a7a595cc9a62f00c0cde2b9db2e2adb9809de1 Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Mon, 1 Jul 2024 16:20:33 -0400 Subject: [PATCH 05/23] Update project.pbxproj --- Palace.xcodeproj/project.pbxproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Palace.xcodeproj/project.pbxproj b/Palace.xcodeproj/project.pbxproj index 6c3bca2b3..265c45264 100644 --- a/Palace.xcodeproj/project.pbxproj +++ b/Palace.xcodeproj/project.pbxproj @@ -5655,7 +5655,7 @@ CODE_SIGN_IDENTITY = "Apple Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 267; + CURRENT_PROJECT_VERSION = 268; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5714,7 +5714,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 267; + CURRENT_PROJECT_VERSION = 268; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5899,7 +5899,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 267; + CURRENT_PROJECT_VERSION = 268; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5960,7 +5960,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 267; + CURRENT_PROJECT_VERSION = 268; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6022,7 +6022,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 267; + CURRENT_PROJECT_VERSION = 268; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6083,7 +6083,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 267; + CURRENT_PROJECT_VERSION = 268; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; From 0ad395ff235723144a55f1ef1be7b97107227b3a Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Mon, 1 Jul 2024 16:24:00 -0400 Subject: [PATCH 06/23] Update TPPBookCellDelegate+Extensions.swift --- Palace/Book/UI/TPPBookCellDelegate+Extensions.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Palace/Book/UI/TPPBookCellDelegate+Extensions.swift b/Palace/Book/UI/TPPBookCellDelegate+Extensions.swift index d25fedfea..a5eafd3bd 100644 --- a/Palace/Book/UI/TPPBookCellDelegate+Extensions.swift +++ b/Palace/Book/UI/TPPBookCellDelegate+Extensions.swift @@ -50,7 +50,7 @@ private struct AssociatedKeys { } let manifestDecoder = Manifest.customDecoder() - + guard let jsonData = try? JSONSerialization.data(withJSONObject: json, options: []), let manifest = try? manifestDecoder.decode(Manifest.self, from: jsonData), let audiobook = AudiobookFactory.audiobook(for: manifest, bookIdentifier: book.identifier, decryptor: drmDecryptor, token: book.bearerToken) @@ -59,7 +59,7 @@ private struct AssociatedKeys { completion?() return } - + let metadata = AudiobookMetadata(title: book.title, authors: [book.authors ?? ""]) let audiobookManager = DefaultAudiobookManager( metadata: metadata, From 58c18798c48df8bdbaa0cd03ba0468cf3c8f34d2 Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Mon, 1 Jul 2024 16:54:51 -0400 Subject: [PATCH 07/23] Update ios-audiobooktoolkit --- ios-audiobooktoolkit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios-audiobooktoolkit b/ios-audiobooktoolkit index c005b42b9..4d8c413e1 160000 --- a/ios-audiobooktoolkit +++ b/ios-audiobooktoolkit @@ -1 +1 @@ -Subproject commit c005b42b99f69d314fa86ae74fbb627aa444dccc +Subproject commit 4d8c413e17b62603b13fe465208bf10f4f5734d2 From bb790d93abfb0e2e7c123cf2a722384ec68714a7 Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Wed, 3 Jul 2024 13:30:46 -0400 Subject: [PATCH 08/23] Prevent LCP lock on startup --- Palace/Audiobooks/LCP/LCPAudiobooks.swift | 79 ++++++++++++++++------- ios-audiobooktoolkit | 2 +- 2 files changed, 56 insertions(+), 25 deletions(-) diff --git a/Palace/Audiobooks/LCP/LCPAudiobooks.swift b/Palace/Audiobooks/LCP/LCPAudiobooks.swift index 7607bdd41..3aafb1049 100644 --- a/Palace/Audiobooks/LCP/LCPAudiobooks.swift +++ b/Palace/Audiobooks/LCP/LCPAudiobooks.swift @@ -16,7 +16,7 @@ import PalaceAudiobookToolkit /// LCP Audiobooks helper class @objc class LCPAudiobooks: NSObject { - + private let audiobookUrlKey = "audiobookUrl" private let audioFileHrefKey = "audioFileHref" private let destinationFileUrlKey = "destinationFileUrl" @@ -40,17 +40,35 @@ import PalaceAudiobookToolkit /// Content dictionary for `AudiobookFactory` @objc func contentDictionary(completion: @escaping (_ json: NSDictionary?, _ error: NSError?) -> ()) { + DispatchQueue.global(qos: .userInitiated).async { + self.loadContentDictionary { json, error in + DispatchQueue.main.async { + completion(json, error) + } + } + } + } + + private func loadContentDictionary(completion: @escaping (_ json: NSDictionary?, _ error: NSError?) -> ()) { let manifestPath = "manifest.json" let asset = FileAsset(url: self.audiobookUrl) streamer.open(asset: asset, allowUserInteraction: false) { result in - do { - let publication = try result.get() - let resourse = publication.getResource(at: manifestPath) - let json = try resourse.readAsJSON().get() - completion(json as NSDictionary, nil) - } catch { - TPPErrorLogger.logError(error, summary: "Error reading LCP \(manifestPath) file", metadata: [self.audiobookUrlKey: self.audiobookUrl]) + switch result { + case .success(let publication): + do { + let resource = publication.getResource(at: manifestPath) + let json = try resource.readAsJSON().get() + completion(json as NSDictionary, nil) + } catch { + TPPErrorLogger.logError(error, summary: "Error reading LCP \(manifestPath) file", metadata: [self.audiobookUrlKey: self.audiobookUrl]) + completion(nil, LCPAudiobooks.nsError(for: error)) + } + case .failure(let error): + TPPErrorLogger.logError(error, summary: "Failed to open LCP audiobook", metadata: [self.audiobookUrlKey: self.audiobookUrl]) completion(nil, LCPAudiobooks.nsError(for: error)) + case .cancelled: + completion(nil, nil) + } } } @@ -59,10 +77,10 @@ import PalaceAudiobookToolkit /// - Parameter book: audiobook /// - Returns: `true` if the book is an LCP DRM protected audiobook, `false` otherwise @objc static func canOpenBook(_ book: TPPBook) -> Bool { - guard let defualtAcquisition = book.defaultAcquisition else { return false } - return book.defaultBookContentType == .audiobook && defualtAcquisition.type == expectedAcquisitionType + guard let defaultAcquisition = book.defaultAcquisition else { return false } + return book.defaultBookContentType == .audiobook && defaultAcquisition.type == expectedAcquisitionType } - + /// Creates an NSError for Objective-C code /// - Parameter error: Error object /// - Returns: NSError object @@ -77,28 +95,41 @@ import PalaceAudiobookToolkit /// DRM Decryptor for LCP audiobooks extension LCPAudiobooks: DRMDecryptor { - + /// Decrypt protected file /// - Parameters: /// - url: encrypted file URL. /// - resultUrl: URL to save decrypted file at. /// - completion: decryptor callback with optional `Error`. func decrypt(url: URL, to resultUrl: URL, completion: @escaping (Error?) -> Void) { + DispatchQueue.global(qos: .userInitiated).async { + self.decryptFile(at: url, to: resultUrl, completion: completion) + } + } + + private func decryptFile(at url: URL, to resultUrl: URL, completion: @escaping (Error?) -> Void) { let asset = FileAsset(url: self.audiobookUrl) streamer.open(asset: asset, allowUserInteraction: false) { result in - do { - let publication = try result.get() - let resource = publication.getResource(at: url.path) - let data = try resource.read().get() - try data.write(to: resultUrl) - completion(nil) - } catch { - TPPErrorLogger.logError(error, summary: "Error decrypting LCP audio file", metadata: [ - self.audiobookUrlKey: self.audiobookUrl, - self.audioFileHrefKey: url, - self.destinationFileUrlKey: resultUrl - ]) + switch result { + case .success(let publication): + do { + let resource = publication.getResource(at: url.path) + let data = try resource.read().get() + try data.write(to: resultUrl) + completion(nil) + } catch { + TPPErrorLogger.logError(error, summary: "Error decrypting LCP audio file", metadata: [ + self.audiobookUrlKey: self.audiobookUrl, + self.audioFileHrefKey: url, + self.destinationFileUrlKey: resultUrl + ]) + completion(error) + } + case .failure(let error): + TPPErrorLogger.logError(error, summary: "Failed to decrypt LCP audiobook", metadata: [self.audiobookUrlKey: self.audiobookUrl]) completion(error) + case .cancelled: + completion(nil) } } } diff --git a/ios-audiobooktoolkit b/ios-audiobooktoolkit index 4d8c413e1..65d70b499 160000 --- a/ios-audiobooktoolkit +++ b/ios-audiobooktoolkit @@ -1 +1 @@ -Subproject commit 4d8c413e17b62603b13fe465208bf10f4f5734d2 +Subproject commit 65d70b499535c3917c08a50a79bca30371245c2b From 23253d7156ffbd27d09cf8ffc9b26cd4ad02f9cb Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Wed, 3 Jul 2024 13:40:54 -0400 Subject: [PATCH 09/23] Update project.pbxproj --- Palace.xcodeproj/project.pbxproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Palace.xcodeproj/project.pbxproj b/Palace.xcodeproj/project.pbxproj index 265c45264..b36b24db9 100644 --- a/Palace.xcodeproj/project.pbxproj +++ b/Palace.xcodeproj/project.pbxproj @@ -5655,7 +5655,7 @@ CODE_SIGN_IDENTITY = "Apple Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 268; + CURRENT_PROJECT_VERSION = 269; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5714,7 +5714,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 268; + CURRENT_PROJECT_VERSION = 269; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5899,7 +5899,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 268; + CURRENT_PROJECT_VERSION = 269; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5960,7 +5960,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 268; + CURRENT_PROJECT_VERSION = 269; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6022,7 +6022,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 268; + CURRENT_PROJECT_VERSION = 269; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6083,7 +6083,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 268; + CURRENT_PROJECT_VERSION = 269; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; From 3cd00bdb41933aee9f79cb179c5ac59b4999189b Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Tue, 9 Jul 2024 08:30:03 -0400 Subject: [PATCH 10/23] Resolve token refresh issue --- Palace/Network/TPPNetworkExecutor.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Palace/Network/TPPNetworkExecutor.swift b/Palace/Network/TPPNetworkExecutor.swift index 59f480427..bcebb5d5e 100644 --- a/Palace/Network/TPPNetworkExecutor.swift +++ b/Palace/Network/TPPNetworkExecutor.swift @@ -63,7 +63,7 @@ extension TPPNetworkExecutor: TPPRequestExecuting { if userAccount.isTokenRefreshRequired() && enableTokenRefresh { let task = urlSession.dataTask(with: req) refreshTokenAndResume(task: task, completion: completion) - return task + return nil } if req.hasRetried && userAccount.isTokenRefreshRequired() { From 2bc734901cd07d7c95c96911f013cf0e2ec60fad Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Tue, 9 Jul 2024 08:30:21 -0400 Subject: [PATCH 11/23] add pretty printing extension for debugging --- Palace/Utilities/Dictionary+Extensions.swift | 27 ++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Palace/Utilities/Dictionary+Extensions.swift b/Palace/Utilities/Dictionary+Extensions.swift index 409c9aa8f..56a6c733a 100644 --- a/Palace/Utilities/Dictionary+Extensions.swift +++ b/Palace/Utilities/Dictionary+Extensions.swift @@ -17,3 +17,30 @@ extension Dictionary { return dictionary } } + +extension Dictionary where Key == String, Value: Any { + + /// Pretty prints the JSON dictionary + func prettyPrintJSON() { + do { + let jsonData = try JSONSerialization.data(withJSONObject: self, options: .prettyPrinted) + if let jsonString = String(data: jsonData, encoding: .utf8) { + print(jsonString) + } + } catch { + print("Failed to pretty print JSON: \(error)") + } + } + + /// Converts the JSON dictionary to a pretty printed string + /// - Returns: A string representation of the pretty printed JSON dictionary + func prettyPrintedJSONString() -> String? { + do { + let jsonData = try JSONSerialization.data(withJSONObject: self, options: .prettyPrinted) + return String(data: jsonData, encoding: .utf8) + } catch { + print("Failed to convert JSON dictionary to pretty printed string: \(error)") + return nil + } + } +} From 58f95c1f4b54da0c8eb9562a1c6509c2114e882c Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Tue, 9 Jul 2024 08:30:25 -0400 Subject: [PATCH 12/23] Update ios-audiobooktoolkit --- ios-audiobooktoolkit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios-audiobooktoolkit b/ios-audiobooktoolkit index 65d70b499..2b7b7222b 160000 --- a/ios-audiobooktoolkit +++ b/ios-audiobooktoolkit @@ -1 +1 @@ -Subproject commit 65d70b499535c3917c08a50a79bca30371245c2b +Subproject commit 2b7b7222bb1bf2d362dbcefbc1c234ea955b3f0f From 423efb221d99fd7ee5f3915c529c24b40a7c1a7e Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Tue, 9 Jul 2024 08:31:11 -0400 Subject: [PATCH 13/23] Update project.pbxproj --- Palace.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Palace.xcodeproj/project.pbxproj b/Palace.xcodeproj/project.pbxproj index b36b24db9..fffd49491 100644 --- a/Palace.xcodeproj/project.pbxproj +++ b/Palace.xcodeproj/project.pbxproj @@ -5899,7 +5899,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 269; + CURRENT_PROJECT_VERSION = 270; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5960,7 +5960,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 269; + CURRENT_PROJECT_VERSION = 270; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6022,7 +6022,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 269; + CURRENT_PROJECT_VERSION = 270; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6083,7 +6083,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 269; + CURRENT_PROJECT_VERSION = 270; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; From ba96dab094d394c38a1c2e215e7118de0ef057ee Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Tue, 9 Jul 2024 08:34:29 -0400 Subject: [PATCH 14/23] Update project.pbxproj --- Palace.xcodeproj/project.pbxproj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Palace.xcodeproj/project.pbxproj b/Palace.xcodeproj/project.pbxproj index 1e4c054c0..b36b24db9 100644 --- a/Palace.xcodeproj/project.pbxproj +++ b/Palace.xcodeproj/project.pbxproj @@ -5899,7 +5899,6 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 270; CURRENT_PROJECT_VERSION = 269; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; @@ -5961,7 +5960,6 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 270; CURRENT_PROJECT_VERSION = 269; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; @@ -6024,7 +6022,6 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 270; CURRENT_PROJECT_VERSION = 269; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; @@ -6086,7 +6083,6 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 270; CURRENT_PROJECT_VERSION = 269; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; From fe5e5c6f048ba24b89977b1c320bdc95193aa3a6 Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Tue, 9 Jul 2024 08:35:02 -0400 Subject: [PATCH 15/23] Update project.pbxproj --- Palace.xcodeproj/project.pbxproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Palace.xcodeproj/project.pbxproj b/Palace.xcodeproj/project.pbxproj index b36b24db9..68f1bdf6a 100644 --- a/Palace.xcodeproj/project.pbxproj +++ b/Palace.xcodeproj/project.pbxproj @@ -5655,7 +5655,7 @@ CODE_SIGN_IDENTITY = "Apple Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 269; + CURRENT_PROJECT_VERSION = 270; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5714,7 +5714,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 269; + CURRENT_PROJECT_VERSION = 270; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5899,7 +5899,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 269; + CURRENT_PROJECT_VERSION = 270; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5960,7 +5960,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 269; + CURRENT_PROJECT_VERSION = 270; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6022,7 +6022,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 269; + CURRENT_PROJECT_VERSION = 270; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6083,7 +6083,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 269; + CURRENT_PROJECT_VERSION = 270; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; From 3f38a110c55d2cbc99dbf98f2958f07aebf0d8b2 Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Tue, 9 Jul 2024 17:48:15 -0400 Subject: [PATCH 16/23] Update ios-audiobooktoolkit --- ios-audiobooktoolkit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios-audiobooktoolkit b/ios-audiobooktoolkit index 2b7b7222b..f511bcd61 160000 --- a/ios-audiobooktoolkit +++ b/ios-audiobooktoolkit @@ -1 +1 @@ -Subproject commit 2b7b7222bb1bf2d362dbcefbc1c234ea955b3f0f +Subproject commit f511bcd61f3ced412115e17b3abbf2828bed1c06 From f0ac922717ad25d03966961d1f8cc5bfc302bd7f Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Wed, 10 Jul 2024 00:00:17 -0400 Subject: [PATCH 17/23] Update ios-audiobooktoolkit --- ios-audiobooktoolkit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios-audiobooktoolkit b/ios-audiobooktoolkit index f511bcd61..7630e8577 160000 --- a/ios-audiobooktoolkit +++ b/ios-audiobooktoolkit @@ -1 +1 @@ -Subproject commit f511bcd61f3ced412115e17b3abbf2828bed1c06 +Subproject commit 7630e857761e7c88a0c6fc7b4696f130e753280d From 91a632419a286b60c5d9dfafadf53a99cad062b2 Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Fri, 12 Jul 2024 10:19:32 -0400 Subject: [PATCH 18/23] Multiple fixes --- Palace.xcodeproj/project.pbxproj | 12 ++++++------ Palace/Book/UI/TPPBookDetailTableView.swift | 2 +- Palace/Utilities/Dictionary+Extensions.swift | 12 ------------ ios-audiobooktoolkit | 2 +- 4 files changed, 8 insertions(+), 20 deletions(-) diff --git a/Palace.xcodeproj/project.pbxproj b/Palace.xcodeproj/project.pbxproj index 68f1bdf6a..ea67a27b9 100644 --- a/Palace.xcodeproj/project.pbxproj +++ b/Palace.xcodeproj/project.pbxproj @@ -5655,7 +5655,7 @@ CODE_SIGN_IDENTITY = "Apple Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 270; + CURRENT_PROJECT_VERSION = 271; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5714,7 +5714,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 270; + CURRENT_PROJECT_VERSION = 271; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5899,7 +5899,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 270; + CURRENT_PROJECT_VERSION = 271; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5960,7 +5960,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 270; + CURRENT_PROJECT_VERSION = 271; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6022,7 +6022,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 270; + CURRENT_PROJECT_VERSION = 271; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6083,7 +6083,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 270; + CURRENT_PROJECT_VERSION = 271; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; diff --git a/Palace/Book/UI/TPPBookDetailTableView.swift b/Palace/Book/UI/TPPBookDetailTableView.swift index fb7f51093..13926541a 100644 --- a/Palace/Book/UI/TPPBookDetailTableView.swift +++ b/Palace/Book/UI/TPPBookDetailTableView.swift @@ -90,7 +90,7 @@ private let standardCellHeight: CGFloat = 44.0 } addPendingIndicator() - TPPOPDSFeed.withURL(url, shouldResetCache: false, useTokenIfAvailable: false) { (feed, errorDict) in + TPPOPDSFeed.withURL(url, shouldResetCache: false, useTokenIfAvailable: true) { (feed, errorDict) in DispatchQueue.main.async { if feed?.type == .acquisitionGrouped { let groupedFeed = TPPCatalogGroupedFeed.init(opdsFeed: feed) diff --git a/Palace/Utilities/Dictionary+Extensions.swift b/Palace/Utilities/Dictionary+Extensions.swift index 56a6c733a..9fa271130 100644 --- a/Palace/Utilities/Dictionary+Extensions.swift +++ b/Palace/Utilities/Dictionary+Extensions.swift @@ -31,16 +31,4 @@ extension Dictionary where Key == String, Value: Any { print("Failed to pretty print JSON: \(error)") } } - - /// Converts the JSON dictionary to a pretty printed string - /// - Returns: A string representation of the pretty printed JSON dictionary - func prettyPrintedJSONString() -> String? { - do { - let jsonData = try JSONSerialization.data(withJSONObject: self, options: .prettyPrinted) - return String(data: jsonData, encoding: .utf8) - } catch { - print("Failed to convert JSON dictionary to pretty printed string: \(error)") - return nil - } - } } diff --git a/ios-audiobooktoolkit b/ios-audiobooktoolkit index 7630e8577..9a1fd1045 160000 --- a/ios-audiobooktoolkit +++ b/ios-audiobooktoolkit @@ -1 +1 @@ -Subproject commit 7630e857761e7c88a0c6fc7b4696f130e753280d +Subproject commit 9a1fd1045483829f1d3aaa33c827299e04b2d82b From 257bd90b31ec2147b69eaa29c032cf34aedb520c Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Fri, 12 Jul 2024 10:22:24 -0400 Subject: [PATCH 19/23] merge in dev --- Palace.xcodeproj/project.pbxproj | 6 --- .../Dictionary+Extensions.swift.orig | 49 +++++++++++++++++++ 2 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 Palace/Utilities/Dictionary+Extensions.swift.orig diff --git a/Palace.xcodeproj/project.pbxproj b/Palace.xcodeproj/project.pbxproj index de4a64126..68f1bdf6a 100644 --- a/Palace.xcodeproj/project.pbxproj +++ b/Palace.xcodeproj/project.pbxproj @@ -5655,7 +5655,6 @@ CODE_SIGN_IDENTITY = "Apple Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 271; CURRENT_PROJECT_VERSION = 270; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; @@ -5715,7 +5714,6 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 271; CURRENT_PROJECT_VERSION = 270; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; @@ -5901,7 +5899,6 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 271; CURRENT_PROJECT_VERSION = 270; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; @@ -5963,7 +5960,6 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 271; CURRENT_PROJECT_VERSION = 270; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; @@ -6026,7 +6022,6 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 271; CURRENT_PROJECT_VERSION = 270; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; @@ -6088,7 +6083,6 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 271; CURRENT_PROJECT_VERSION = 270; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; diff --git a/Palace/Utilities/Dictionary+Extensions.swift.orig b/Palace/Utilities/Dictionary+Extensions.swift.orig new file mode 100644 index 000000000..60c32296e --- /dev/null +++ b/Palace/Utilities/Dictionary+Extensions.swift.orig @@ -0,0 +1,49 @@ +// +// Dictionary+Extensions.swift +// Palace +// +// Created by Maurice Carrier on 6/16/23. +// Copyright © 2023 The Palace Project. All rights reserved. +// + +import Foundation + +extension Dictionary { + func mapKeys(_ transform: (Key) throws -> T) rethrows -> Dictionary { + var dictionary = Dictionary() + for (key, value) in self { + dictionary[try transform(key)] = value + } + return dictionary + } +} + +extension Dictionary where Key == String, Value: Any { + + /// Pretty prints the JSON dictionary + func prettyPrintJSON() { + do { + let jsonData = try JSONSerialization.data(withJSONObject: self, options: .prettyPrinted) + if let jsonString = String(data: jsonData, encoding: .utf8) { + print(jsonString) + } + } catch { + print("Failed to pretty print JSON: \(error)") + } + } +<<<<<<< HEAD +======= + + /// Converts the JSON dictionary to a pretty printed string + /// - Returns: A string representation of the pretty printed JSON dictionary + func prettyPrintedJSONString() -> String? { + do { + let jsonData = try JSONSerialization.data(withJSONObject: self, options: .prettyPrinted) + return String(data: jsonData, encoding: .utf8) + } catch { + print("Failed to convert JSON dictionary to pretty printed string: \(error)") + return nil + } + } +>>>>>>> beta +} From 34c363928e98b29521112991f716b42dd16d1f21 Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Fri, 12 Jul 2024 10:22:57 -0400 Subject: [PATCH 20/23] Update project.pbxproj --- Palace.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Palace.xcodeproj/project.pbxproj b/Palace.xcodeproj/project.pbxproj index 68f1bdf6a..7c2bfcdb9 100644 --- a/Palace.xcodeproj/project.pbxproj +++ b/Palace.xcodeproj/project.pbxproj @@ -5899,7 +5899,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 270; + CURRENT_PROJECT_VERSION = 271; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5960,7 +5960,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 270; + CURRENT_PROJECT_VERSION = 271; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6022,7 +6022,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 270; + CURRENT_PROJECT_VERSION = 271; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6083,7 +6083,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 270; + CURRENT_PROJECT_VERSION = 271; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; From 6e8b84b5a36aa24100484a017cc71fd81176e293 Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Fri, 12 Jul 2024 10:27:05 -0400 Subject: [PATCH 21/23] Clean up --- Palace.xcodeproj/project.pbxproj | 4 +- .../Dictionary+Extensions.swift.orig | 49 ------------------- 2 files changed, 2 insertions(+), 51 deletions(-) delete mode 100644 Palace/Utilities/Dictionary+Extensions.swift.orig diff --git a/Palace.xcodeproj/project.pbxproj b/Palace.xcodeproj/project.pbxproj index 7c2bfcdb9..ea67a27b9 100644 --- a/Palace.xcodeproj/project.pbxproj +++ b/Palace.xcodeproj/project.pbxproj @@ -5655,7 +5655,7 @@ CODE_SIGN_IDENTITY = "Apple Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 270; + CURRENT_PROJECT_VERSION = 271; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5714,7 +5714,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 270; + CURRENT_PROJECT_VERSION = 271; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; diff --git a/Palace/Utilities/Dictionary+Extensions.swift.orig b/Palace/Utilities/Dictionary+Extensions.swift.orig deleted file mode 100644 index 60c32296e..000000000 --- a/Palace/Utilities/Dictionary+Extensions.swift.orig +++ /dev/null @@ -1,49 +0,0 @@ -// -// Dictionary+Extensions.swift -// Palace -// -// Created by Maurice Carrier on 6/16/23. -// Copyright © 2023 The Palace Project. All rights reserved. -// - -import Foundation - -extension Dictionary { - func mapKeys(_ transform: (Key) throws -> T) rethrows -> Dictionary { - var dictionary = Dictionary() - for (key, value) in self { - dictionary[try transform(key)] = value - } - return dictionary - } -} - -extension Dictionary where Key == String, Value: Any { - - /// Pretty prints the JSON dictionary - func prettyPrintJSON() { - do { - let jsonData = try JSONSerialization.data(withJSONObject: self, options: .prettyPrinted) - if let jsonString = String(data: jsonData, encoding: .utf8) { - print(jsonString) - } - } catch { - print("Failed to pretty print JSON: \(error)") - } - } -<<<<<<< HEAD -======= - - /// Converts the JSON dictionary to a pretty printed string - /// - Returns: A string representation of the pretty printed JSON dictionary - func prettyPrintedJSONString() -> String? { - do { - let jsonData = try JSONSerialization.data(withJSONObject: self, options: .prettyPrinted) - return String(data: jsonData, encoding: .utf8) - } catch { - print("Failed to convert JSON dictionary to pretty printed string: \(error)") - return nil - } - } ->>>>>>> beta -} From 6346001ec98d0e0a3f0f1c21e7b213ee5b0fcc77 Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Mon, 15 Jul 2024 10:29:43 -0400 Subject: [PATCH 22/23] Ensure image update is not missed by callback --- Palace/Book/Models/TPPBookCoverRegistry.swift | 19 ++++++++++--------- Palace/Book/UI/TPPBookDetailTableView.swift | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Palace/Book/Models/TPPBookCoverRegistry.swift b/Palace/Book/Models/TPPBookCoverRegistry.swift index 2698fab30..62f55b76f 100644 --- a/Palace/Book/Models/TPPBookCoverRegistry.swift +++ b/Palace/Book/Models/TPPBookCoverRegistry.swift @@ -66,18 +66,14 @@ class TPPBookCoverRegistry { /// - books: A set of `TPPBook` objects. /// - handler: completion handler. `handler()` is called once, after all covers are downloaded. func thumbnailImagesForBooks(_ books: Set, handler: @escaping (_ bookIdentifiersToImages: [String: UIImage]) -> Void) { - var result: [String: UIImage] = [:] { - didSet { - if books.count == result.keys.count { - DispatchQueue.main.async { - handler(result) - } - } - } - } + var result: [String: UIImage] = [:] + let dispatchGroup = DispatchGroup() + books.forEach { book in + dispatchGroup.enter() guard let thumbnailUrl = book.imageThumbnailURL else { result[book.identifier] = self.generateBookCoverImage(book) + dispatchGroup.leave() return } @@ -91,8 +87,13 @@ class TPPBookCoverRegistry { result[book.identifier] = self.generateBookCoverImage(book) } } + dispatchGroup.leave() }.resume() } + + dispatchGroup.notify(queue: .main) { + handler(result) + } } /// Immediately returns the cached thumbnail if available, else nil. Generated images are not returned. diff --git a/Palace/Book/UI/TPPBookDetailTableView.swift b/Palace/Book/UI/TPPBookDetailTableView.swift index 13926541a..e694f0bab 100644 --- a/Palace/Book/UI/TPPBookDetailTableView.swift +++ b/Palace/Book/UI/TPPBookDetailTableView.swift @@ -90,7 +90,7 @@ private let standardCellHeight: CGFloat = 44.0 } addPendingIndicator() - TPPOPDSFeed.withURL(url, shouldResetCache: false, useTokenIfAvailable: true) { (feed, errorDict) in + TPPOPDSFeed.withURL(url, shouldResetCache: false, useTokenIfAvailable: TPPUserAccount.sharedAccount().hasAdobeToken()) { (feed, errorDict) in DispatchQueue.main.async { if feed?.type == .acquisitionGrouped { let groupedFeed = TPPCatalogGroupedFeed.init(opdsFeed: feed) From f2a83925a92efa7069bf61749d1c5dd0c17784bc Mon Sep 17 00:00:00 2001 From: Maurice Carrier Date: Mon, 15 Jul 2024 10:30:59 -0400 Subject: [PATCH 23/23] Update project.pbxproj --- Palace.xcodeproj/project.pbxproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Palace.xcodeproj/project.pbxproj b/Palace.xcodeproj/project.pbxproj index ea67a27b9..a4520731d 100644 --- a/Palace.xcodeproj/project.pbxproj +++ b/Palace.xcodeproj/project.pbxproj @@ -5655,7 +5655,7 @@ CODE_SIGN_IDENTITY = "Apple Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 271; + CURRENT_PROJECT_VERSION = 272; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5714,7 +5714,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 271; + CURRENT_PROJECT_VERSION = 272; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5899,7 +5899,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 271; + CURRENT_PROJECT_VERSION = 272; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5960,7 +5960,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 271; + CURRENT_PROJECT_VERSION = 272; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6022,7 +6022,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 271; + CURRENT_PROJECT_VERSION = 272; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6083,7 +6083,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 271; + CURRENT_PROJECT_VERSION = 272; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO;