Updates after rebasing, implement download for offline audio

This commit is contained in:
Jackson Harper 2022-09-13 16:03:34 +08:00
parent 9b1ce21f6f
commit e73072e224
4 changed files with 20 additions and 11 deletions

View file

@ -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)

View file

@ -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 {

View file

@ -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")
}
}

View file

@ -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 {