From e73072e22468f9ab279dfc7d00772d980f825ef1 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Tue, 13 Sep 2022 16:03:34 +0800 Subject: [PATCH] Updates after rebasing, implement download for offline audio --- .../Home/Components/FeedCardNavigationLink.swift | 6 +++--- .../Sources/App/Views/Home/HomeFeedViewIOS.swift | 14 +++++++------- .../Sources/App/Views/Home/HomeFeedViewModel.swift | 2 +- .../Services/AudioSession/AudioController.swift | 9 +++++++++ 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift b/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift index 425fb5afd..74dce21f2 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift @@ -24,7 +24,7 @@ struct FeedCardNavigationLink: View { .opacity(0) .buttonStyle(PlainButtonStyle()) .onAppear { - Task { await viewModel.itemAppeared(item: item, dataService: dataService, audioController: AudioController) } + Task { await viewModel.itemAppeared(item: item, dataService: dataService, audioController: audioController) } } FeedCard(item: item) } @@ -34,7 +34,7 @@ struct FeedCardNavigationLink: View { struct GridCardNavigationLink: View { @EnvironmentObject var dataService: DataService - @EnvironmentObject var audioSession: AudioSession + @EnvironmentObject var audioController: AudioController @State private var scale = 1.0 @@ -63,7 +63,7 @@ struct GridCardNavigationLink: View { withAnimation { tapAction() } }) .onAppear { - Task { await viewModel.itemAppeared(item: item, dataService: dataService, audioController: AudioController) } + Task { await viewModel.itemAppeared(item: item, dataService: dataService, audioController: audioController) } } } .aspectRatio(1.8, contentMode: .fill) diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift index c1e67990d..a4a1e91b4 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift @@ -12,13 +12,13 @@ import Views struct HomeFeedContainerView: View { @EnvironmentObject var dataService: DataService - @EnvironmentObject var audioSession: AudioSession + @EnvironmentObject var audioController: AudioController @AppStorage(UserDefaultKey.homeFeedlayoutPreference.rawValue) var prefersListLayout = false @ObservedObject var viewModel: HomeFeedViewModel func loadItems(isRefresh: Bool) { - Task { await viewModel.loadItems(dataService: dataService, audioSession: audioSession, isRefresh: isRefresh) } + Task { await viewModel.loadItems(dataService: dataService, audioController: audioController, isRefresh: isRefresh) } } var body: some View { @@ -230,7 +230,7 @@ import Views struct HomeFeedListView: View { @EnvironmentObject var dataService: DataService - @EnvironmentObject var audioSession: AudioSession + @EnvironmentObject var audioController: AudioController @Binding var prefersListLayout: Bool @@ -293,7 +293,7 @@ import Views } } Button( - action: { viewModel.downloadAudio(audioSession: audioSession, item: item) }, + action: { viewModel.downloadAudio(audioController: audioController, item: item) }, label: { Label("Download Audio", systemImage: "icloud.and.arrow.down") } ) } @@ -362,7 +362,7 @@ import Views struct HomeFeedGridView: View { @EnvironmentObject var dataService: DataService - @EnvironmentObject var audioSession: AudioSession + @EnvironmentObject var audioController: AudioController @State private var itemToRemove: LinkedItem? @State private var confirmationShown = false @@ -382,12 +382,12 @@ import Views case .editTitle: viewModel.itemUnderTitleEdit = item case .downloadAudio: - viewModel.downloadAudio(audioSession: audioSession, item: item) + viewModel.downloadAudio(audioController: audioController, item: item) } } func loadItems(isRefresh: Bool) { - Task { await viewModel.loadItems(dataService: dataService, audioSession: audioSession, isRefresh: isRefresh) } + Task { await viewModel.loadItems(dataService: dataService, audioController: audioController, isRefresh: isRefresh) } } var body: some View { diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift index be922e211..a06d06fdc 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift @@ -149,7 +149,7 @@ import Views func downloadAudio(audioController: AudioController, item: LinkedItem) { Snackbar.show(message: "Downloading Offline Audio") Task { - let downloaded = await audioController.preload(itemIDs: [item.unwrappedID]) + let downloaded = await audioController.downloadForOffline(itemID: item.unwrappedID) Snackbar.show(message: downloaded ? "Audio file downloaded" : "Error downloading audio") } } diff --git a/apple/OmnivoreKit/Sources/Services/AudioSession/AudioController.swift b/apple/OmnivoreKit/Sources/Services/AudioSession/AudioController.swift index a145f1d9d..4924dbc6a 100644 --- a/apple/OmnivoreKit/Sources/Services/AudioSession/AudioController.swift +++ b/apple/OmnivoreKit/Sources/Services/AudioSession/AudioController.swift @@ -152,6 +152,15 @@ public class AudioController: NSObject, ObservableObject, AVAudioPlayerDelegate return true } + public func downloadForOffline(itemID: String) async -> Bool { + if let document = try? await downloadSpeechFile(itemID: itemID, priority: .low) { + let synthesizer = SpeechSynthesizer(appEnvironment: appEnvironment, networker: networker, document: document) + for await _ in synthesizer.fetch(from: 0) {} + return true + } + return false + } + public var scrubState: PlayerScrubState = .reset { didSet { switch scrubState {