From 8722a62bbf8fba92cc620fd2d76f427c41ecc2fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthieu=20D=C3=A9glon?= Date: Fri, 22 Nov 2024 13:09:07 +0100 Subject: [PATCH] refactor: Feedbacks and remove unused code --- .../Preview/VideoCollectionViewCell.swift | 7 ------ kDriveCore/AudioPlayer/MediaMetadata.swift | 8 +++---- .../AudioPlayer/SingleTrackPlayer.swift | 13 +++++----- kDriveCore/VideoPlayer/VideoPlayer.swift | 24 +++++++++++-------- 4 files changed, 24 insertions(+), 28 deletions(-) diff --git a/kDrive/UI/View/Files/Preview/VideoCollectionViewCell.swift b/kDrive/UI/View/Files/Preview/VideoCollectionViewCell.swift index 95a638c03..f1eb7ccf4 100644 --- a/kDrive/UI/View/Files/Preview/VideoCollectionViewCell.swift +++ b/kDrive/UI/View/Files/Preview/VideoCollectionViewCell.swift @@ -42,7 +42,6 @@ class VideoCollectionViewCell: PreviewCollectionViewCell { weak var parentViewController: UIViewController? weak var floatingPanelController: FloatingPanelController? - private var playableFileName: String? private var previewDownloadTask: Kingfisher.DownloadTask? private var file: File! private var videoPlayer: VideoPlayer? @@ -63,17 +62,11 @@ class VideoCollectionViewCell: PreviewCollectionViewCell { assert(file.realm == nil || file.isFrozen, "File must be thread safe at this point") self.file = file - playableFileName = file.name file.getThumbnail { preview, hasThumbnail in self.previewFrameImageView.image = hasThumbnail ? preview : nil } Task { @MainActor in videoPlayer = VideoPlayer(frozenFile: file, driveFileManager: driveFileManager) - guard let videoPlayer else { return } - videoPlayer.setNowPlayingMetadata() - videoPlayer.onPlaybackEnded = { [weak self] in - self?.videoPlayer?.setNowPlayingMetadata() - } } } diff --git a/kDriveCore/AudioPlayer/MediaMetadata.swift b/kDriveCore/AudioPlayer/MediaMetadata.swift index f669c88bc..d9c7faaf0 100644 --- a/kDriveCore/AudioPlayer/MediaMetadata.swift +++ b/kDriveCore/AudioPlayer/MediaMetadata.swift @@ -33,16 +33,14 @@ public struct MediaMetadata { } public extension MediaMetadata { - static func extractTrackMetadata(from url: URL) async -> MediaMetadata { + static func extractTrackMetadata(from url: URL, playableFileName: String?) async -> MediaMetadata { let asset = AVAsset(url: url) - var title = KDriveResourcesStrings.Localizable.unknownTitle + var title = playableFileName ?? KDriveResourcesStrings.Localizable.unknownTitle var artist = KDriveResourcesStrings.Localizable.unknownArtist var artwork: UIImage? - let metadata = asset.commonMetadata - - for item in metadata { + for item in asset.commonMetadata { guard let commonKey = item.commonKey else { continue } switch commonKey { diff --git a/kDriveCore/AudioPlayer/SingleTrackPlayer.swift b/kDriveCore/AudioPlayer/SingleTrackPlayer.swift index 7227e549d..de018d7d9 100644 --- a/kDriveCore/AudioPlayer/SingleTrackPlayer.swift +++ b/kDriveCore/AudioPlayer/SingleTrackPlayer.swift @@ -97,8 +97,7 @@ public final class SingleTrackPlayer { if !playableFile.isLocalVersionOlderThanRemote { player = AVPlayer(url: playableFile.localUrl) Task { @MainActor in - currentTrackMetadata = await MediaMetadata.extractTrackMetadata(from: playableFile.localUrl) - await onCurrentTrackMetadata.send(MediaMetadata.extractTrackMetadata(from: playableFile.localUrl)) + await setMetaData(url: playableFile.localUrl, playableFileName: playableFile.name) } setUpObservers() } else if let token = driveFileManager.apiFetcher.currentToken { @@ -108,10 +107,7 @@ public final class SingleTrackPlayer { let headers = ["Authorization": "Bearer \(token.accessToken)"] let asset = AVURLAsset(url: url, options: ["AVURLAssetHTTPHeaderFieldsKey": headers]) Task { @MainActor in - self.currentTrackMetadata = await MediaMetadata.extractTrackMetadata(from: asset.url) - await self.onCurrentTrackMetadata.send(MediaMetadata.extractTrackMetadata( - from: asset.url - )) + await self.setMetaData(url: asset.url, playableFileName: playableFile.name) self.player = AVPlayer(playerItem: AVPlayerItem(asset: asset)) self.setUpObservers() } @@ -131,6 +127,11 @@ public final class SingleTrackPlayer { playerState = .stopped } + private func setMetaData(url: URL, playableFileName: String?) async { + currentTrackMetadata = await MediaMetadata.extractTrackMetadata(from: url, playableFileName: playableFileName) + await onCurrentTrackMetadata.send(MediaMetadata.extractTrackMetadata(from: url, playableFileName: playableFileName)) + } + // MARK: - MediaPlayer private func setNowPlayingMetadata() { diff --git a/kDriveCore/VideoPlayer/VideoPlayer.swift b/kDriveCore/VideoPlayer/VideoPlayer.swift index 02f490035..fc9f2a46f 100644 --- a/kDriveCore/VideoPlayer/VideoPlayer.swift +++ b/kDriveCore/VideoPlayer/VideoPlayer.swift @@ -44,18 +44,16 @@ public final class VideoPlayer { setupPlayer(with: frozenFile, driveFileManager: driveFileManager) } - public func setNowPlayingMetadata() { + public func setNowPlayingMetadata(metadata: MediaMetadata) { var nowPlayingInfo = [String: Any]() nowPlayingInfo[MPNowPlayingInfoPropertyMediaType] = MPNowPlayingInfoMediaType.video.rawValue nowPlayingInfo[MPNowPlayingInfoPropertyIsLiveStream] = false - if let currentTrackMetadata { - nowPlayingInfo[MPMediaItemPropertyTitle] = currentTrackMetadata.title - nowPlayingInfo[MPMediaItemPropertyArtist] = currentTrackMetadata.artist - if let artwork = currentTrackMetadata.artwork { - let artworkItem = MPMediaItemArtwork(boundsSize: artwork.size) { _ in artwork } - nowPlayingInfo[MPMediaItemPropertyArtwork] = artworkItem - } + nowPlayingInfo[MPMediaItemPropertyTitle] = metadata.title + nowPlayingInfo[MPMediaItemPropertyArtist] = metadata.artist + if let artwork = metadata.artwork { + let artworkItem = MPMediaItemArtwork(boundsSize: artwork.size) { _ in artwork } + nowPlayingInfo[MPMediaItemPropertyArtwork] = artworkItem } if let duration = player?.currentItem?.duration { @@ -73,7 +71,10 @@ public final class VideoPlayer { if !file.isLocalVersionOlderThanRemote { player = AVPlayer(url: file.localUrl) Task { @MainActor in - currentTrackMetadata = await MediaMetadata.extractTrackMetadata(from: file.localUrl) + currentTrackMetadata = await MediaMetadata.extractTrackMetadata(from: file.localUrl, playableFileName: file.name) + if let currentMetadata = self.currentTrackMetadata { + setNowPlayingMetadata(metadata: currentMetadata) + } } } else if let token = driveFileManager.apiFetcher.currentToken { driveFileManager.apiFetcher.performAuthenticatedRequest(token: token) { token, _ in @@ -82,7 +83,10 @@ public final class VideoPlayer { let headers = ["Authorization": "Bearer \(token.accessToken)"] let asset = AVURLAsset(url: url, options: ["AVURLAssetHTTPHeaderFieldsKey": headers]) Task { @MainActor in - self.currentTrackMetadata = await MediaMetadata.extractTrackMetadata(from: asset.url) + self.currentTrackMetadata = await MediaMetadata.extractTrackMetadata( + from: asset.url, + playableFileName: file.name + ) self.player = AVPlayer(playerItem: AVPlayerItem(asset: asset)) } }