From 5f6c8793e645f3bd000f784d423f6616218ca3d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Coye=20de=20Brune=CC=81lis?= Date: Fri, 24 Jan 2025 11:43:40 +0100 Subject: [PATCH 1/2] fix(SingleTrackPlayer): Audio preview in public share --- .../AudioPlayer/SingleTrackPlayer.swift | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/kDriveCore/AudioPlayer/SingleTrackPlayer.swift b/kDriveCore/AudioPlayer/SingleTrackPlayer.swift index 6e1a4dd99..2497511fe 100644 --- a/kDriveCore/AudioPlayer/SingleTrackPlayer.swift +++ b/kDriveCore/AudioPlayer/SingleTrackPlayer.swift @@ -106,27 +106,39 @@ public final class SingleTrackPlayer: Pausable { Task { await setMetaData(from: asset.commonMetadata, playableFileName: playableFile.name) } + } else if let publicShareProxy = driveFileManager.publicShareProxy { + let url = Endpoint.downloadShareLinkFile( + driveId: publicShareProxy.driveId, + linkUuid: publicShareProxy.shareLinkUid, + fileId: playableFile.id + ).url + let asset = AVURLAsset(url: url) + setupStreamingAsset(asset, fileName: playableFile.name) } else if let token = driveFileManager.apiFetcher.currentToken { driveFileManager.apiFetcher.performAuthenticatedRequest(token: token) { token, _ in guard let token else { return } - Task { @MainActor in - let url = Endpoint.download(file: playableFile).url - let headers = ["Authorization": "Bearer \(token.accessToken)"] - let asset = AVURLAsset(url: url, options: ["AVURLAssetHTTPHeaderFieldsKey": headers]) - self.player = AVPlayer(playerItem: AVPlayerItem(asset: asset)) - await self.setMetaData(from: asset.commonMetadata, playableFileName: playableFile.name) - self.setUpObservers() - - self.currentItemStatusObserver = self.player?.observe(\.currentItem?.status) { _, _ in - self.handleItemStatusChange() - } - } + let url = Endpoint.download(file: playableFile).url + let headers = ["Authorization": "Bearer \(token.accessToken)"] + let asset = AVURLAsset(url: url, options: ["AVURLAssetHTTPHeaderFieldsKey": headers]) + self.setupStreamingAsset(asset, fileName: playableFile.name) } } else { onPlaybackError.send(.previewLoadErrorNoToken) } } + private func setupStreamingAsset(_ urlAsset: AVURLAsset, fileName: String) { + Task { @MainActor in + player = AVPlayer(playerItem: AVPlayerItem(asset: urlAsset)) + await setMetaData(from: urlAsset.commonMetadata, playableFileName: fileName) + setUpObservers() + + currentItemStatusObserver = player?.observe(\.currentItem?.status) { _, _ in + self.handleItemStatusChange() + } + } + } + public func reset() { removeAllObservers() player?.pause() From cae102ace6b6423020a380ba55fcd280922e99b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Coye=20de=20Brune=CC=81lis?= Date: Fri, 24 Jan 2025 12:49:51 +0100 Subject: [PATCH 2/2] refactor(PreviewViewController): Any download call will behave correctly in public share mode fix(Flac): Lossless audio preview works --- .../Files/Preview/PreviewViewController.swift | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/kDrive/UI/Controller/Files/Preview/PreviewViewController.swift b/kDrive/UI/Controller/Files/Preview/PreviewViewController.swift index 57bd00d1d..180a52441 100644 --- a/kDrive/UI/Controller/Files/Preview/PreviewViewController.swift +++ b/kDrive/UI/Controller/Files/Preview/PreviewViewController.swift @@ -548,10 +548,23 @@ final class PreviewViewController: UIViewController, PreviewContentCellDelegate, return } + downloadFile(at: indexPath) + } + + private func downloadFile(at indexPath: IndexPath) { if let publicShareProxy = driveFileManager.publicShareProxy { downloadPublicShareFile(at: indexPath, publicShareProxy: publicShareProxy) } else { - downloadFile(at: indexPath) + DownloadQueue.instance.temporaryDownload( + file: currentFile, + userId: accountManager.currentUserId, + onOperationCreated: { operation in + self.trackOperationCreated(at: indexPath, downloadOperation: operation) + }, + completion: { error in + self.downloadCompletion(at: indexPath, error: error) + } + ) } } @@ -568,19 +581,6 @@ final class PreviewViewController: UIViewController, PreviewContentCellDelegate, ) } - private func downloadFile(at indexPath: IndexPath) { - DownloadQueue.instance.temporaryDownload( - file: currentFile, - userId: accountManager.currentUserId, - onOperationCreated: { operation in - self.trackOperationCreated(at: indexPath, downloadOperation: operation) - }, - completion: { error in - self.downloadCompletion(at: indexPath, error: error) - } - ) - } - private func trackOperationCreated(at indexPath: IndexPath, downloadOperation: DownloadAuthenticatedOperation?) { Task { @MainActor [weak self] in guard let self else {